Comparison

mod_privacy/mod_privacy.lua @ 16:35e74c1094a7

mod_privacy: order must be non-negativ integer and unique, group must be existing in the roster, subscription can only be to,from,both or none, action must be either deny or allow.
author Thilo Cestonaro <thilo@cestona.ro>
date Mon, 28 Sep 2009 18:17:20 +0200
parent 15:14b18ef8b554
child 17:ccb07c0efc7e
comparison
equal deleted inserted replaced
15:14b18ef8b554 16:35e74c1094a7
13 local datamanager = require "util.datamanager"; 13 local datamanager = require "util.datamanager";
14 local bare_sessions = bare_sessions; 14 local bare_sessions = bare_sessions;
15 local util_Jid = require "util.jid"; 15 local util_Jid = require "util.jid";
16 local jid_bare = util_Jid.bare; 16 local jid_bare = util_Jid.bare;
17 local jid_split = util_Jid.split; 17 local jid_split = util_Jid.split;
18 local load_roster = require "core.rostermanager".load_roster;
19 local to_number = _G.tonumber;
18 20
19 function findNamedList (privacy_lists, name) 21 function findNamedList (privacy_lists, name)
20 local ret = nil 22 local ret = nil
21 if privacy_lists.lists == nil then 23 if privacy_lists.lists == nil then
22 module:log("debug", "no lists loaded.") 24 module:log("debug", "no lists loaded.")
75 return true; 77 return true;
76 end 78 end
77 return false; 79 return false;
78 end 80 end
79 81
80 function createOrReplaceList (privacy_lists, origin, stanza, name, entries) 82 function createOrReplaceList (privacy_lists, origin, stanza, name, entries, roster)
81 module:log("info", "User requests to create / replace list named %s, item count: %d", name, #entries); 83 module:log("info", "User requests to create / replace list named %s, item count: %d", name, #entries);
82 local ret = true; 84 local ret = true;
83 local idx = findNamedList(privacy_lists, name); 85 local idx = findNamedList(privacy_lists, name);
84 local bare_jid = origin.username.."@"..origin.host; 86 local bare_jid = origin.username.."@"..origin.host;
85 87
89 91
90 if idx == nil then 92 if idx == nil then
91 idx = #privacy_lists.lists + 1; 93 idx = #privacy_lists.lists + 1;
92 end 94 end
93 95
96 local orderCheck = {};
94 local list = {}; 97 local list = {};
95 list.name = name; 98 list.name = name;
96 list.items = {}; 99 list.items = {};
97 100
98 for _,item in ipairs(entries) do 101 for _,item in ipairs(entries) do
102 if to_number(item.attr.order) == nil or to_number(item.attr.order) < 0 or orderCheck[item.attr.order] ~= nil then
103 return "bad-request";
104 end
99 local tmp = {}; 105 local tmp = {};
106 orderCheck[item.attr.order] = true;
107
100 tmp["type"] = item.attr.type; 108 tmp["type"] = item.attr.type;
101 tmp["value"] = item.attr.value; 109 tmp["value"] = item.attr.value;
102 tmp["action"] = item.attr.action; 110 tmp["action"] = item.attr.action;
103 tmp["order"] = item.attr.order; 111 tmp["order"] = to_number(item.attr.order);
104 tmp["presence-in"] = false; 112 tmp["presence-in"] = false;
105 tmp["presence-out"] = false; 113 tmp["presence-out"] = false;
106 tmp["message"] = false; 114 tmp["message"] = false;
107 tmp["iq"] = false; 115 tmp["iq"] = false;
108 116
109 if #item.tags > 0 then 117 if #item.tags > 0 then
110 for _,tag in ipairs(item.tags) do 118 for _,tag in ipairs(item.tags) do
111 tmp[tag.name] = true; 119 tmp[tag.name] = true;
112 end 120 end
113 end 121 end
122
123 if tmp.type == "group" then
124 local found = false;
125 local roster = load_roster(origin.username, origin.host);
126 local groups = roster.groups;
127 if groups == nil then
128 return "item-not-found";
129 end
130 for _,group in ipairs(groups) do
131 if group == tmp.value then
132 found = true;
133 end
134 end
135 if found == false then
136 return "item-not-found";
137 end
138 elseif tmp.type == "subscription" then
139 if tmp.value ~= "both" and
140 tmp.value ~= "to" and
141 tmp.value ~= "from" and
142 tmp.value ~= "none" then
143 return "bad-request";
144 end
145 end
146
147 if tmp.action ~= "deny" and tmp.action ~= "allow" then
148 return "bad-request";
149 end
150
114 list.items[#list.items + 1] = tmp; 151 list.items[#list.items + 1] = tmp;
115 end 152 end
116 153
117 table.sort(list, sortByOrder); 154 table.sort(list, sortByOrder);
118 155
193 elseif tag.name == "list" and tag.attr.name then -- Client adds / edits a privacy list 230 elseif tag.name == "list" and tag.attr.name then -- Client adds / edits a privacy list
194 if #tag.tags == 0 then -- Client removes a privacy list 231 if #tag.tags == 0 then -- Client removes a privacy list
195 valid = deleteList(privacy_lists, origin, stanza, tag.attr.name); 232 valid = deleteList(privacy_lists, origin, stanza, tag.attr.name);
196 else -- Client edits a privacy list 233 else -- Client edits a privacy list
197 valid = createOrReplaceList(privacy_lists, origin, stanza, tag.attr.name, tag.tags) 234 valid = createOrReplaceList(privacy_lists, origin, stanza, tag.attr.name, tag.tags)
235 if valid ~= true then
236 err_reply = st.error_reply(stanza, "cancel", valid);
237 valid = false;
238 end
198 end 239 end
199 end 240 end
200 end 241 end
201 end 242 end
202 elseif stanza.attr.type == "get" then 243 elseif stanza.attr.type == "get" then
287 (evilJid.host and item.value == evilJid.host) then 328 (evilJid.host and item.value == evilJid.host) then
288 module:log("debug", "jid matched."); 329 module:log("debug", "jid matched.");
289 apply = true; 330 apply = true;
290 block = (item.action == "deny"); 331 block = (item.action == "deny");
291 elseif item.type == "group" then 332 elseif item.type == "group" then
292 local groups = origin.roster[jid_bare(stanza.from)].groups; 333 local roster = load_roster(node_, host_);
334 local groups = roster.groups;
293 for _,group in ipairs(groups) do 335 for _,group in ipairs(groups) do
294 if group == item.value then 336 if group == item.value then
295 module:log("debug", "group matched."); 337 module:log("debug", "group matched.");
296 apply = true; 338 apply = true;
297 block = (item.action == "deny"); 339 block = (item.action == "deny");