2008/5/26 Iñaki Baz Castillo <ibc(a)in.ilimit.es>es>:
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");
}
}
}
---------------------
hasta aquí OK, pero esta segunda parte me pierde un poco: ni NO tiene
totag, el if haría if (1 && $var(loose_route)) entonces, la única
menra de entrar en ese if no sería que loose_route valiera 1? No
podríoa ser algo así?:
### Initial request processing:
if (!has_totag()) {
# 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");
}
}
if (method=="INVITE")
route(x);
if (method == "REGISTER")
route(z);
}
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.
Lo cierto es que le encuentro sentido :)
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".
ACK.
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.
Umm, entonces puede que si pido autenticación para los re-INVITE y
REFER algún UA me de por el culo?!
Saludos.
Salu2 y graciaxx!!
--
Saúl -- "Nunca subestimes el ancho de banda de un camión lleno de disketes."
----------------------------------------------------------------
http://www.saghul.net/