El Lunes, 14 de Enero de 2008, David Villasmil escribió:
Chicos,
Como es normal, no quiero que nadie llame si estar registrado...
No, no es normal. Asumo que lo que quieres decir es:
"Como es normal, no quiero que nadie llame sin autenticarse".
Recuerdo que en SIP estar registrado nada tiene que ver con ser un usuario
subscrito (o sea, que tienes cuenta de usuario y password).
tengo lo siguiente en mi conf:
if (method=="INVITE") {
if (!proxy_authorize("sip.midom.com","subscriber"))
{
proxy_challenge("sip.midom..com","0");
exit;
}else{
if($si=="GW1"||$si=="GW2"){
xlog("L_NOTICE", "\n************** ALLOWING
INCOMING CALL AS IT COMES FROM $si ************\n");
}
}
El problema es cuando una llamada viene de GW1/GW2... que les da DECLINED
El script es incorrecto, supongamos una llamada desde el GW1 o GW2:
- Primero haces:
if (!proxy_authorize("sip.midom.com","subscriber"))
Es decir, que si el llamante no presenta credenciales se le ofrezca un "407
Proxy Autehntication Required", o sea, eso se traduce en:
proxy_challenge("sip.midom..com","0");
La condición anterior se cumple (el GW1 no incluía credenciales en el INVITE)
por lo que el proxy envía el 407 al GW1.
- El GW1 recibe el 407 requeriendo que se autentique (cosa que no puede hacer,
ni tampoco queremos que haga, aquí está el error).
- Ese "else" NO se cumplirá nunca puesto que el GW1 NUNCA se podrá autenticar
(en cuyo caso el "if" daría falso y se ejecutaría el "else").
- El único caso en el que se ejecutaría el "else" es cuando llama cualquier
otro usuario que sí se autentica, lo cuál no es evidentemente lo que quieres.
El autenticar por IP se debe hacer ANTES del "proxy_authorize()". Es decir,
sólo pedir autenticación si la IP no es la del GW1/GW2.
Además, mira el módulo "trusted" que tiene funciones apropiadas para
autenticación por IP.
Saludos.
--
Iñaki Baz Castillo