[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