Software /
code /
prosody-modules
Comparison
mod_privacy/mod_privacy.lua @ 42:bbb3d3a90a70
mod_privacy: decrease the log messages count.
author | Thilo Cestonaro <thilo@cestona.ro> |
---|---|
date | Thu, 15 Oct 2009 11:38:57 +0200 |
parent | 41:0381d5d38c37 |
child | 45:3f5bbd7c90d4 |
comparison
equal
deleted
inserted
replaced
41:0381d5d38c37 | 42:bbb3d3a90a70 |
---|---|
18 local to_number = _G.tonumber; | 18 local to_number = _G.tonumber; |
19 | 19 |
20 function findNamedList (privacy_lists, name) | 20 function findNamedList (privacy_lists, name) |
21 local ret = nil | 21 local ret = nil |
22 if privacy_lists.lists == nil then | 22 if privacy_lists.lists == nil then |
23 module:log("debug", "privacy_lists.list is nil. no lists loaded.") | |
24 return nil; | 23 return nil; |
25 end | 24 end |
26 | 25 |
27 module:log("debug", "searching for list: %s", name); | |
28 for i=1, #privacy_lists.lists do | 26 for i=1, #privacy_lists.lists do |
29 if privacy_lists.lists[i].name == name then | 27 if privacy_lists.lists[i].name == name then |
30 ret = i; | 28 ret = i; |
31 break; | 29 break; |
32 end | 30 end |
37 function isListUsed(origin, name, privacy_lists) | 35 function isListUsed(origin, name, privacy_lists) |
38 if bare_sessions[origin.username.."@"..origin.host].sessions ~= nil then | 36 if bare_sessions[origin.username.."@"..origin.host].sessions ~= nil then |
39 for resource, session in pairs(bare_sessions[origin.username.."@"..origin.host].sessions) do | 37 for resource, session in pairs(bare_sessions[origin.username.."@"..origin.host].sessions) do |
40 if resource ~= origin.resource then | 38 if resource ~= origin.resource then |
41 if session.activePrivacyList == name then | 39 if session.activePrivacyList == name then |
42 module:log("debug", "List {0} is in use.", name); | |
43 return true; | 40 return true; |
44 elseif session.activePrivacyList == nil and privacy_lists.default == name then | 41 elseif session.activePrivacyList == nil and privacy_lists.default == name then |
45 module:log("debug", "List {0} is in use.", name); | |
46 return true; | 42 return true; |
47 end | 43 end |
48 end | 44 end |
49 end | 45 end |
50 end | 46 end |
51 module:log("debug", "List {0} is in NOT use.", name); | |
52 return false; | 47 return false; |
53 end | 48 end |
54 | 49 |
55 function isAnotherSessionUsingDefaultList(origin) | 50 function isAnotherSessionUsingDefaultList(origin) |
56 local ret = false | 51 local ret = false |
57 if bare_sessions[origin.username.."@"..origin.host].sessions ~= nil then | 52 if bare_sessions[origin.username.."@"..origin.host].sessions ~= nil then |
58 for resource, session in pairs(bare_sessions[origin.username.."@"..origin.host].sessions) do | 53 for resource, session in pairs(bare_sessions[origin.username.."@"..origin.host].sessions) do |
59 if resource ~= origin.resource and session.activePrivacyList == nil then | 54 if resource ~= origin.resource and session.activePrivacyList == nil then |
60 module:log("debug", "Default list is used by another resource."); | |
61 ret = true; | 55 ret = true; |
62 break; | 56 break; |
63 end | 57 end |
64 end | 58 end |
65 end | 59 end |
66 return ret; | 60 return ret; |
67 end | 61 end |
68 | 62 |
69 function declineList (privacy_lists, origin, stanza, which) | 63 function declineList (privacy_lists, origin, stanza, which) |
70 module:log("info", "User requests to decline the use of privacy list: %s", which); | |
71 if which == "default" then | 64 if which == "default" then |
72 if isAnotherSessionUsingDefaultList(origin) then | 65 if isAnotherSessionUsingDefaultList(origin) then |
73 return { "cancel", "conflict", "Another session is online and using the default list."}; | 66 return { "cancel", "conflict", "Another session is online and using the default list."}; |
74 end | 67 end |
75 privacy_lists.default = nil; | 68 privacy_lists.default = nil; |
82 end | 75 end |
83 return true; | 76 return true; |
84 end | 77 end |
85 | 78 |
86 function activateList (privacy_lists, origin, stanza, which, name) | 79 function activateList (privacy_lists, origin, stanza, which, name) |
87 module:log("info", "User requests to change the privacy list: %s, to be list named %s", which, name); | |
88 local idx = findNamedList(privacy_lists, name); | 80 local idx = findNamedList(privacy_lists, name); |
89 | 81 |
90 if privacy_lists.default == nil then | 82 if privacy_lists.default == nil then |
91 privacy_lists.default = ""; | 83 privacy_lists.default = ""; |
92 end | 84 end |
108 end | 100 end |
109 return true; | 101 return true; |
110 end | 102 end |
111 | 103 |
112 function deleteList (privacy_lists, origin, stanza, name) | 104 function deleteList (privacy_lists, origin, stanza, name) |
113 module:log("info", "User requests to delete privacy list: %s", name); | |
114 local idx = findNamedList(privacy_lists, name); | 105 local idx = findNamedList(privacy_lists, name); |
115 | 106 |
116 if idx ~= nil then | 107 if idx ~= nil then |
117 if isListUsed(origin, name, privacy_lists) then | 108 if isListUsed(origin, name, privacy_lists) then |
118 return {"cancel", "conflict", "Another session is online and using the list which should be deleted."}; | 109 return {"cancel", "conflict", "Another session is online and using the list which should be deleted."}; |
136 end | 127 end |
137 return false; | 128 return false; |
138 end | 129 end |
139 | 130 |
140 function createOrReplaceList (privacy_lists, origin, stanza, name, entries, roster) | 131 function createOrReplaceList (privacy_lists, origin, stanza, name, entries, roster) |
141 module:log("info", "User requests to create / replace list named %s, item count: %d", name, #entries); | |
142 local idx = findNamedList(privacy_lists, name); | 132 local idx = findNamedList(privacy_lists, name); |
143 local bare_jid = origin.username.."@"..origin.host; | 133 local bare_jid = origin.username.."@"..origin.host; |
144 | 134 |
145 if privacy_lists.lists == nil then | 135 if privacy_lists.lists == nil then |
146 privacy_lists.lists = {}; | 136 privacy_lists.lists = {}; |
235 end | 225 end |
236 return true; | 226 return true; |
237 end | 227 end |
238 | 228 |
239 function getList(privacy_lists, origin, stanza, name) | 229 function getList(privacy_lists, origin, stanza, name) |
240 module:log("info", "User requests list named: %s", name or "nil"); | |
241 local reply = st.reply(stanza); | 230 local reply = st.reply(stanza); |
242 reply:tag("query", {xmlns="jabber:iq:privacy"}); | 231 reply:tag("query", {xmlns="jabber:iq:privacy"}); |
243 | 232 |
244 if name == nil then | 233 if name == nil then |
245 reply:tag("active", {name=origin.activePrivacyList or ""}):up(); | 234 reply:tag("active", {name=origin.activePrivacyList or ""}):up(); |
249 reply:tag("list", {name=list.name}):up(); | 238 reply:tag("list", {name=list.name}):up(); |
250 end | 239 end |
251 end | 240 end |
252 else | 241 else |
253 local idx = findNamedList(privacy_lists, name); | 242 local idx = findNamedList(privacy_lists, name); |
254 module:log("debug", "list idx: %d", idx or -1); | |
255 if idx ~= nil then | 243 if idx ~= nil then |
256 list = privacy_lists.lists[idx]; | 244 list = privacy_lists.lists[idx]; |
257 reply = reply:tag("list", {name=list.name}); | 245 reply = reply:tag("list", {name=list.name}); |
258 for _,item in ipairs(list.items) do | 246 for _,item in ipairs(list.items) do |
259 reply:tag("item", {type=item.type, value=item.value, action=item.action, order=item.order}); | 247 reply:tag("item", {type=item.type, value=item.value, action=item.action, order=item.order}); |
291 end | 279 end |
292 elseif tag.name == "list" and tag.attr.name then -- Client adds / edits a privacy list | 280 elseif tag.name == "list" and tag.attr.name then -- Client adds / edits a privacy list |
293 if #tag.tags == 0 then -- Client removes a privacy list | 281 if #tag.tags == 0 then -- Client removes a privacy list |
294 valid = deleteList(privacy_lists, origin, stanza, tag.attr.name); | 282 valid = deleteList(privacy_lists, origin, stanza, tag.attr.name); |
295 else -- Client edits a privacy list | 283 else -- Client edits a privacy list |
296 valid = createOrReplaceList(privacy_lists, origin, stanza, tag.attr.name, tag.tags); -- TODO check if used! | 284 valid = createOrReplaceList(privacy_lists, origin, stanza, tag.attr.name, tag.tags); |
297 end | 285 end |
298 end | 286 end |
299 end | 287 end |
300 end | 288 end |
301 elseif stanza.attr.type == "get" then | 289 elseif stanza.attr.type == "get" then |
333 function checkIfNeedToBeBlocked(e, session) | 321 function checkIfNeedToBeBlocked(e, session) |
334 local origin, stanza = e.origin, e.stanza; | 322 local origin, stanza = e.origin, e.stanza; |
335 local privacy_lists = datamanager.load(session.username, session.host, "privacy") or {}; | 323 local privacy_lists = datamanager.load(session.username, session.host, "privacy") or {}; |
336 local bare_jid = session.username.."@"..session.host; | 324 local bare_jid = session.username.."@"..session.host; |
337 | 325 |
338 module:log("debug", "checkIfNeedToBeBlocked: username: %s, host: %s", session.username, session.host); | |
339 module:log("debug", "stanza: %s, to: %s, form: %s", stanza.name, stanza.attr.to or "nil", stanza.attr.from or "nil"); | 326 module:log("debug", "stanza: %s, to: %s, form: %s", stanza.name, stanza.attr.to or "nil", stanza.attr.from or "nil"); |
340 | 327 |
341 if stanza.attr.to ~= nil and stanza.attr.from ~= nil then | 328 if stanza.attr.to ~= nil and stanza.attr.from ~= nil then |
342 module:log("debug", "privacy_lists.lists: %s", tostring(privacy_lists.lists)); | |
343 module:log("debug", "session.activePrivacyList: %s", tostring(session.activePrivacyList)); | |
344 module:log("debug", "privacy_lists.default: %s", tostring(privacy_lists.default)); | |
345 if privacy_lists.lists == nil or | 329 if privacy_lists.lists == nil or |
346 (session.activePrivacyList == nil or session.activePrivacyList == "") and | 330 (session.activePrivacyList == nil or session.activePrivacyList == "") and |
347 (privacy_lists.default == nil or privacy_lists.default == "") | 331 (privacy_lists.default == nil or privacy_lists.default == "") |
348 then | 332 then |
349 module:log("debug", "neither active nor default list set (both are nil) or privacy_lists totally nil. So nothing to do => default is Allow All."); | |
350 return; -- Nothing to block, default is Allow all | 333 return; -- Nothing to block, default is Allow all |
351 end | 334 end |
352 if jid_bare(stanza.attr.from) == bare_jid and jid_bare(stanza.attr.to) == bare_jid then | 335 if jid_bare(stanza.attr.from) == bare_jid and jid_bare(stanza.attr.to) == bare_jid then |
353 module:log("debug", "Never block communications from one of a user's resources to another."); | 336 module:log("debug", "Never block communications from one of a user's resources to another."); |
354 return; -- from one of a user's resource to another => HANDS OFF! | 337 return; -- from one of a user's resource to another => HANDS OFF! |
372 return; | 355 return; |
373 end | 356 end |
374 for _,item in ipairs(list.items) do | 357 for _,item in ipairs(list.items) do |
375 local apply = false; | 358 local apply = false; |
376 local block = false; | 359 local block = false; |
377 if (stanza.name == "message" and item.message) then | 360 if ( |
378 module:log("debug", "message stanza match."); | 361 (stanza.name == "message" and item.message) or |
379 apply = true; | 362 (stanza.name == "iq" and item.iq) or |
380 elseif (stanza.name == "iq" and item.iq) then | 363 (stanza.name == "presence" and jid_bare(stanza.attr.to) == bare_jid and item["presence-in"]) or |
381 module:log("debug", "iq stanza match!"); | 364 (stanza.name == "presence" and jid_bare(stanza.attr.from) == bare_jid and item["presence-out"]) or |
382 apply = true; | 365 (item.message == false and item.iq == false and item["presence-in"] == false and item["presence-in"] == false) |
383 elseif (stanza.name == "presence" and jid_bare(stanza.attr.to) == bare_jid and item["presence-in"]) then | 366 ) then |
384 module:log("debug", "presence-in stanza match."); | |
385 apply = true; | |
386 elseif (stanza.name == "presence" and jid_bare(stanza.attr.from) == bare_jid and item["presence-out"]) then | |
387 module:log("debug", "presence-out stanza match"); | |
388 apply = true; | |
389 elseif (item.message == false and item.iq == false and item["presence-in"] == false and item["presence-in"] == false) then | |
390 module:log("debug", "all is false, so apply."); | |
391 apply = true; | 367 apply = true; |
392 end | 368 end |
393 if apply then | 369 if apply then |
394 local evilJid = {}; | 370 local evilJid = {}; |
395 apply = false; | 371 apply = false; |
398 evilJid.node, evilJid.host, evilJid.resource = jid_split(stanza.attr.from); | 374 evilJid.node, evilJid.host, evilJid.resource = jid_split(stanza.attr.from); |
399 else | 375 else |
400 module:log("debug", "evil jid is (to): %s", stanza.attr.to); | 376 module:log("debug", "evil jid is (to): %s", stanza.attr.to); |
401 evilJid.node, evilJid.host, evilJid.resource = jid_split(stanza.attr.to); | 377 evilJid.node, evilJid.host, evilJid.resource = jid_split(stanza.attr.to); |
402 end | 378 end |
403 module:log("debug", "Item Type: %s", tostring(item.type)); | |
404 module:log("debug", "Item Action: %s", item.action); | |
405 if item.type == "jid" and | 379 if item.type == "jid" and |
406 (evilJid.node and evilJid.host and evilJid.resource and item.value == evilJid.node.."@"..evilJid.host.."/"..evilJid.resource) or | 380 (evilJid.node and evilJid.host and evilJid.resource and item.value == evilJid.node.."@"..evilJid.host.."/"..evilJid.resource) or |
407 (evilJid.node and evilJid.host and item.value == evilJid.node.."@"..evilJid.host) or | 381 (evilJid.node and evilJid.host and item.value == evilJid.node.."@"..evilJid.host) or |
408 (evilJid.host and evilJid.resource and item.value == evilJid.host.."/"..evilJid.resource) or | 382 (evilJid.host and evilJid.resource and item.value == evilJid.host.."/"..evilJid.resource) or |
409 (evilJid.host and item.value == evilJid.host) then | 383 (evilJid.host and item.value == evilJid.host) then |
410 module:log("debug", "jid matched."); | |
411 apply = true; | 384 apply = true; |
412 block = (item.action == "deny"); | 385 block = (item.action == "deny"); |
413 elseif item.type == "group" then | 386 elseif item.type == "group" then |
414 local roster = load_roster(session.username, session.host); | 387 local roster = load_roster(session.username, session.host); |
415 local groups = roster[evilJid.node .. "@" .. evilJid.host].groups; | 388 local groups = roster[evilJid.node .. "@" .. evilJid.host].groups; |
416 for group in pairs(groups) do | 389 for group in pairs(groups) do |
417 if group == item.value then | 390 if group == item.value then |
418 module:log("debug", "group matched."); | |
419 apply = true; | 391 apply = true; |
420 block = (item.action == "deny"); | 392 block = (item.action == "deny"); |
421 break; | 393 break; |
422 end | 394 end |
423 end | 395 end |
424 elseif item.type == "subscription" and evilJid.node ~= nil and evilJid.host ~= nil then -- we need a valid bare evil jid | 396 elseif item.type == "subscription" and evilJid.node ~= nil and evilJid.host ~= nil then -- we need a valid bare evil jid |
425 local roster = load_roster(session.username, session.host); | 397 local roster = load_roster(session.username, session.host); |
426 if roster[evilJid.node .. "@" .. evilJid.host].subscription == item.value then | 398 if roster[evilJid.node .. "@" .. evilJid.host].subscription == item.value then |
427 module:log("debug", "subscription matched."); | |
428 apply = true; | 399 apply = true; |
429 block = (item.action == "deny"); | 400 block = (item.action == "deny"); |
430 end | 401 end |
431 elseif item.type == nil then | 402 elseif item.type == nil then |
432 module:log("debug", "no item.type, so matched."); | |
433 apply = true; | 403 apply = true; |
434 block = (item.action == "deny"); | 404 block = (item.action == "deny"); |
435 end | 405 end |
436 end | 406 end |
437 if apply then | 407 if apply then |