Mercurial > 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 |
| parents | 0381d5d38c37 |
| children | 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 |
