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(a)in.ilimit.es