Software /
code /
prosody
Comparison
plugins/mod_pep.lua @ 3344:b16f842b7525
mod_pep: Use util.caps
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Fri, 09 Jul 2010 13:22:58 +0100 |
parent | 3290:1eec2bd19bf7 |
child | 3648:c0148fddd81f |
comparison
equal
deleted
inserted
replaced
3343:c70c6d5bf270 | 3344:b16f842b7525 |
---|---|
14 local user_exists = require "core.usermanager".user_exists; | 14 local user_exists = require "core.usermanager".user_exists; |
15 local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed; | 15 local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed; |
16 local pairs, ipairs = pairs, ipairs; | 16 local pairs, ipairs = pairs, ipairs; |
17 local next = next; | 17 local next = next; |
18 local type = type; | 18 local type = type; |
19 local sha1 = require "util.hashes".sha1; | 19 local calculate_hash = require "util.caps".calculate_hash; |
20 local base64 = require "util.encodings".base64.encode; | |
21 | 20 |
22 local NULL = {}; | 21 local NULL = {}; |
23 local data = {}; | 22 local data = {}; |
24 local recipients = {}; | 23 local recipients = {}; |
25 local hash_map = {}; | 24 local hash_map = {}; |
207 return true; | 206 return true; |
208 end | 207 end |
209 end | 208 end |
210 end); | 209 end); |
211 | 210 |
212 local function calculate_hash(disco_info) | |
213 local identities, features, extensions = {}, {}, {}; | |
214 for _, tag in pairs(disco_info) do | |
215 if tag.name == "identity" then | |
216 table.insert(identities, (tag.attr.category or "").."\0"..(tag.attr.type or "").."\0"..(tag.attr["xml:lang"] or "").."\0"..(tag.attr.name or "")); | |
217 elseif tag.name == "feature" then | |
218 table.insert(features, tag.attr.var or ""); | |
219 elseif tag.name == "x" and tag.attr.xmlns == "jabber:x:data" then | |
220 local form = {}; | |
221 local FORM_TYPE; | |
222 for _, field in pairs(tag.tags) do | |
223 if field.name == "field" and field.attr.var then | |
224 local values = {}; | |
225 for _, val in pairs(field.tags) do | |
226 val = #val.tags == 0 and table.concat(val); -- FIXME use get_text? | |
227 if val then table.insert(values, val); end | |
228 end | |
229 table.sort(values); | |
230 if field.attr.var == "FORM_TYPE" then | |
231 FORM_TYPE = values[1]; | |
232 elseif #values > 0 then | |
233 table.insert(form, field.attr.var.."\0"..table.concat(values, "<")); | |
234 else | |
235 table.insert(form, field.attr.var); | |
236 end | |
237 end | |
238 end | |
239 table.sort(form); | |
240 form = table.concat(form, "<"); | |
241 if FORM_TYPE then form = FORM_TYPE.."\0"..form; end | |
242 table.insert(extensions, form); | |
243 end | |
244 end | |
245 table.sort(identities); | |
246 table.sort(features); | |
247 table.sort(extensions); | |
248 if #identities > 0 then identities = table.concat(identities, "<"):gsub("%z", "/").."<"; else identities = ""; end | |
249 if #features > 0 then features = table.concat(features, "<").."<"; else features = ""; end | |
250 if #extensions > 0 then extensions = table.concat(extensions, "<"):gsub("%z", "<").."<"; else extensions = ""; end | |
251 local S = identities..features..extensions; | |
252 local ver = base64(sha1(S)); | |
253 return ver, S; | |
254 end | |
255 | |
256 module:hook("iq/bare/disco", function(event) | 211 module:hook("iq/bare/disco", function(event) |
257 local session, stanza = event.origin, event.stanza; | 212 local session, stanza = event.origin, event.stanza; |
258 if stanza.attr.type == "result" then | 213 if stanza.attr.type == "result" then |
259 local disco = stanza.tags[1]; | 214 local disco = stanza.tags[1]; |
260 if disco and disco.name == "query" and disco.attr.xmlns == "http://jabber.org/protocol/disco#info" then | 215 if disco and disco.name == "query" and disco.attr.xmlns == "http://jabber.org/protocol/disco#info" then |