From 782c47214608c6c39e0f3aa9baaaca662166c26a Mon Sep 17 00:00:00 2001 From: ihusejnovic Date: Mon, 25 Nov 2019 11:21:43 +0100 Subject: [PATCH 1/7] SIP plugin: headers on incoming events --- plugins/janus_sip.c | 104 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 96 insertions(+), 8 deletions(-) diff --git a/plugins/janus_sip.c b/plugins/janus_sip.c index 233df18517..8bb3e7d912 100644 --- a/plugins/janus_sip.c +++ b/plugins/janus_sip.c @@ -119,6 +119,7 @@ "proxy" : "", "outbound_proxy" : "", "headers" : "", + "incoming_header_prefixes" : "", "refresh" : ", "master_id" : } @@ -205,6 +206,7 @@ "call_id" : "", "result" : { "event" : "ringing", + "headers" : "" } } \endverbatim @@ -220,7 +222,8 @@ "call_id" : "", "result" : { "event" : "accepted", - "username" : "" + "username" : "", + "headers" : "" } } \endverbatim @@ -241,7 +244,8 @@ "call_id" : "", "result" : { "event" : "progress", - "username" : "" + "username" : "", + "headers" : "" } } \endverbatim @@ -282,7 +286,8 @@ "displayname" : "", "referred_by" : "", "replaces" : "", - "srtp" : "" + "srtp" : "", + "headers" : "" } } \endverbatim @@ -387,7 +392,8 @@ "event" : "message", "sender" : "", "displayname" : "", - "content" : "" + "content" : "", + "headers" : "" } } \endverbatim @@ -414,7 +420,8 @@ "sender" : "", "displayname" : "", "type" : "", - "content" : "" + "content" : "", + "headers" : "" } } \endverbatim @@ -444,7 +451,8 @@ "notify" : "", "substate" : "", "content-type" : "" - "content" : "" + "content" : "", + "headers" : "" } } \endverbatim @@ -560,7 +568,8 @@ "refer_id" : , "refer_to" : "", "referred_by" : "", - "replaces" : "" + "replaces" : "", + "headers" : "" } } \endverbatim @@ -961,6 +970,7 @@ typedef struct janus_sip_session { janus_refcount ref; janus_mutex mutex; char *hangup_reason_header; + GList *incoming_header_prefixes; } janus_sip_session; static GHashTable *sessions; static GHashTable *identities; @@ -1070,6 +1080,10 @@ static void janus_sip_session_free(const janus_refcount *session_ref) { g_free(session->hangup_reason_header); session->hangup_reason_header = NULL; } + if(session->incoming_header_prefixes) { + g_list_free_full(session->incoming_header_prefixes, g_free); + session->incoming_header_prefixes = NULL; + } janus_sip_srtp_cleanup(session); g_free(session); } @@ -1383,6 +1397,28 @@ static void janus_sip_remove_quotes(char *str) { } } +static json_t *janus_sip_get_incoming_headers(const sip_t *sip, const janus_sip_session *session) { + json_t *headers = json_object(); + if (!sip) { + return headers; + } + sip_unknown_t *unknown_header = sip->sip_unknown; + while (unknown_header != NULL) { + GList *temp = session->incoming_header_prefixes; + while (temp != NULL) { + char *header_prefix = (char *) temp->data; + if (strncmp(unknown_header->un_name, header_prefix, strlen(header_prefix)) == 0) { + const char *header_name = g_strdup(unknown_header->un_name); + json_object_set(headers, header_name, json_string(unknown_header->un_value)); + break; + } + temp = temp->next; + } + unknown_header = unknown_header->un_next; + } + return headers; +} + /* Error codes */ #define JANUS_SIP_ERROR_UNKNOWN_ERROR 499 #define JANUS_SIP_ERROR_NO_MESSAGE 440 @@ -2671,7 +2707,19 @@ static void *janus_sip_handler(void *data) { g_hash_table_insert(masters, GUINT_TO_POINTER(session->master_id), session); janus_mutex_unlock(&sessions_mutex); } - /* If this is a refresh, get rid of the old values */ + + json_t *header_prefixes_json = json_object_get(root, "incoming_header_prefixes"); + if(header_prefixes_json && json_is_array(header_prefixes_json)) { + size_t index; + json_t *value; + + json_array_foreach(header_prefixes_json, index, value) { + const char *header_prefix = g_strdup(json_string_value(value)); + session->incoming_header_prefixes = g_list_append(session->incoming_header_prefixes, header_prefix); + } + } + + /* If this is a refresh, get rid of the old values */ if(refresh) { /* Cleanup old values */ if(session->account.identity != NULL) { @@ -4424,6 +4472,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, if(sip->sip_from && sip->sip_from->a_display) { json_object_set_new(calling, "displayname", json_string(sip->sip_from->a_display)); } + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(calling, "headers", headers); + } char *referred_by = NULL; if(sip->sip_referred_by && sip->sip_referred_by->b_url) { char *rby_text = url_as_string(session->stack->s_home, sip->sip_referred_by->b_url); @@ -4542,6 +4594,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, json_object_set_new(result, "replaces", json_string(replaces)); g_free(replaces); } + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(result, "headers", headers); + } su_free(session->stack->s_home, refer_to); if(custom_headers != NULL) su_free(session->stack->s_home, custom_headers); @@ -4574,6 +4630,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, } json_object_set_new(result, "type", json_string(type)); json_object_set_new(result, "content", json_string(payload)); + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(result, "headers", headers); + } json_object_set_new(info, "result", result); int ret = gateway->push_event(session->handle, &janus_sip_plugin, session->transaction, info, NULL); JANUS_LOG(LOG_VERB, " >> Pushing event to peer: %d (%s)\n", ret, janus_get_api_error(ret)); @@ -4604,6 +4664,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, json_object_set_new(result, "displayname", json_string(sip->sip_from->a_display)); } json_object_set_new(result, "content", json_string(payload)); + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(result, "headers", headers); + } json_object_set_new(message, "result", result); int ret = gateway->push_event(session->handle, &janus_sip_plugin, session->transaction, message, NULL); JANUS_LOG(LOG_VERB, " >> Pushing event to peer: %d (%s)\n", ret, janus_get_api_error(ret)); @@ -4640,6 +4704,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, if(sip->sip_content_type != NULL) json_object_set_new(result, "content-type", json_string(sip->sip_content_type->c_type)); json_object_set_new(result, "content", json_string(sip->sip_payload->pl_data)); + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(result, "headers", headers); + } json_object_set_new(notify, "result", result); int ret = gateway->push_event(session->handle, &janus_sip_plugin, session->transaction, notify, NULL); JANUS_LOG(LOG_VERB, " >> Pushing event to peer: %d (%s)\n", ret, janus_get_api_error(ret)); @@ -4727,6 +4795,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, json_object_set_new(ringing, "sip", json_string("event")); json_t *result = json_object(); json_object_set_new(result, "event", json_string("ringing")); + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(result, "headers", headers); + } json_object_set_new(ringing, "result", result); json_object_set_new(ringing, "call_id", json_string(session->callid)); int ret = gateway->push_event(session->handle, &janus_sip_plugin, session->transaction, ringing, NULL); @@ -4934,6 +5006,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, json_object_set_new(calling, "username", json_string(session->callee)); if(is_focus) json_object_set_new(calling, "isfocus", json_true()); + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(calling, "headers", headers); + } json_object_set_new(call, "result", calling); json_object_set_new(call, "call_id", json_string(session->callid)); int ret = gateway->push_event(session->handle, &janus_sip_plugin, session->transaction, call, jsep); @@ -5096,6 +5172,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, json_object_set_new(result, "event", json_string("registration_failed")); json_object_set_new(result, "code", json_integer(status)); json_object_set_new(result, "reason", json_string(phrase ? phrase : "")); + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(result, "headers", headers); + } json_object_set_new(event, "result", result); int ret = gateway->push_event(session->handle, &janus_sip_plugin, session->transaction, event, NULL); JANUS_LOG(LOG_VERB, " >> Pushing event to peer: %d (%s)\n", ret, janus_get_api_error(ret)); @@ -5120,6 +5200,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, json_t *result = json_object(); json_object_set_new(result, "event", json_string("subscribe_succeeded")); json_object_set_new(result, "code", json_integer(status)); + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(result, "headers", headers); + } json_object_set_new(result, "reason", json_string(phrase ? phrase : "")); json_object_set_new(event, "result", result); int ret = gateway->push_event(session->handle, &janus_sip_plugin, session->transaction, event, NULL); @@ -5186,6 +5270,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, json_object_set_new(result, "event", json_string("subscribe_failed")); json_object_set_new(result, "code", json_integer(status)); json_object_set_new(result, "reason", json_string(phrase ? phrase : "")); + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(result, "headers", headers); + } json_object_set_new(event, "result", result); int ret = gateway->push_event(session->handle, &janus_sip_plugin, session->transaction, event, NULL); JANUS_LOG(LOG_VERB, " >> Pushing event to peer: %d (%s)\n", ret, janus_get_api_error(ret)); From 071d30aac06f68fccf0d689915809c13e54b1dd2 Mon Sep 17 00:00:00 2001 From: ihusejnovic Date: Mon, 25 Nov 2019 11:25:46 +0100 Subject: [PATCH 2/7] Fixed formatting --- plugins/janus_sip.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/plugins/janus_sip.c b/plugins/janus_sip.c index 8bb3e7d912..3028840c0e 100644 --- a/plugins/janus_sip.c +++ b/plugins/janus_sip.c @@ -2708,18 +2708,18 @@ static void *janus_sip_handler(void *data) { janus_mutex_unlock(&sessions_mutex); } - json_t *header_prefixes_json = json_object_get(root, "incoming_header_prefixes"); - if(header_prefixes_json && json_is_array(header_prefixes_json)) { - size_t index; - json_t *value; - - json_array_foreach(header_prefixes_json, index, value) { - const char *header_prefix = g_strdup(json_string_value(value)); - session->incoming_header_prefixes = g_list_append(session->incoming_header_prefixes, header_prefix); - } - } + json_t *header_prefixes_json = json_object_get(root, "incoming_header_prefixes"); + if(header_prefixes_json && json_is_array(header_prefixes_json)) { + size_t index; + json_t *value; + + json_array_foreach(header_prefixes_json, index, value) { + const char *header_prefix = g_strdup(json_string_value(value)); + session->incoming_header_prefixes = g_list_append(session->incoming_header_prefixes, header_prefix); + } + } - /* If this is a refresh, get rid of the old values */ + /* If this is a refresh, get rid of the old values */ if(refresh) { /* Cleanup old values */ if(session->account.identity != NULL) { From 24c8be0a5a8f873cdecfe3333c6c5477fb001405 Mon Sep 17 00:00:00 2001 From: ihusejnovic Date: Mon, 25 Nov 2019 18:48:55 +0100 Subject: [PATCH 3/7] Fixed formatting and minor issues --- plugins/janus_sip.c | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/plugins/janus_sip.c b/plugins/janus_sip.c index 3028840c0e..3385793501 100644 --- a/plugins/janus_sip.c +++ b/plugins/janus_sip.c @@ -704,7 +704,8 @@ static struct janus_json_parameter register_parameters[] = { {"user_agent", JSON_STRING, 0}, {"headers", JSON_OBJECT, 0}, {"master_id", JANUS_JSON_INTEGER, 0}, - {"refresh", JANUS_JSON_BOOL, 0} + {"refresh", JANUS_JSON_BOOL, 0}, + {"incoming_header_prefixes", JSON_ARRAY, 0} }; static struct janus_json_parameter subscribe_parameters[] = { {"to", JSON_STRING, 0}, @@ -1399,24 +1400,24 @@ static void janus_sip_remove_quotes(char *str) { static json_t *janus_sip_get_incoming_headers(const sip_t *sip, const janus_sip_session *session) { json_t *headers = json_object(); - if (!sip) { + if(!sip) return headers; + sip_unknown_t *unknown_header = sip->sip_unknown; + while(unknown_header != NULL) { + GList *temp = session->incoming_header_prefixes; + while(temp != NULL) { + char *header_prefix = (char *) temp->data; + if(header_prefix != NULL && unknown_header->un_name != NULL) + if(strncmp(unknown_header->un_name, header_prefix, strlen(header_prefix)) == 0) { + const char *header_name = g_strdup(unknown_header->un_name); + json_object_set(headers, header_name, json_string(unknown_header->un_value)); + break; + } + temp = temp->next; + } + unknown_header = unknown_header->un_next; } - sip_unknown_t *unknown_header = sip->sip_unknown; - while (unknown_header != NULL) { - GList *temp = session->incoming_header_prefixes; - while (temp != NULL) { - char *header_prefix = (char *) temp->data; - if (strncmp(unknown_header->un_name, header_prefix, strlen(header_prefix)) == 0) { - const char *header_name = g_strdup(unknown_header->un_name); - json_object_set(headers, header_name, json_string(unknown_header->un_value)); - break; - } - temp = temp->next; - } - unknown_header = unknown_header->un_next; - } - return headers; + return headers; } /* Error codes */ @@ -2709,13 +2710,14 @@ static void *janus_sip_handler(void *data) { } json_t *header_prefixes_json = json_object_get(root, "incoming_header_prefixes"); - if(header_prefixes_json && json_is_array(header_prefixes_json)) { + if(header_prefixes_json) { size_t index; json_t *value; json_array_foreach(header_prefixes_json, index, value) { - const char *header_prefix = g_strdup(json_string_value(value)); - session->incoming_header_prefixes = g_list_append(session->incoming_header_prefixes, header_prefix); + const char *header_prefix = json_string_value(value); + if(header_prefix) + session->incoming_header_prefixes = g_list_append(session->incoming_header_prefixes, g_strdup(header_prefix)); } } From 7342c99833f3043ace28b139e6f25bd44aa166e5 Mon Sep 17 00:00:00 2001 From: ihusejnovic Date: Tue, 26 Nov 2019 12:48:03 +0100 Subject: [PATCH 4/7] Added brackets --- plugins/janus_sip.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/janus_sip.c b/plugins/janus_sip.c index 3385793501..e181532e50 100644 --- a/plugins/janus_sip.c +++ b/plugins/janus_sip.c @@ -1407,12 +1407,13 @@ static json_t *janus_sip_get_incoming_headers(const sip_t *sip, const janus_sip_ GList *temp = session->incoming_header_prefixes; while(temp != NULL) { char *header_prefix = (char *) temp->data; - if(header_prefix != NULL && unknown_header->un_name != NULL) + if(header_prefix != NULL && unknown_header->un_name != NULL) { if(strncmp(unknown_header->un_name, header_prefix, strlen(header_prefix)) == 0) { const char *header_name = g_strdup(unknown_header->un_name); json_object_set(headers, header_name, json_string(unknown_header->un_value)); break; } + } temp = temp->next; } unknown_header = unknown_header->un_next; From d1f8967d571f9437e76c44e84cd5953b032e5337 Mon Sep 17 00:00:00 2001 From: ihusejnovic Date: Tue, 26 Nov 2019 12:52:49 +0100 Subject: [PATCH 5/7] Fixed formatting after master merge --- plugins/janus_sip.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/janus_sip.c b/plugins/janus_sip.c index 6a277ef10c..0e78de3cc4 100644 --- a/plugins/janus_sip.c +++ b/plugins/janus_sip.c @@ -120,7 +120,7 @@ "outbound_proxy" : "", "headers" : "", "contact_params" : "", - "incoming_header_prefixes" : "", + "incoming_header_prefixes" : "", "refresh" : ", "master_id" : } From 2fa82d4f697346fe36405b9de28a7bfefafa3af5 Mon Sep 17 00:00:00 2001 From: ihusejnovic Date: Tue, 26 Nov 2019 17:03:20 +0100 Subject: [PATCH 6/7] Minor fixes, doc updated --- plugins/janus_sip.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/plugins/janus_sip.c b/plugins/janus_sip.c index 0e78de3cc4..5f2a10413d 100644 --- a/plugins/janus_sip.c +++ b/plugins/janus_sip.c @@ -120,7 +120,7 @@ "outbound_proxy" : "", "headers" : "", "contact_params" : "", - "incoming_header_prefixes" : "", + "incoming_header_prefixes" : "", "refresh" : ", "master_id" : } @@ -207,7 +207,7 @@ "call_id" : "", "result" : { "event" : "ringing", - "headers" : "" + "headers" : "" } } \endverbatim @@ -224,7 +224,7 @@ "result" : { "event" : "accepted", "username" : "", - "headers" : "" + "headers" : "" } } \endverbatim @@ -246,7 +246,7 @@ "result" : { "event" : "progress", "username" : "", - "headers" : "" + "headers" : "" } } \endverbatim @@ -288,7 +288,7 @@ "referred_by" : "", "replaces" : "", "srtp" : "", - "headers" : "" + "headers" : "" } } \endverbatim @@ -394,7 +394,7 @@ "sender" : "", "displayname" : "", "content" : "", - "headers" : "" + "headers" : "" } } \endverbatim @@ -422,7 +422,7 @@ "displayname" : "", "type" : "", "content" : "", - "headers" : "" + "headers" : "" } } \endverbatim @@ -453,7 +453,7 @@ "substate" : "", "content-type" : "" "content" : "", - "headers" : "" + "headers" : "" } } \endverbatim @@ -570,7 +570,7 @@ "refer_to" : "", "referred_by" : "", "replaces" : "", - "headers" : "" + "headers" : "" } } \endverbatim @@ -1410,7 +1410,7 @@ static json_t *janus_sip_get_incoming_headers(const sip_t *sip, const janus_sip_ while(temp != NULL) { char *header_prefix = (char *) temp->data; if(header_prefix != NULL && unknown_header->un_name != NULL) { - if(strncmp(unknown_header->un_name, header_prefix, strlen(header_prefix)) == 0) { + if(strncasecmp(unknown_header->un_name, header_prefix, strlen(header_prefix)) == 0) { const char *header_name = g_strdup(unknown_header->un_name); json_object_set(headers, header_name, json_string(unknown_header->un_value)); break; @@ -2747,8 +2747,8 @@ static void *janus_sip_handler(void *data) { json_t *header_prefixes_json = json_object_get(root, "incoming_header_prefixes"); if(header_prefixes_json) { - size_t index; - json_t *value; + size_t index = 0; + json_t *value = NULL; json_array_foreach(header_prefixes_json, index, value) { const char *header_prefix = json_string_value(value); From 43ca1bfa5e5ab7ca8e1bf1119f37f59a3729a375 Mon Sep 17 00:00:00 2001 From: ihusejnovic Date: Tue, 26 Nov 2019 23:00:30 +0100 Subject: [PATCH 7/7] Updated doc for headers --- plugins/janus_sip.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/janus_sip.c b/plugins/janus_sip.c index 5f2a10413d..b30b8f7ed3 100644 --- a/plugins/janus_sip.c +++ b/plugins/janus_sip.c @@ -207,7 +207,7 @@ "call_id" : "", "result" : { "event" : "ringing", - "headers" : "" + "headers" : "" } } \endverbatim @@ -224,7 +224,7 @@ "result" : { "event" : "accepted", "username" : "", - "headers" : "" + "headers" : "" } } \endverbatim @@ -246,7 +246,7 @@ "result" : { "event" : "progress", "username" : "", - "headers" : "" + "headers" : "" } } \endverbatim @@ -288,7 +288,7 @@ "referred_by" : "", "replaces" : "", "srtp" : "", - "headers" : "" + "headers" : "" } } \endverbatim @@ -394,7 +394,7 @@ "sender" : "", "displayname" : "", "content" : "", - "headers" : "" + "headers" : "" } } \endverbatim @@ -422,7 +422,7 @@ "displayname" : "", "type" : "", "content" : "", - "headers" : "" + "headers" : "" } } \endverbatim @@ -453,7 +453,7 @@ "substate" : "", "content-type" : "" "content" : "", - "headers" : "" + "headers" : "" } } \endverbatim @@ -570,7 +570,7 @@ "refer_to" : "", "referred_by" : "", "replaces" : "", - "headers" : "" + "headers" : "" } } \endverbatim