annotate mod_pubsub_subscription/mod_pubsub_subscription.lua @ 6513:5fb466693e85

mod_storage_xmlarchive: Ensure list index files are removed using os.remove() on the list files leaves the new index files behind since util.datamanager does not know they are removed. Thanks Link Mauve
author Kim Alvefur <zash@zash.se>
date Tue, 07 Apr 2026 21:10:54 +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);