Annotate

plugins/mod_privacy.lua @ 3938:a3ecaf46bd82

util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
author Matthew Wild <mwild1@gmail.com>
date Wed, 22 Dec 2010 03:46:32 +0000
parent 3453:fba130c16818
child 4231:a99f82db692a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1293
diff changeset
1 -- Prosody IM
2925
692b3c6c5bd2 Merge 0.6->0.7
Matthew Wild <mwild1@gmail.com>
parents: 2616 2923
diff changeset
2 -- Copyright (C) 2009-2010 Matthew Wild
692b3c6c5bd2 Merge 0.6->0.7
Matthew Wild <mwild1@gmail.com>
parents: 2616 2923
diff changeset
3 -- Copyright (C) 2009-2010 Waqas Hussain
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
4 -- Copyright (C) 2009 Thilo Cestonaro
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1293
diff changeset
5 --
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1293
diff changeset
6 -- This project is MIT/X11 licensed. Please see the
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1293
diff changeset
7 -- COPYING file in the source package for more information.
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1293
diff changeset
8 --
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1293
diff changeset
9
3317
82b17b199d68 mod_privacy: Add service discovery feature.
Waqas Hussain <waqas20@gmail.com>
parents: 3313
diff changeset
10 module:add_feature("jabber:iq:privacy");
82b17b199d68 mod_privacy: Add service discovery feature.
Waqas Hussain <waqas20@gmail.com>
parents: 3313
diff changeset
11
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
12 local prosody = prosody;
1293
13dde33d5b87 mod_privacy: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
13 local st = require "util.stanza";
13dde33d5b87 mod_privacy: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
14 local datamanager = require "util.datamanager";
2498
3d08a6cf57ea mod_privacy: Fixed global access.
Waqas Hussain <waqas20@gmail.com>
parents: 2496
diff changeset
15 local bare_sessions, full_sessions = bare_sessions, full_sessions;
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
16 local util_Jid = require "util.jid";
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
17 local jid_bare = util_Jid.bare;
3069
c3df9053e0a9 mod_privacy: Fix several possible tracebacks when either the contact is a host JID, or the contact isn't in your roster and you have roster group/subscription rules in place
Matthew Wild <mwild1@gmail.com>
parents: 3068
diff changeset
18 local jid_split, jid_join = util_Jid.split, util_Jid.join;
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
19 local load_roster = require "core.rostermanager".load_roster;
2498
3d08a6cf57ea mod_privacy: Fixed global access.
Waqas Hussain <waqas20@gmail.com>
parents: 2496
diff changeset
20 local to_number = tonumber;
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
21
2500
bffdaeb7ab5e mod_privacy: Cleaned up code.
Waqas Hussain <waqas20@gmail.com>
parents: 2499
diff changeset
22 function isListUsed(origin, name, privacy_lists)
bffdaeb7ab5e mod_privacy: Cleaned up code.
Waqas Hussain <waqas20@gmail.com>
parents: 2499
diff changeset
23 local user = bare_sessions[origin.username.."@"..origin.host];
bffdaeb7ab5e mod_privacy: Cleaned up code.
Waqas Hussain <waqas20@gmail.com>
parents: 2499
diff changeset
24 if user then
bffdaeb7ab5e mod_privacy: Cleaned up code.
Waqas Hussain <waqas20@gmail.com>
parents: 2499
diff changeset
25 for resource, session in pairs(user.sessions) do
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
26 if resource ~= origin.resource then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
27 if session.activePrivacyList == name then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
28 return true;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
29 elseif session.activePrivacyList == nil and privacy_lists.default == name then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
30 return true;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
31 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
32 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
33 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
34 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
35 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
36
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
37 function isAnotherSessionUsingDefaultList(origin)
2500
bffdaeb7ab5e mod_privacy: Cleaned up code.
Waqas Hussain <waqas20@gmail.com>
parents: 2499
diff changeset
38 local user = bare_sessions[origin.username.."@"..origin.host];
bffdaeb7ab5e mod_privacy: Cleaned up code.
Waqas Hussain <waqas20@gmail.com>
parents: 2499
diff changeset
39 if user then
bffdaeb7ab5e mod_privacy: Cleaned up code.
Waqas Hussain <waqas20@gmail.com>
parents: 2499
diff changeset
40 for resource, session in pairs(user.sessions) do
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
41 if resource ~= origin.resource and session.activePrivacyList == nil then
2500
bffdaeb7ab5e mod_privacy: Cleaned up code.
Waqas Hussain <waqas20@gmail.com>
parents: 2499
diff changeset
42 return true;
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
43 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
44 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
45 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
46 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
47
2498
3d08a6cf57ea mod_privacy: Fixed global access.
Waqas Hussain <waqas20@gmail.com>
parents: 2496
diff changeset
48 function sendUnavailable(origin, to, from)
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
49 --[[ example unavailable presence stanza
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
50 <presence from="node@host/resource" type="unavailable" to="node@host" >
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
51 <status>Logged out</status>
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
52 </presence>
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
53 ]]--
2500
bffdaeb7ab5e mod_privacy: Cleaned up code.
Waqas Hussain <waqas20@gmail.com>
parents: 2499
diff changeset
54 local presence = st.presence({from=from, type="unavailable"});
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
55 presence:tag("status"):text("Logged out");
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
56
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
57 local node, host = jid_bare(to);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
58 local bare = node .. "@" .. host;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
59
2500
bffdaeb7ab5e mod_privacy: Cleaned up code.
Waqas Hussain <waqas20@gmail.com>
parents: 2499
diff changeset
60 local user = bare_sessions[bare];
bffdaeb7ab5e mod_privacy: Cleaned up code.
Waqas Hussain <waqas20@gmail.com>
parents: 2499
diff changeset
61 if user then
bffdaeb7ab5e mod_privacy: Cleaned up code.
Waqas Hussain <waqas20@gmail.com>
parents: 2499
diff changeset
62 for resource, session in pairs(user.sessions) do
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
63 presence.attr.to = session.full_jid;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
64 module:log("debug", "send unavailable to: %s; from: %s", tostring(presence.attr.to), tostring(presence.attr.from));
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
65 origin.send(presence);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
66 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
67 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
68 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
69
2500
bffdaeb7ab5e mod_privacy: Cleaned up code.
Waqas Hussain <waqas20@gmail.com>
parents: 2499
diff changeset
70 function declineList(privacy_lists, origin, stanza, which)
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
71 if which == "default" then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
72 if isAnotherSessionUsingDefaultList(origin) then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
73 return { "cancel", "conflict", "Another session is online and using the default list."};
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
74 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
75 privacy_lists.default = nil;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
76 origin.send(st.reply(stanza));
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
77 elseif which == "active" then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
78 origin.activePrivacyList = nil;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
79 origin.send(st.reply(stanza));
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
80 else
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
81 return {"modify", "bad-request", "Neither default nor active list specifed to decline."};
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
82 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
83 return true;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
84 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
85
2500
bffdaeb7ab5e mod_privacy: Cleaned up code.
Waqas Hussain <waqas20@gmail.com>
parents: 2499
diff changeset
86 function activateList(privacy_lists, origin, stanza, which, name)
2588
741302471a23 mod_privacy: Don't store the privacy lists as an array, but as a map... faster and less code
Matthew Wild <mwild1@gmail.com>
parents: 2579
diff changeset
87 local list = privacy_lists.lists[name];
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
88
2588
741302471a23 mod_privacy: Don't store the privacy lists as an array, but as a map... faster and less code
Matthew Wild <mwild1@gmail.com>
parents: 2579
diff changeset
89 if which == "default" and list then
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
90 if isAnotherSessionUsingDefaultList(origin) then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
91 return {"cancel", "conflict", "Another session is online and using the default list."};
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
92 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
93 privacy_lists.default = name;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
94 origin.send(st.reply(stanza));
2588
741302471a23 mod_privacy: Don't store the privacy lists as an array, but as a map... faster and less code
Matthew Wild <mwild1@gmail.com>
parents: 2579
diff changeset
95 elseif which == "active" and list then
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
96 origin.activePrivacyList = name;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
97 origin.send(st.reply(stanza));
3313
9bcf8d612a52 mod_privacy: Return the correct item-not-found instead of bad-request when a non-existent list is activated by the client (thanks teo)
Matthew Wild <mwild1@gmail.com>
parents: 3300
diff changeset
98 elseif not list then
9bcf8d612a52 mod_privacy: Return the correct item-not-found instead of bad-request when a non-existent list is activated by the client (thanks teo)
Matthew Wild <mwild1@gmail.com>
parents: 3300
diff changeset
99 return {"cancel", "item-not-found", "No such list: "..name};
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
100 else
3313
9bcf8d612a52 mod_privacy: Return the correct item-not-found instead of bad-request when a non-existent list is activated by the client (thanks teo)
Matthew Wild <mwild1@gmail.com>
parents: 3300
diff changeset
101 return {"modify", "bad-request", "No list chosen to be active or default."};
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
102 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
103 return true;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
104 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
105
2500
bffdaeb7ab5e mod_privacy: Cleaned up code.
Waqas Hussain <waqas20@gmail.com>
parents: 2499
diff changeset
106 function deleteList(privacy_lists, origin, stanza, name)
2588
741302471a23 mod_privacy: Don't store the privacy lists as an array, but as a map... faster and less code
Matthew Wild <mwild1@gmail.com>
parents: 2579
diff changeset
107 local list = privacy_lists.lists[name];
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
108
2588
741302471a23 mod_privacy: Don't store the privacy lists as an array, but as a map... faster and less code
Matthew Wild <mwild1@gmail.com>
parents: 2579
diff changeset
109 if list then
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
110 if isListUsed(origin, name, privacy_lists) then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
111 return {"cancel", "conflict", "Another session is online and using the list which should be deleted."};
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
112 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
113 if privacy_lists.default == name then
2590
2d7e2a28d1d5 mod_privacy: Remove use of to identify unspecified privacy list
Matthew Wild <mwild1@gmail.com>
parents: 2589
diff changeset
114 privacy_lists.default = nil;
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
115 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
116 if origin.activePrivacyList == name then
2590
2d7e2a28d1d5 mod_privacy: Remove use of to identify unspecified privacy list
Matthew Wild <mwild1@gmail.com>
parents: 2589
diff changeset
117 origin.activePrivacyList = nil;
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
118 end
2588
741302471a23 mod_privacy: Don't store the privacy lists as an array, but as a map... faster and less code
Matthew Wild <mwild1@gmail.com>
parents: 2579
diff changeset
119 privacy_lists.lists[name] = nil;
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
120 origin.send(st.reply(stanza));
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
121 return true;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
122 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
123 return {"modify", "bad-request", "Not existing list specifed to be deleted."};
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
124 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
125
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
126 function createOrReplaceList (privacy_lists, origin, stanza, name, entries, roster)
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
127 local bare_jid = origin.username.."@"..origin.host;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
128
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
129 if privacy_lists.lists == nil then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
130 privacy_lists.lists = {};
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
131 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
132
2588
741302471a23 mod_privacy: Don't store the privacy lists as an array, but as a map... faster and less code
Matthew Wild <mwild1@gmail.com>
parents: 2579
diff changeset
133 local list = {};
741302471a23 mod_privacy: Don't store the privacy lists as an array, but as a map... faster and less code
Matthew Wild <mwild1@gmail.com>
parents: 2579
diff changeset
134 privacy_lists.lists[name] = list;
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
135
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
136 local orderCheck = {};
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
137 list.name = name;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
138 list.items = {};
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
139
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
140 for _,item in ipairs(entries) do
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
141 if to_number(item.attr.order) == nil or to_number(item.attr.order) < 0 or orderCheck[item.attr.order] ~= nil then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
142 return {"modify", "bad-request", "Order attribute not valid."};
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
143 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
144
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
145 if item.attr.type ~= nil and item.attr.type ~= "jid" and item.attr.type ~= "subscription" and item.attr.type ~= "group" then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
146 return {"modify", "bad-request", "Type attribute not valid."};
2516
68a889016a46 mod_privacy: Trailing whitespace (I can't sleep)
Matthew Wild <mwild1@gmail.com>
parents: 2502
diff changeset
147 end
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
148
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
149 local tmp = {};
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
150 orderCheck[item.attr.order] = true;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
151
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
152 tmp["type"] = item.attr.type;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
153 tmp["value"] = item.attr.value;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
154 tmp["action"] = item.attr.action;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
155 tmp["order"] = to_number(item.attr.order);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
156 tmp["presence-in"] = false;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
157 tmp["presence-out"] = false;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
158 tmp["message"] = false;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
159 tmp["iq"] = false;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
160
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
161 if #item.tags > 0 then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
162 for _,tag in ipairs(item.tags) do
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
163 tmp[tag.name] = true;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
164 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
165 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
166
3068
fc7c693e094a mod_privacy: Remove validation that checks a roster group you block actually exists - it would be time-consuming on large rosters, and isn't important (or correct?) anyway.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
167 if tmp.type == "subscription" then
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
168 if tmp.value ~= "both" and
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
169 tmp.value ~= "to" and
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
170 tmp.value ~= "from" and
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
171 tmp.value ~= "none" then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
172 return {"cancel", "bad-request", "Subscription value must be both, to, from or none."};
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
173 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
174 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
175
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
176 if tmp.action ~= "deny" and tmp.action ~= "allow" then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
177 return {"cancel", "bad-request", "Action must be either deny or allow."};
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
178 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
179 list.items[#list.items + 1] = tmp;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
180 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
181
2499
145d62abdbfc mod_privacy: Reduced a function.
Waqas Hussain <waqas20@gmail.com>
parents: 2498
diff changeset
182 table.sort(list, function(a, b) return a.order < b.order; end);
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
183
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
184 origin.send(st.reply(stanza));
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
185 if bare_sessions[bare_jid] ~= nil then
2498
3d08a6cf57ea mod_privacy: Fixed global access.
Waqas Hussain <waqas20@gmail.com>
parents: 2496
diff changeset
186 local iq = st.iq ( { type = "set", id="push1" } );
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
187 iq:tag ("query", { xmlns = "jabber:iq:privacy" } );
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
188 iq:tag ("list", { name = list.name } ):up();
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
189 iq:up();
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
190 for resource, session in pairs(bare_sessions[bare_jid].sessions) do
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
191 iq.attr.to = bare_jid.."/"..resource
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
192 session.send(iq);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
193 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
194 else
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
195 return {"cancel", "bad-request", "internal error."};
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
196 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
197 return true;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
198 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
199
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
200 function getList(privacy_lists, origin, stanza, name)
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
201 local reply = st.reply(stanza);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
202 reply:tag("query", {xmlns="jabber:iq:privacy"});
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
203
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
204 if name == nil then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
205 if privacy_lists.lists then
3453
fba130c16818 mod_privacy: Fix typo causing <active/> to never be send
Florian Zeitz <florob@babelmonkeys.de>
parents: 3318
diff changeset
206 if origin.activePrivacyList then
2590
2d7e2a28d1d5 mod_privacy: Remove use of to identify unspecified privacy list
Matthew Wild <mwild1@gmail.com>
parents: 2589
diff changeset
207 reply:tag("active", {name=origin.activePrivacyList}):up();
2d7e2a28d1d5 mod_privacy: Remove use of to identify unspecified privacy list
Matthew Wild <mwild1@gmail.com>
parents: 2589
diff changeset
208 end
2d7e2a28d1d5 mod_privacy: Remove use of to identify unspecified privacy list
Matthew Wild <mwild1@gmail.com>
parents: 2589
diff changeset
209 if privacy_lists.default then
2d7e2a28d1d5 mod_privacy: Remove use of to identify unspecified privacy list
Matthew Wild <mwild1@gmail.com>
parents: 2589
diff changeset
210 reply:tag("default", {name=privacy_lists.default}):up();
2d7e2a28d1d5 mod_privacy: Remove use of to identify unspecified privacy list
Matthew Wild <mwild1@gmail.com>
parents: 2589
diff changeset
211 end
2615
c5f7c803fe7d mod_privacy: Fix to correctly iterate over lists stored in new format
Matthew Wild <mwild1@gmail.com>
parents: 2614
diff changeset
212 for name,list in pairs(privacy_lists.lists) do
c5f7c803fe7d mod_privacy: Fix to correctly iterate over lists stored in new format
Matthew Wild <mwild1@gmail.com>
parents: 2614
diff changeset
213 reply:tag("list", {name=name}):up();
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
214 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
215 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
216 else
2588
741302471a23 mod_privacy: Don't store the privacy lists as an array, but as a map... faster and less code
Matthew Wild <mwild1@gmail.com>
parents: 2579
diff changeset
217 local list = privacy_lists.lists[name];
741302471a23 mod_privacy: Don't store the privacy lists as an array, but as a map... faster and less code
Matthew Wild <mwild1@gmail.com>
parents: 2579
diff changeset
218 if list then
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
219 reply = reply:tag("list", {name=list.name});
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
220 for _,item in ipairs(list.items) do
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
221 reply:tag("item", {type=item.type, value=item.value, action=item.action, order=item.order});
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
222 if item["message"] then reply:tag("message"):up(); end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
223 if item["iq"] then reply:tag("iq"):up(); end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
224 if item["presence-in"] then reply:tag("presence-in"):up(); end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
225 if item["presence-out"] then reply:tag("presence-out"):up(); end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
226 reply:up();
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
227 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
228 else
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
229 return {"cancel", "item-not-found", "Unknown list specified."};
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
230 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
231 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
232
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
233 origin.send(reply);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
234 return true;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
235 end
1293
13dde33d5b87 mod_privacy: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
236
13dde33d5b87 mod_privacy: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
237 module:hook("iq/bare/jabber:iq:privacy:query", function(data)
13dde33d5b87 mod_privacy: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
238 local origin, stanza = data.origin, data.stanza;
13dde33d5b87 mod_privacy: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
239
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
240 if stanza.attr.to == nil then -- only service requests to own bare JID
1293
13dde33d5b87 mod_privacy: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
241 local query = stanza.tags[1]; -- the query element
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
242 local valid = false;
2614
7a589e9e2372 mod_privacy: Upgrade old privacy lists to new storage format, so they don't get lost
Matthew Wild <mwild1@gmail.com>
parents: 2590
diff changeset
243 local privacy_lists = datamanager.load(origin.username, origin.host, "privacy") or { lists = {} };
7a589e9e2372 mod_privacy: Upgrade old privacy lists to new storage format, so they don't get lost
Matthew Wild <mwild1@gmail.com>
parents: 2590
diff changeset
244
7a589e9e2372 mod_privacy: Upgrade old privacy lists to new storage format, so they don't get lost
Matthew Wild <mwild1@gmail.com>
parents: 2590
diff changeset
245 if privacy_lists.lists[1] then -- Code to migrate from old privacy lists format, remove in 0.8
7a589e9e2372 mod_privacy: Upgrade old privacy lists to new storage format, so they don't get lost
Matthew Wild <mwild1@gmail.com>
parents: 2590
diff changeset
246 module:log("info", "Upgrading format of stored privacy lists for %s@%s", origin.username, origin.host);
7a589e9e2372 mod_privacy: Upgrade old privacy lists to new storage format, so they don't get lost
Matthew Wild <mwild1@gmail.com>
parents: 2590
diff changeset
247 local lists = privacy_lists.lists;
7a589e9e2372 mod_privacy: Upgrade old privacy lists to new storage format, so they don't get lost
Matthew Wild <mwild1@gmail.com>
parents: 2590
diff changeset
248 for idx, list in ipairs(lists) do
7a589e9e2372 mod_privacy: Upgrade old privacy lists to new storage format, so they don't get lost
Matthew Wild <mwild1@gmail.com>
parents: 2590
diff changeset
249 lists[list.name] = list;
7a589e9e2372 mod_privacy: Upgrade old privacy lists to new storage format, so they don't get lost
Matthew Wild <mwild1@gmail.com>
parents: 2590
diff changeset
250 lists[idx] = nil;
7a589e9e2372 mod_privacy: Upgrade old privacy lists to new storage format, so they don't get lost
Matthew Wild <mwild1@gmail.com>
parents: 2590
diff changeset
251 end
7a589e9e2372 mod_privacy: Upgrade old privacy lists to new storage format, so they don't get lost
Matthew Wild <mwild1@gmail.com>
parents: 2590
diff changeset
252 end
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
253
1293
13dde33d5b87 mod_privacy: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
254 if stanza.attr.type == "set" then
2516
68a889016a46 mod_privacy: Trailing whitespace (I can't sleep)
Matthew Wild <mwild1@gmail.com>
parents: 2502
diff changeset
255 if #query.tags == 1 then -- the <query/> element MUST NOT include more than one child element
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
256 for _,tag in ipairs(query.tags) do
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
257 if tag.name == "active" or tag.name == "default" then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
258 if tag.attr.name == nil then -- Client declines the use of active / default list
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
259 valid = declineList(privacy_lists, origin, stanza, tag.name);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
260 else -- Client requests change of active / default list
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
261 valid = activateList(privacy_lists, origin, stanza, tag.name, tag.attr.name);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
262 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
263 elseif tag.name == "list" and tag.attr.name then -- Client adds / edits a privacy list
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
264 if #tag.tags == 0 then -- Client removes a privacy list
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
265 valid = deleteList(privacy_lists, origin, stanza, tag.attr.name);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
266 else -- Client edits a privacy list
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
267 valid = createOrReplaceList(privacy_lists, origin, stanza, tag.attr.name, tag.tags);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
268 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
269 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
270 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
271 end
1293
13dde33d5b87 mod_privacy: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
272 elseif stanza.attr.type == "get" then
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
273 local name = nil;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
274 local listsToRetrieve = 0;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
275 if #query.tags >= 1 then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
276 for _,tag in ipairs(query.tags) do
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
277 if tag.name == "list" then -- Client requests a privacy list from server
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
278 name = tag.attr.name;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
279 listsToRetrieve = listsToRetrieve + 1;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
280 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
281 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
282 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
283 if listsToRetrieve == 0 or listsToRetrieve == 1 then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
284 valid = getList(privacy_lists, origin, stanza, name);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
285 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
286 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
287
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
288 if valid ~= true then
2589
39f5a068dc41 mod_privacy: Fix potential traceback in stanza validation, and fix some zero-based indexing :)
Matthew Wild <mwild1@gmail.com>
parents: 2588
diff changeset
289 valid = valid or { "cancel", "bad-request", "Couldn't understand request" };
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
290 if valid[1] == nil then
2589
39f5a068dc41 mod_privacy: Fix potential traceback in stanza validation, and fix some zero-based indexing :)
Matthew Wild <mwild1@gmail.com>
parents: 2588
diff changeset
291 valid[1] = "cancel";
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
292 end
2589
39f5a068dc41 mod_privacy: Fix potential traceback in stanza validation, and fix some zero-based indexing :)
Matthew Wild <mwild1@gmail.com>
parents: 2588
diff changeset
293 if valid[2] == nil then
39f5a068dc41 mod_privacy: Fix potential traceback in stanza validation, and fix some zero-based indexing :)
Matthew Wild <mwild1@gmail.com>
parents: 2588
diff changeset
294 valid[2] = "bad-request";
39f5a068dc41 mod_privacy: Fix potential traceback in stanza validation, and fix some zero-based indexing :)
Matthew Wild <mwild1@gmail.com>
parents: 2588
diff changeset
295 end
39f5a068dc41 mod_privacy: Fix potential traceback in stanza validation, and fix some zero-based indexing :)
Matthew Wild <mwild1@gmail.com>
parents: 2588
diff changeset
296 origin.send(st.error_reply(stanza, valid[1], valid[2], valid[3]));
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
297 else
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
298 datamanager.store(origin.username, origin.host, "privacy", privacy_lists);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
299 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
300 return true;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
301 end
2500
bffdaeb7ab5e mod_privacy: Cleaned up code.
Waqas Hussain <waqas20@gmail.com>
parents: 2499
diff changeset
302 end);
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
303
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
304 function checkIfNeedToBeBlocked(e, session)
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
305 local origin, stanza = e.origin, e.stanza;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
306 local privacy_lists = datamanager.load(session.username, session.host, "privacy") or {};
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
307 local bare_jid = session.username.."@"..session.host;
3300
b651f8290e27 mod_privacy: Treat stanzas with no 'to' address as going to the user's bare JID (thanks KSid)
Matthew Wild <mwild1@gmail.com>
parents: 3085
diff changeset
308 local to = stanza.attr.to or bare_jid;
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
309 local from = stanza.attr.from;
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
310
2579
4e0caff152d6 mod_privacy: Rename from_user/to_user flags to is_from_user/is_to_user for clarity
Matthew Wild <mwild1@gmail.com>
parents: 2524
diff changeset
311 local is_to_user = bare_jid == jid_bare(to);
4e0caff152d6 mod_privacy: Rename from_user/to_user flags to is_from_user/is_to_user for clarity
Matthew Wild <mwild1@gmail.com>
parents: 2524
diff changeset
312 local is_from_user = bare_jid == jid_bare(from);
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
313
3085
cf01b0725272 mod_privacy: Improved logging.
Waqas Hussain <waqas20@gmail.com>
parents: 3069
diff changeset
314 --module:log("debug", "stanza: %s, to: %s, from: %s", tostring(stanza.name), tostring(to), tostring(from));
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
315
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
316 if privacy_lists.lists == nil or
2590
2d7e2a28d1d5 mod_privacy: Remove use of to identify unspecified privacy list
Matthew Wild <mwild1@gmail.com>
parents: 2589
diff changeset
317 not (session.activePrivacyList or privacy_lists.default)
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
318 then
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
319 return; -- Nothing to block, default is Allow all
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
320 end
2579
4e0caff152d6 mod_privacy: Rename from_user/to_user flags to is_from_user/is_to_user for clarity
Matthew Wild <mwild1@gmail.com>
parents: 2524
diff changeset
321 if is_from_user and is_to_user then
3085
cf01b0725272 mod_privacy: Improved logging.
Waqas Hussain <waqas20@gmail.com>
parents: 3069
diff changeset
322 --module:log("debug", "Not blocking communications between user's resources");
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
323 return; -- from one of a user's resource to another => HANDS OFF!
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
324 end
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
325
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
326 local item;
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
327 local listname = session.activePrivacyList;
2590
2d7e2a28d1d5 mod_privacy: Remove use of to identify unspecified privacy list
Matthew Wild <mwild1@gmail.com>
parents: 2589
diff changeset
328 if listname == nil then
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
329 listname = privacy_lists.default; -- no active list selected, use default list
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
330 end
2588
741302471a23 mod_privacy: Don't store the privacy lists as an array, but as a map... faster and less code
Matthew Wild <mwild1@gmail.com>
parents: 2579
diff changeset
331 local list = privacy_lists.lists[listname];
3085
cf01b0725272 mod_privacy: Improved logging.
Waqas Hussain <waqas20@gmail.com>
parents: 3069
diff changeset
332 if not list then -- should never happen
cf01b0725272 mod_privacy: Improved logging.
Waqas Hussain <waqas20@gmail.com>
parents: 3069
diff changeset
333 module:log("warn", "given privacy list not found. name: %s for user %s", listname, bare_jid);
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
334 return;
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
335 end
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
336 for _,item in ipairs(list.items) do
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
337 local apply = false;
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
338 local block = false;
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
339 if (
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
340 (stanza.name == "message" and item.message) or
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
341 (stanza.name == "iq" and item.iq) or
2579
4e0caff152d6 mod_privacy: Rename from_user/to_user flags to is_from_user/is_to_user for clarity
Matthew Wild <mwild1@gmail.com>
parents: 2524
diff changeset
342 (stanza.name == "presence" and is_to_user and item["presence-in"]) or
4e0caff152d6 mod_privacy: Rename from_user/to_user flags to is_from_user/is_to_user for clarity
Matthew Wild <mwild1@gmail.com>
parents: 2524
diff changeset
343 (stanza.name == "presence" and is_from_user and item["presence-out"]) or
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
344 (item.message == false and item.iq == false and item["presence-in"] == false and item["presence-out"] == false)
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
345 ) then
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
346 apply = true;
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
347 end
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
348 if apply then
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
349 local evilJid = {};
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
350 apply = false;
2579
4e0caff152d6 mod_privacy: Rename from_user/to_user flags to is_from_user/is_to_user for clarity
Matthew Wild <mwild1@gmail.com>
parents: 2524
diff changeset
351 if is_to_user then
3085
cf01b0725272 mod_privacy: Improved logging.
Waqas Hussain <waqas20@gmail.com>
parents: 3069
diff changeset
352 --module:log("debug", "evil jid is (from): %s", from);
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
353 evilJid.node, evilJid.host, evilJid.resource = jid_split(from);
1293
13dde33d5b87 mod_privacy: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
354 else
3085
cf01b0725272 mod_privacy: Improved logging.
Waqas Hussain <waqas20@gmail.com>
parents: 3069
diff changeset
355 --module:log("debug", "evil jid is (to): %s", to);
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
356 evilJid.node, evilJid.host, evilJid.resource = jid_split(to);
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
357 end
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
358 if item.type == "jid" and
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
359 (evilJid.node and evilJid.host and evilJid.resource and item.value == evilJid.node.."@"..evilJid.host.."/"..evilJid.resource) or
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
360 (evilJid.node and evilJid.host and item.value == evilJid.node.."@"..evilJid.host) or
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
361 (evilJid.host and evilJid.resource and item.value == evilJid.host.."/"..evilJid.resource) or
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
362 (evilJid.host and item.value == evilJid.host) then
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
363 apply = true;
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
364 block = (item.action == "deny");
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
365 elseif item.type == "group" then
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
366 local roster = load_roster(session.username, session.host);
3069
c3df9053e0a9 mod_privacy: Fix several possible tracebacks when either the contact is a host JID, or the contact isn't in your roster and you have roster group/subscription rules in place
Matthew Wild <mwild1@gmail.com>
parents: 3068
diff changeset
367 local roster_entry = roster[jid_join(evilJid.node, evilJid.host)];
c3df9053e0a9 mod_privacy: Fix several possible tracebacks when either the contact is a host JID, or the contact isn't in your roster and you have roster group/subscription rules in place
Matthew Wild <mwild1@gmail.com>
parents: 3068
diff changeset
368 if roster_entry then
c3df9053e0a9 mod_privacy: Fix several possible tracebacks when either the contact is a host JID, or the contact isn't in your roster and you have roster group/subscription rules in place
Matthew Wild <mwild1@gmail.com>
parents: 3068
diff changeset
369 local groups = roster_entry.groups;
c3df9053e0a9 mod_privacy: Fix several possible tracebacks when either the contact is a host JID, or the contact isn't in your roster and you have roster group/subscription rules in place
Matthew Wild <mwild1@gmail.com>
parents: 3068
diff changeset
370 for group in pairs(groups) do
c3df9053e0a9 mod_privacy: Fix several possible tracebacks when either the contact is a host JID, or the contact isn't in your roster and you have roster group/subscription rules in place
Matthew Wild <mwild1@gmail.com>
parents: 3068
diff changeset
371 if group == item.value then
c3df9053e0a9 mod_privacy: Fix several possible tracebacks when either the contact is a host JID, or the contact isn't in your roster and you have roster group/subscription rules in place
Matthew Wild <mwild1@gmail.com>
parents: 3068
diff changeset
372 apply = true;
c3df9053e0a9 mod_privacy: Fix several possible tracebacks when either the contact is a host JID, or the contact isn't in your roster and you have roster group/subscription rules in place
Matthew Wild <mwild1@gmail.com>
parents: 3068
diff changeset
373 block = (item.action == "deny");
c3df9053e0a9 mod_privacy: Fix several possible tracebacks when either the contact is a host JID, or the contact isn't in your roster and you have roster group/subscription rules in place
Matthew Wild <mwild1@gmail.com>
parents: 3068
diff changeset
374 break;
c3df9053e0a9 mod_privacy: Fix several possible tracebacks when either the contact is a host JID, or the contact isn't in your roster and you have roster group/subscription rules in place
Matthew Wild <mwild1@gmail.com>
parents: 3068
diff changeset
375 end
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
376 end
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
377 end
3069
c3df9053e0a9 mod_privacy: Fix several possible tracebacks when either the contact is a host JID, or the contact isn't in your roster and you have roster group/subscription rules in place
Matthew Wild <mwild1@gmail.com>
parents: 3068
diff changeset
378 elseif item.type == "subscription" then -- we need a valid bare evil jid
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
379 local roster = load_roster(session.username, session.host);
3069
c3df9053e0a9 mod_privacy: Fix several possible tracebacks when either the contact is a host JID, or the contact isn't in your roster and you have roster group/subscription rules in place
Matthew Wild <mwild1@gmail.com>
parents: 3068
diff changeset
380 local roster_entry = roster[jid_join(evilJid.node, evilJid.host)];
c3df9053e0a9 mod_privacy: Fix several possible tracebacks when either the contact is a host JID, or the contact isn't in your roster and you have roster group/subscription rules in place
Matthew Wild <mwild1@gmail.com>
parents: 3068
diff changeset
381 if (not(roster_entry) and item.value == "none")
c3df9053e0a9 mod_privacy: Fix several possible tracebacks when either the contact is a host JID, or the contact isn't in your roster and you have roster group/subscription rules in place
Matthew Wild <mwild1@gmail.com>
parents: 3068
diff changeset
382 or (roster_entry and roster_entry.subscription == item.value) then
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
383 apply = true;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
384 block = (item.action == "deny");
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
385 end
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
386 elseif item.type == nil then
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
387 apply = true;
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
388 block = (item.action == "deny");
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
389 end
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
390 end
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
391 if apply then
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
392 if block then
2524
b427f5401ce7 mod_privacy: A handful of logging fixes
Matthew Wild <mwild1@gmail.com>
parents: 2523
diff changeset
393 module:log("debug", "stanza blocked: %s, to: %s, from: %s", tostring(stanza.name), tostring(to), tostring(from));
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
394 if stanza.name == "message" then
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
395 origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
396 elseif stanza.name == "iq" and (stanza.attr.type == "get" or stanza.attr.type == "set") then
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
397 origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
398 end
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
399 return true; -- stanza blocked !
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
400 else
3085
cf01b0725272 mod_privacy: Improved logging.
Waqas Hussain <waqas20@gmail.com>
parents: 3069
diff changeset
401 --module:log("debug", "stanza explicitly allowed!")
2523
0c816b271208 mod_privacy: Remove the giant if/end block that was really causing problems - skipping stanzas with no to/from (like presence broadcast). Also optimised the code a *lot*, these changes untested at the moment though.
Matthew Wild <mwild1@gmail.com>
parents: 2522
diff changeset
402 return;
1293
13dde33d5b87 mod_privacy: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
403 end
13dde33d5b87 mod_privacy: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
404 end
13dde33d5b87 mod_privacy: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
405 end
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
406 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
407
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
408 function preCheckIncoming(e)
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
409 local session;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
410 if e.stanza.attr.to ~= nil then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
411 local node, host, resource = jid_split(e.stanza.attr.to);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
412 if node == nil or host == nil then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
413 return;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
414 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
415 if resource == nil then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
416 local prio = 0;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
417 local session_;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
418 if bare_sessions[node.."@"..host] ~= nil then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
419 for resource, session_ in pairs(bare_sessions[node.."@"..host].sessions) do
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
420 if session_.priority ~= nil and session_.priority > prio then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
421 session = session_;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
422 prio = session_.priority;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
423 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
424 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
425 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
426 else
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
427 session = full_sessions[node.."@"..host.."/"..resource];
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
428 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
429 if session ~= nil then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
430 return checkIfNeedToBeBlocked(e, session);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
431 else
3085
cf01b0725272 mod_privacy: Improved logging.
Waqas Hussain <waqas20@gmail.com>
parents: 3069
diff changeset
432 --module:log("debug", "preCheckIncoming: Couldn't get session for jid: %s@%s/%s", tostring(node), tostring(host), tostring(resource));
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
433 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
434 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
435 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
436
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
437 function preCheckOutgoing(e)
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
438 local session = e.origin;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
439 if e.stanza.attr.from == nil then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
440 e.stanza.attr.from = session.username .. "@" .. session.host;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
441 if session.resource ~= nil then
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
442 e.stanza.attr.from = e.stanza.attr.from .. "/" .. session.resource;
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
443 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
444 end
3221
01da55cffcfb mod_privacy: Workaround for a traceback.
Waqas Hussain <waqas20@gmail.com>
parents: 3085
diff changeset
445 if session.username then -- FIXME do properly
01da55cffcfb mod_privacy: Workaround for a traceback.
Waqas Hussain <waqas20@gmail.com>
parents: 3085
diff changeset
446 return checkIfNeedToBeBlocked(e, session);
01da55cffcfb mod_privacy: Workaround for a traceback.
Waqas Hussain <waqas20@gmail.com>
parents: 3085
diff changeset
447 end
2496
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
448 end
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
449
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
450 module:hook("pre-message/full", preCheckOutgoing, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
451 module:hook("pre-message/bare", preCheckOutgoing, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
452 module:hook("pre-message/host", preCheckOutgoing, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
453 module:hook("pre-iq/full", preCheckOutgoing, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
454 module:hook("pre-iq/bare", preCheckOutgoing, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
455 module:hook("pre-iq/host", preCheckOutgoing, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
456 module:hook("pre-presence/full", preCheckOutgoing, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
457 module:hook("pre-presence/bare", preCheckOutgoing, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
458 module:hook("pre-presence/host", preCheckOutgoing, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
459
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
460 module:hook("message/full", preCheckIncoming, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
461 module:hook("message/bare", preCheckIncoming, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
462 module:hook("message/host", preCheckIncoming, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
463 module:hook("iq/full", preCheckIncoming, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
464 module:hook("iq/bare", preCheckIncoming, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
465 module:hook("iq/host", preCheckIncoming, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
466 module:hook("presence/full", preCheckIncoming, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
467 module:hook("presence/bare", preCheckIncoming, 500);
f18b882af1d1 mod_privacy: Imported from prosody-modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
468 module:hook("presence/host", preCheckIncoming, 500);