diff --git a/src/include/switch_ivr.h b/src/include/switch_ivr.h index ba5ad7011b..7a8d9e6603 100644 --- a/src/include/switch_ivr.h +++ b/src/include/switch_ivr.h @@ -934,6 +934,9 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_say_ip(switch_core_session_t *session switch_input_args_t *args); SWITCH_DECLARE(switch_status_t) switch_ivr_set_user(switch_core_session_t *session, const char *data); +SWITCH_DECLARE(switch_status_t) switch_ivr_set_user_xml(switch_core_session_t *session, const char *prefix, + const char *user, const char *domain, switch_xml_t x_user); + SWITCH_DECLARE(switch_status_t) switch_ivr_sound_test(switch_core_session_t *session); SWITCH_DECLARE(void) switch_process_import(switch_core_session_t *session, switch_channel_t *peer_channel, const char *varname, const char *prefix); SWITCH_DECLARE(switch_bool_t) switch_ivr_uuid_exists(const char *uuid); diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index f1fadd2475..cfd14aba4d 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -1000,7 +1000,7 @@ void sofia_reg_auth_challenge(sofia_profile_t *profile, nua_handle_t *nh, sofia_ auth_res_t sofia_reg_parse_auth(sofia_profile_t *profile, sip_authorization_t const *authorization, sip_t const *sip, sofia_dispatch_event_t *de, const char *regstr, char *np, size_t nplen, char *ip, switch_event_t **v_event, - long exptime, sofia_regtype_t regtype, const char *to_user, switch_event_t **auth_params, long *reg_count); + long exptime, sofia_regtype_t regtype, const char *to_user, switch_event_t **auth_params, long *reg_count, switch_xml_t *user_xml); void sofia_reg_handle_sip_r_challenge(int status, @@ -1047,7 +1047,7 @@ switch_call_cause_t sofia_glue_sip_cause_to_freeswitch(int status); void sofia_glue_do_xfer_invite(switch_core_session_t *session); uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sip_t const *sip, sofia_dispatch_event_t *de, - sofia_regtype_t regtype, char *key, uint32_t keylen, switch_event_t **v_event, const char *is_nat); + sofia_regtype_t regtype, char *key, uint32_t keylen, switch_event_t **v_event, const char *is_nat, switch_xml_t *user_xml); extern switch_endpoint_interface_t *sofia_endpoint_interface; 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); diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index cea456958a..5fc8b5b1a1 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -1109,7 +1109,7 @@ static void our_sofia_event_callback(nua_event_t event, sofia_glue_get_addr(de->data->e_msg, network_ip, sizeof(network_ip), NULL); auth_res = sofia_reg_parse_auth(profile, authorization, sip, de, (char *) sip->sip_request->rq_method_name, tech_pvt->key, strlen(tech_pvt->key), network_ip, NULL, 0, - REG_INVITE, NULL, NULL, NULL); + REG_INVITE, NULL, NULL, NULL, NULL); } if ((auth_res != AUTH_OK && auth_res != AUTH_RENEWED)) { @@ -7692,6 +7692,7 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia char network_ip[80]; char proxied_client_ip[80]; switch_event_t *v_event = NULL; + switch_xml_t x_user = NULL; uint32_t sess_count = switch_core_session_count(); uint32_t sess_max = switch_core_session_limit(0); int is_auth = 0, calling_myself = 0; @@ -7925,10 +7926,15 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia if (!strcmp(network_ip, profile->sipip) && network_port == profile->sip_port) { calling_myself++; } else { - if (sofia_reg_handle_register(nua, profile, nh, sip, de, REG_INVITE, key, sizeof(key), &v_event, NULL)) { + + if (sofia_reg_handle_register(nua, profile, nh, sip, de, REG_INVITE, key, sizeof(key), &v_event, NULL, &x_user)) { + if (v_event) { switch_event_destroy(&v_event); } + if (x_user) { + switch_xml_free(x_user); + } if (sip->sip_authorization || sip->sip_proxy_authorization) { goto fail; @@ -8006,15 +8012,6 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia switch_channel_set_variable(channel, "sip_looped_call", "true"); } - if (v_event) { - switch_event_header_t *hp; - - for (hp = v_event->headers; hp; hp = hp->next) { - switch_channel_set_variable(channel, hp->name, hp->value); - } - switch_event_destroy(&v_event); - } - if (sip->sip_from && sip->sip_from->a_url) { from_user = sip->sip_from->a_url->url_user; from_host = sip->sip_from->a_url->url_host; @@ -8761,6 +8758,25 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia switch_channel_set_caller_profile(channel, tech_pvt->caller_profile); } + if (x_user) { + const char *user = NULL, *domain = NULL; + + if (v_event) { + user = switch_event_get_header(v_event, "username"); + domain = switch_event_get_header(v_event, "domain_name"); + } + + printf("W00t!!!!\n"); + switch_ivr_set_user_xml(session, NULL, user, domain, x_user); + switch_xml_free(x_user); + x_user = NULL; + } + + if (v_event) { + switch_event_destroy(&v_event); + } + + tech_pvt->sofia_private = sofia_private; tech_pvt->nh = nh; diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index 4c2f436f87..640544e7d9 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -4475,8 +4475,8 @@ void sofia_presence_handle_sip_i_message(int status, sofia_glue_get_addr(de->data->e_msg, network_ip, sizeof(network_ip), NULL); auth_res = sofia_reg_parse_auth(profile, authorization, sip, de, (char *) sip->sip_request->rq_method_name, key, keylen, network_ip, NULL, 0, - REG_INVITE, NULL, NULL, NULL); - } else if ( sofia_reg_handle_register(nua, profile, nh, sip, de, REG_INVITE, key, keylen, &v_event, NULL)) { + REG_INVITE, NULL, NULL, NULL, NULL); + } else if ( sofia_reg_handle_register(nua, profile, nh, sip, de, REG_INVITE, key, keylen, &v_event, NULL, NULL)) { if (v_event) { switch_event_destroy(&v_event); } diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index 3487b4f0fc..e195a1cbae 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -1073,8 +1073,8 @@ static int debounce_check(sofia_profile_t *profile, const char *user, const char uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sip_t const *sip, - sofia_dispatch_event_t *de, sofia_regtype_t regtype, char *key, - uint32_t keylen, switch_event_t **v_event, const char *is_nat) + sofia_dispatch_event_t *de, sofia_regtype_t regtype, char *key, + uint32_t keylen, switch_event_t **v_event, const char *is_nat, switch_xml_t *user_xml) { sip_to_t const *to = NULL; sip_from_t const *from = NULL; @@ -1301,7 +1301,7 @@ uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_hand const char *username = "unknown"; const char *realm = reg_host; if ((auth_res = sofia_reg_parse_auth(profile, authorization, sip, de, sip->sip_request->rq_method_name, - key, keylen, network_ip, v_event, exptime, regtype, to_user, &auth_params, ®_count)) == AUTH_STALE) { + key, keylen, network_ip, v_event, exptime, regtype, to_user, &auth_params, ®_count, user_xml)) == AUTH_STALE) { stale = 1; } @@ -2012,7 +2012,9 @@ void sofia_reg_handle_sip_i_register(nua_t *nua, sofia_profile_t *profile, nua_h is_nat = NULL; } - sofia_reg_handle_register(nua, profile, nh, sip, de, type, key, sizeof(key), &v_event, is_nat); + + sofia_reg_handle_register(nua, profile, nh, sip, de, type, key, sizeof(key), &v_event, is_nat, NULL); + if (v_event) { switch_event_destroy(&v_event); @@ -2319,7 +2321,7 @@ auth_res_t sofia_reg_parse_auth(sofia_profile_t *profile, size_t nplen, char *ip, switch_event_t **v_event, - long exptime, sofia_regtype_t regtype, const char *to_user, switch_event_t **auth_params, long *reg_count) + long exptime, sofia_regtype_t regtype, const char *to_user, switch_event_t **auth_params, long *reg_count, switch_xml_t *user_xml) { int indexnum; const char *cur; @@ -2743,7 +2745,7 @@ auth_res_t sofia_reg_parse_auth(sofia_profile_t *profile, skip_auth: if (first && (ret == AUTH_OK || ret == AUTH_RENEWED)) { - if (v_event) { + if (!v_event) { switch_event_create_plain(v_event, SWITCH_EVENT_REQUEST_PARAMS); } @@ -2875,7 +2877,11 @@ auth_res_t sofia_reg_parse_auth(sofia_profile_t *profile, switch_event_destroy(¶ms); if (user) { - switch_xml_free(user); + if (user_xml) { + *user_xml = user; + } else { + switch_xml_free(user); + } } switch_safe_free(input); diff --git a/src/switch_ivr.c b/src/switch_ivr.c index ba4ad8bead..80b099dc93 100644 --- a/src/switch_ivr.c +++ b/src/switch_ivr.c @@ -3188,36 +3188,18 @@ static const char *get_prefixed_str(char *buffer, size_t buffer_size, const char return buffer; } -SWITCH_DECLARE(switch_status_t) switch_ivr_set_user(switch_core_session_t *session, const char *data) +SWITCH_DECLARE(switch_status_t) switch_ivr_set_user_xml(switch_core_session_t *session, const char *prefix, + const char *user, const char *domain, switch_xml_t x_user) { - switch_xml_t x_domain, xml = NULL, x_user, x_param, x_params, x_group = NULL; - char *user, *number_alias, *domain; + switch_xml_t x_params, x_param; + char *number_alias; switch_channel_t *channel = switch_core_session_get_channel(session); switch_status_t status = SWITCH_STATUS_FALSE; - char *prefix_buffer = NULL, *prefix; + char *prefix_buffer = NULL; size_t buffer_size = 0; size_t prefix_size = 0; - if (zstr(data)) { - goto error; - } - user = switch_core_session_strdup(session, data); - - if ((prefix = strchr(user, ' '))) { - *prefix++ = 0; - } - - if (!(domain = strchr(user, '@'))) { - goto error; - } - - *domain++ = '\0'; - - if (switch_xml_locate_user("id", user, domain, NULL, &xml, &x_domain, &x_user, &x_group, NULL) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "can't find user [%s@%s]\n", user, domain); - goto done; - } status = SWITCH_STATUS_SUCCESS; @@ -3231,50 +3213,6 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_set_user(switch_core_session_t *sessi switch_channel_set_variable(channel, get_prefixed_str(prefix_buffer, buffer_size, prefix, prefix_size, "number_alias"), number_alias); } - if ((x_params = switch_xml_child(x_domain, "variables"))) { - for (x_param = switch_xml_child(x_params, "variable"); x_param; x_param = x_param->next) { - const char *var = switch_xml_attr(x_param, "name"); - const char *val = switch_xml_attr(x_param, "value"); - - if (var && val) { - switch_channel_set_variable(channel, get_prefixed_str(prefix_buffer, buffer_size, prefix, prefix_size, var), val); - } - } - } - - if ((x_params = switch_xml_child(x_domain, "profile-variables"))) { - for (x_param = switch_xml_child(x_params, "variable"); x_param; x_param = x_param->next) { - const char *var = switch_xml_attr(x_param, "name"); - const char *val = switch_xml_attr(x_param, "value"); - - if (var && val) { - switch_channel_set_profile_var(channel, get_prefixed_str(prefix_buffer, buffer_size, prefix, prefix_size, var), val); - } - } - } - - if (x_group && (x_params = switch_xml_child(x_group, "variables"))) { - for (x_param = switch_xml_child(x_params, "variable"); x_param; x_param = x_param->next) { - const char *var = switch_xml_attr(x_param, "name"); - const char *val = switch_xml_attr(x_param, "value"); - - if (var && val) { - switch_channel_set_variable(channel, get_prefixed_str(prefix_buffer, buffer_size, prefix, prefix_size, var), val); - } - } - } - - if ((x_params = switch_xml_child(x_group, "profile-variables"))) { - for (x_param = switch_xml_child(x_params, "variable"); x_param; x_param = x_param->next) { - const char *var = switch_xml_attr(x_param, "name"); - const char *val = switch_xml_attr(x_param, "value"); - - if (var && val) { - switch_channel_set_profile_var(channel, get_prefixed_str(prefix_buffer, buffer_size, prefix, prefix_size, var), val); - } - } - } - if ((x_params = switch_xml_child(x_user, "variables"))) { for (x_param = switch_xml_child(x_params, "variable"); x_param; x_param = x_param->next) { const char *var = switch_xml_attr(x_param, "name"); @@ -3297,17 +3235,55 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_set_user(switch_core_session_t *sessi } } - switch_channel_set_variable(channel, get_prefixed_str(prefix_buffer, buffer_size, prefix, prefix_size, "user_name"), user); - switch_channel_set_variable(channel, get_prefixed_str(prefix_buffer, buffer_size, prefix, prefix_size, "domain_name"), domain); + if (user && domain) { + switch_channel_set_variable(channel, get_prefixed_str(prefix_buffer, buffer_size, prefix, prefix_size, "user_name"), user); + switch_channel_set_variable(channel, get_prefixed_str(prefix_buffer, buffer_size, prefix, prefix_size, "domain_name"), domain); + } + return status; +} + +SWITCH_DECLARE(switch_status_t) switch_ivr_set_user(switch_core_session_t *session, const char *data) +{ + switch_xml_t x_user; + char *user, *domain; + switch_status_t status = SWITCH_STATUS_FALSE; + + char *prefix; + + if (zstr(data)) { + goto error; + } + + user = switch_core_session_strdup(session, data); + + if ((prefix = strchr(user, ' '))) { + *prefix++ = 0; + } + + if (!(domain = strchr(user, '@'))) { + goto error; + } + + *domain++ = '\0'; + + + if (switch_xml_locate_user_merged("id", user, domain, NULL, &x_user, NULL) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "can't find user [%s@%s]\n", user, domain); + goto done; + } + + status = switch_ivr_set_user_xml(session, prefix, user, domain, x_user); + goto done; error: switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "No user@domain specified.\n"); done: - if (xml) { - switch_xml_free(xml); + + if (x_user) { + switch_xml_free(x_user); } return status; diff --git a/src/switch_xml.c b/src/switch_xml.c index c13e33bea4..369f88e2c1 100644 --- a/src/switch_xml.c +++ b/src/switch_xml.c @@ -1919,8 +1919,10 @@ SWITCH_DECLARE(void) switch_xml_merge_user(switch_xml_t user, switch_xml_t domai do_merge(user, group, "params", "param"); do_merge(user, group, "variables", "variable"); + do_merge(user, group, "profile-variables", "variable"); do_merge(user, domain, "params", "param"); do_merge(user, domain, "variables", "variable"); + do_merge(user, domain, "profile-variables", "variable"); } SWITCH_DECLARE(uint32_t) switch_xml_clear_user_cache(const char *key, const char *user_name, const char *domain_name)