Hola Iñaki,
Gracias por la rapidez de la respuesta. No acabo de enteder porque no es necesario verificar credenciales en el reINVITE y si en el INVITE, y solo es necesario verificar el has_totag(). Intentaré documentarme más sobre el uso del has_totag().
El caso es que en el inicio de una transferencia A->B->C:
- A llama ALIAS_B (INVITE), y B llama-transfer a C (INVITE in-dialog=reINVITE) creo que es necesario que en el INVITE de B a C , B sea verificado (al igual que se hace en el INVITE de A a B incial), no ?
Saludos, y gracias. Miguel A.
El Miércoles, 24 de Octubre de 2007, MAS escribió:
Hola Iñaki,
Gracias por la rapidez de la respuesta. No acabo de enteder porque no es necesario verificar credenciales en el reINVITE y si en el INVITE, y solo es necesario verificar el has_totag().
Es SIP puro y duro ;)
Una llamada (diálogo) se identifica con el From_tag, To_tag y Call-id. Una vez que se ha establecido ambos teléfonos finales conocen esos parámetros.
Así que si a tu OpenSer lellega un mensaje (un INVITE por ejemplo) con un tag en el To entonces lo puedes rutar perfectamente al destino final puesto que dicho destino SOLO aceptará ese paquete si dicho To tag, el From tag y el Call-id pertenencen a los de un diálogo que tiene abierto.
Si es un INVITE nuevo sólo llegará con From tag y call-id, y entonces pasa por el control de seguridad de OpenSer y si lo pasa llega al destino, quien pone el To tag en el 180/200 y se conforma el diálogo. A partir de ese momento no es necesario pedir auth pues sólo permites rutar paquetes in-dialog (loose_route() y has_totag()) si cumplen con esas dos premisas.
Intentaré documentarme más sobre el uso del has_totag().
El caso es que en el inicio de una transferencia A->B->C:
- A llama ALIAS_B (INVITE), y B llama-transfer a C (INVITE
in-dialog=reINVITE) creo que es necesario que en el INVITE de B a C , B sea verificado (al igual que se hace en el INVITE de A a B incial), no ?
Si, es cierto, el REFER hay que autenticarlo, aunque efectivamente me has descubierto un problema:
- A llama a ALIAS_B - ALIAS_B trata de hacer una transferencia (REFER) - OpenSer le pide auth. - No puede hacer el auth porque su From indica ALIAS_B y su auth username B -> !check_from.
Hummm, ¿y esto cómo se resuelve? ¿Tal vez el teléfono destino debería NO usar como From el To recibido y usar su From de "toda la vida" sin alias?
OK Iñaki,
El teléfono que estoy usando es un Thomson 2030 con v1.56. Intentaré verificar si pasa lo mismo con otros modelos de teléfono.
Gracias por la explicación.
Saludos, y gracias. Miguel A.
El Miércoles, 24 de Octubre de 2007, MAS escribió:
OK Iñaki,
El teléfono que estoy usando es un Thomson 2030 con v1.56. Intentaré
verificar si pasa lo mismo con otros modelos de teléfono.
Ya te adelanto que lo he probado con Twinkle y también ocurre. Es más, estoy 99% seguro de que el From y el To NO deben ser modificados durante un diálogo. En este caso habrá que hace alguna ñapa dentro de la sección "loose_route".
Hola,
Mi ñapa, con mis conocimientos, es la siguiente (se aceptan mejoras, sugerencias, problemas, errores, etc):
if ($fu=~"^sip:[1-9][0-9][0-9][0-9][0-9]@.*") { avp_db_query("select contact from aliases where username='$fU'","$avp(s:can_uri)"); avp_printf("$avp(s:can_urid)","sip:$au@$fd"); if (!avp_check("$avp(s:can_uri)","eq/$avp(s:can_urid)/g")) { sl_send_reply("403","Use From!=Authenticate ID"); return(-1); } } else if (!(check_from())) { sl_send_reply("403","Use From!=Authenticate ID"); return(-1); }
Saludos. Miguel A.
El Miércoles, 24 de Octubre de 2007, MAS escribió:
Hola,
Mi ñapa, con mis conocimientos, es la siguiente (se aceptan mejoras,
sugerencias, problemas, errores, etc):
Primeramente, a modo de opinión personal, creo que es más sencillo usar alias con el módulo alias_db ya que usa una tabla "dbaliases" mucho más sencilla que la de "aliases" y tiene sus propias funciones para buscar y tal: http://www.openser.org/docs/modules/devel/alias_db.html
if ($fu=~"^sip:[1-9][0-9][0-9][0-9][0-9]@.*") { avp_db_query("select contact from aliases where username='$fU'","$avp(s:can_uri)");
¡¡ Ojito ahí, que te pueden meter un SQL injection si ponen una comilla simple en el nombre del "From" !! Yo tb lo tengo pendiente de corregir (en un caso similar), supongo que haré una substitución de caracteres prohibidos o incluso una detección y si existen a la porra el mensaje.
avp_printf("$avp(s:can_urid)","sip:$au@$fd");
Desde OpenSer 1.2.X todo eso es más "humano" en plan variables de toda la vida:
$avp(s:can_urid) = "sip:" + $au + "@" + $fd; :) y creo que tb valdría: $avp(s:can_urid) = "sip:$au@$fd"; (pero igual no por la falta de espacios).
Lo único ojo con ese "sip:" a machete, ¿y si alguien usa SIPS?
if (!avp_check("$avp(s:can_uri)","eq/$avp(s:can_urid)/g")) {
Idem:
if ( $avp(s:can_uri) !~ $avp(s:can_urid) )
sl_send_reply("403","Use From!=Authenticate ID"); return(-1); } } else if (!(check_from())) { sl_send_reply("403","Use From!=Authenticate ID"); return(-1); }
Por lo demás me parece bien, ¿has comprobado que funciona?
Saludos.
Hola Iñaki,
Si a mi me funciona. Gracias por las correcciones y comentarios. Todavia estoy aprendiendo. ;-)
Salu2, y gracias. Miguel A.
sr-users-es@lists.kamailio.org