From 78c2ed0526e25c10241ceb918e73aef02446ffd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Wed, 8 Jun 2016 19:01:31 +0200 Subject: [PATCH] FS-9241 Use tls_public_url instead of tls_url in INVITE Contact when NAT is detected --- src/mod/endpoints/mod_sofia/mod_sofia.h | 1 + src/mod/endpoints/mod_sofia/sofia.c | 10 ++----- src/mod/endpoints/mod_sofia/sofia_glue.c | 37 ++++++++++++++++++------ 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index 512f239eb4..70ef0dd241 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -1028,6 +1028,7 @@ void sofia_presence_set_chat_hash(private_object_t *tech_pvt, sip_t const *sip); switch_status_t sofia_on_hangup(switch_core_session_t *session); char *sofia_glue_get_url_from_contact(char *buf, uint8_t to_dup); char *sofia_glue_get_path_from_contact(char *buf); +char *sofia_glue_get_profile_url(sofia_profile_t *profile, char *remote_ip, const sofia_transport_t transport); void sofia_presence_set_hash_key(char *hash_key, int32_t len, sip_t const *sip); void sofia_glue_sql_close(sofia_profile_t *profile, time_t prune); int sofia_glue_init_sql(sofia_profile_t *profile); diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 811a45d753..49eb3eff8e 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -10046,11 +10046,9 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia user, ipv6 ? "[" : "", host, ipv6 ? "]" : "", port, sofia_glue_transport2str(transport)); if (sofia_glue_check_nat(profile, tech_pvt->mparams.remote_ip)) { - url = (sofia_glue_transport_has_tls(transport)) ? profile->tls_public_url : profile->public_url; check_nat = 1; - } else { - url = (sofia_glue_transport_has_tls(transport)) ? profile->tls_url : profile->url; } + url = sofia_glue_get_profile_url(profile, tech_pvt->mparams.remote_ip, transport); if (!url) { if (check_nat) { @@ -10085,11 +10083,7 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia } else { const char *url = NULL; - if (sofia_glue_check_nat(profile, tech_pvt->mparams.remote_ip)) { - url = (sofia_glue_transport_has_tls(transport)) ? profile->tls_public_url : profile->public_url; - } else { - url = (sofia_glue_transport_has_tls(transport)) ? profile->tls_url : profile->url; - } + url = sofia_glue_get_profile_url(profile, tech_pvt->mparams.remote_ip, transport); if (url) { const char *brackets = NULL; diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index eaad00a2a1..9fc7a60a70 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -931,15 +931,7 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session) ipv6 ? "[" : "", ip_addr, ipv6 ? "]" : "", tech_pvt->profile->extsipport); } } else { - if (sofia_glue_transport_has_tls(tech_pvt->transport)) { - tech_pvt->invite_contact = tech_pvt->profile->tls_url; - } else { - if (!zstr(tech_pvt->mparams.remote_ip) && sofia_glue_check_nat(tech_pvt->profile, tech_pvt->mparams.remote_ip)) { - tech_pvt->invite_contact = tech_pvt->profile->public_url; - } else { - tech_pvt->invite_contact = tech_pvt->profile->url; - } - } + sofia_glue_get_profile_url(tech_pvt->profile, tech_pvt->mparams.remote_ip, tech_pvt->transport); } } @@ -3105,6 +3097,33 @@ void sofia_glue_clear_soa(switch_core_session_t *session, switch_bool_t partner) } +char *sofia_glue_get_profile_url(sofia_profile_t *profile, char *remote_ip, const sofia_transport_t transport) +{ + char *url = NULL; + int check_nat = 0; + + if (!zstr(remote_ip) && sofia_glue_check_nat(profile, remote_ip)) { + check_nat = 1; + } + + if (sofia_glue_transport_has_tls(transport)) { + if (check_nat && profile->tls_public_url) { + url = profile->tls_public_url; + } else { + url = profile->tls_url; + } + } else { + if (check_nat && profile->public_url) { + url = profile->public_url; + } else { + url = profile->url; + } + } + + if (!url) url = profile->url; + + return url; +} /* For Emacs: * Local Variables: