diff --git a/conf/directory.xml b/conf/directory.xml index 0b93e075d4..101286fbc8 100644 --- a/conf/directory.xml +++ b/conf/directory.xml @@ -19,6 +19,8 @@ + + diff --git a/conf/sofia.conf.xml b/conf/sofia.conf.xml index a4fafabb06..2b56d22277 100644 --- a/conf/sofia.conf.xml +++ b/conf/sofia.conf.xml @@ -22,6 +22,8 @@ + + diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index 8b2178e1cf..b52dede84e 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -196,6 +196,7 @@ struct sofia_gateway { char *register_proxy; char *register_context; char *expires_str; + char *register_url; uint32_t freq; time_t expires; time_t retry; diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index dd7f158167..406b176dfe 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -501,7 +501,8 @@ static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag) *expire_seconds = "3600", *retry_seconds = "30", *from_domain = "", - *to_domain = ""; + *to_domain = "", + *register_proxy = NULL; gateway->pool = profile->pool; gateway->profile = profile; @@ -539,13 +540,11 @@ static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag) from_domain = val; } else if (!strcmp(var, "to-domain")) { to_domain = val; + } else if (!strcmp(var, "register-proxy")) { + register_proxy = val; } } - - if (switch_strlen_zero(to_domain)) { - to_domain = proxy; - } - + if (switch_strlen_zero(realm)) { realm = name; } @@ -563,7 +562,7 @@ static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag) if (switch_strlen_zero(extension)) { extension = username; } - + if (switch_strlen_zero(proxy)) { proxy = realm; } @@ -576,6 +575,14 @@ static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag) from_domain = realm; } + if (switch_strlen_zero(register_proxy)) { + register_proxy = proxy; + } + + if (switch_strlen_zero(to_domain)) { + to_domain = proxy; + } + gateway->retry_seconds = atoi(retry_seconds); if (gateway->retry_seconds < 10) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "INVALID: retry_seconds correcting the value to 30\n"); @@ -589,6 +596,7 @@ static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag) if (switch_true(caller_id_in_from)) { switch_set_flag(gateway, REG_FLAG_CALLERID); } + gateway->register_url = switch_core_sprintf(gateway->pool, "sip:%s", register_proxy); gateway->register_from = switch_core_sprintf(gateway->pool, "sip:%s@%s", username, from_domain); gateway->register_contact = switch_core_sprintf(gateway->pool, "sip:%s@%s:%d", extension, profile->extsipip ? profile->extsipip : profile->sipip, profile->sip_port); diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index 7d05816daf..22e715ecbe 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -73,6 +73,7 @@ void sofia_reg_check_gateway(sofia_profile_t *profile, time_t now) case REG_STATE_UNREGISTER: nua_unregister(gateway_ptr->nh, + NUTAG_URL(gateway_ptr->register_url), SIPTAG_FROM_STR(gateway_ptr->register_from), SIPTAG_CONTACT_STR(gateway_ptr->register_contact), SIPTAG_EXPIRES_STR(gateway_ptr->expires_str), @@ -97,6 +98,7 @@ void sofia_reg_check_gateway(sofia_profile_t *profile, time_t now) if (now) { nua_register(gateway_ptr->nh, + NUTAG_URL(gateway_ptr->register_url), SIPTAG_FROM_STR(gateway_ptr->register_from), SIPTAG_CONTACT_STR(gateway_ptr->register_contact), SIPTAG_EXPIRES_STR(gateway_ptr->expires_str), @@ -105,6 +107,7 @@ void sofia_reg_check_gateway(sofia_profile_t *profile, time_t now) gateway_ptr->retry = now + gateway_ptr->retry_seconds; } else { nua_unregister(gateway_ptr->nh, + NUTAG_URL(gateway_ptr->register_url), SIPTAG_FROM_STR(gateway_ptr->register_from), SIPTAG_CONTACT_STR(gateway_ptr->register_contact), SIPTAG_EXPIRES_STR(gateway_ptr->expires_str), @@ -700,7 +703,7 @@ void sofia_reg_handle_sip_r_challenge(int status, goto cancel; } } - + snprintf(authentication, sizeof(authentication), "%s:%s:%s:%s", scheme, realm, gateway->register_username, gateway->register_password); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Authenticating '%s' with '%s'.\n", profile->username, authentication);