Parseando una cabecera SIP P-Asserted-Identity en Asterisk

852 views
Skip to first unread message

Iñaki Baz Castillo

unread,
Jun 9, 2008, 12:08:35 PM6/9/08
to aster...@googlegroups.com
Hola, ¿sabéis si Asterisk dispone de algún módulo que ofrezca funciones
cómodas para parsear una cabecera SIP y extraer de forma segura un username
de un SIP URI?

El caso concreto es que recibo una cabecera PAI, que por ejemplo puede ser:

P-Asserted-Identity: <sip:9991...@88.99.4.10>

y de ahí me interesa sacar: 999111222

Lo comento porque sé que se puede jugar con expresiones regulares y tal en el
dialplan, pero es bastante guarrete. Igual hay algo mejor.

Gracias.

--
Iñaki Baz Castillo
i...@in.ilimit.es

Iñaki Baz Castillo

unread,
Jun 9, 2008, 12:45:32 PM6/9/08
to aster...@googlegroups.com

Bueno, lo dicho, que no existe nada apropiado pero a base de guarrear:

exten => _+XXXX.,1,Set(PAI=${SIP_HEADER(P-Asserted-Identity)})
exten => _+XXXX.,n,Set(PAI=${CUT(PAI,"<",2)})
exten => _+XXXX.,n,Set(PAI=${CUT(PAI,"@",1)})
exten => _+XXXX.,n,Set(PAI=${CUT(PAI,":",2)})
exten => _+XXXX.,n,Set(CALLERID=<${PAI}>)

y ya...

~~~~~~ uso de NGREP (captura traza SIP) ~~~~~~
En el servidor Asterisk:
~$ ngrep -d any -P ' ' -W byline -T port 5060
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

paco gil

unread,
Jun 9, 2008, 1:00:52 PM6/9/08
to aster...@googlegroups.com
hombre... pero eso no es guarrear.... por lo menos yo no lo veo así.

[macro-no-tan-guarra]    con tu código y punto.

Si te fijas al final, acaba siendo como si tuvieses tu propio IbcPBX verdad??? XDD

http://ualtech.wordpress.com

2008/6/9 Iñaki Baz Castillo <i...@in.ilimit.es>:

Raúl Alexis Betancor Santana

unread,
Jun 9, 2008, 2:38:59 PM6/9/08
to aster...@googlegroups.com
El Lunes, 9 de Junio de 2008 17:45, Iñaki Baz Castillo escribió:
> El Monday 09 June 2008 18:08:35 Iñaki Baz Castillo escribió:
> > Hola, ¿sabéis si Asterisk dispone de algún módulo que ofrezca funciones
> > cómodas para parsear una cabecera SIP y extraer de forma segura un
> > username de un SIP URI?
> >
> > El caso concreto es que recibo una cabecera PAI, que por ejemplo puede
> > ser:
> >
> > P-Asserted-Identity: <sip:9991...@88.99.4.10>
> >
> > y de ahí me interesa sacar: 999111222
> >
> > Lo comento porque sé que se puede jugar con expresiones regulares y tal
> > en el dialplan, pero es bastante guarrete. Igual hay algo mejor.
>
> Bueno, lo dicho, que no existe nada apropiado pero a base de guarrear:
>
> exten => _+XXXX.,1,Set(PAI=${SIP_HEADER(P-Asserted-Identity)})
> exten => _+XXXX.,n,Set(PAI=${CUT(PAI,"<",2)})
> exten => _+XXXX.,n,Set(PAI=${CUT(PAI,"@",1)})
> exten => _+XXXX.,n,Set(PAI=${CUT(PAI,":",2)})
> exten => _+XXXX.,n,Set(CALLERID=<${PAI}>)

No te compliques la existencia ...

exten => _X.,n,Set(UCLID=${CUT(CUT(SIP_HEADER(P-Asserted-Identity),@,1),:,2)})
exten => _X.,n,Set(CALLERID(number)=${UCLID})
exten => _X.,n,Set(CALLERID(name)=${UCLID})

Además es más rápido que lo tuyo .. ;-P

--
Saludos.

Raúl Alexis Betancor Santana
Dimensión Virtual S.L.

Elio Rojano

unread,
Jun 9, 2008, 3:59:14 PM6/9/08
to aster...@googlegroups.com

Iñaki Baz Castillo

unread,
Jun 10, 2008, 4:26:27 AM6/10/08
to aster...@googlegroups.com

ok

Lo único, comento que tanto tu solución como la mía tienen un problema, y es
que el Display Name puede contener "<, >, @" y machacarnos el invento.

Menos mal que soy yo quien setea el PAI en el proxy y lo hago sin
DisplayName ;)

Gracias.

Iñaki Baz Castillo

unread,
Jun 10, 2008, 4:27:00 AM6/10/08
to aster...@googlegroups.com
El Monday 09 June 2008 19:00:52 paco gil escribió:
> hombre... pero eso no es guarrear.... por lo menos yo no lo veo así.
>
> [macro-no-tan-guarra] con tu código y punto.

