diff --git a/kamailio/default.cfg b/kamailio/default.cfg index 9228f4c..13d1a57 100644 --- a/kamailio/default.cfg +++ b/kamailio/default.cfg @@ -411,6 +411,9 @@ route[HANDLE_OPTIONS] route[HANDLE_NOTIFY] { + if (has_totag()) + return; + if (is_method("NOTIFY")) { if (isflagset(FLAG_INTERNALLY_SOURCED)) { if (loose_route()) { @@ -527,6 +530,10 @@ route[HANDLE_IN_DIALOG_REQUESTS] if (is_method("INVITE") && !isflagset(FLAG_INTERNALLY_SOURCED) && is_audio_on_hold()) { setflag(FLAG_ASSOCIATE_USER); } + if ( is_method("NOTIFY") ) { + # Add Record-Route for in-dialog NOTIFY as per RFC 6665. + record_route(); + } route(RELAY); } else if (isflagset(FLAG_INTERNALLY_SOURCED)) { xlog("L_INFO", "$ci|log|relay internally sourced in-dialog message without loose_route\n"); diff --git a/kamailio/presence-role.cfg b/kamailio/presence-role.cfg index 0bea9f0..9393ff3 100644 --- a/kamailio/presence-role.cfg +++ b/kamailio/presence-role.cfg @@ -4,7 +4,7 @@ #!trydef PRESENCE_MAX_EXPIRES 3600 modparam("htable", "htable", "p=>size=32;autoexpire=3600;") -modparam("htable", "htable", "first=>size=32;autoexpire=3600;initval =0;updateexpire=1") +modparam("htable", "htable", "first=>size=32;autoexpire=3600;initval =0;updateexpire=1;") loadmodule "presence.so" loadmodule "presence_dialoginfo.so" @@ -53,6 +53,7 @@ modparam("nat_traversal", "keepalive_state_file", "KAZOO_DATA_DIR/keep_alive_sta modparam("nat_traversal", "keepalive_interval", 45) #!endif +kazoo.presence_sync_amqp = 0 descr "sync subscriptions to amqp" #!ifdef FAST_PICKUP_ROLE #!include_file "fast-pickup-role.cfg" @@ -88,11 +89,17 @@ route[HANDLE_SUBSCRIBE] route(PRESENCE_NAT); #!endif + if(has_totag()) { + loose_route(); + } + + record_route(); + if (!t_newtran()) { sl_reply_error(); exit; } - + if(has_totag()) { route(HANDLE_RESUBSCRIBE); } else { @@ -106,8 +113,7 @@ route[HANDLE_SUBSCRIBE] route[HANDLE_RESUBSCRIBE] { - loose_route(); - + if(handle_subscribe()) { if($subs(remote_cseq) < 5) { $sht(first=>$subs(callid)) = $null; @@ -151,8 +157,6 @@ route[HANDLE_NEW_SUBSCRIBE] } } - record_route(); - if (handle_subscribe()) { route(SUBSCRIBE_AMQP); xlog("L_INFO","$ci|end|new $hdr(Event) subscription from $fU to $tU in realm $fd : $sht(first=>$ci) : $sht(first=>$fU::$tU::$fd::$hdr(Event))\n"); @@ -167,9 +171,11 @@ route[HANDLE_NEW_SUBSCRIBE] route[SUBSCRIBE_AMQP] { - $var(rk) = "subscribe." + $(subs(to_domain){kz.encode}) + "." + $(subs(to_user){kz.encode}); - $var(amqp_payload_request) = $_s({"Event-Category" : "presence", "Event-Name" : "subscription", "Event-Package" : "$hdr(event)", "Expires" : $subs(expires), "Queue" : "BLF-MY_HOSTNAME", "Server-ID" : "BLF-MY_HOSTNAME" , "Contact" : "$(ct{s.escape.common}{s.replace,\','}{s.replace,$$,})", "Call-ID" : "$ci", "From" : "$fu", "User" : "$subs(uri)", "User-Agent" : "$(ua{s.escape.common}{s.replace,\','}{s.replace,$$,})" }); - kazoo_publish("omnipresence", "$var(rk)", $var(amqp_payload_request)); + if(@cfg_get.kazoo.presence_sync_amqp == 1) { + $var(rk) = "subscribe." + $(subs(to_domain){kz.encode}) + "." + $(subs(to_user){kz.encode}); + $var(amqp_payload_request) = $_s({"Event-Category" : "presence", "Event-Name" : "subscription", "Event-Package" : "$hdr(event)", "Expires" : $subs(expires), "Queue" : "BLF-MY_HOSTNAME", "Server-ID" : "BLF-MY_HOSTNAME" , "Contact" : "$(ct{s.escape.common}{s.replace,\','}{s.replace,$$,})", "Call-ID" : "$ci", "From" : "$fu", "User" : "$subs(uri)", "User-Agent" : "$(ua{s.escape.common}{s.replace,\','}{s.replace,$$,})" }); + kazoo_publish("omnipresence", "$var(rk)", $var(amqp_payload_request)); + } } route[HANDLE_PUBLISH] diff --git a/kamailio/presence_notify_sync-role.cfg b/kamailio/presence_notify_sync-role.cfg index 56f9425..da44700 100644 --- a/kamailio/presence_notify_sync-role.cfg +++ b/kamailio/presence_notify_sync-role.cfg @@ -4,7 +4,7 @@ kazoo.presence_notify_log_body = 0 descr "logs the body sent in the notification kazoo.presence_notify_log_resp_body = 0 descr "logs the body received from notification" kazoo.presence_notify_log_to_table = 1 descr "logs notify/reply to active_watchers_log table" kazoo.presence_notify_log_to_amqp = 0 descr "logs notify/reply to amqp" -kazoo.presence_notify_record_route = 0 descr "add record route header to notify msg sent" +kazoo.presence_notify_record_route = 1 descr "add record route header to notify msg sent" kazoo.presence_notify_log_init_body = 0 descr "logs the body before its sent" kazoo.presence_notify_force_send_socket = 0 descr "forces the send socket to the contact" @@ -53,6 +53,7 @@ event_route[presence:notify-reply] if($notify_reply($rs) == 200) { $sht(notify=>$ci) = $null; + $sht(notify=>$ci::count) = 0; xlog("L_INFO", "$ci|end|notified $subs(watcher_username)@$subs(watcher_domain) on behalf of $subs(pres_uri)\n"); } else if($notify_reply($rs) == 481 && $subs(reason) == "timeout") { xlog("L_INFO","$ci|end|sent subscription $hdr(Subscription-State)\n"); diff --git a/kamailio/presence_query-role.cfg b/kamailio/presence_query-role.cfg index 2b9364d..ac087cc 100644 --- a/kamailio/presence_query-role.cfg +++ b/kamailio/presence_query-role.cfg @@ -47,7 +47,7 @@ route[PRESENCE_SEARCH_SUMMARY] } xlog("L_DEBUG", "$ci| RESULT \"Subscriptions\" : { $var(Subs) }\n"); - $var(amqp_payload_request) = '{"Event-Category" : "presence", "Event-Name" : "search_resp", "Msg-ID" : "$(kzE{kz.json,Msg-ID})", "Subscriptions" : { $var(Subs) } }'; + $var(amqp_payload_request) = $_s({"Event-Category" : "presence", "Event-Name" : "search_resp", "Msg-ID" : "$(kzE{kz.json,Msg-ID})", "Subscriptions" : { $var(Subs) } }); kazoo_publish("targeted", "$var(Queue)", $var(amqp_payload_request)); }