From c58b659f3f989584d5d7fcf1517793d7165bde19 Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Thu, 1 Apr 2021 03:37:10 +0300 Subject: [PATCH] [Core] Add new switch_channel_set_variable_strip_quotes API, cleanup mod_sofia. --- src/include/switch_channel.h | 3 +++ src/mod/endpoints/mod_sofia/sofia.c | 32 ++-------------------- src/switch_channel.c | 42 +++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 30 deletions(-) diff --git a/src/include/switch_channel.h b/src/include/switch_channel.h index 3786d4583c..6692ceaa7f 100644 --- a/src/include/switch_channel.h +++ b/src/include/switch_channel.h @@ -278,6 +278,8 @@ SWITCH_DECLARE(switch_status_t) switch_channel_get_log_tags(switch_channel_t *ch SWITCH_DECLARE(switch_status_t) switch_channel_set_variable_var_check(switch_channel_t *channel, const char *varname, const char *value, switch_bool_t var_check); +SWITCH_DECLARE(switch_status_t) switch_channel_set_variable_strip_quotes_var_check(switch_channel_t *channel, + const char *varname, const char *value, switch_bool_t var_check); SWITCH_DECLARE(switch_status_t) switch_channel_add_variable_var_check(switch_channel_t *channel, const char *varname, const char *value, switch_bool_t var_check, switch_stack_t stack); SWITCH_DECLARE(switch_status_t) switch_channel_set_variable_printf(switch_channel_t *channel, const char *varname, const char *fmt, ...); @@ -295,6 +297,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_transfer_variable_prefix(switch_c #define switch_channel_set_variable_safe(_channel, _var, _val) switch_channel_set_variable_var_check(_channel, _var, _val, SWITCH_FALSE) #define switch_channel_set_variable(_channel, _var, _val) switch_channel_set_variable_var_check(_channel, _var, _val, SWITCH_TRUE) +#define switch_channel_set_variable_strip_quotes(_channel, _var, _val) switch_channel_set_variable_strip_quotes_var_check(_channel, _var, _val, SWITCH_TRUE) #define switch_channel_set_variable_partner(_channel, _var, _val) switch_channel_set_variable_partner_var_check(_channel, _var, _val, SWITCH_TRUE) diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index fec5997f08..82b912341b 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -201,24 +201,6 @@ static const char *_url_set_chanvars(switch_core_session_t *session, url_t *url, return uri; } -static char *strip_quotes(const char *in) -{ - char *t = (char *) in; - char *r = (char *) in; - - if (t && *t == '"') { - t++; - - if (end_of(t) == '"') { - r = strdup(t); - switch_assert(r); - end_of(r) = '\0'; - } - } - - return r; -} - static void extract_header_vars(sofia_profile_t *profile, sip_t const *sip, switch_core_session_t *session, nua_handle_t *nh) { @@ -324,12 +306,8 @@ static void extract_header_vars(sofia_profile_t *profile, sip_t const *sip, } if (sip->sip_from) { - char *p = strip_quotes(sip->sip_from->a_display); + switch_channel_set_variable_strip_quotes(channel, "sip_from_display", sip->sip_from->a_display); - if (p) { - switch_channel_set_variable(channel, "sip_from_display", p); - } - if (p != sip->sip_from->a_display) free(p); if ((full = sip_header_as_string(nua_handle_get_home(nh), (void *) sip->sip_from))) { switch_channel_set_variable(channel, "sip_full_from", full); su_free(nua_handle_get_home(nh), full); @@ -337,13 +315,7 @@ static void extract_header_vars(sofia_profile_t *profile, sip_t const *sip, } if (sip->sip_to) { - char *p = strip_quotes(sip->sip_to->a_display); - - if (p) { - switch_channel_set_variable(channel, "sip_to_display", p); - } - - if (p != sip->sip_to->a_display) free(p); + switch_channel_set_variable_strip_quotes(channel, "sip_to_display", sip->sip_to->a_display); if ((full = sip_header_as_string(nua_handle_get_home(nh), (void *) sip->sip_to))) { switch_channel_set_variable(channel, "sip_full_to", full); diff --git a/src/switch_channel.c b/src/switch_channel.c index 1beeaef4c4..9ce2fdc52e 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -1496,6 +1496,48 @@ SWITCH_DECLARE(switch_status_t) switch_channel_set_variable_var_check(switch_cha return status; } +SWITCH_DECLARE(switch_status_t) switch_channel_set_variable_strip_quotes_var_check(switch_channel_t *channel, + const char *varname, const char *value, switch_bool_t var_check) +{ + switch_status_t status = SWITCH_STATUS_FALSE; + + switch_assert(channel != NULL); + + switch_mutex_lock(channel->profile_mutex); + if (channel->variables && !zstr(varname)) { + if (zstr(value)) { + switch_event_del_header(channel->variables, varname); + } else { + int ok = 1; + char *t = (char *)value; + char *r = (char *)value; + + if (t && *t == '"') { + t++; + if (end_of(t) == '"') { + r = strdup(t); + switch_assert(r); + end_of(r) = '\0'; + } + } + + if (var_check) { + ok = !switch_string_var_check_const(r); + } + if (ok) { + switch_event_add_header_string(channel->variables, SWITCH_STACK_BOTTOM, varname, r); + } else { + switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_CRIT, "Invalid data (${%s} contains a variable)\n", varname); + } + + if (r != value) free(r); + } + status = SWITCH_STATUS_SUCCESS; + } + switch_mutex_unlock(channel->profile_mutex); + + return status; +} SWITCH_DECLARE(switch_status_t) switch_channel_add_variable_var_check(switch_channel_t *channel, const char *varname, const char *value, switch_bool_t var_check, switch_stack_t stack)