diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index a685467a36..df73c0519d 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -48,60 +48,63 @@ switch_status_t sofia_presence_chat_send(char *proto, char *from, char *to, char nua_handle_t *msg_nh; char *contact; - if (to && (user = strdup(to))) { - if ((host = strchr(user, '@'))) { - *host++ = '\0'; - } + if (!to) { + return SWITCH_STATUS_SUCCESS; + } - if (!host || !(profile = sofia_glue_find_profile(host))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, - "Chat proto [%s]\nfrom [%s]\nto [%s]\n%s\nInvalid Profile %s\n", proto, from, to, - body ? body : "[no body]", host ? host : "NULL"); + user = strdup(to); + assert(user); + + if ((host = strchr(user, '@'))) { + *host++ = '\0'; + } + + if (!host || !(profile = sofia_glue_find_profile(host))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + "Chat proto [%s]\nfrom [%s]\nto [%s]\n%s\nInvalid Profile %s\n", proto, from, to, + body ? body : "[no body]", host ? host : "NULL"); + return SWITCH_STATUS_FALSE; + } + + if (!sofia_reg_find_reg_url(profile, user, host, buf, sizeof(buf))) { + return SWITCH_STATUS_FALSE; + } + + if (!strcmp(proto, SOFIA_CHAT_PROTO)) { + from = hint; + } else { + char *fp, *p, *fu = NULL; + fp = strdup(from); + if (!fp) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n"); return SWITCH_STATUS_FALSE; } - if (!sofia_reg_find_reg_url(profile, user, host, buf, sizeof(buf))) { - return SWITCH_STATUS_FALSE; + if ((p = strchr(fp, '@'))) { + *p = '\0'; + fu = strdup(fp); + *p = '+'; } - if (!strcmp(proto, SOFIA_CHAT_PROTO)) { - from = hint; - } else { - char *fp, *p, *fu = NULL; + ffrom = switch_mprintf("\"%s\" ", fu, proto, fp, profile->name); + from = ffrom; + switch_safe_free(fu); + switch_safe_free(fp); + } - if (!(fp = strdup(from))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n"); - return SWITCH_STATUS_FALSE; - } + contact = sofia_glue_get_url_from_contact(buf, 1); + msg_nh = nua_handle(profile->nua, NULL, SIPTAG_FROM_STR(from), NUTAG_URL(contact), SIPTAG_TO_STR(buf), // if this cries, add contact here too, change the 1 to 0 and omit the safe_free + SIPTAG_CONTACT_STR(profile->url), TAG_END()); - if ((p = strchr(fp, '@'))) { - *p = '\0'; - fu = strdup(fp); - *p = '+'; - } + switch_safe_free(contact); - ffrom = switch_mprintf("\"%s\" ", fu, proto, fp, profile->name); - from = ffrom; - switch_safe_free(fu); - switch_safe_free(fp); - } + nua_message(msg_nh, SIPTAG_CONTENT_TYPE_STR("text/html"), SIPTAG_PAYLOAD_STR(body), TAG_END()); - contact = sofia_glue_get_url_from_contact(buf, 1); - msg_nh = nua_handle(profile->nua, NULL, SIPTAG_FROM_STR(from), NUTAG_URL(contact), SIPTAG_TO_STR(buf), // if this cries, add contact here too, change the 1 to 0 and omit the safe_free - SIPTAG_CONTACT_STR(profile->url), TAG_END()); + switch_safe_free(ffrom); + free(user); - switch_safe_free(contact); - - - nua_message(msg_nh, SIPTAG_CONTENT_TYPE_STR("text/html"), SIPTAG_PAYLOAD_STR(body), TAG_END()); - - - switch_safe_free(ffrom); - free(user); - - if (profile) { - switch_thread_rwlock_unlock(profile->rwlock); - } + if (profile) { + switch_thread_rwlock_unlock(profile->rwlock); } return SWITCH_STATUS_SUCCESS; @@ -149,8 +152,6 @@ void sofia_presence_establish_presence(sofia_profile_t *profile) } } - - char *sofia_presence_translate_rpid(char *in, char *ext) { char *r = in; @@ -233,7 +234,6 @@ void sofia_presence_mwi_event_handler(switch_event_t *event) sofia_presence_mwi_callback, profile); - switch_safe_free(sql); switch_safe_free(dup_account); if (profile) { @@ -241,7 +241,6 @@ void sofia_presence_mwi_event_handler(switch_event_t *event) } } - void sofia_presence_event_handler(switch_event_t *event) { sofia_profile_t *profile = NULL; @@ -252,11 +251,9 @@ void sofia_presence_event_handler(switch_event_t *event) char *rpid = switch_event_get_header(event, "rpid"); char *status = switch_event_get_header(event, "status"); char *event_type = switch_event_get_header(event, "event_type"); - //char *event_subtype = switch_event_get_header(event, "event_subtype"); char *sql = NULL; char *euser = NULL, *user = NULL, *host = NULL; - if (rpid && !strcasecmp(rpid, "n/a")) { rpid = NULL; } @@ -304,15 +301,12 @@ void sofia_presence_event_handler(switch_event_t *event) continue; } - sofia_glue_execute_sql_callback(profile, SWITCH_FALSE, profile->ireg_mutex, sql, sofia_presence_sub_callback, profile); - - } switch_mutex_unlock(mod_sofia_globals.hash_mutex); free(sql); @@ -339,12 +333,10 @@ void sofia_presence_event_handler(switch_event_t *event) } else { euser = user; } - } else { return; } - switch (event->event_id) { case SWITCH_EVENT_PRESENCE_PROBE: if (proto) { @@ -374,9 +366,7 @@ void sofia_presence_event_handler(switch_event_t *event) sofia_presence_resub_callback, profile); - sofia_glue_release_profile(profile); - switch_safe_free(sql); } switch_safe_free(user); @@ -413,7 +403,6 @@ void sofia_presence_event_handler(switch_event_t *event) sql, sofia_presence_sub_callback, profile); - } } switch_mutex_unlock(mod_sofia_globals.hash_mutex); @@ -425,7 +414,6 @@ void sofia_presence_event_handler(switch_event_t *event) static int sofia_presence_sub_reg_callback(void *pArg, int argc, char **argv, char **columnNames) { sofia_profile_t *profile = (sofia_profile_t *) pArg; - //char *proto = argv[0]; char *user = argv[1]; char *host = argv[2]; switch_event_t *event; @@ -603,8 +591,6 @@ static int sofia_presence_sub_callback(void *pArg, int argc, char **argv, char * SIPTAG_SUBSCRIPTION_STATE_STR("active;expires=3600"), SIPTAG_EVENT_STR(event), SIPTAG_CONTENT_TYPE_STR("application/pidf+xml"), SIPTAG_PAYLOAD_STR(pl), TAG_END()); - - if (done) { switch_core_hash_delete(profile->sub_hash, call_id); } @@ -621,7 +607,7 @@ static int sofia_presence_mwi_callback(void *pArg, int argc, char **argv, char * { //char *proto = argv[0]; //char *user = argv[1]; - char *host = argv[2]; + //char *host = argv[2]; char *sub_to_user = argv[3]; char *sub_to_host = argv[4]; char *event = argv[5]; @@ -638,7 +624,7 @@ static int sofia_presence_mwi_callback(void *pArg, int argc, char **argv, char * int expire_sec = atoi(expires); if (!(profile = sofia_glue_find_profile(sub_to_host))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find profile for host %s\n", host); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find profile for host %s\n", sub_to_host); return 0; } @@ -658,17 +644,14 @@ static int sofia_presence_mwi_callback(void *pArg, int argc, char **argv, char * SIPTAG_SUBSCRIPTION_STATE_STR(exp), SIPTAG_EVENT_STR(event), SIPTAG_CONTENT_TYPE_STR("application/simple-message-summary"), SIPTAG_PAYLOAD_STR(body), TAG_END()); - switch_safe_free(id); switch_safe_free(exp); sofia_glue_release_profile(profile); - return 0; } - void sofia_presence_handle_sip_i_subscribe(int status, char const *phrase, nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sofia_private_t *sofia_private, sip_t const *sip, tagi_t tags[]) @@ -678,10 +661,9 @@ void sofia_presence_handle_sip_i_subscribe(int status, sip_to_t const *to = sip->sip_to; sip_from_t const *from = sip->sip_from; sip_contact_t const *contact = sip->sip_contact; - char *from_user = NULL; - char *from_host = NULL; - char *to_user = NULL; - char *to_host = NULL; + const char *from_user = NULL, *from_host = NULL; + const char *to_user = NULL, *to_host = NULL; + char *my_to_user = NULL; char *sql, *event = NULL; char *proto = "sip"; char *d_user = NULL; @@ -698,7 +680,6 @@ void sofia_presence_handle_sip_i_subscribe(int status, tl_gets(tags, NUTAG_SUBSTATE_REF(sub_state), TAG_END()); - if (contact) { char *port = (char *) contact->m_url->url_port; @@ -732,13 +713,13 @@ void sofia_presence_handle_sip_i_subscribe(int status, } if (to) { - to_user = (char *) to->a_url->url_user; - to_host = (char *) to->a_url->url_host; + to_user = to->a_url->url_user; + to_host = to->a_url->url_host; } if (sip && sip->sip_from) { - from_user = (char *) sip->sip_from->a_url->url_user; - from_host = (char *) sip->sip_from->a_url->url_host; + from_user = sip->sip_from->a_url->url_user; + from_host = sip->sip_from->a_url->url_host; } else { from_user = "n/a"; from_host = "n/a"; @@ -776,8 +757,9 @@ void sofia_presence_handle_sip_i_subscribe(int status, if (strchr(to_user, '+')) { char *h; if ((proto = (d_user = strdup(to_user)))) { - if ((to_user = strchr(d_user, '+'))) { - *to_user++ = '\0'; + if ((my_to_user = strchr(d_user, '+'))) { + *my_to_user++ = '\0'; + to_user = my_to_user; if ((h = strchr(to_user, '+')) || (h = strchr(to_user, '@'))) { *h++ = '\0'; to_host = h; @@ -791,7 +773,7 @@ void sofia_presence_handle_sip_i_subscribe(int status, } } - call_id = sip->sip_call_id->i_id; //sip_header_as_string(profile->home, (void *) sip->sip_call_id); + call_id = sip->sip_call_id->i_id; event = sip_header_as_string(profile->home, (void *) sip->sip_event); full_from = sip_header_as_string(profile->home, (void *) sip->sip_from); full_via = sip_header_as_string(profile->home, (void *) sip->sip_via); @@ -799,8 +781,6 @@ void sofia_presence_handle_sip_i_subscribe(int status, exp_raw = (sip->sip_expires ? sip->sip_expires->ex_delta : 3600); exp = (long) time(NULL) + exp_raw; - - switch_mutex_lock(profile->ireg_mutex); sql = switch_mprintf("delete from sip_subscriptions where " @@ -827,11 +807,9 @@ void sofia_presence_handle_sip_i_subscribe(int status, sofia_glue_execute_sql(profile, SWITCH_FALSE, sql, NULL); free(sql); - switch_mutex_unlock(profile->ireg_mutex); sstr = switch_mprintf("active;expires=%ld", exp_raw); switch_core_hash_insert(profile->sub_hash, call_id, nh); - } nua_respond(nh, SIP_202_ACCEPTED, @@ -862,12 +840,6 @@ void sofia_presence_handle_sip_i_subscribe(int status, su_free(profile->home, event); } - /* - if (call_id) { - su_free(profile->home, call_id); - } - */ - if (full_from) { su_free(profile->home, full_from); } @@ -975,70 +947,52 @@ void sofia_presence_handle_sip_i_publish(nua_t *nua, sofia_profile_t *profile, n if (event_type) { su_free(profile->home, event_type); } - switch_xml_free(xml); } - } - } - nua_respond(nh, SIP_200_OK, NUTAG_WITH_THIS(nua), TAG_END()); - } void sofia_presence_set_hash_key(char *hash_key, int32_t len, sip_t const *sip) { - - snprintf(hash_key, len, "%s%s%s", (char *) sip->sip_from->a_url->url_user, (char *) sip->sip_from->a_url->url_host, - (char *) sip->sip_to->a_url->url_user); - - -#if 0 - /* nicer one we cant use in both directions >=0 */ - snprintf(hash_key, len, "%s%s%s%s%s%s", - (char *) sip->sip_to->a_url->url_user, - (char *) sip->sip_to->a_url->url_host, - (char *) sip->sip_to->a_url->url_params, - (char *) sip->sip_from->a_url->url_user, (char *) sip->sip_from->a_url->url_host, (char *) sip->sip_from->a_url->url_params); -#endif - + url_t *to = sip->sip_to->a_url; + url_t *from = sip->sip_from->a_url; + snprintf(hash_key, len, "%s%s%s", from->url_user, from->url_host, to->url_user); } - void sofia_presence_handle_sip_i_message(int status, char const *phrase, nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sofia_private_t *sofia_private, sip_t const *sip, tagi_t tags[]) { if (sip) { sip_from_t const *from = sip->sip_from; - char *from_user = NULL; - char *from_host = NULL; + const char *from_user = NULL; + const char *from_host = NULL; sip_to_t const *to = sip->sip_to; - char *to_user = NULL; - char *to_host = NULL; + const char *to_user = NULL; + const char *to_host = NULL; sip_subject_t const *sip_subject = sip->sip_subject; sip_payload_t *payload = sip->sip_payload; const char *subject = "n/a"; char *msg = NULL; if (sip->sip_content_type) { - if (strstr((char *) sip->sip_content_type->c_subtype, "composing")) { + if (strstr(sip->sip_content_type->c_subtype, "composing")) { return; } } if (from) { - from_user = (char *) from->a_url->url_user; - from_host = (char *) from->a_url->url_host; + from_user = from->a_url->url_user; + from_host = from->a_url->url_host; } if (to) { - to_user = (char *) to->a_url->url_user; - to_host = (char *) to->a_url->url_host; + to_user = to->a_url->url_user; + to_host = to->a_url->url_host; } - if (!to_user) { return; } @@ -1074,14 +1028,12 @@ void sofia_presence_handle_sip_i_message(int status, *p = '@'; } } - } else { to_addr = switch_mprintf("%s@%s", to_user, to_host); } from_addr = switch_mprintf("%s@%s", from_user, from_host); - sofia_presence_set_hash_key(hash_key, sizeof(hash_key), sip); if ((tech_pvt = (private_object_t *) switch_core_hash_find(profile->chat_hash, hash_key))) { channel = switch_core_session_get_channel(tech_pvt->session); @@ -1107,7 +1059,6 @@ void sofia_presence_handle_sip_i_message(int status, } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Chat Interface [%s]!\n", proto); } - } switch_safe_free(to_addr); switch_safe_free(from_addr); @@ -1115,7 +1066,6 @@ void sofia_presence_handle_sip_i_message(int status, su_free(profile->home, full_from); } } - } }