diff --git a/resources/install/scripts/app/xml_handler/resources/scripts/directory/directory.lua b/resources/install/scripts/app/xml_handler/resources/scripts/directory/directory.lua index f4c0414ddb..5615058097 100644 --- a/resources/install/scripts/app/xml_handler/resources/scripts/directory/directory.lua +++ b/resources/install/scripts/app/xml_handler/resources/scripts/directory/directory.lua @@ -62,6 +62,12 @@ --all other directory actions: sip_auth, user_call --except for the action: group_call + -- Make sance only for extensions with number_alias + -- true - you should register with AuthID=Extension and UserID=Number Alias + -- false - you should register with AuthID=UserID=Extension + -- also in this case you need 2 records in memcache for one extension + local DIAL_STRING_BASED_ON_USERID = false + local sip_auth_method = params:getHeader("sip_auth_method") if sip_auth_method then sip_auth_method = sip_auth_method:upper(); @@ -80,30 +86,50 @@ user = ""; end - --get the cache - if (trim(api:execute("module_exists", "mod_memcache")) == "true") then - if (domain_name) then - XML_STRING = trim(api:execute("memcache", "get directory:" .. user .. "@" .. domain_name)); - end - if (XML_STRING == "-ERR NOT FOUND") or (XML_STRING == "-ERR CONNECTION FAILURE") then - source = "database"; - continue = true; - else - source = "cache"; - continue = true; - end - else - XML_STRING = ""; - source = "database"; - continue = true; + if (from_user == "") or (from_user == nil) then + from_user = user end --prevent processing for invalid user - if (user == "*97") then + if (user == "*97") or (user == "") then source = ""; continue = false; end + -- cleanup + XML_STRING = nil; + + --get the cache + if (continue) then + if (trim(api:execute("module_exists", "mod_memcache")) == "true") then + if (domain_name) then + local key = "directory:" .. (from_user or user) .. "@" .. domain_name + XML_STRING = trim(api:execute("memcache", "get " .. key)); + + if debug['cache'] then + if XML_STRING:sub(1, 4) == '-ERR' then + freeswitch.consoleLog("notice", "[xml_handler-directory][memcache] get key: " .. key .. " fail: " .. XML_STRING .. "\n") + else + freeswitch.consoleLog("notice", "[xml_handler-directory][memcache] get key: " .. key .. " pass!" .. "\n") + end + end + else + XML_STRING = "-ERR NOT FOUND" + end + if (XML_STRING == "-ERR NOT FOUND") or (XML_STRING == "-ERR CONNECTION FAILURE") then + source = "database"; + continue = true; + else + source = "cache"; + continue = true; + end + else + XML_STRING = ""; + source = "database"; + continue = true; + end + end + --show the params in the console --if (params:serialize() ~= nil) then -- freeswitch.consoleLog("notice", "[xml_handler-directory.lua] Params:\n" .. params:serialize() .. "\n"); @@ -118,8 +144,10 @@ --freeswitch.consoleLog("notice", "[xml_handler-directory.lua] dialed_extension is " .. dialed_extension .. "\n"); end + local loaded_from_db = false --build the XML string from the database if (source == "database") or (load_balancing) then + loaded_from_db = true --database connection if (continue) then --connect to the database @@ -211,8 +239,10 @@ if (debug["sql"]) then freeswitch.consoleLog("notice", "[xml_handler] SQL: " .. sql .. "\n"); end + continue = false dbh:query(sql, function(row) --general + continue = true domain_uuid = row.domain_uuid; extension_uuid = row.extension_uuid; extension = row.extension; @@ -266,7 +296,7 @@ -- check matching UserID and AuthName if sip_auth_method and (METHODS[sip_auth_method] or METHODS._ANY_) then - continue = (sip_from_user == user) and ((sip_from_number == user) or (sip_from_number == from_user)) + continue = (sip_from_user == user) and ((sip_from_number == from_user) or (from_user == user)) if not continue then XML_STRING = nil; return 1; @@ -279,8 +309,7 @@ else --set a default dial string if (dial_string == null) then - local username = (#number_alias > 0) and number_alias or extension - dial_string = "{sip_invite_domain=" .. domain_name .. ",presence_id=" .. user .. "@" .. domain_name .. "}${sofia_contact(" .. username .. "@" .. domain_name .. ")}"; + dial_string = "{sip_invite_domain=" .. domain_name .. ",presence_id=" .. user .. "@" .. domain_name .. "}${sofia_contact(" .. (DIAL_STRING_BASED_ON_USERID and sip_from_number or sip_from_user) .. "@" .. domain_name .. ")}"; end --set the an alternative dial string if the hostnames don't match if (load_balancing) then @@ -514,9 +543,11 @@ dbh:release(); --set the cache - if (user and domain_name) then - result = trim(api:execute("memcache", "set directory:" .. user .. "@" .. domain_name .. " '"..XML_STRING:gsub("'", "'").."' "..expire["directory"])); + local key = "directory:" .. (DIAL_STRING_BASED_ON_USERID and sip_from_number or sip_from_user) .. "@" .. domain_name + if debug['cache'] then + freeswitch.consoleLog("notice", "[xml_handler-directory][memcache] set key: " .. key .. "\n") end + result = trim(api:execute("memcache", "set " .. key .. " '"..XML_STRING:gsub("'", "'").."' "..expire["directory"])); --send the xml to the console if (debug["xml_string"]) then @@ -532,17 +563,14 @@ end end - if XML_STRING and sip_auth_method and (METHODS[sip_auth_method] or METHODS._ANY_) then - --disable registration for number-alias - if (api:execute("user_data", user .. "@" .. domain_name .." attr id") ~= user) then + if XML_STRING and (not loaded_from_db) + and sip_auth_method and (METHODS[sip_auth_method] or METHODS._ANY_) + then + local user_id = api:execute("user_data", from_user .. "@" .. domain_name .." attr id") + --disable registration for number-alias and foreign number_alias + if user_id ~= user then XML_STRING = nil; end - --disable registration for foreign number_alias - if from_user ~= user then - if (api:execute("user_data", from_user .. "@" .. domain_name .." attr id") ~= user) then - XML_STRING = nil; - end - end end --get the XML string from the cache