From e2f19675c0f031da2714e00c8ee0e5217169341f Mon Sep 17 00:00:00 2001 From: Luis Azedo Date: Sat, 8 Jun 2019 00:11:36 +0100 Subject: [PATCH] backport of #100 --- kamailio/auth.cfg | 44 ++++++++++++++++------- kamailio/default.cfg | 60 +++++++------------------------ kamailio/defs.cfg | 1 + kamailio/message-role.cfg | 51 ++++++++++++++++++++++++-- kamailio/nodes-role.cfg | 12 +++++-- kamailio/presence-fast-pickup.cfg | 6 +++- kamailio/presence-role.cfg | 14 ++++---- 7 files changed, 114 insertions(+), 74 deletions(-) diff --git a/kamailio/auth.cfg b/kamailio/auth.cfg index aca5bec..ffa5c32 100644 --- a/kamailio/auth.cfg +++ b/kamailio/auth.cfg @@ -30,6 +30,25 @@ route[AUTH_HEADERS] } +route[AUTH_HEADERS_JSON] +{ + xavp_params_implode("hf", "$var(outx)"); + $var(out) = $(var(outx){re.subst,/^(.*);$$/\1/}); + $var(c) = $(var(out){param.count}); + $var(headers_json) = ""; + $var(sep) = ""; + xlog("L_DEBUG", "$ci|auth|headers $var(c) => $var(out) => $var(outx)\n"); + while($var(c) > 0) { + $var(idx) = $var(c) - 1; + xlog("L_DEBUG", "$ci|auth|adding $(var(out){param.name,$var(idx)}): $(var(out){param.valueat,$var(idx)}{s.unescape.param})\n"); + append_hf("$(var(out){param.name,$var(idx)}): $(var(out){param.valueat,$var(idx)}{s.unescape.param})\r\n"); + $var(headers_json) = $_s($var(headers_json)$var(sep)"$(var(out){param.name,$var(idx)})" : "$(var(out){param.valueat,$var(idx)}{s.unescape.param})"); + $var(c) = $var(c) - 1; + $var(sep) = " , "; + } + $var(headers_json) = $_s({ $var(headers_json) }); +} + route[SETUP_AUTH_HEADERS] { @@ -37,11 +56,18 @@ route[SETUP_AUTH_HEADERS] $xavp(hf[0]=>X-AUTH-PORT) = $sp; #!ifdef REGISTRAR_ROLE + + $avp(is_registred) = "false"; + $xavp(regcfg=>match_received) = $su; + if (registered("location","$fu", 2, 1) != 1) return; + + $avp(is_registred) = "true"; #!ifdef WITH_AUTH_TOKEN route(AUTH_TOKEN); #!else route(AUTH_CCVS); #!endif + #!endif } @@ -50,23 +76,17 @@ route[SETUP_AUTH_HEADERS] route[AUTH_TOKEN] { - $xavp(regcfg=>match_received) = $su; - if (registered("location","$fu", 2, 1) == 1) { - if($(xavp(ulattrs=>token){s.len}) > 0) { - $xavp(hf[0]=>X-AUTH-Token) = $xavp(ulattrs=>token); - } else { - if($(xavp(ulattrs=>Authorizing-ID){s.len}) > 0 && $(xavp(ulattrs=>Account-ID){s.len})) { - $xavp(hf[0]=>X-AUTH-Token) = $_s($(xavp(ulattrs=>custom_channel_vars){kz.json,Authorizing-ID})@$(xavp(ulattrs=>custom_channel_vars){kz.json,Account-ID})); - } - } + if($(xavp(ulattrs=>token){s.len}) > 0) { + $xavp(hf[0]=>X-AUTH-Token) = $xavp(ulattrs=>token); + } else { + if($(xavp(ulattrs=>Authorizing-ID){s.len}) > 0 && $(xavp(ulattrs=>Account-ID){s.len})) { + $xavp(hf[0]=>X-AUTH-Token) = $_s($(xavp(ulattrs=>custom_channel_vars){kz.json,Authorizing-ID})@$(xavp(ulattrs=>custom_channel_vars){kz.json,Account-ID})); + } } } route[AUTH_CCVS] { - $xavp(regcfg=>match_received) = $su; - if (registered("location","$fu", 2, 1) != 1) return; - if($(xavp(ulattrs=>custom_channel_vars){kz.json,Account-ID}{s.len}) > 0) $xavp(hf[0]=>X-ecallmgr_Account-ID) = $(xavp(ulattrs=>custom_channel_vars){kz.json,Account-ID}); diff --git a/kamailio/default.cfg b/kamailio/default.cfg index 72b12a7..b1fb648 100644 --- a/kamailio/default.cfg +++ b/kamailio/default.cfg @@ -36,7 +36,7 @@ debug = KAZOO_LOG_LEVEL memdbg = 10 memlog = L_BUG corelog = L_ERR -mem_summary = 0 +mem_summary = KZ_MEM_SUMMARY log_stderror = no log_facility = LOG_LOCAL0 log_name="kamailio" @@ -327,13 +327,22 @@ route route(SIP_TRACE); #!endif + route_if_exists("CUSTOM_START_ROUTES"); + route(HANDLE_NOTIFY); #!ifdef AUTHORIZATION_ROLE route(AUTHORIZATION_CHECK); #!endif + #!ifdef MESSAGE_ROLE route(HANDLE_MESSAGE); + #!else + if (is_method("MESSAGE")) { + sl_send_reply("405", "Method Not Allowed"); + exit; + } + #!endif #!ifdef PRESENCE_ROLE route(HANDLE_SUBSCRIBE); @@ -486,48 +495,6 @@ route[HANDLE_NOTIFY] exit; } -route[HANDLE_MESSAGE] -{ - #!ifdef MESSAGE_ROLE - if (is_method("MESSAGE")) { - xlog("L_INFO", "$ci|MESSAGE from $fu to $tu\n"); - if (isflagset(FLAG_INTERNALLY_SOURCED) || src_ip == myself) { - xlog("L_INFO", "$ci| routing MESSAGE to external from $fu to $tu\n"); - if (registered("location")) { - lookup("location"); - xlog("L_INFO", "$ci|log|routing to $ruid\n"); - } - #!ifdef TRAFFIC_FILTER_ROLE - } else if (!isflagset(FLAG_TRUSTED_SOURCE) - && $rd =~ "[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3}\.[0-9]{1,3}") { - xlog("L_WARN", "$ci|end|dropping MESSAGE request with IP domain\n"); - exit(); - #!endif - } else { - xlog("L_WARN", "$ci|end|MESSAGE $hdr(Content-Type)\n"); - if( $hdr(Content-Type) == "application/im-iscomposing+xml" ) { - xlog("L_WARN", "$ci|end|dropping MESSAGE application/im-iscomposing+xml\n"); - sl_send_reply("200", "OK"); - } else if( $hdr(Content-Type) == "message/imdn+xml" ) { - xlog("L_WARN", "$ci|end|dropping MESSAGE message/imdn+xml\n"); - sl_send_reply("202", "Accepted"); - } else { - route(DISPATCHER_FIND_ROUTES); - } - } - route(RELAY); - } - #!else - if (is_method("MESSAGE")) { - if (!isflagset(FLAG_INTERNALLY_SOURCED)) { - sl_send_reply("202", "delivered to /dev/null"); - exit(); - } - route(RELAY); - } - #!endif -} - route[HANDLE_REFER] { if (!is_method("REFER")) { @@ -691,7 +658,7 @@ branch_route[MANAGE_BRANCH] { #!endif route(BRANCH_HEADERS); - + route_if_exists("CUSTOM_BRANCH_HEADERS"); } route[RELAY] @@ -702,10 +669,6 @@ route[RELAY] if (isflagset(FLAG_INTERNALLY_SOURCED)) { route(INTERNAL_TO_EXTERNAL_RELAY); - #!ifdef MESSAGE_ROLE - } else if (is_method("MESSAGE") && src_ip == myself) { - route(INTERNAL_TO_EXTERNAL_RELAY); - #!endif } else { route(EXTERNAL_TO_INTERNAL_RELAY); } @@ -1000,5 +963,6 @@ route[LOCAL_REQUEST] exit; } +#!import_file "custom-routes.cfg" # vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab diff --git a/kamailio/defs.cfg b/kamailio/defs.cfg index 753828b..4a19595 100644 --- a/kamailio/defs.cfg +++ b/kamailio/defs.cfg @@ -27,6 +27,7 @@ #!trydef PV_BUFFER_SIZE 16384 #!trydef PV_BUFFER_SLOTS 30 +#!trydef KZ_MEM_SUMMARY 0 #!trydef KZ_DB_MODULE kazoo #!substdef "!KAMAILIO_DBMS!$def(KZ_DB_MODULE)!g" diff --git a/kamailio/message-role.cfg b/kamailio/message-role.cfg index 1122a1e..53e5cdb 100644 --- a/kamailio/message-role.cfg +++ b/kamailio/message-role.cfg @@ -1,5 +1,52 @@ modparam("htable", "htable", "msg=>size=32;autoexpire=60;") +route[HANDLE_MESSAGE] +{ + if (!is_method("MESSAGE")) return; + + xlog("L_INFO", "$ci|log|MESSAGE from $fu to $tu\n"); + if (isflagset(FLAG_INTERNALLY_SOURCED) || src_ip == myself) { + xlog("L_INFO", "$ci| routing MESSAGE to external from $fu to $tu\n"); + if (registered("location")) { + lookup("location"); + xlog("L_INFO", "$ci|log|routing to $ruid\n"); + } else { + xlog("L_INFO", "$ci|end|user is not registered\n"); + append_to_reply("$def(AOR_NOT_SUBSCRIBED_REASON)\r\n"); + sl_send_reply("410", "Not registered"); + exit; + } + } else { + route(AUTH); + $xavp(regcfg=>match_received) = $su; + if($avp(is_registred) != "true") { + sl_send_reply("403", "Forbidden"); + exit; + } else { + if($hdr(Content-Type) == "text/plain") { + route(MESSAGE_INBOUND); + } else { + xlog("L_WARN", "$ci|end|dropping MESSAGE $hdr(Content-Type)\n"); + sl_send_reply("200", "OK"); + exit; + } + } + } +} + +route[MESSAGE_INBOUND] +{ + route(AUTH_HEADERS_JSON); + $var(Payload) = $_s({"Event-Category" : "message", "Event-Name" : "inbound", "Call-ID" : "$ci", "Message-ID" : "$ci", "Route-Type" : "on-net", "Route-ID" : "sip", "From" : "$fU@$fd", "To" : "$tU@$td", "Request" : "$rU@$rd", "Caller-ID-Number" : "$fU", "Callee-ID-Number" : "$tU", "Body" : "$rb", "Custom-SIP-Headers" : $var(headers_json), "Msg-ID" : "$uuid(g)"}); + + $var(exchange) = "sms"; + $var(RoutingKey) = $_s(message.inbound.sip.$(ci{kz.encode})); + xlog("L_INFO", "$ci|msg|sending inbound message $var(RoutingKey) => $var(Payload)\n"); + kazoo_publish($var(exchange), $var(RoutingKey), $var(Payload)); + sl_send_reply("200", "OK"); + exit; + +} event_route[kazoo:consumer-event-message-route] { @@ -39,7 +86,7 @@ route[MESSAGE_REPLY] $var(Result) = "Success"; } - $var(Payload) = '{ "Event-Category" : "message", "Event-Name" : "delivery", "Call-ID" : "$(sht(msg=>$ci){kz.json,Call-ID})", "Message-ID" : "$(sht(msg=>$ci){kz.json,Message-ID})" , "Delivery-Result-Code" : "sip:$T_reply_code", "Msg-ID" : "$(sht(msg=>$ci){kz.json,Msg-ID})" , "Status" : "$var(Result)"}'; + $var(Payload) = $_s({ "Event-Category" : "message", "Event-Name" : "delivery", "Call-ID" : "$(sht(msg=>$ci){kz.json,Call-ID})", "Message-ID" : "$(sht(msg=>$ci){kz.json,Message-ID})" , "Delivery-Result-Code" : "sip:$T_reply_code", "Msg-ID" : "$(sht(msg=>$ci){kz.json,Msg-ID})" , "Status" : "$var(Result)"}); $var(RoutingKey) = $(sht(msg=>$ci){kz.json,Server-ID}); $var(exchange) = "targeted"; @@ -54,7 +101,7 @@ route[MESSAGE_REPLY] route[MESSAGE_BINDINGS] { $var(key) = "kamailio@MY_HOSTNAME"; - $var(payload) = $_s({"name": "sms", "exchange": "sms", "type": "topic", "queue": "MSG-QUEUE-MY_HOSTNAME", "routing": "message.route.$(var(key){kz.encode}).*", "no_ack": 0 }); + $var(payload) = $_s({"name": "sms", "exchange": "sms", "type": "topic", "queue": "MSG-QUEUE-MY_HOSTNAME", "routing": "message.route.$(var(key){kz.encode}).*", "no_ack": false }); kazoo_subscribe("$var(payload)"); } diff --git a/kamailio/nodes-role.cfg b/kamailio/nodes-role.cfg index cb985a2..f1a8fbd 100644 --- a/kamailio/nodes-role.cfg +++ b/kamailio/nodes-role.cfg @@ -136,10 +136,16 @@ route[CHECK_MEDIA_SERVERS] $var(ProfileIdx) = 0; while( $var(ProfileIdx) < $var(ProfileCount) ) { $var(MediaProfile) = $(avp(ProfileKeys)[$var(ProfileIdx)]); - $var(MediaRawUrl) = $(var(Payload){kz.json,Media-Servers.$var(MediaKey).Interfaces.$var(MediaProfile).URL}); + $var(MediaRawUrl) = $(var(Payload){kz.json,Media-Servers.$var(MediaKey).Interfaces.$var(MediaProfile).info.url}); + if($var(MediaRawUrl) == "") { + $var(MediaRawUrl) = $(var(Payload){kz.json,Media-Servers.$var(MediaKey).Interfaces.$var(MediaProfile).URL}); + } $var(MediaUrl) = $(var(MediaRawUrl){re.subst,/^sip:(.*)@(.*)/sip:\2/}); $var(MediaInstanceUUID) = $(var(Payload){kz.json,Media-Servers.$var(MediaKey).Instance-UUID}); - $var(MediaIP) = $(var(Payload){kz.json,Media-Servers.$var(MediaKey).Interfaces.$var(MediaProfile).SIP-IP}); + $var(MediaIP) = $(var(Payload){kz.json,Media-Servers.$var(MediaKey).Interfaces.$var(MediaProfile).info.sip-ip}); + if($var(MediaIP) == "") { + $var(MediaIP) = $(var(Payload){kz.json,Media-Servers.$var(MediaKey).Interfaces.$var(MediaProfile).SIP-IP}); + } if($shtinc(media=>$var(MediaUrl)::count) == 1) { $sht(media=>$var(MediaUrl)::zone) = $var(Zone); $shtex(media=>$var(MediaUrl)::zone) = 0; @@ -207,7 +213,7 @@ route[MEDIA_SERVER_RESTART] #!ifndef NODES_CUSTOM_BINDINGS route[NODES_BINDINGS] { - $var(payload) = $_s({"name": "nodes", "exchange" : "nodes" , "type" : "fanout", "queue" : "nodes-MY_HOSTNAME", "exclusive":0, "federate":1 }); + $var(payload) = $_s({"name": "nodes", "exchange" : "nodes" , "type" : "fanout", "queue" : "nodes-MY_HOSTNAME", "exclusive": false, "federate": true }); kazoo_subscribe("$var(payload)"); } #!endif diff --git a/kamailio/presence-fast-pickup.cfg b/kamailio/presence-fast-pickup.cfg index 692a32e..77669a6 100644 --- a/kamailio/presence-fast-pickup.cfg +++ b/kamailio/presence-fast-pickup.cfg @@ -60,11 +60,11 @@ route[PRESENCE_FAST_PICKUP_ATTEMPT] route(PRESENCE_FAST_PICKUP_OPTION); $du = $sht(fp=>$var(md5)); append_hf("Replaces: $var(replaced_call_id)$var(Pickup)\r\n"); + append_hf("k-cid: $var(replaced_call_id)\r\n"); xlog("L_INFO", "$ci|log|fast|found shortcut for call-id $var(replaced_call_id) , redirecting ($(ru{uri.user})) to $du\n"); route(RELAY); exit(); } else { - $var(replaced_call_id) = "none"; xlog("L_INFO", "$ci|log|fast|shortcut $var(md5) invalid in this server, using standard routing\n"); } } @@ -88,6 +88,7 @@ route[PRESENCE_FAST_PICKUP_ATTEMPT] } remove_hf_re("^Replaces"); append_hf("Replaces: $var(rep)\r\n"); + append_hf("k-cid: $var(replaced_call_id)\r\n"); xlog("L_INFO", "$ci|log|call-id $var(replaced_call_id) found, redirecting call ($(ru{uri.user})) to $du => $var(rep)\n"); route(RELAY); exit(); @@ -108,6 +109,7 @@ route[PRESENCE_FAST_PICKUP_ATTEMPT] $var(park) = $_s(*3$(ru{uri.user}{s.substr,2,0})@$(ru{uri.domain})); if($sht(park=>$var(park)) != $null) { $du = $sht(park=>$var(park)); + append_hf("k-cid: $sht(park=>$var(park)::callid)\r\n"); xlog("L_INFO", "$ci|log|redirecting park request to $du , callid : $sht(park=>$var(park)::callid)\n"); route(RELAY); exit(); @@ -117,6 +119,7 @@ route[PRESENCE_FAST_PICKUP_ATTEMPT] if($sht(park=>$(ru{uri.user})@$(ru{uri.domain})) != $null) { $du = $sht(park=>$(ru{uri.user})@$(ruri{uri.domain})); + append_hf("k-cid: $sht(park=>$(ru{uri.user})@$(ruri{uri.domain})::callid)\r\n"); xlog("L_INFO", "$ci|log|redirecting park request to $du, callid: $sht(park=>$(ru{uri.user})@$(ruri{uri.domain})::callid)\n"); route(RELAY); exit(); @@ -135,6 +138,7 @@ route[PRESENCE_FAST_PICKUP_ATTEMPT] $du = $(kzR{kz.json,Channels[0].switch_url}); if($du != $null) { xlog("L_INFO", "$ci|log|redirecting park request to $du from realtime query reply\n"); + append_hf("k-cid: $(kzR{kz.json,Channels[0].call_id})\r\n"); route(RELAY); exit(); } diff --git a/kamailio/presence-role.cfg b/kamailio/presence-role.cfg index e7e4815..0f73535 100644 --- a/kamailio/presence-role.cfg +++ b/kamailio/presence-role.cfg @@ -392,12 +392,10 @@ event_route[kazoo:consumer-event-presence-mwi-update] pres_refresh_watchers("$(kzE{kz.json,From})", "message-summary", 1); } else { #!ifdef PRESENCE_TRACK_ALL_PKG_MWI - if($(kzE{kz.json,Event-Package}) == "message-summary") { - $var(kz_presence_log_level) = $(sel(cfg_get.kazoo.presence_with_targets_log_level){s.int}); - xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|saving $var(presentity) from mwi update => $var(payload)\n"); - if(kazoo_pua_publish_mwi($kzE) != 1) { - xlog("L_ERR", "$(var(payload){kz.json,Call-ID})|log|error publishing $var(presentity) mwi update => $var(payload)\n"); - } + $var(kz_presence_log_level) = $(sel(cfg_get.kazoo.presence_with_targets_log_level){s.int}); + xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|saving $var(presentity) from mwi update => $var(payload)\n"); + if(kazoo_pua_publish_mwi($kzE) != 1) { + xlog("L_ERR", "$(var(payload){kz.json,Call-ID})|log|error publishing $var(presentity) mwi update => $var(payload)\n"); } #!else xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|skip mwi update for $var(presentity)\n"); @@ -546,7 +544,7 @@ route[PRESENCE_BINDINGS] #!import_file "presence-custom-bindings.cfg" #!ifndef PRESENCE_CUSTOM_BINDINGS - $var(payload) = $_s({ "name" : "presence", "exchange" : "presence", "type" : "topic", "queue" : "presence-dialog-MY_HOSTNAME", "routing" : ["dialog.*.*", "update.*.*", "mwi_updates.*.*"], "exclusive" : 0, "federate" : 1 }); + $var(payload) = $_s({ "name" : "presence", "exchange" : "presence", "type" : "topic", "queue" : "presence-dialog-MY_HOSTNAME", "routing" : ["dialog.*.*", "update.*.*", "mwi_updates.*.*"], "exclusive" : false, "federate" : true }); kazoo_subscribe("$var(payload)"); #!endif @@ -561,7 +559,7 @@ route[PRESENCE_API_BINDINGS] #!import_file "presence-api-custom-bindings.cfg" #!ifndef PRESENCE_API_CUSTOM_BINDINGS - $var(payload) = $_s({"name": "presence-api", "exchange": "presence", "type": "topic", "queue": "presence-api-MY_HOSTNAME", "routing": ["presence.search_req.*", "presence.reset.*.*"], "exclusive": 0, "federate": 1 }); + $var(payload) = $_s({"name": "presence-api", "exchange": "presence", "type": "topic", "queue": "presence-api-MY_HOSTNAME", "routing": ["presence.search_req.*", "presence.reset.*.*"], "exclusive": false, "federate": true }); kazoo_subscribe("$var(payload)"); #!endif