]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix double sessions on auth challenged calls
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 29 Aug 2012 15:38:37 +0000 (10:38 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Wed, 29 Aug 2012 15:38:37 +0000 (10:38 -0500)
src/include/switch_core.h
src/include/switch_types.h
src/mod/endpoints/mod_sofia/sofia.c
src/switch_core_session.c
src/switch_core_state_machine.c

index ad7969bd62efb1481fabdbc3a3a4f01df5be19ea..50ec7a965e4dc50488a77670b3e387098a2cba65 100644 (file)
@@ -673,6 +673,7 @@ SWITCH_DECLARE(switch_size_t) switch_core_session_get_id(_In_ switch_core_sessio
   \return the total number of allocated sessions since core startup
 */
 SWITCH_DECLARE(switch_size_t) switch_core_session_id(void);
+SWITCH_DECLARE(switch_size_t) switch_core_session_id_dec(void);
 
 /*! 
   \brief Allocate and return a new session from the core based on a given endpoint module name
index b35f33eb1953ac562de600d5363d61f691c77318..690f9f5bde1cc7cc636a73fba47e42a8dcd55e13 100644 (file)
@@ -1241,6 +1241,7 @@ typedef enum {
        CF_RECOVERING_BRIDGE,
        CF_TRACKED,
        CF_TRACKABLE,
+       CF_NO_CDR,
        /* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
        /* IF YOU ADD NEW ONES CHECK IF THEY SHOULD PERSIST OR ZERO THEM IN switch_core_session.c switch_core_session_request_xml() */
        CF_FLAG_MAX
index 6d790ce738b99e4d39af0bbf95d59b967f0aacc5..63aa6c5379ca24d51bc6e8c8aef164fdc6a91283 100644 (file)
@@ -1658,6 +1658,20 @@ void sofia_event_callback(nua_event_t event,
        uint32_t sess_max = switch_core_session_limit(0);
 
        switch(event) {
+       case nua_i_terminated:
+               if (status > 300 && sofia_private && sofia_private->uuid) {
+                       switch_core_session_t *session;
+
+                       if ((session = switch_core_session_force_locate(sofia_private->uuid))) {
+                               switch_channel_t *channel = switch_core_session_get_channel(session);
+                               switch_channel_set_flag(channel, CF_NO_CDR);
+                               switch_channel_hangup(channel, status == 403 ? SWITCH_CAUSE_BEARERCAPABILITY_NOTAVAIL : SWITCH_CAUSE_BEARERCAPABILITY_NOTAUTH);
+                               switch_core_session_rwunlock(session);
+                               switch_core_session_id_dec();
+                       }
+
+               }
+               break;
        case nua_i_invite:
        case nua_i_register:
        case nua_i_options:
@@ -1718,8 +1732,20 @@ void sofia_event_callback(nua_event_t event,
                }
 
                if (session) {
+                       const char *channel_name = NULL;
                        private_object_t *tech_pvt = sofia_glue_new_pvt(session);
-                       sofia_glue_attach_private(session, profile, tech_pvt, NULL);
+
+                       if (sip->sip_from) {
+                               channel_name = url_set_chanvars(session, sip->sip_from->a_url, sip_from);
+                       }
+                       if (!channel_name && sip->sip_contact && sip->sip_contact->m_url) {
+                               channel_name = url_set_chanvars(session, sip->sip_contact->m_url, sip_contact);
+                       }
+                       if (sip->sip_referred_by) {
+                               channel_name = url_set_chanvars(session, sip->sip_referred_by->b_url, sip_referred_by);
+                       }
+
+                       sofia_glue_attach_private(session, profile, tech_pvt, channel_name);
 
                } else {
                        nua_respond(nh, 503, "Maximum Calls In Progress", SIPTAG_RETRY_AFTER_STR("300"), TAG_END());
@@ -8016,7 +8042,7 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia
        sip_call_info_t *call_info = NULL;
        private_object_t *tech_pvt = NULL;
        switch_channel_t *channel = NULL;
-       const char *channel_name = NULL;
+       //const char *channel_name = NULL;
        const char *displayname = NULL;
        const char *destination_number = NULL;
        const char *from_user = NULL, *from_host = NULL;
@@ -8323,7 +8349,7 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia
        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;
-               channel_name = url_set_chanvars(session, sip->sip_from->a_url, sip_from);
+               //channel_name = url_set_chanvars(session, sip->sip_from->a_url, sip_from);
 
                if (sip->sip_from->a_url->url_params) {
                        aniii = switch_find_parameter(sip->sip_from->a_url->url_params, "isup-oli", switch_core_session_get_pool(session));
@@ -8550,16 +8576,13 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia
        }
 
        if (sip->sip_contact && sip->sip_contact->m_url) {
-               const char *contact_uri = url_set_chanvars(session, sip->sip_contact->m_url, sip_contact);
-               if (!channel_name) {
-                       channel_name = contact_uri;
-               }
+               url_set_chanvars(session, sip->sip_contact->m_url, sip_contact);
        }
 
        if (sip->sip_referred_by) {
                referred_by_user = sip->sip_referred_by->b_url->url_user;
                //referred_by_host = sip->sip_referred_by->b_url->url_host;
-               channel_name = url_set_chanvars(session, sip->sip_referred_by->b_url, sip_referred_by);
+               //channel_name = url_set_chanvars(session, sip->sip_referred_by->b_url, sip_referred_by);
 
                check_decode(referred_by_user, session);
 
@@ -8578,7 +8601,7 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia
                }
        }
 
-       sofia_glue_set_name(tech_pvt, channel_name);
+       //sofia_glue_set_name(tech_pvt, channel_name);
        sofia_glue_tech_prepare_codecs(tech_pvt);
 
        switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "INBOUND CALL");
index 61d82169b3480b6138ce8163d2a38a4e0b2296cb..1f499c14597a7586497344e66ce4557728765ba7 100644 (file)
@@ -2130,6 +2130,14 @@ SWITCH_DECLARE(switch_size_t) switch_core_session_get_id(switch_core_session_t *
        return session->id;
 }
 
+SWITCH_DECLARE(switch_size_t) switch_core_session_id_dec(void)
+{
+       switch_mutex_lock(runtime.session_hash_mutex);
+       session_manager.session_id--;
+       switch_mutex_unlock(runtime.session_hash_mutex);
+       return session_manager.session_id;
+}
+
 SWITCH_DECLARE(switch_size_t) switch_core_session_id(void)
 {
        return session_manager.session_id;
index b33fec00e5924be866f0f5c98c61f7593ebe1c21..b830a41d6a5ed4c1d965e36e68139dd15b8b8ae5 100644 (file)
@@ -697,6 +697,11 @@ SWITCH_DECLARE(void) switch_core_session_reporting_state(switch_core_session_t *
                }
        }
 
+       if (switch_channel_test_flag(session->channel, CF_NO_CDR)) {
+               do_extra_handlers = 0;
+       }
+
+
        STATE_MACRO(reporting, "REPORTING");
 
        if ((hook_var = switch_channel_get_variable(session->channel, SWITCH_API_REPORTING_HOOK_VARIABLE))) {