Software /
code /
prosody-modules
Comparison
mod_privacy/mod_privacy.lua @ 8:10502594a49b
adds mod_privacy; lists creating, editing and deletion working.
author | Thilo Cestonaro <thilo@cestona.ro> |
---|---|
date | Fri, 25 Sep 2009 16:56:50 +0200 |
child | 10:7d70faba234c |
comparison
equal
deleted
inserted
replaced
7:473b14c59797 | 8:10502594a49b |
---|---|
1 -- Prosody IM | |
2 -- Copyright (C) 2008-2009 Matthew Wild | |
3 -- Copyright (C) 2008-2009 Waqas Hussain | |
4 -- Copyright (C) 2009 Thilo Cestonaro | |
5 -- | |
6 -- This project is MIT/X11 licensed. Please see the | |
7 -- COPYING file in the source package for more information. | |
8 -- | |
9 | |
10 | |
11 local prosody = prosody; | |
12 local helpers = require "util/helpers"; | |
13 local st = require "util.stanza"; | |
14 local datamanager = require "util.datamanager"; | |
15 local privacy_lists = nil | |
16 local bare_sessions = bare_sessions; | |
17 | |
18 | |
19 function findNamedList (name) | |
20 local ret = nil | |
21 if privacy_lists.lists == nil then return nil; end | |
22 | |
23 for i=1, #privacy_lists.lists do | |
24 if privacy_lists.lists[i].name == name then | |
25 ret = i; | |
26 break; | |
27 end | |
28 end | |
29 return ret; | |
30 end | |
31 | |
32 function declineList (origin, stanza, which) | |
33 module:log("info", "User requests to decline the use of privacy list: %s", which); | |
34 privacy_lists[which] = nil; | |
35 origin.send(st.reply(stanza)); | |
36 return true; | |
37 end | |
38 | |
39 function activateList (origin, stanza, which, name) | |
40 module:log("info", "User requests to change the privacy list: %s, to be list named %s", which, name); | |
41 local ret = false; | |
42 local idx = findNamedList(name); | |
43 | |
44 if privacy_lists[which] == nil then | |
45 privacy_lists[which] = ""; | |
46 end | |
47 | |
48 if privacy_lists[which] ~= name and idx ~= nil then | |
49 privacy_lists[which] = name; | |
50 origin.send(st.reply(stanza)); | |
51 ret = true; | |
52 end | |
53 return ret; | |
54 end | |
55 | |
56 function deleteList (origin, stanza, name) | |
57 module:log("info", "User requests to delete privacy list: %s", name); | |
58 local ret = false; | |
59 local idx = findNamedList(name); | |
60 | |
61 if idx ~= nil then | |
62 table.remove(privacy_lists.lists, idx); | |
63 origin.send(st.reply(stanza)); | |
64 ret = true; | |
65 end | |
66 return ret; | |
67 end | |
68 | |
69 function createOrReplaceList (origin, stanza, name, entries) | |
70 module:log("info", "User requests to create / replace list named %s, item count: %d", name, #entries); | |
71 local ret = true; | |
72 local idx = findNamedList(name); | |
73 local bare_jid = origin.username.."@"..origin.host; | |
74 | |
75 if privacy_lists.lists == nil then | |
76 privacy_lists.lists = {}; | |
77 end | |
78 | |
79 if idx == nil then | |
80 idx = #privacy_lists.lists + 1; | |
81 end | |
82 | |
83 local list = {}; | |
84 list.name = name; | |
85 list.items = {}; | |
86 | |
87 for _,item in ipairs(entries) do | |
88 tmp = {}; | |
89 tmp["type"] = item.attr.type; | |
90 tmp["value"] = item.attr.value; | |
91 tmp["action"] = item.attr.action; | |
92 tmp["order"] = item.attr.order; | |
93 tmp["presence-in"] = false; | |
94 tmp["presence-out"] = false; | |
95 tmp["message"] = false; | |
96 tmp["iq"] = false; | |
97 | |
98 if #item.tags > 0 then | |
99 for _,tag in ipairs(item.tags) do | |
100 tmp[tag.name] = true; | |
101 end | |
102 end | |
103 list.items[#list.items + 1] = tmp; | |
104 end | |
105 | |
106 privacy_lists.lists[idx] = list; | |
107 origin.send(st.reply(stanza)); | |
108 if bare_sessions[bare_jid] ~= nil then | |
109 iq = st.iq ( { type = "set", id="push1" } ); | |
110 iq:tag ("query", { xmlns = "jabber:iq:privacy" } ); | |
111 iq:tag ("list", { name = list.name } ):up(); | |
112 iq:up(); | |
113 for resource, session in pairs(bare_sessions[bare_jid].sessions) do | |
114 iq.attr.to = bare_jid.."/"..resource | |
115 session.send(iq); | |
116 end | |
117 end | |
118 return true; | |
119 end | |
120 | |
121 function getList(origin, stanza, name) | |
122 module:log("info", "User requests list named: %s", name or "nil"); | |
123 local ret = true; | |
124 local idx = findNamedList(name); | |
125 local reply = st.reply(stanza); | |
126 reply = reply:tag("query", {xmlns="jabber:iq:privacy"}); | |
127 | |
128 if idx == nil then | |
129 reply:tag("active", {name=privacy_lists.active or ""}):up(); | |
130 reply:tag("default", {name=privacy_lists.default or ""}):up(); | |
131 if privacy_lists.lists then | |
132 for _,list in ipairs(privacy_lists.lists) do | |
133 reply:tag("list", {name=list.name}):up(); | |
134 end | |
135 end | |
136 else | |
137 list = privacy_lists.lists[idx]; | |
138 reply = reply:tag("list", {name=list.name}); | |
139 for _,item in ipairs(list.items) do | |
140 reply:tag("item", {type=item.type, value=item.value, action=item.action, order=item.order}); | |
141 if item["message"] then reply:tag("message"):up(); end | |
142 if item["iq"] then reply:tag("iq"):up(); end | |
143 if item["presence-in"] then reply:tag("presence-in"):up(); end | |
144 if item["presence-out"] then reply:tag("presence-out"):up(); end | |
145 reply:up(); | |
146 end | |
147 end | |
148 | |
149 origin.send(reply); | |
150 return ret; | |
151 end | |
152 | |
153 -- "[tagname]/[target-type]/[payload-namespace]:[payload-tagname]" | |
154 module:hook("iq/bare/jabber:iq:privacy:query", function(data) | |
155 local origin, stanza = data.origin, data.stanza; | |
156 | |
157 if stanza.attr.to == nil then -- only service requests to own bare JID | |
158 local query = stanza.tags[1]; -- the query element | |
159 local valid = false; | |
160 privacy_lists = datamanager.load(origin.username, origin.host, "privacy") or {}; | |
161 | |
162 if stanza.attr.type == "set" then | |
163 if #query.tags >= 1 then | |
164 for _,tag in ipairs(query.tags) do | |
165 if tag.name == "active" or tag.name == "default" then | |
166 if tag.attr.name == nil then -- Client declines the use of active / default list | |
167 valid = declineList(origin, stanza, tag.name); | |
168 else -- Client requests change of active / default list | |
169 valid = activateList(origin, stanza, tag.name, tag.attr.name); | |
170 end | |
171 elseif tag.name == "list" and tag.attr.name then -- Client adds / edits a privacy list | |
172 if #tag.tags == 0 then -- Client removes a privacy list | |
173 valid = deleteList(origin, stanza, tag.attr.name); | |
174 else -- Client edits a privacy list | |
175 valid = createOrReplaceList(origin, stanza, tag.attr.name, tag.tags) | |
176 end | |
177 end | |
178 end | |
179 end | |
180 elseif stanza.attr.type == "get" then | |
181 local name = nil; | |
182 if #query.tags >= 1 then | |
183 for _,tag in ipairs(query.tags) do | |
184 if tag.name == "list" then -- Client requests a privacy list from server | |
185 name = tag.attr.name; | |
186 break; | |
187 end | |
188 end | |
189 end | |
190 valid = getList(origin, stanza, name); | |
191 end | |
192 | |
193 if valid == false then | |
194 origin.send(st.error_reply(stanza, "modify", "bad-request")); | |
195 else | |
196 datamanager.store(origin.username, origin.host, "privacy", privacy_lists); | |
197 end | |
198 return true; | |
199 end | |
200 return false; | |
201 end, 500); | |
202 | |
203 function checkIfNeedToBeBlocked(e) | |
204 return false; | |
205 end | |
206 | |
207 module:hook("pre-message/full", checkIfNeedToBeBlocked, 500); | |
208 module:hook("pre-iq/bare", checkIfNeedToBeBlocked, 500); | |
209 module:hook("pre-presence/bare", checkIfNeedToBeBlocked, 500); | |
210 | |
211 -- helpers.log_events(hosts["albastru.de"].events, "albastru.de"); | |
212 -- helpers.log_events(prosody.events, "*"); | |
213 | |
214 module:log("info", "mod_privacy loaded ..."); |