Module: sip-router Branch: master Commit: 5a8b8da4abda5b20599add078efe4681aeb8dfa7 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=5a8b8da4...
Author: Peter Dunkley peter.dunkley@crocodile-rcs.com Committer: Peter Dunkley peter.dunkley@crocodile-rcs.com Date: Fri Oct 26 16:09:09 2012 +0100
modules/websocket: Updated example kamailio.cfg
- Better MSRP over WebSocket support
---
modules/websocket/example/kamailio.cfg | 157 ++++++++++++++++++------------- 1 files changed, 91 insertions(+), 66 deletions(-)
diff --git a/modules/websocket/example/kamailio.cfg b/modules/websocket/example/kamailio.cfg index b43583b..21b9925 100644 --- a/modules/websocket/example/kamailio.cfg +++ b/modules/websocket/example/kamailio.cfg @@ -120,7 +120,7 @@ modparam("auth", "qop", "auth") modparam("auth_db", "db_url", "DBURL") modparam("auth_db", "calculate_ha1", yes) modparam("auth_db", "password_column", "password") -modparam("auth_db", "load_credentials", "") +modparam("auth_db", "load_credentials", "id")
# ----- corex params ----- modparam("corex", "alias_subdomains", "MY_DOMAIN") @@ -153,6 +153,12 @@ modparam("htable", "htable", "msrp=>size=8;autoexpire=MSRP_MAX_EXPIRES;") # - processing of any incoming SIP request starts with this route # - note: this is the same as route { ... } request_route { + if ((($Rp == MY_WS_PORT || $Rp == MY_WSS_PORT) + && !(proto == WS || proto == WSS)) || $Rp == MY_MSRP_PORT) { + xlog("L_WARN", "SIP request received on $Rp\n"); + sl_send_reply("403", "Forbidden"); + exit; + }
# per request initial checks route(REQINIT); @@ -164,9 +170,9 @@ request_route { # This won't be needed in the future if Kamailio and the # WebSocket client support Outbound and Path. force_rport(); - if (is_method("REGISTER")) + if (is_method("REGISTER")) { fix_nated_register(); - else { + } else { if (!add_contact_alias()) { xlog("L_ERR", "Error aliasing contact <$ct>\n"); sl_send_reply("400", "Bad Request"); @@ -183,8 +189,9 @@ request_route {
# CANCEL processing if (is_method("CANCEL")) { - if (t_check_trans()) + if (t_check_trans()) { t_relay(); + } exit; }
@@ -196,15 +203,16 @@ request_route { # record routing for dialog forming requests (in case they are routed) # - remove preloaded route headers remove_hf("Route"); - if (is_method("INVITE")) + if (is_method("INVITE")) { record_route(); + }
# handle registrations route(REGISTRAR);
if ($rU==$null) { # request with no Username in RURI - sl_send_reply("484","Address Incomplete"); + sl_send_reply("484", "Address Incomplete"); exit; }
@@ -269,7 +277,7 @@ route[WITHINDLG] { exit; } } - sl_send_reply("404","Not Found"); + sl_send_reply("404", "Not Found"); } exit; } @@ -278,26 +286,34 @@ route[WITHINDLG] { # Handle SIP registrations route[REGISTRAR] { if (is_method("REGISTER")) { - if (!save("location")) + if (!save("location")) { sl_reply_error(); - + } exit; } }
# USER location service route[LOCATION] { + if (!is_subscriber("$ru", "subscriber", "1")) { + t_newtran(); + send_reply("404", "Not Found"); + exit; + } + if (!lookup("location")) { $var(rc) = $rc; t_newtran(); switch ($var(rc)) { - case -1: - case -3: - send_reply("404", "Not Found"); - exit; - case -2: - send_reply("405", "Method Not Allowed"); - exit; + case -1: + send_reply("480", "Temporarily Unavailable"); + exit; + case -2: + send_reply("405", "Method Not Allowed"); + exit; + case -3: + send_reply("500", "Server Internal Error"); + exit; } } } @@ -311,19 +327,27 @@ route[AUTH] { exit; } # user authenticated - remove auth header - if(!is_method("REGISTER")) + if(!is_method("REGISTER")) { consume_credentials(); + } } # if caller is not local subscriber, then check if it calls # a local destination, otherwise deny, not an open relay here if (from_uri!=myself && uri!=myself) { - sl_send_reply("403","Forbidden"); + sl_send_reply("403", "Forbidden"); exit; } }
#!ifdef WITH_WEBSOCKETS onreply_route { + if ((($Rp == MY_WS_PORT || $Rp == MY_WSS_PORT) + && !(proto == WS || proto == WSS)) || $Rp == MY_MSRP_PORT) { + xlog("L_WARN", "SIP response received on $Rp\n"); + drop; + exit; + } + if (nat_uac_test(64)) { # Do NAT traversal stuff for replies to a WebSocket connection # - even if it is not behind a NAT! @@ -393,40 +417,29 @@ event_route[websocket:closed] {
#!ifdef WITH_MSRP event_route[msrp:frame-in] { - xdbg("============#[[$msrp(method)]]===========\n"); - xdbg("============*[[$si:$sp]]\n"); - xdbg("============ crthop: [$msrp(crthop)]\n"); - xdbg("============ prevhop: [$msrp(prevhop)]\n"); - xdbg("============ nexthop: [$msrp(nexthop)]\n"); - xdbg("============ firsthop: [$msrp(firsthop)]\n"); - xdbg("============ lasthop: [$msrp(lasthop)]\n"); - xdbg("============ prevhops: [$msrp(prevhops)]\n"); - xdbg("============ nexthops: [$msrp(nexthops)]\n"); - xdbg("============ srcaddr: [$msrp(srcaddr)]\n"); - xdbg("============ srcsock: [$msrp(srcsock)]\n"); - xdbg("============ sessid: [$msrp(sessid)]\n"); - msrp_reply_flags("1");
- if(msrp_is_reply()) - { - msrp_relay(); + if ((($Rp == MY_WS_PORT || $Rp == MY_WSS_PORT) + && !(proto == WS || proto == WSS)) && $Rp != MY_MSRP_PORT) { + xlog("L_WARN", "MSRP request received on $Rp\n"); + msrp_reply("403", "Action-not-allowed"); + exit; } - else if($msrp(method)=="AUTH") - { - if($msrp(nexthops)>0) - { + + if (msrp_is_reply()) { + msrp_relay(); + } else if($msrp(method)=="AUTH") { + if($msrp(nexthops)>0) { msrp_relay(); exit; }
- if(!www_authenticate("MY_DOMAIN", "subscriber", "$msrp(method)")) - { - if(auth_get_www_authenticate("myrealm", "1", - "$var(wauth)")) - { + if (!www_authenticate("MY_DOMAIN", "subscriber", + "$msrp(method)")) { + if (auth_get_www_authenticate("MY_DOMAIN", "1", + "$var(wauth)")) { msrp_reply("401", "Unauthorized", - "$var(wauth)"); + "$var(wauth)"); } else { msrp_reply("500", "Server Error"); } @@ -435,7 +448,6 @@ event_route[msrp:frame-in] {
if ($hdr(Expires) != $null) { $var(expires) = (int) $hdr(Expires); - if ($var(expires) < MSRP_MIN_EXPIRES) { msrp_reply("423", "Interval Out-of-Bounds", "Min-Expires: MSRP_MIN_EXPIRES\r\n"); @@ -443,51 +455,64 @@ event_route[msrp:frame-in] { } else if ($var(expires) > MSRP_MAX_EXPIRES) { msrp_reply("423", "Interval Out-of-Bounds", "Max-Expires: MSRP_MAX_EXPIRES\r\n"); - exit; + exit; } - } else + } else { $var(expires) = MSRP_MAX_EXPIRES; + }
$var(cnt) = $var(cnt) + 1; pv_printf("$var(sessid)", "s.$(pp).$(var(cnt)).$(RANDOM)"); $sht(msrp=>$var(sessid)::srcaddr) = $msrp(srcaddr); $sht(msrp=>$var(sessid)::srcsock) = $msrp(srcsock); - $shtex(msrp=>$var(sessid)) = MSRP_MAX_EXPIRES + 5; + $shtex(msrp=>$var(sessid)) = $var(expires) + 5; # - Use-Path: the MSRP address for server + session id - $var(headers) = "Use-Path: msrp://MY_IP_ADDR:MY_MSRP_PORT/" - + $var(sessid) + ";tcp\r\n" + if (proto == WS || proto == WSS) { + if (proto == WS) { + $var(hdrs) = + "Use-Path: msrp://MY_IP_ADDR:MY_WS_PORT/" + + $var(sessid) + ";ws "; + } else { + $var(hdrs) = + "Use-Path: msrps://MY_IP_ADDR:MY_WSS_PORT/" + + $var(sessid) + ";ws "; + } + $var(cnt) = $var(cnt) + 1; + pv_printf("$var(sessid)", + "s.$(pp).$(var(cnt)).$(RANDOM)"); + $var(hdrs) = $var(hdrs) + + "msrps://MY_IP_ADDR:MY_MSRP_PORT/" + + $var(sessid) + ";tcp\r\n"; + } else { + $var(hdrs) = + "Use-Path: msrps://MY_IP_ADDR:MY_MSRP_PORT/" + + $var(sessid) + ";tcp\r\n"; + } + $var(hdrs) = $var(hdrs) + "Expires: " + $var(expires) + "\r\n"; - msrp_reply("200", "OK", "$var(expires)"); - } - else if($msrp(method)=="SEND" || $msrp(method)=="REPORT") - { - if($msrp(nexthops)>1) - { - if ($msrp(method)!="REPORT") - { + msrp_reply("200", "OK", "$var(hdrs)"); + } else if ($msrp(method)=="SEND" || $msrp(method)=="REPORT") { + if ($msrp(nexthops)>1) { + if ($msrp(method)!="REPORT") { msrp_reply("200", "OK"); } msrp_relay(); exit; } $var(sessid) = $msrp(sessid); - if($sht(msrp=>$var(sessid)::srcaddr) == $null) - { + if ($sht(msrp=>$var(sessid)::srcaddr) == $null) { # one more hop, but we don't have address in htable msrp_reply("481", "Session-does-not-exist"); exit; } - else if($msrp(method)!="REPORT") - { - msrp_relay("200", "OK"); + else if ($msrp(method)!="REPORT") { + msrp_reply("200", "OK"); } msrp_relay_flags("1"); msrp_set_dst("$sht(msrp=>$var(sessid)::srcaddr)", "$sht(msrp=>$var(sessid)::srcsock)"); msrp_relay(); - } - else - { + } else { msrp_reply("501", "Request-method-not-understood"); } }