aboutsummaryrefslogtreecommitdiffstats
path: root/util
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2008-11-23 05:03:36 +0000
committerMatthew Wild <mwild1@gmail.com>2008-11-23 05:03:36 +0000
commitb94fd79634deabef5f4761825495e0940aec0ac6 (patch)
treebe1d302b3f7e9e812e294b95cad8750e1a690ac6 /util
parent21df2699e2ffd587a014c9c345ca1161d6a4fc5c (diff)
parent43c503330db3d5b1613c1babcd5ef150d2ccf247 (diff)
downloadprosody-b94fd79634deabef5f4761825495e0940aec0ac6.tar.gz
prosody-b94fd79634deabef5f4761825495e0940aec0ac6.zip
Merge from waqas
Diffstat (limited to 'util')
-rw-r--r--util/discohelper.lua79
-rw-r--r--util/jid.lua4
2 files changed, 80 insertions, 3 deletions
diff --git a/util/discohelper.lua b/util/discohelper.lua
new file mode 100644
index 00000000..4ac8f227
--- /dev/null
+++ b/util/discohelper.lua
@@ -0,0 +1,79 @@
+
+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 = 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
+ local found; -- to keep track of any handlers found
+ if handler then
+ for _, h in ipairs(handler) do
+ if h(reply, to, from, node) then found = true; end
+ end
+ end
+ 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
+ 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;
diff --git a/util/jid.lua b/util/jid.lua
index 2e40a338..065f176f 100644
--- a/util/jid.lua
+++ b/util/jid.lua
@@ -17,10 +17,8 @@ function bare(jid)
local node, host = split(jid);
if node and host then
return node.."@"..host;
- elseif host then
- return host;
end
- return nil;
+ return host;
end
return _M;