X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=plugins%2Fmod_privacy.lua;h=d6ff9761e2625e46bfefe7760517f9c4584c3509;hb=cc67ab83f88b3b4a1327cc6c6a5a8b922d6ba838;hp=ab1eb87062bd2b573110d32fb7ebbc9d9abb8014;hpb=182225692d408f289a01287d2c703d048201ad78;p=prosody.git diff --git a/plugins/mod_privacy.lua b/plugins/mod_privacy.lua index ab1eb870..d6ff9761 100644 --- a/plugins/mod_privacy.lua +++ b/plugins/mod_privacy.lua @@ -17,16 +17,6 @@ local jid_split = util_Jid.split; local load_roster = require "core.rostermanager".load_roster; local to_number = tonumber; -function findNamedList(privacy_lists, name) - if privacy_lists.lists then - for i=1,#privacy_lists.lists do - if privacy_lists.lists[i].name == name then - return i; - end - end - end -end - function isListUsed(origin, name, privacy_lists) local user = bare_sessions[origin.username.."@"..origin.host]; if user then @@ -126,16 +116,9 @@ function declineList(privacy_lists, origin, stanza, which) end function activateList(privacy_lists, origin, stanza, which, name) - local idx = findNamedList(privacy_lists, name); + local list = privacy_lists.lists[name]; - if privacy_lists.default == nil then - privacy_lists.default = ""; - end - if origin.activePrivacyList == nil then - origin.activePrivacyList = ""; - end - - if which == "default" and idx ~= nil then + if which == "default" and list then if isAnotherSessionUsingDefaultList(origin) then return {"cancel", "conflict", "Another session is online and using the default list."}; end @@ -146,7 +129,7 @@ function activateList(privacy_lists, origin, stanza, which, name) sendNeededUnavailablePersences(origin, name); end ]]-- - elseif which == "active" and idx ~= nil then + elseif which == "active" and list then origin.activePrivacyList = name; origin.send(st.reply(stanza)); -- sendNeededUnavailablePersences(origin, name); @@ -157,19 +140,19 @@ function activateList(privacy_lists, origin, stanza, which, name) end function deleteList(privacy_lists, origin, stanza, name) - local idx = findNamedList(privacy_lists, name); + local list = privacy_lists.lists[name]; - if idx ~= nil then + if list then if isListUsed(origin, name, privacy_lists) then return {"cancel", "conflict", "Another session is online and using the list which should be deleted."}; end if privacy_lists.default == name then - privacy_lists.default = ""; + privacy_lists.default = nil; end if origin.activePrivacyList == name then - origin.activePrivacyList = ""; + origin.activePrivacyList = nil; end - table.remove(privacy_lists.lists, idx); + privacy_lists.lists[name] = nil; origin.send(st.reply(stanza)); return true; end @@ -177,19 +160,16 @@ function deleteList(privacy_lists, origin, stanza, name) end function createOrReplaceList (privacy_lists, origin, stanza, name, entries, roster) - local idx = findNamedList(privacy_lists, name); local bare_jid = origin.username.."@"..origin.host; if privacy_lists.lists == nil then privacy_lists.lists = {}; end - if idx == nil then - idx = #privacy_lists.lists + 1; - end + local list = {}; + privacy_lists.lists[name] = list; local orderCheck = {}; - local list = {}; list.name = name; list.items = {}; @@ -264,7 +244,6 @@ function createOrReplaceList (privacy_lists, origin, stanza, name, entries, rost table.sort(list, function(a, b) return a.order < b.order; end); - privacy_lists.lists[idx] = list; origin.send(st.reply(stanza)); if bare_sessions[bare_jid] ~= nil then local iq = st.iq ( { type = "set", id="push1" } ); @@ -286,17 +265,20 @@ function getList(privacy_lists, origin, stanza, name) reply:tag("query", {xmlns="jabber:iq:privacy"}); if name == nil then - reply:tag("active", {name=origin.activePrivacyList or ""}):up(); - reply:tag("default", {name=privacy_lists.default or ""}):up(); if privacy_lists.lists then + if origin.ActivePrivacyList then + reply:tag("active", {name=origin.activePrivacyList}):up(); + end + if privacy_lists.default then + reply:tag("default", {name=privacy_lists.default}):up(); + end for _,list in ipairs(privacy_lists.lists) do reply:tag("list", {name=list.name}):up(); end end else - local idx = findNamedList(privacy_lists, name); - if idx ~= nil then - local list = privacy_lists.lists[idx]; + local list = privacy_lists.lists[name]; + if list then reply = reply:tag("list", {name=list.name}); for _,item in ipairs(list.items) do reply:tag("item", {type=item.type, value=item.value, action=item.action, order=item.order}); @@ -358,13 +340,14 @@ module:hook("iq/bare/jabber:iq:privacy:query", function(data) end if valid ~= true then - if valid[0] == nil then - valid[0] = "cancel"; - end + valid = valid or { "cancel", "bad-request", "Couldn't understand request" }; if valid[1] == nil then - valid[1] = "bad-request"; + valid[1] = "cancel"; + end + if valid[2] == nil then + valid[2] = "bad-request"; end - origin.send(st.error_reply(stanza, valid[0], valid[1], valid[2])); + origin.send(st.error_reply(stanza, valid[1], valid[2], valid[3])); else datamanager.store(origin.username, origin.host, "privacy", privacy_lists); end @@ -379,37 +362,29 @@ function checkIfNeedToBeBlocked(e, session) local to = stanza.attr.to; local from = stanza.attr.from; - local to_user = bare_jid == jid_bare(to); - local from_user = bare_jid == jid_bare(from); + local is_to_user = bare_jid == jid_bare(to); + local is_from_user = bare_jid == jid_bare(from); module:log("debug", "stanza: %s, to: %s, from: %s", tostring(stanza.name), tostring(to), tostring(from)); if privacy_lists.lists == nil or - (session.activePrivacyList == nil or session.activePrivacyList == "") and - (privacy_lists.default == nil or privacy_lists.default == "") + not (session.activePrivacyList or privacy_lists.default) then return; -- Nothing to block, default is Allow all end - if from_user and to_user then + if is_from_user and is_to_user then module:log("debug", "Not blocking communications between user's resources"); return; -- from one of a user's resource to another => HANDS OFF! end - local idx; - local list; local item; local listname = session.activePrivacyList; - if listname == nil or listname == "" then + if listname == nil then listname = privacy_lists.default; -- no active list selected, use default list end - idx = findNamedList(privacy_lists, listname); - if idx == nil then - module:log("debug", "given privacy listname not found. name: %s", listname); - return; - end - list = privacy_lists.lists[idx]; - if list == nil then - module:log("debug", "privacy list index wrong. index: %d", idx); + local list = privacy_lists.lists[listname]; + if not list then + module:log("debug", "given privacy list not found. name: %s", listname); return; end for _,item in ipairs(list.items) do @@ -418,8 +393,8 @@ function checkIfNeedToBeBlocked(e, session) if ( (stanza.name == "message" and item.message) or (stanza.name == "iq" and item.iq) or - (stanza.name == "presence" and to_user and item["presence-in"]) or - (stanza.name == "presence" and from_user and item["presence-out"]) or + (stanza.name == "presence" and is_to_user and item["presence-in"]) or + (stanza.name == "presence" and is_from_user and item["presence-out"]) or (item.message == false and item.iq == false and item["presence-in"] == false and item["presence-out"] == false) ) then apply = true; @@ -427,7 +402,7 @@ function checkIfNeedToBeBlocked(e, session) if apply then local evilJid = {}; apply = false; - if to_user then + if is_to_user then module:log("debug", "evil jid is (from): %s", from); evilJid.node, evilJid.host, evilJid.resource = jid_split(from); else