Hombre, pero ya podía tener Asterisk una función para parsear URI's...

Iñaki Baz Castillo

unread,
Jun 10, 2008, 4:40:06 AM6/10/08
to aster...@googlegroups.com
El Monday 09 June 2008 21:59:14 Elio Rojano escribió:
> http://www.voip-info.org/wiki/index.php?page=Asterisk+func+sippeer

Gracias elio, pero esa función no sirve para parsear una SIP uri :(


~~~~~~ uso de NGREP (captura traza SIP) ~~~~~~
En el servidor Asterisk:
~$ ngrep -d any -P ' ' -W byline -T port 5060
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

--
Iñaki Baz Castillo
i...@in.ilimit.es

Raúl Alexis Betancor Santana

unread,
Jun 10, 2008, 5:50:37 AM6/10/08
to aster...@googlegroups.com
El Martes, 10 de Junio de 2008 09:26, Iñaki Baz Castillo escribió:
> Lo único, comento que tanto tu solución como la mía tienen un problema, y
> es que el Display Name puede contener "<, >, @" y machacarnos el invento.
>
> Menos mal que soy yo quien setea el PAI en el proxy y lo hago sin
> DisplayName ;)

Jejeje, idem ... eso es parte del dialplan de nuestros mg, los PAI
vienen "limpitos" desde los proxy.

Germán Aracil Boned

unread,
Jun 10, 2008, 5:53:17 AM6/10/08
to aster...@googlegroups.com
exten =>
_X.,n,Set(UCLID=${CUT(CUT(SIP_HEADER(P-Asserted-Identity),@,1),:,2)})
exten => _X.,n,Set(CALLERID(all)=${UCLID} <${UCLID}>)

Y esta una línea más rápido :)

Raúl Alexis Betancor Santana escribió:

--


-
-------------------------------------
Germán Aracil Boned
Director de Sistemas
Zoon Suite S.L.

www.zoonsuite.com
963146030 - General
963146031 - Asistencia de incidencias
963146032 - FAX
-------------------------------------
-

Germán Aracil Boned

unread,
Jun 10, 2008, 5:54:34 AM6/10/08
to aster...@googlegroups.com
Hazla, es un simple programita en C..

Si os interesa y recaudamos fondos me curro yo una :) jejeje

Iñaki Baz Castillo escribió:

--


Elio Rojano

unread,
Jun 10, 2008, 6:04:07 AM6/10/08
to aster...@googlegroups.com
Hazte un AGI, entre las variables que le pasas puedes tratar las cadenas como mejor te parezca y luego devolverlo a Asterisk en una variable.. :)

2008/6/10 Iñaki Baz Castillo <i...@in.ilimit.es>:



--
http://www.sinologic.net/

Germán Aracil Boned

unread,
Jun 10, 2008, 6:09:58 AM6/10/08
to aster...@googlegroups.com
Los agi no son muy buenos para sistemas con cierta carga.
Además de cargar el interprete del lenguaje script (usado normalmente),
te hace un fork sino me equivoco, con el consiguiente consumo de recursos.

Yo me inclino por una aplicacion/funcion integrada en dialplan. No
requiere parchear asterisk, simplemente el fichero app_funcion.c lo
dejamos caer en /asterisk/apps/ luego hacemos un ./configure ./make
menuconfig para verificar que está marcado, y a compilar.

Además de tener acceso a todas las variables del dialplan, poder crear y
en definitiva hacer lo que quieras sin practicamente límites, este
programa sería pequeño y consumiría muy pocos recursos y memoria.

Igual me he lanzado .. Ya me veo escribiendolo.. Si es que esto es vicio
y lo demás tonterías.

Elio Rojano escribió:


> Hazte un AGI, entre las variables que le pasas puedes tratar las cadenas
> como mejor te parezca y luego devolverlo a Asterisk en una variable.. :)
>

> 2008/6/10 Iñaki Baz Castillo <i...@in.ilimit.es <mailto:i...@in.ilimit.es>>:


>
>
> El Monday 09 June 2008 21:59:14 Elio Rojano escribió:
> > http://www.voip-info.org/wiki/index.php?page=Asterisk+func+sippeer
>
> Gracias elio, pero esa función no sirve para parsear una SIP uri :(
>
>
> ~~~~~~ uso de NGREP (captura traza SIP) ~~~~~~
> En el servidor Asterisk:
> ~$ ngrep -d any -P ' ' -W byline -T port 5060
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> --
> Iñaki Baz Castillo

> i...@in.ilimit.es <mailto:i...@in.ilimit.es>
>
>
>
>
>
> --
> http://www.sinologic.net/

Iñaki Baz Castillo

unread,
Jun 10, 2008, 6:20:30 AM6/10/08
to aster...@googlegroups.com
El Tuesday 10 June 2008 12:09:58 Germán Aracil Boned escribió:

> Además de tener acceso a todas las variables del dialplan, poder crear y
> en definitiva hacer lo que quieras sin practicamente límites, este
> programa sería pequeño y consumiría muy pocos recursos y memoria.
>
> Igual me he lanzado .. Ya me veo escribiendolo.. Si es que esto es vicio
> y lo demás tonterías.

Sería una gran contribución y haría a Asterisk más potente y flexible en SIP.
Por desgracia mi C está muy oxidado pero si quieres te puedo "motivar" y
además ayudar en cómo se debe parsear un SIP URI, me conozco la teoría al
dedillo puesto que estoy haciendo un parser SIP en Ruby XD

Si te animas coméntame ;)

