]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[Core] Add new switch_channel_set_variable_strip_quotes API, cleanup mod_sofia.
authorAndrey Volk <andywolk@gmail.com>
Thu, 1 Apr 2021 00:37:10 +0000 (03:37 +0300)
committerAndrey Volk <andywolk@gmail.com>
Tue, 19 Oct 2021 17:45:07 +0000 (20:45 +0300)
src/include/switch_channel.h
src/mod/endpoints/mod_sofia/sofia.c
src/switch_channel.c

index 3786d4583c8f1907e85a69bbcceb50560f8143d7..6692ceaa7f76b080f6f11d0c3298281e49f63e92 100644 (file)
@@ -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)
 
 
index fec5997f08f89698f7028151b0270ae0ad2e4a1a..82b912341ba334c148cecf950d8bcc11c976698a 100644 (file)
@@ -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);
index 1beeaef4c40a928d7da33c7ba05796b5d78ed59e..9ce2fdc52ef955d41396dba22548f1bc1ea2c163 100644 (file)
@@ -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)