From 864a15d79957c2dc395f4161b773dd5c258b9bc5 Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Mon, 12 Jul 2021 19:08:38 +0200 Subject: [PATCH] sip: origin: Explicitly include contact header for sofia > 1.13 Fixes #304 --- plugins/sip/calls-sip-origin.c | 56 ++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/plugins/sip/calls-sip-origin.c b/plugins/sip/calls-sip-origin.c index 847317b..091383c 100644 --- a/plugins/sip/calls-sip-origin.c +++ b/plugins/sip/calls-sip-origin.c @@ -40,6 +40,7 @@ #include #include +#include #include #include #include @@ -70,6 +71,8 @@ enum { }; static GParamSpec *props[PROP_LAST_PROP]; +static gboolean set_contact_header = FALSE; + struct _CallsSipOrigin { GObject parent_instance; @@ -77,6 +80,7 @@ struct _CallsSipOrigin CallsSipContext *ctx; nua_t *nua; CallsSipHandles *oper; + char *contact_header; /* Needed for sofia SIP >= 1.13 */ /* Direct connection mode is useful for debugging purposes */ gboolean use_direct_connection; @@ -231,6 +235,7 @@ add_call (CallsSipOrigin *self, SOATAG_AF (SOA_AF_IP4_IP6), SOATAG_USER_SDP_STR (local_sdp), SIPTAG_TO_STR (address), + TAG_IF (!!self->contact_header, SIPTAG_CONTACT_STR (self->contact_header)), SOATAG_RTP_SORT (SOA_RTP_SORT_REMOTE), SOATAG_RTP_SELECT (SOA_RTP_SELECT_ALL), TAG_END ()); @@ -457,6 +462,7 @@ sip_r_register (int status, if (status == 200) { g_debug ("REGISTER successful"); origin->state = CALLS_ACCOUNT_ONLINE; + nua_get_params (nua, TAG_ANY (), TAG_END()); } else if (status == 401 || status == 407) { sip_authenticate (origin, nh, sip); @@ -598,6 +604,35 @@ sip_i_state (int status, } +static void +sip_r_get_params (int status, + char const *phrase, + nua_t *nua, + CallsSipOrigin *origin, + nua_handle_t *nh, + CallsSipHandles *op, + sip_t const *sip, + tagi_t tags[]) +{ + tagi_t *from = NULL; + const char *from_str = NULL; + + g_debug ("response to get_params: %03d %s", status, phrase); + + if (!set_contact_header) + return; + + if ((status != 200) || ((from = tl_find (tags, siptag_from_str)) == NULL)) { + g_warning ("Could not find 'siptag_from_tag' among the tags"); + return; + } + + from_str = (const char *) from->t_value; + g_free (origin->contact_header); + origin->contact_header = g_strdup (from_str); +} + + static void sip_callback (nua_event_t event, int status, @@ -694,6 +729,17 @@ sip_callback (nua_event_t event, tags); break; + case nua_r_get_params: + sip_r_get_params (status, + phrase, + nua, + origin, + nh, + op, + sip, + tags); + break; + case nua_r_set_params: g_debug ("response to set_params: %03d %s", status, phrase); break; @@ -1134,6 +1180,16 @@ calls_sip_origin_constructed (GObject *object) { CallsSipOrigin *self = CALLS_SIP_ORIGIN (object); g_autoptr (GError) error = NULL; + int major = 0; + int minor = 0; + int patch = 0; + + if (sscanf (SOFIA_SIP_VERSION, "%d.%d.%d", &major, &minor, &patch) == 3) { + if (major > 2 || (major == 1 && minor >= 13)) { + /* Sofia 1.13 does no longer include the contact header by default, see #304 */ + set_contact_header = TRUE; + } + } if (!init_sip_account (self, &error)) { g_warning ("Error initializing the SIP account: %s", error->message);