Germán Aracil Boned

unread,
Jun 10, 2008, 6:24:27 AM6/10/08
to aster...@googlegroups.com
Pues yo encantado. Pero... Necesito una descripción detallada de la/s
funcionalidad/es.

Con eso en principio no necesito nada más, pero si así fuese preciso, te
iba a incordiar un rato jejee ;)

Venga cuentanos.. a ver si alguien más se le ocurre alguna funcionalidad
relacionada.

Iñaki Baz Castillo escribió:

--


Iñaki Baz Castillo

unread,
Jun 10, 2008, 6:57:34 AM6/10/08
to aster...@googlegroups.com
El Tuesday 10 June 2008 12:24:27 Germán Aracil Boned escribió:
> Pues yo encantado. Pero... Necesito una descripción detallada de la/s
> funcionalidad/es.
>
> Con eso en principio no necesito nada más, pero si así fuese preciso, te
> iba a incordiar un rato jejee ;)
>
> Venga cuentanos.. a ver si alguien más se le ocurre alguna funcionalidad
> relacionada.

Hay varias cabeceras SIP que incluyen un SIP URI, así que debería ser
flexible. Creo que ya tiene cierta dificultad puesto que las SIP URIs tienen
bastante faena (username, password, host, puerto, headers, parameters...)


~~~~~~ uso de NGREP (captura traza SIP) ~~~~~~
En el servidor Asterisk:
~$ ngrep -d any -P ' ' -W byline -T port 5060
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

--
Iñaki Baz Castillo
i...@in.ilimit.es

Germán Aracil Boned

unread,
Jun 10, 2008, 10:31:03 AM6/10/08
to aster...@googlegroups.com
A mi pensando pensando lo que se me esta ocurriendo es un "firewall" SIP

Una especie de Proxy SIP, muy elemental que lo único que haga es filtrar
los paquetes SIP entre varias máquinas y el.

Algo que no conteste nada, ni error en login por ejemplo cuando traslade
el registro a la máquina que toque. Guardándose como un router las
asociaciones de direcciones de clientes y nodos a quienes ha trasladado
el registro o invite.

Del mismo modo, todos los equipos con asterisk, envian sus paquetes SIP
al mismo sitio, que traduce y envía al cliente oportuno.

Un servicio capaz de bannear una ip durante un periodo de tiempo,
avisando de la situación, cuando alguien intenta logearse con un pass
erróneo 3 o 5 veces..

Capaz de garantizar que las peticiones SIP, cumplan con determinado
perfil para iniciar una respuesta.


Sé que me vais a decir.. OpenSer, pero yo hablo de algo muy simple y
pequeño, con otras políticas SIP. A mi me gustaría llamarlo router SIP.

Seguro que algo hay por ahí..

P.D. Tarde aburrida, no para de llover.

Iñaki Baz Castillo escribió:

--


Iñaki Baz Castillo

unread,
Jun 10, 2008, 11:11:03 AM6/10/08
to aster...@googlegroups.com
El Tuesday 10 June 2008 16:31:03 Germán Aracil Boned escribió:

> Del mismo modo, todos los equipos con asterisk, envian sus paquetes SIP
> al mismo sitio, que traduce y envía al cliente oportuno.
>
> Un servicio capaz de bannear una ip durante un periodo de tiempo,
> avisando de la situación, cuando alguien intenta logearse con un pass
> erróneo 3 o 5 veces..

Eso lo hace el módulo 'pike' de OpenSer.

> Capaz de garantizar que las peticiones SIP, cumplan con determinado
> perfil para iniciar una respuesta.

¿Qué perfil? ojo que existen unos cuantos RFC's sobre estos temas (SIP
preconditions).


> Sé que me vais a decir.. OpenSer, pero yo hablo de algo muy simple y
> pequeño, con otras políticas SIP. A mi me gustaría llamarlo router SIP.

OpenSer = Open SIP Express Router

Es que es lo que tú dices, y puede ser tan simple como la configuración que le
apliques :)

> Seguro que algo hay por ahí..

Sí, y se llama... XDD


~~~~~~ uso de NGREP (captura traza SIP) ~~~~~~
En el servidor Asterisk:
~$ ngrep -d any -P ' ' -W byline -T port 5060
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

--
Iñaki Baz Castillo
i...@in.ilimit.es

Reply all
Reply to author
Forward
0 new messages