diff --git a/ngcp/ngcp.lua b/ngcp/ngcp.lua index 2758d04..18e8caa 100644 --- a/ngcp/ngcp.lua +++ b/ngcp/ngcp.lua @@ -30,6 +30,7 @@ NGCPConfig_MT = { __index = NGCPConfig } inbound_npn = "from_user", inbound_uprn = "from_user", ip_header = "P-NGCP-Src-Ip", + account_id = 0, } } setmetatable( t, NGCPConfig_MT ) @@ -117,26 +118,104 @@ NGCP_MT = { __index = NGCP } {"peer_caller_sst_max_timer", "sst_max_timer"}, {"peer_caller_sst_refresh_method", "sst_refresh_method"} } - } + }, + caller_usr_load = { + caller_usr_prefs = { + {"allowed_ips_grp", "allowed_ips_grp"}, + {"man_allowed_ips_grp", "man_allowed_ips_grp"}, + {"ignore_allowed_ips", "ignore_allowed_ips"}, + {"caller_account_id", "account_id"}, + {"caller_cc", "cc"}, + {"caller_ac", "ac"}, + {"caller_emergency_cli", "emergency_cli"}, + {"caller_emergency_prefix", "emergency_prefix"}, + {"caller_emergency_suffix", "emergency_suffix"}, + {"caller_lock", "lock"}, + {"caller_block_override", "block_out_override_pin"}, + {"caller_adm_block_override", "dm_block_out_override_pin"}, + {"caller_allowed_clis", "allowed_clis"}, + {"caller_user_cli", "user_cli"}, + {"caller_block_out_mode", "block_out_mode"}, + {"caller_block_out_list", "block_out_list"}, + {"caller_adm_block_out_mode", "adm_block_out_mode"}, + {"caller_adm_block_out_list", "adm_block_out_list"}, + {"caller_peer_auth_user", "peer_auth_user"}, + {"caller_peer_auth_pass", "peer_auth_pass"}, + {"caller_peer_auth_realm", "peer_auth_realm"}, + {"caller_ext_subscriber_id", "ext_subscriber_id"}, + {"caller_ext_contract_id", "ext_contract_id"}, + {"caller_prepaid", "prepaid"}, + }, + caller_real_prefs = { + {"caller_reject_emergency", "reject_emergency"}, + {"caller_ncos_id", "ncos_id"}, + {"caller_inbound_upn", "inbound_upn"}, + {"caller_extension_in_npn", "extension_in_npn"}, + {"caller_inbound_uprn", "inbound_uprn", "npn"}, + {"caller_ipv46_for_rtpproxy", "ipv46_for_rtpproxy"}, + {"caller_force_outbound_calls_to_peer", "force_outbound_calls_to_peer"}, + {"caller_use_rtpproxy", "use_rtpproxy"}, + {"rewrite_caller_in_dpid", "rewrite_caller_in_dpid"}, + {"rewrite_callee_in_dpid", "rewrite_callee_in_dpid"}, + {"caller_ip_header", "ip_header"}, + {"caller_allow_out_foreign_domain", "allow_out_foreign_domain"}, + {"caller_concurrent_max", "concurrent_max"}, + {"caller_concurrent_max_out", "concurrent_max_out"}, + {"caller_concurrent_max_per_account", "concurrent_max_per_account"}, + {"caller_concurrent_max_out_per_account", "concurrent_max_out_per_account"}, + {"caller_sst_enable", "sst_enable"}, + {"caller_sst_expires", "sst_expires"}, + {"caller_sst_min_timer", "sst_min_timer"}, + {"caller_sst_max_timer", "sst_max_timer"}, + {"caller_sst_refresh_method", "sst_refresh_method"} + } + }, + callee_usr_load = {} } return t end + function NGCP:_set_vars(indx) + local _,k,v, default, xvap, var + for k,var in pairs(self.vars[indx]) do + for _,v in pairs(var) do + if not v[3] then + default = self.config.default[v[2]] + else + default = v[3] + end + if v[2] then + xavp = k .. "=>" .. v[2] + else + xavp = nil + end + NGCPPrefs.set_avp(v[1], xavp, default) + end + end + end + + -- value 0 is like null? + -- if 0 => use dom pref if not 0 + function NGCP._set_dom_priority(var, xavp, pref) + local avp = NGCPAvp:new(var) + local value + + if avp() == 0 then + value = xavp(pref) + if not value and value ~= 0 then + avp:clean() + avp(value) + end + end + end + function NGCP:caller_peer_load(peer) local _,v, default, xvap local keys = self.prefs.peer:caller_load(peer) local vars = self.vars.caller_peer_load self.prefs.real:caller_peer_load(keys) - for _,v in pairs(vars.caller_peer_prefs) do - default = self.config.default[v[2]] - if v[2] then - xavp = "caller_peer_prefs=>" .. v[2] - else - xavp = nil - end - NGCPPrefs.set_avp(v[1], xavp, default) - end + self:_set_vars("caller_peer_load") return keys end @@ -146,44 +225,47 @@ NGCP_MT = { __index = NGCP } local vars = self.vars.callee_peer_load self.prefs.real:callee_peer_load(keys) - for _,v in pairs(vars.callee_peer_prefs) do - default = self.config.default[v[2]] - if v[2] then - xavp = "callee_peer_prefs=>" .. v[2] - else - xavp = nil - end - NGCPPrefs.set_avp(v[1], xavp, default) - end - + self:_set_vars("callee_peer_load") return keys end function NGCP:caller_usr_load(uuid, domain) + local _,v local keys = { domain = self.prefs.dom:caller_load(domain), user = self.prefs.usr:caller_load(uuid) } local unique_keys = table.deepcopy(keys.domain) - local _,v + for _,v in pairs(keys.user) do table.add(unique_keys, v) end self.prefs.real:caller_usr_load(unique_keys) + self:_set_vars("caller_usr_load") + local xavp = NGCPXAvp:new('caller', 'dom') + + -- if 0 => use dom pref if not 0 + NGCP._set_dom_priority("caller_concurrent_max", xavp, "concurrent_max") + NGCP._set_dom_priority("caller_concurrent_max_out", xavp, "concurrent_max_out") + NGCP._set_dom_priority("caller_concurrent_max_per_account", xavp, "concurrent_max_per_account") + NGCP._set_dom_priority("caller_concurrent_max_per_account_out", xavp, "concurrent_max_per_account_out") + return unique_keys end function NGCP:callee_usr_load(uuid, domain) + local _,v local keys = { domain = self.prefs.dom:callee_load(domain), user = self.prefs.usr:callee_load(uuid) } local unique_keys = table.deepcopy(keys.domain) - local _,v + for _,v in pairs(keys.user) do table.add(unique_keys, v) end self.prefs.real:callee_usr_load(unique_keys) + self:_set_vars("callee_usr_load") return unique_keys end diff --git a/tests/ngcp.lua b/tests/ngcp.lua index 77a5a4f..1f62e2c 100644 --- a/tests/ngcp.lua +++ b/tests/ngcp.lua @@ -27,17 +27,13 @@ TestNGCP = {} --class package.loaded.luasql = nil package.preload['luasql.mysql'] = function () luasql = {} - luasql.mysql = mc:mock() - return luasql.mysql + luasql.mysql = function () + return env + end end require 'ngcp.ngcp' - luasql.mysql = function () - luasql.mysql = env - return env - end - self.ngcp = NGCP:new() self.dp_vars = DPFetch:new() self.pp_vars = PPFetch:new() @@ -87,12 +83,41 @@ TestNGCP = {} --class assertEquals(self.ngcp:callee_usr_load(), {}) end + function TestNGCP:test_caller_usr_load() + local c = self.ngcp.config + env:connect(c.db_database, c.db_username, c.db_pass, c.db_host, c.db_port) ;mc :returns(self.con) + self.con:execute("SELECT * FROM dom_preferences WHERE domain ='192.168.51.56'") ;mc :returns(self.cur) + self.cur:fetch(mc.ANYARGS) ;mc :returns(self.dp_vars:val("d_192_168_51_56")) + self.cur:fetch(mc.ANYARGS) ;mc :returns(self.dp_vars:val("d_192_168_51_56")) + self.cur:fetch(mc.ANYARGS) ;mc :returns(nil) + self.cur:close() + self.con:close() + env:connect(c.db_database, c.db_username, c.db_pass, c.db_host, c.db_port) ;mc :returns(self.con) + self.con:execute("SELECT * FROM usr_preferences WHERE uuid ='ae736f72-21d1-4ea6-a3ea-4d7f56b3887c'") ;mc :returns(self.cur) + self.cur:fetch(mc.ANYARGS) ;mc :returns(self.up_vars:val("ae736f72_21d1_4ea6_a3ea_4d7f56b3887c")) + self.cur:fetch(mc.ANYARGS) ;mc :returns(self.up_vars:val("ae736f72_21d1_4ea6_a3ea_4d7f56b3887c")) + self.cur:fetch(mc.ANYARGS) ;mc :returns(self.up_vars:val("ae736f72_21d1_4ea6_a3ea_4d7f56b3887c")) + self.cur:fetch(mc.ANYARGS) ;mc :returns(self.up_vars:val("ae736f72_21d1_4ea6_a3ea_4d7f56b3887c")) + self.cur:fetch(mc.ANYARGS) ;mc :returns(nil) + self.cur:close() + self.con:close() + + mc:replay() + local keys = self.ngcp:caller_usr_load("ae736f72-21d1-4ea6-a3ea-4d7f56b3887c", "192.168.51.56") + mc:verify() + + assertEquals(sr.pv.get("$xavp(caller_usr_prefs=>dummy)"), "caller") + assertEquals(sr.pv.get("$xavp(caller_real_prefs=>sst_enable)"), "no") + assertEquals(sr.pv.get("$avp(caller_sst_enable)"), "no") + assertEquals(sr.pv.get("$xavp(caller_real_prefs=>sst_refresh_method)"), "UPDATE_FALLBACK_INVITE") + assertEquals(sr.pv.get("$avp(caller_sst_refresh_method)"), "UPDATE_FALLBACK_INVITE") + end + function TestNGCP:test_caller_peer_load_empty() assertEquals(self.ngcp:caller_peer_load(), {}) end function TestNGCP:test_caller_peer_load() - --self.ngcp.config:getDBConnection() ;mc :returns(self.con) local c = self.ngcp.config env:connect(c.db_database, c.db_username, c.db_pass, c.db_host, c.db_port) ;mc :returns(self.con) self.con:execute(mc.ANYARGS) ;mc :returns(self.cur) @@ -364,5 +389,76 @@ TestNGCP = {} --class assertEquals(sr.pv.get("$avp(s:caller_ip_val)"), nil) end + function TestNGCP:test_caller_usr_clean_vars() + self:test_caller_usr_load() + + self.ngcp:clean('caller', 'usr') + + assertEquals(sr.pv.get("$avp(s:caller_account_id)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_lock)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_allowed_clis)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_user_cli)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_cc)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_ac)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_emergency_cli)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_emergency_prefix)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_emergency_suffix)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_block_out_mode)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_block_out_list)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_adm_block_out_mode)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_adm_block_out_list)"), nil) + + assertEquals(sr.pv.get("$avp(s:allowed_ips_grp)"), nil) + assertEquals(sr.pv.get("$avp(s:man_allowed_ips_grp)"), nil) + assertEquals(sr.pv.get("$avp(s:ignore_allowed_ips)"), nil) + + assertEquals(sr.pv.get("$avp(s:caller_ncos_id)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_adm_ncos_id)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_dom_ncos_id)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_dom_adm_ncos_id)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_block_override)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_adm_block_override)"), nil) + + assertEquals(sr.pv.get("$avp(s:caller_peer_auth_user)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_peer_auth_pass)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_peer_auth_realm)"), nil) + + assertEquals(sr.pv.get("$avp(s:caller_ext_subscriber_id)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_ext_contract_id)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_prepaid)"), nil) + + assertEquals(sr.pv.get("$avp(s:caller_ipv46_for_rtpproxy)"), nil) + + assertEquals(sr.pv.get("$avp(s:caller_use_rtpproxy)"), nil) + + assertEquals(sr.pv.get("$avp(s:caller_force_outbound_calls_to_peer)"), nil) + + assertEquals(sr.pv.get("$avp(s:caller_concurrent_max)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_concurrent_max_out)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_concurrent_max_per_account)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_concurrent_max_out_per_account)"), nil) + + assertEquals(sr.pv.get("$avp(s:caller_sst_enable)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_sst_expires)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_sst_min_timer)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_sst_max_timer)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_sst_refresh_method)"), nil) + + assertEquals(sr.pv.get("$avp(s:caller_reject_emergency)"), nil) + + assertEquals(sr.pv.get("$avp(s:caller_inbound_upn)"), nil) + assertEquals(sr.pv.get("$avp(s:caller_inbound_uprn)"), nil) + + assertEquals(sr.pv.get("$avp(s:caller_extension_in_npn)"), nil) + + assertEquals(sr.pv.get("$avp(s:caller_allow_out_foreign_domain)"), nil) + + assertEquals(sr.pv.get("$avp(s:rewrite_caller_in_dpid)"), nil) + assertEquals(sr.pv.get("$avp(s:rewrite_caller_out_dpid)"), nil) + assertEquals(sr.pv.get("$avp(s:rewrite_callee_in_dpid)"), nil) + assertEquals(sr.pv.get("$avp(s:rewrite_callee_out_dpid)"), nil) + + assertEquals(sr.pv.get("$avp(s:caller_ip_header)"), nil) + end -- class TestNGCP --EOF \ No newline at end of file