El 23/08/07, Saúl Ibarra saghul@gmail.com escribió:
He estado "limpiando" un poco el código, metiendo el auth, el alias y el location en distintos routes, y ahora me queda más "legible" xD
Lo que no me ha quedado muy claro es la utenticación del REFER. Yo actualmente hago esto:
## Con el has_totag sabemos si son "in-dialog"
Humm, creo que no exactamente. Para saber si es en dialog es la función: if (loose_route()) http://4z.com/people/emin-gabrielyan/public/070412-SIP-record-route/
El tema del "has_totag" se debe a que, una vez dentro de un diálogo establecido, los mensajes in-dialog deben necesariamente tener un parámetro "tag" dentro del campo "To". Es una medida de seguridad aunque reconozco que tengo pendiente comprobar cómo de seguro es esto, es decir, si yo genero a propósito un mensaje nuevo con un "tag" en el "To" y le añado la cabecera "Route" para que pase por "loose_route" (in-dialog) ¿significa eso que OpenSer me permite el paso de es mensaje "trampa" que en realidad no pertenece a ningún diálogo establecido? Aquí hay que recordar que OpenSer no recuerda el estado de diálogos, sólo de transacciones.
if ((method=="INVITE" || method=="REFER") && !has_totag()) { sl_send_reply("403", "Forbidden"); xlog("L_INFO","$Crx ** INVITE o REFER sin TO tag ** $Cxx\n"); exit; }
Así vale? O debería añadir a continuación algo como:
if (method=="REFER") { route(22); route(1); }
Donde route 22 es:
# ----------------------------------------------------------------- # Auth check # -----------------------------------------------------------------
route[22] { ## Es necesario autenticarse if (!proxy_authorize("","subscriber")) { xlog("L_INFO","$CbxSe necesita autenticacion para $rm $Cxx\n"); proxy_challenge("","0"); exit; }
## Tienen que coincidir el nombre de usuario con el de la cabecera FROM else if (!check_from()) { xlog("L_INFO","$Crx*** check_from() = NO!! ***$Cxx\n"); sl_send_reply("403", "Use From=ID"); exit; } xlog("L_INFO","$Cbx*** Autenticacion Correcta para $rm ***$Cxx\n"); consume_credentials();
}
??
Sí, en efecto, es necesario ese Auth para REFER. Piensa en el caso de que llames desde un PAP2 (por ejemplo) a un número SIP "ajeno"/exterior. Una vez en el diálogo, si no pides auth para el REFER la otra parte podría enviarte un REFER para que tu teléfono haga una llamada al número que sea, lo que podría ocasionar llamada vía PSTN con el coste económino asociado (y es una llamada que ha hecho tu PAP2). Pongo el ejemplo del PAP2 porque, que o sepa, ningún deskphone pide confirmación al usuario cuando recibe un REFER. En cambio, con Twinkle al recibir un REFER te saca un pop-up preguntando al usuario si desea aceptar el REFER a la URI que sea. Ah, y todo esto yo he leído en algún RFC que es lo correcto por obvia seguridad, en cambio parece como si la mayoría de dispositivos SIP delegasen en su proxy SIP la seguridad del REFER.
Saludos.