Annotate

mod_privacy_lists/mod_privacy_lists.lua @ 3965:2b10e51d85a6

mod_muc_limits: Add config option to limit to join stanzas only This is a bit more limited in pre-0.11 MUC modules, because it just detects stanzas sent to full JIDs (which would include all presence and nick changes). This option is useful for setups where users are typically unaffiliated, but trusted (e.g. if access to the room is gated through some other means such as password/token auth).
author Matthew Wild <mwild1@gmail.com>
date Fri, 03 Apr 2020 12:26:56 +0100
parent 3009:a6fa44eeb818
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1474
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 -- Prosody IM
1475
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
2 -- Copyright (C) 2009-2014 Matthew Wild
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
3 -- Copyright (C) 2009-2014 Waqas Hussain
1474
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 -- Copyright (C) 2009 Thilo Cestonaro
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 --
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 -- This project is MIT/X11 licensed. Please see the
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 -- COPYING file in the source package for more information.
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 --
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 module:add_feature("jabber:iq:privacy");
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local st = require "util.stanza";
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 local bare_sessions, full_sessions = prosody.bare_sessions, prosody.full_sessions;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 local util_Jid = require "util.jid";
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 local jid_bare = util_Jid.bare;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 local jid_split, jid_join = util_Jid.split, util_Jid.join;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 local load_roster = require "core.rostermanager".load_roster;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 local to_number = tonumber;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19
1480
92b930be261f mod_privacy_lists: Open 'privacy' storage (module:open_store() defaults to the name of the module)
Kim Alvefur <zash@zash.se>
parents: 1475
diff changeset
20 local privacy_storage = module:open_store("privacy");
1475
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
21 local user_sessions = hosts[module.host].sessions;
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
22
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
23 local function get_lists(username)
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
24 return user_sessions[username].privacy_lists;
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
25 end
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
26
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
27 local function save_lists(username)
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
28 local privacy_lists = user_sessions[username].privacy_lists;
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
29 if privacy_lists.default == nil and next(privacy_lists.lists) == nil then
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
30 privacy_lists = nil;
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
31 end
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
32 return privacy_storage:set(username, privacy_lists);
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
33 end
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
34
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
35 module:hook("resource-bind", function (event)
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
36 local username = event.session.username;
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
37 user_sessions[username].privacy_lists = privacy_storage:get(username) or { lists = {} };
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
38 end);
1474
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 function isListUsed(origin, name, privacy_lists)
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 local user = bare_sessions[origin.username.."@"..origin.host];
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 if user then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 for resource, session in pairs(user.sessions) do
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 if resource ~= origin.resource then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 if session.activePrivacyList == name then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 return true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 elseif session.activePrivacyList == nil and privacy_lists.default == name then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 return true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 function isAnotherSessionUsingDefaultList(origin)
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 local user = bare_sessions[origin.username.."@"..origin.host];
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 if user then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 for resource, session in pairs(user.sessions) do
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 if resource ~= origin.resource and session.activePrivacyList == nil then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 return true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 function declineList(privacy_lists, origin, stanza, which)
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 if which == "default" then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 if isAnotherSessionUsingDefaultList(origin) then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 return { "cancel", "conflict", "Another session is online and using the default list."};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 privacy_lists.default = nil;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 origin.send(st.reply(stanza));
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 elseif which == "active" then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 origin.activePrivacyList = nil;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 origin.send(st.reply(stanza));
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 else
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 return {"modify", "bad-request", "Neither default nor active list specifed to decline."};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 return true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 function activateList(privacy_lists, origin, stanza, which, name)
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 local list = privacy_lists.lists[name];
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 if which == "default" and list then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 if isAnotherSessionUsingDefaultList(origin) then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 return {"cancel", "conflict", "Another session is online and using the default list."};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 privacy_lists.default = name;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 origin.send(st.reply(stanza));
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 elseif which == "active" and list then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 origin.activePrivacyList = name;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 origin.send(st.reply(stanza));
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 elseif not list then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 return {"cancel", "item-not-found", "No such list: "..name};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 else
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 return {"modify", "bad-request", "No list chosen to be active or default."};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 return true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 function deleteList(privacy_lists, origin, stanza, name)
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 local list = privacy_lists.lists[name];
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 if list then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 if isListUsed(origin, name, privacy_lists) then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 return {"cancel", "conflict", "Another session is online and using the list which should be deleted."};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 if privacy_lists.default == name then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 privacy_lists.default = nil;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 if origin.activePrivacyList == name then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 origin.activePrivacyList = nil;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 privacy_lists.lists[name] = nil;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 origin.send(st.reply(stanza));
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 return true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 return {"modify", "bad-request", "Not existing list specifed to be deleted."};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 function createOrReplaceList (privacy_lists, origin, stanza, name, entries)
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 local bare_jid = origin.username.."@"..origin.host;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 if privacy_lists.lists == nil then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 privacy_lists.lists = {};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 local list = {};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130 privacy_lists.lists[name] = list;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
131
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132 local orderCheck = {};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 list.name = name;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 list.items = {};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136 for _,item in ipairs(entries) do
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137 if to_number(item.attr.order) == nil or to_number(item.attr.order) < 0 or orderCheck[item.attr.order] ~= nil then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 return {"modify", "bad-request", "Order attribute not valid."};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
141 if item.attr.type ~= nil and item.attr.type ~= "jid" and item.attr.type ~= "subscription" and item.attr.type ~= "group" then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 return {"modify", "bad-request", "Type attribute not valid."};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
143 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
144
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
145 local tmp = {};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 orderCheck[item.attr.order] = true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148 tmp["type"] = item.attr.type;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149 tmp["value"] = item.attr.value;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 tmp["action"] = item.attr.action;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151 tmp["order"] = to_number(item.attr.order);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
152 tmp["presence-in"] = false;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
153 tmp["presence-out"] = false;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
154 tmp["message"] = false;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
155 tmp["iq"] = false;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
156
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
157 if #item.tags > 0 then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
158 for _,tag in ipairs(item.tags) do
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159 tmp[tag.name] = true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
160 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
161 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
162
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
163 if tmp.type == "subscription" then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
164 if tmp.value ~= "both" and
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165 tmp.value ~= "to" and
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 tmp.value ~= "from" and
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167 tmp.value ~= "none" then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
168 return {"cancel", "bad-request", "Subscription value must be both, to, from or none."};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
170 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172 if tmp.action ~= "deny" and tmp.action ~= "allow" then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
173 return {"cancel", "bad-request", "Action must be either deny or allow."};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 list.items[#list.items + 1] = tmp;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177
1487
5410f5c30d63 mod_privacy_lists: Correctly sort the list rules by order (thanks Flow). Fixes issue #58
Matthew Wild <mwild1@gmail.com>
parents: 1480
diff changeset
178 table.sort(list.items, function(a, b) return a.order < b.order; end);
1474
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
179
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
180 origin.send(st.reply(stanza));
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
181 if bare_sessions[bare_jid] ~= nil then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
182 local iq = st.iq ( { type = "set", id="push1" } );
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
183 iq:tag ("query", { xmlns = "jabber:iq:privacy" } );
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184 iq:tag ("list", { name = list.name } ):up();
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
185 iq:up();
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
186 for resource, session in pairs(bare_sessions[bare_jid].sessions) do
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
187 iq.attr.to = bare_jid.."/"..resource
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
188 session.send(iq);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
189 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
190 else
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
191 return {"cancel", "bad-request", "internal error."};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
192 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
193 return true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
194 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
195
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
196 function getList(privacy_lists, origin, stanza, name)
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
197 local reply = st.reply(stanza);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
198 reply:tag("query", {xmlns="jabber:iq:privacy"});
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
199
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
200 if name == nil then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
201 if privacy_lists.lists then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
202 if origin.activePrivacyList then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
203 reply:tag("active", {name=origin.activePrivacyList}):up();
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
204 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
205 if privacy_lists.default then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
206 reply:tag("default", {name=privacy_lists.default}):up();
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
207 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
208 for name,list in pairs(privacy_lists.lists) do
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
209 reply:tag("list", {name=name}):up();
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
210 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
211 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
212 else
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
213 local list = privacy_lists.lists[name];
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
214 if list then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
215 reply = reply:tag("list", {name=list.name});
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
216 for _,item in ipairs(list.items) do
3009
a6fa44eeb818 mod_privacy_lists: Convert order to a string before using as attribute value (thanks ValdikSS)
Matthew Wild <mwild1@gmail.com>
parents: 2214
diff changeset
217 reply:tag("item", {type=item.type, value=item.value, action=item.action, order=("%d"):format(item.order)});
1474
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
218 if item["message"] then reply:tag("message"):up(); end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
219 if item["iq"] then reply:tag("iq"):up(); end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
220 if item["presence-in"] then reply:tag("presence-in"):up(); end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
221 if item["presence-out"] then reply:tag("presence-out"):up(); end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
222 reply:up();
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
223 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
224 else
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
225 return {"cancel", "item-not-found", "Unknown list specified."};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
226 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
227 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
228
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
229 origin.send(reply);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
230 return true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
231 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
232
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
233 module:hook("iq/bare/jabber:iq:privacy:query", function(data)
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
234 local origin, stanza = data.origin, data.stanza;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
235
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
236 if stanza.attr.to == nil then -- only service requests to own bare JID
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
237 local query = stanza.tags[1]; -- the query element
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
238 local valid = false;
1475
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
239 local privacy_lists = get_lists(origin.username);
1474
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
240
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
241 if privacy_lists.lists[1] then -- Code to migrate from old privacy lists format, remove in 0.8
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
242 module:log("info", "Upgrading format of stored privacy lists for %s@%s", origin.username, origin.host);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
243 local lists = privacy_lists.lists;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
244 for idx, list in ipairs(lists) do
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
245 lists[list.name] = list;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
246 lists[idx] = nil;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
247 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
248 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
249
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
250 if stanza.attr.type == "set" then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
251 if #query.tags == 1 then -- the <query/> element MUST NOT include more than one child element
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
252 for _,tag in ipairs(query.tags) do
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
253 if tag.name == "active" or tag.name == "default" then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
254 if tag.attr.name == nil then -- Client declines the use of active / default list
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
255 valid = declineList(privacy_lists, origin, stanza, tag.name);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
256 else -- Client requests change of active / default list
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
257 valid = activateList(privacy_lists, origin, stanza, tag.name, tag.attr.name);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
258 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
259 elseif tag.name == "list" and tag.attr.name then -- Client adds / edits a privacy list
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
260 if #tag.tags == 0 then -- Client removes a privacy list
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
261 valid = deleteList(privacy_lists, origin, stanza, tag.attr.name);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
262 else -- Client edits a privacy list
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
263 valid = createOrReplaceList(privacy_lists, origin, stanza, tag.attr.name, tag.tags);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
264 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
265 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
266 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
267 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
268 elseif stanza.attr.type == "get" then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
269 local name = nil;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
270 local listsToRetrieve = 0;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
271 if #query.tags >= 1 then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
272 for _,tag in ipairs(query.tags) do
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
273 if tag.name == "list" then -- Client requests a privacy list from server
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
274 name = tag.attr.name;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
275 listsToRetrieve = listsToRetrieve + 1;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
276 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
277 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
278 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
279 if listsToRetrieve == 0 or listsToRetrieve == 1 then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
280 valid = getList(privacy_lists, origin, stanza, name);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
281 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
282 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
283
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
284 if valid ~= true then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
285 valid = valid or { "cancel", "bad-request", "Couldn't understand request" };
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
286 if valid[1] == nil then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
287 valid[1] = "cancel";
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
288 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
289 if valid[2] == nil then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
290 valid[2] = "bad-request";
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
291 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
292 origin.send(st.error_reply(stanza, valid[1], valid[2], valid[3]));
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
293 else
1475
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
294 save_lists(origin.username);
1474
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
295 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
296 return true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
297 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
298 end);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
299
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
300 function checkIfNeedToBeBlocked(e, session)
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
301 local origin, stanza = e.origin, e.stanza;
1475
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
302 local user = user_sessions[session.username];
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
303 local privacy_lists = user and user.privacy_lists;
1474
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
304 local bare_jid = session.username.."@"..session.host;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
305 local to = stanza.attr.to or bare_jid;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
306 local from = stanza.attr.from;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
307
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
308 local is_to_user = bare_jid == jid_bare(to);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
309 local is_from_user = bare_jid == jid_bare(from);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
310
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
311 --module:log("debug", "stanza: %s, to: %s, from: %s", tostring(stanza.name), tostring(to), tostring(from));
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
312
1475
58d48afca54d mod_privacy_lists: Cache privacy lists for better performance with high traffic
Matthew Wild <mwild1@gmail.com>
parents: 1474
diff changeset
313 if not privacy_lists or privacy_lists.lists == nil or
1474
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
314 not (session.activePrivacyList or privacy_lists.default)
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
315 then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
316 return; -- Nothing to block, default is Allow all
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
317 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
318 if is_from_user and is_to_user then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
319 --module:log("debug", "Not blocking communications between user's resources");
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
320 return; -- from one of a user's resource to another => HANDS OFF!
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
321 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
322
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
323 local listname = session.activePrivacyList;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
324 if listname == nil then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
325 listname = privacy_lists.default; -- no active list selected, use default list
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
326 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
327 local list = privacy_lists.lists[listname];
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
328 if not list then -- should never happen
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
329 module:log("warn", "given privacy list not found. name: %s for user %s", listname, bare_jid);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
330 return;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
331 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
332 for _,item in ipairs(list.items) do
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
333 local apply = false;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
334 local block = false;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
335 if (
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
336 (stanza.name == "message" and item.message) or
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
337 (stanza.name == "iq" and item.iq) or
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
338 (stanza.name == "presence" and is_to_user and item["presence-in"]) or
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
339 (stanza.name == "presence" and is_from_user and item["presence-out"]) or
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
340 (item.message == false and item.iq == false and item["presence-in"] == false and item["presence-out"] == false)
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
341 ) then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
342 apply = true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
343 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
344 if apply then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
345 local evilJid = {};
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
346 apply = false;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
347 if is_to_user then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
348 --module:log("debug", "evil jid is (from): %s", from);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
349 evilJid.node, evilJid.host, evilJid.resource = jid_split(from);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
350 else
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
351 --module:log("debug", "evil jid is (to): %s", to);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
352 evilJid.node, evilJid.host, evilJid.resource = jid_split(to);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
353 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
354 if item.type == "jid" and
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
355 (evilJid.node and evilJid.host and evilJid.resource and item.value == evilJid.node.."@"..evilJid.host.."/"..evilJid.resource) or
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
356 (evilJid.node and evilJid.host and item.value == evilJid.node.."@"..evilJid.host) or
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
357 (evilJid.host and evilJid.resource and item.value == evilJid.host.."/"..evilJid.resource) or
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
358 (evilJid.host and item.value == evilJid.host) then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
359 apply = true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
360 block = (item.action == "deny");
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
361 elseif item.type == "group" then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
362 local roster = load_roster(session.username, session.host);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
363 local roster_entry = roster[jid_join(evilJid.node, evilJid.host)];
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
364 if roster_entry then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
365 local groups = roster_entry.groups;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
366 for group in pairs(groups) do
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
367 if group == item.value then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
368 apply = true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
369 block = (item.action == "deny");
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
370 break;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
371 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
372 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
373 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
374 elseif item.type == "subscription" then -- we need a valid bare evil jid
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
375 local roster = load_roster(session.username, session.host);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
376 local roster_entry = roster[jid_join(evilJid.node, evilJid.host)];
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
377 if (not(roster_entry) and item.value == "none")
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
378 or (roster_entry and roster_entry.subscription == item.value) then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
379 apply = true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
380 block = (item.action == "deny");
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
381 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
382 elseif item.type == nil then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
383 apply = true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
384 block = (item.action == "deny");
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
385 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
386 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
387 if apply then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
388 if block then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
389 -- drop and not bounce groupchat messages, otherwise users will get kicked
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
390 if stanza.attr.type == "groupchat" then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
391 return true;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
392 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
393 module:log("debug", "stanza blocked: %s, to: %s, from: %s", tostring(stanza.name), tostring(to), tostring(from));
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
394 if stanza.name == "message" then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
395 origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
396 elseif stanza.name == "iq" and (stanza.attr.type == "get" or stanza.attr.type == "set") then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
397 origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
398 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
399 return true; -- stanza blocked !
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
400 else
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
401 --module:log("debug", "stanza explicitly allowed!")
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
402 return;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
403 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
404 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
405 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
406 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
407
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
408 function preCheckIncoming(e)
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
409 local session;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
410 if e.stanza.attr.to ~= nil then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
411 local node, host, resource = jid_split(e.stanza.attr.to);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
412 if node == nil or host == nil then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
413 return;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
414 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
415 if resource == nil then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
416 local prio = 0;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
417 if bare_sessions[node.."@"..host] ~= nil then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
418 for resource, session_ in pairs(bare_sessions[node.."@"..host].sessions) do
2214
c2fc3516cca1 mod_privacy_lists: Fix selecting the top resource (fixes #694)
Kim Alvefur <zash@zash.se>
parents: 1487
diff changeset
419 if session_.priority ~= nil and session_.priority >= prio then
1474
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
420 session = session_;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
421 prio = session_.priority;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
422 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
423 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
424 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
425 else
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
426 session = full_sessions[node.."@"..host.."/"..resource];
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
427 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
428 if session ~= nil then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
429 return checkIfNeedToBeBlocked(e, session);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
430 else
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
431 --module:log("debug", "preCheckIncoming: Couldn't get session for jid: %s@%s/%s", tostring(node), tostring(host), tostring(resource));
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
432 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
433 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
434 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
435
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
436 function preCheckOutgoing(e)
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
437 local session = e.origin;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
438 if e.stanza.attr.from == nil then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
439 e.stanza.attr.from = session.username .. "@" .. session.host;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
440 if session.resource ~= nil then
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
441 e.stanza.attr.from = e.stanza.attr.from .. "/" .. session.resource;
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
442 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
443 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
444 if session.username then -- FIXME do properly
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
445 return checkIfNeedToBeBlocked(e, session);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
446 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
447 end
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
448
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
449 module:hook("pre-message/full", preCheckOutgoing, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
450 module:hook("pre-message/bare", preCheckOutgoing, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
451 module:hook("pre-message/host", preCheckOutgoing, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
452 module:hook("pre-iq/full", preCheckOutgoing, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
453 module:hook("pre-iq/bare", preCheckOutgoing, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
454 module:hook("pre-iq/host", preCheckOutgoing, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
455 module:hook("pre-presence/full", preCheckOutgoing, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
456 module:hook("pre-presence/bare", preCheckOutgoing, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
457 module:hook("pre-presence/host", preCheckOutgoing, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
458
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
459 module:hook("message/full", preCheckIncoming, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
460 module:hook("message/bare", preCheckIncoming, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
461 module:hook("message/host", preCheckIncoming, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
462 module:hook("iq/full", preCheckIncoming, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
463 module:hook("iq/bare", preCheckIncoming, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
464 module:hook("iq/host", preCheckIncoming, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
465 module:hook("presence/full", preCheckIncoming, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
466 module:hook("presence/bare", preCheckIncoming, 500);
d4233dce479f mod_privacy_lists: Import mod_privacy from 0.9
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
467 module:hook("presence/host", preCheckIncoming, 500);