annotate mod_pubsub_subscription/mod_pubsub_subscription.lua @ 6545:3b605bfc94aa

mod_storage_xmlarchive: Fix purge method (thanks MattJ) Was returning after reaching the inner loop without proceeding to inspect other stores.
author Kim Alvefur <zash@zash.se>
date Sun, 24 May 2026 19:15:11 +0200
parents 1c0e9486ba23
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6086
dc2cce03554d mod_pubsub_subscription: Match stanzas with fixed prefix only
Matthew Wild <mwild1@gmail.com>
parents: 5651
diff changeset
1 local id = require "util.id";
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 local st = require "util.stanza";
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 local uuid = require "util.uuid";
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 local mt = require "util.multitable";
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 local cache = require "util.cache";
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 local xmlns_pubsub = "http://jabber.org/protocol/pubsub";
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event";
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 -- TODO persist
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 -- TODO query known pubsub nodes to sync current subscriptions
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 -- TODO subscription ids per 'item' would be handy
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 local pending_subscription = cache.new(256); -- uuid → node
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 local pending_unsubscription = cache.new(256); -- uuid → node
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
16 local active_subscriptions = mt.new() -- service | node | subscriber | uuid | { item }
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 function module.save()
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 return { active_subscriptions = active_subscriptions.data }
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 function module.restore(data)
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 if data and data.active_subscriptions then
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 active_subscriptions.data = data.active_subscriptions
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 local valid_events = {"subscribed"; "unsubscribed"; "error"; "item"; "retract"; "purge"; "delete"}
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 local function subscription_added(item_event)
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 local item = item_event.item;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 assert(item.service, "pubsub subscription item MUST have a 'service' field.");
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 assert(item.node, "pubsub subscription item MUST have a 'node' field.");
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
32 item.from = item.from or module.host;
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33
6305
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
34 local already_subscribed = false;
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
35 for _ in active_subscriptions:iter(item.service, item.node, item.from, nil) do -- luacheck: ignore 512
6305
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
36 already_subscribed = true;
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 break
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38 end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 item._id = uuid.generate();
6086
dc2cce03554d mod_pubsub_subscription: Match stanzas with fixed prefix only
Matthew Wild <mwild1@gmail.com>
parents: 5651
diff changeset
41 local iq_id = "pubsub-sub-"..id.short();
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 pending_subscription:set(iq_id, item._id);
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
43 active_subscriptions:set(item.service, item.node, item.from, item._id, item);
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44
6305
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
45 if not already_subscribed then
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
46 local function send_subscribe()
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
47 module:log("debug", "%s is subscribing to %s:%s", item.from, item.service, item.node);
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
48 module:send(st.iq({ type = "set", id = iq_id, from = item.from, to = item.service })
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
49 :tag("pubsub", { xmlns = xmlns_pubsub })
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
50 :tag("subscribe", { jid = item.from, node = item.node }));
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
51 end
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
52
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
53 if prosody.start_time then
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
54 send_subscribe();
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
55 else
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
56 module:log("debug", "%s will subscribe to %s:%s after server startup", item.from, item.service, item.node);
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
57 module:hook_global("server-started", send_subscribe);
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
58 end
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
59 else
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
60 module:log("debug", "%s is already subscribed to %s:%s", item.from, item.service, item.node);
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62 end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 for _, event_name in ipairs(valid_events) do
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65 module:hook("pubsub-event/host/"..event_name, function (event)
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
66 for _, _, _, _, _, cb in active_subscriptions:iter(event.service, event.node, event.stanza.attr.to, nil, "on_"..event_name) do
6091
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
67 event.handled = true;
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
68 pcall(cb, event);
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
69 end
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
70 end);
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
71
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
72 module:hook("pubsub-event/bare/"..event_name, function (event)
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
73 for _, _, _, _, _, cb in active_subscriptions:iter(event.service, event.node, event.stanza.attr.to, nil, "on_"..event_name) do
6091
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
74 event.handled = true;
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 pcall(cb, event);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77 end);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79
6305
1c0e9486ba23 mod_pubsub_subscription: Fix sometimes not subscribing at startup, improve logs
Matthew Wild <mwild1@gmail.com>
parents: 6091
diff changeset
80 function handle_iq(context, event) --luacheck: ignore 212/context
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 local stanza = event.stanza;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
82 local service = stanza.attr.from;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
83
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
84 if not stanza.attr.id then return end -- shouldn't be possible
6086
dc2cce03554d mod_pubsub_subscription: Match stanzas with fixed prefix only
Matthew Wild <mwild1@gmail.com>
parents: 5651
diff changeset
85 if not stanza.attr.id:match("^pubsub%-sub%-") then return end
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
86
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
87 local subscribed_node = pending_subscription:get(stanza.attr.id);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
88 pending_subscription:set(stanza.attr.id, nil);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
89 local unsubscribed_node = pending_unsubscription:get(stanza.attr.id);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
90 pending_unsubscription:set(stanza.attr.id, nil);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
91
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
92 if stanza.attr.type == "result" then
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
93 local pubsub_wrapper = stanza:get_child("pubsub", xmlns_pubsub);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94 local subscription = pubsub_wrapper and pubsub_wrapper:get_child("subscription");
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
95 if not subscription then return end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
96 local node = subscription.attr.node;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
97
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
98 local what;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
99 if subscription.attr.subscription == "subscribed" then
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
100 what = "on_subscribed";
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
101 elseif subscription.attr.subscription == "none" then
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
102 what = "on_unsubscribed";
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104 if not what then return end -- there are other states but we don't handle them
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
105 for _, _, _, _, _, cb in active_subscriptions:iter(service, node, stanza.attr.to, nil, what) do
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
106 cb(event);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
107 end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
108 return true;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
109
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
110 elseif stanza.attr.type == "error" then
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
111 local node = subscribed_node or unsubscribed_node;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
112 local error_type, error_condition, reason, pubsub_error = stanza:get_error();
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
113 local err = { type = error_type, condition = error_condition, text = reason, extra = pubsub_error };
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
114 if active_subscriptions:get(service) then
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
115 for _, _, _, _, _, cb in active_subscriptions:iter(service, node, stanza.attr.to, nil, "on_error") do
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
116 cb(err);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
117 end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
118 return true;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
119 end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
120 end
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
121 end
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
122
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
123 module:hook("iq/host", function (event)
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
124 handle_iq("host", event);
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
125 end, 1);
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
126
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
127 module:hook("iq/bare", function (event)
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
128 handle_iq("bare", event);
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
129 end, 1);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
130
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
131 local function subscription_removed(item_event)
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
132 local item = item_event.item;
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
133 active_subscriptions:set(item.service, item.node, item.from, item._id, nil);
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
134 local node_subs = active_subscriptions:get(item.service, item.node, item.from);
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
135 if node_subs and next(node_subs) then return end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
136
6086
dc2cce03554d mod_pubsub_subscription: Match stanzas with fixed prefix only
Matthew Wild <mwild1@gmail.com>
parents: 5651
diff changeset
137 local iq_id = "pubsub-sub-"..id.short();
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
138 pending_unsubscription:set(iq_id, item._id);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
139
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
140 module:send(st.iq({ type = "set", id = iq_id, from = item.from, to = item.service })
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
141 :tag("pubsub", { xmlns = xmlns_pubsub })
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
142 :tag("unsubscribe", { jid = item.from, node = item.node }))
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
143 end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
144
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
145 module:handle_items("pubsub-subscription", subscription_added, subscription_removed, true);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
146
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
147 function handle_message(context, event)
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
148 local origin, stanza = event.origin, event.stanza;
6091
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
149 local handled = nil;
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
150 local service = stanza.attr.from;
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
151 module:log("debug", "Got message/%s: %s", context, stanza:top_tag());
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
152 for event_container in stanza:childtags("event", xmlns_pubsub_event) do
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
153 for pubsub_event in event_container:childtags() do
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
154 module:log("debug", "Got pubsub event %s", pubsub_event:top_tag());
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
155 local node = pubsub_event.attr.node;
6091
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
156 local event_data = {
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
157 stanza = stanza;
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
158 origin = origin;
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
159 event = pubsub_event;
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
160 service = service;
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
161 node = node;
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
162 handled = false;
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
163 };
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
164 module:fire_event("pubsub-event/" .. context .. "/"..pubsub_event.name, event_data);
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
165 if not handled and event_data.handled then
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
166 handled = true;
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
167 end
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
168 end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
169 end
6091
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
170 -- If not addressed to the host, let it fall through to normal handling
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
171 -- (it may be on its way to a local client), otherwise, we'll mark the
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
172 -- event as handled to suppress an error response if we handled it.
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
173 if context == "host" and handled then
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
174 return true;
6dca425eea15 mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents: 6086
diff changeset
175 end
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
176 end
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
177
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
178 module:hook("message/host", function(event)
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
179 return handle_message("host", event);
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
180 end);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
181
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
182 module:hook("message/bare", function(event)
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
183 return handle_message("bare", event);
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
184 end);
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
185
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
186
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
187 function handle_items(context, event)
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
188 for item in event.event:childtags() do
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
189 module:log("debug", "Got pubsub item event %s", item:top_tag());
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
190 event.item = item;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
191 event.payload = item.tags[1];
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
192 module:fire_event("pubsub-event/" .. context .. "/"..item.name, event);
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
193 end
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
194 end
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
195
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
196 module:hook("pubsub-event/host/items", function (event)
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
197 handle_items("host", event);
4511
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
198 end);
5651
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
199
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
200 module:hook("pubsub-event/bare/items", function (event)
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
201 handle_items("bare", event);
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4511
diff changeset
202 end);