1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
-- Prosody IM v0.2
-- Copyright (C) 2008 Matthew Wild
-- Copyright (C) 2008 Waqas Hussain
--
-- This project is MIT/X11 licensed. Please see the
-- COPYING file in the source package for more information.
--
local t_insert = table.insert;
local jid_split = require "util.jid".split;
local ipairs = ipairs;
local st = require "util.stanza";
module "discohelper";
local function addDiscoItemsHandler(self, jid, func)
if self.item_handlers[jid] then
t_insert(self.item_handlers[jid], func);
else
self.item_handlers[jid] = {func};
end
end
local function addDiscoInfoHandler(self, jid, func)
if self.info_handlers[jid] then
t_insert(self.info_handlers[jid], func);
else
self.info_handlers[jid] = {func};
end
end
local function handle(self, stanza)
if stanza.name == "iq" and stanza.tags[1].name == "query" then
local query = stanza.tags[1];
local to = stanza.attr.to;
local from = stanza.attr.from
local node = query.attr.node or "";
local to_node, to_host = jid_split(to);
local reply = st.reply(stanza):query(query.attr.xmlns);
local handlers;
if query.attr.xmlns == "http://jabber.org/protocol/disco#info" then -- select handler set
handlers = self.info_handlers;
elseif query.attr.xmlns == "http://jabber.org/protocol/disco#items" then
handlers = self.item_handlers;
end
local handler;
local found; -- to keep track of any handlers found
if to_node then -- handlers which get called always
handler = handlers["*node"];
else
handler = handlers["*host"];
end
if handler then -- call always called handler
for _, h in ipairs(handler) do
if h(reply, to, from, node) then found = true; end
end
end
handler = handlers[to]; -- get the handler
if not handler then -- if not found then use default handler
if to_node then
handler = handlers["*defaultnode"];
else
handler = handlers["*defaulthost"];
end
end
if handler then
for _, h in ipairs(handler) do
if h(reply, to, from, node) then found = true; end
end
end
if found then return reply; end -- return the reply if there was one
return st.error_reply(stanza, "cancel", "service-unavailable");
end
end
function new()
return {
item_handlers = {};
info_handlers = {};
addDiscoItemsHandler = addDiscoItemsHandler;
addDiscoInfoHandler = addDiscoInfoHandler;
handle = handle;
};
end
return _M;
|