aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWaqas Hussain <waqas20@gmail.com>2009-05-08 01:07:35 +0500
committerWaqas Hussain <waqas20@gmail.com>2009-05-08 01:07:35 +0500
commit3120084a39b47ac2e79c05a07afb1a90879bedb3 (patch)
tree9a47a2d8037c6f3e02d2327e31d917ffd6580b93
parent5cd003581a143f38b3aa3eb990dd5fc024fc6399 (diff)
downloadprosody-3120084a39b47ac2e79c05a07afb1a90879bedb3.tar.gz
prosody-3120084a39b47ac2e79c05a07afb1a90879bedb3.zip
mod_pep: Initial commit (extremely basic implementation)
-rw-r--r--plugins/mod_pep.lua48
1 files changed, 48 insertions, 0 deletions
diff --git a/plugins/mod_pep.lua b/plugins/mod_pep.lua
new file mode 100644
index 00000000..438b077d
--- /dev/null
+++ b/plugins/mod_pep.lua
@@ -0,0 +1,48 @@
+
+local jid_bare = require "util.jid".bare;
+local jid_split = require "util.jid".split;
+local st = require "util.stanza";
+local hosts = hosts;
+local user_exists = require "core.usermanager".user_exists;
+local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed;
+local pairs, ipairs = pairs, ipairs;
+
+local function publish(session, node, item)
+ local stanza = st.message({from=session.full_jid, type='headline'})
+ :tag('event', {xmlns='http://jabber.org/protocol/pubsub#event'})
+ :tag('items', {node=node})
+ :add_child(item)
+ :up()
+ :up();
+
+ -- broadcast to resources
+ stanza.attr.to = session.username..'@'..session.host;
+ core_route_stanza(session, stanza);
+
+ -- broadcast to contacts
+ for jid, item in pairs(session.roster) do
+ if jid and jid ~= "pending" and (item.subscription == 'from' or item.subscription == 'both') then
+ stanza.attr.to = jid;
+ core_route_stanza(session, stanza);
+ end
+ end
+end
+
+module:add_iq_handler("c2s", "http://jabber.org/protocol/pubsub", function (session, stanza)
+ if stanza.attr.type == 'set' and (not stanza.attr.to or jid_bare(stanza.attr.from) == stanza.attr.to) then
+ local payload = stanza.tags[1];
+ if payload.name == 'pubsub' then
+ payload = payload.tags[1];
+ if payload and payload.name == 'publish' and payload.attr.node then
+ local node = payload.attr.node;
+ payload = payload.tags[1];
+ if payload then
+ publish(session, node, payload);
+ return true;
+ end -- TODO else error
+ end -- TODO else error
+ end
+ end
+ origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
+end);
+