[OpenSER-Users-ES] Gestionando "correctamente" el loose route

Iñaki Baz Castillo ibc at in.ilimit.es
Mon May 26 10:02:16 CEST 2008


El Sunday 25 May 2008 20:26:41 Saúl Ibarra escribió:
> Hoola!
>
> Viendo distintos documentos por ahí, veo que cada uno pone un poco a
> su manera la detección del loose route.
>
> De todos los que he visto, el que más me ha gustado ha sido el del
> libro "Building Telephony Systems with OpenSER", en el que se propone
> lo siguiente:
>
> if (has_totag()) {
>    if (loose_route()) {
>        if (message == "INVITE")
>                route(x);
>        if (message == "REFER")
>               route(y);
>         ....
>     }
> else {
>     sl_rend_reply(403, "Fuck you!")
> }

Ojo con eso que tal y como está permites mensajes initial-request (has_totag() 
= FALSE) pero que contengan "Route", o sea, que sería como un open relay.

Yo hago esto:


----------------
# ¿in-dialog?
if (loose_route()) $var(loose_route) = 1; else $var(loose_route) = 0;

### In-dialog procesing:

if (has_totag() && $var(loose_route)) {
        if (message == "INVITE")
                route(x);
        if (message == "REFER")
               route(y);
        ...
}

### Initial request processing:

if (!has_totag() && $var(loose_route)) {
	# Initial request -> preloaded ROUTE set?
	 if ($var(loose_route)) {
 		xlog("L_ERROR", "ERROR: Attempt to route with preloaded Route\n");
 			sl_send_reply("403","Preload Route denied");
 		}
 	}	
}
---------------------

Es importante guardar y usar la variable $var(loose_route) ya que no podemos 
llamar dos veces a la función "loose_route()" puesto que haría algo 
impredecible.

De todas formas, creo que mi forma es un tanto rebuscada.



> La pregunta es: se supone que esta (primero mirar el totag y luego
> loose_route) es la manera "más correcta" de comprobar que lo que viene
> esta in-dialog?

Que está in-dialog sólo viene determinado por la presencia del "tag" en 
el "To", nada más. Se supone que como OpenSer le ha añadido previamente a 
responses de ese diálogo el "Record-Route" entonces los siguientes mensajes 
en dialog tendrá un "Route", y de hecho es dificil que llegue un mensaje 
in-dialog sin "Route" (pero no imposible ni mucho menos). Pero la clave de 
que un mensaje sea in-dialog es únicamente la presencia de "tag" en el "To".


> Y ya que estoy, otra preguntilla :) Qué mensajes in-dialog han de ir
> autenticados? (INVITE y REFER fijo, pero los demás?).

Esta pregunta la hice yo en su día en esta misma lista, recuerdo que había 
buenas conclusiones.
Por cierto, el re-INVITE **NO** se debe autenticar necesariamente (de hecho no 
hay razón alguna para hacerlo), y el REFER puede hacerse o no. Más seguro es 
que sí, pero ojo si el llamado es un alias y luego exiges "check_from()" en 
la autenticación a un REFER desde dicho alias.


Saludos.



-- 
Iñaki Baz Castillo
ibc at in.ilimit.es




More information about the Users-es mailing list