Annotate

plugins/mod_pep_simple.lua @ 12956:52fcdfe710ca

storagemanager: Add keyval+ (combined keyval + map) store type This combines the two most common store types, which modules often end up opening with both interfaces separately anyway. As well as combining them, I've taken the opportunity to improve some of the method names to make them clearer.
author Matthew Wild <mwild1@gmail.com>
date Tue, 27 Sep 2022 17:46:27 +0100
parent 12589:39ae08180c81
child 12977:74b9e05af71e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1461
diff changeset
1 -- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2327
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2327
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5683
diff changeset
4 --
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1461
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1461
diff changeset
6 -- COPYING file in the source package for more information.
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1461
diff changeset
7 --
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1461
diff changeset
8
1136
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
9
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
10 local jid_bare = require "util.jid".bare;
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
11 local jid_split = require "util.jid".split;
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
12 local st = require "util.stanza";
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
13 local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed;
5170
3eaf4fc58902 mod_pep: Remove unused imports
Kim Alvefur <zash@zash.se>
parents: 5013
diff changeset
14 local pairs = pairs;
1401
a3ce55c1e43a mod_pep: Remove data when a user disables a node
Waqas Hussain <waqas20@gmail.com>
parents: 1400
diff changeset
15 local next = next;
1437
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
16 local type = type;
12589
39ae08180c81 compat: Remove handling of Lua 5.1 location of 'unpack' function
Kim Alvefur <zash@zash.se>
parents: 10555
diff changeset
17 local unpack = table.unpack;
3344
b16f842b7525 mod_pep: Use util.caps
Matthew Wild <mwild1@gmail.com>
parents: 3290
diff changeset
18 local calculate_hash = require "util.caps".calculate_hash;
5013
ab693eea0869 mod_admin_adhoc, mod_admin_telnet, mod_bosh, mod_c2s, mod_component, mod_pep, mod_presence, mod_roster, mod_s2s: Import core_post_stanza from the global prosody table.
Kim Alvefur <zash@zash.se>
parents: 5004
diff changeset
19 local core_post_stanza = prosody.core_post_stanza;
6865
20b0f0b48655 mod_pep: Don't store contacts' subscriptions to a user's nodes when that user is offline
Matthew Wild <mwild1@gmail.com>
parents: 6864
diff changeset
20 local bare_sessions = prosody.bare_sessions;
1136
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
21
8330
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
22 local xmlns_pubsub = "http://jabber.org/protocol/pubsub";
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
23
6864
0129ffcaa7ab mod_pep: Document data structures, so I don't have to spend time remembering every time I work on this module
Matthew Wild <mwild1@gmail.com>
parents: 5804
diff changeset
24 -- Used as canonical 'empty table'
1430
39169cf8d36f mod_pep: Broadcast only to available recipients with caps
Waqas Hussain <waqas20@gmail.com>
parents: 1429
diff changeset
25 local NULL = {};
6864
0129ffcaa7ab mod_pep: Document data structures, so I don't have to spend time remembering every time I work on this module
Matthew Wild <mwild1@gmail.com>
parents: 5804
diff changeset
26 -- data[user_bare_jid][node] = item_stanza
1323
e1bfe7816761 mod_pep: Maintain user nodes for delayed delivery
Waqas Hussain <waqas20@gmail.com>
parents: 1136
diff changeset
27 local data = {};
6864
0129ffcaa7ab mod_pep: Document data structures, so I don't have to spend time remembering every time I work on this module
Matthew Wild <mwild1@gmail.com>
parents: 5804
diff changeset
28 --- recipients[user_bare_jid][contact_full_jid][subscribed_node] = true
1325
b58645973d7d mod_pep: Send items to contacts coming online
Waqas Hussain <waqas20@gmail.com>
parents: 1324
diff changeset
29 local recipients = {};
6864
0129ffcaa7ab mod_pep: Document data structures, so I don't have to spend time remembering every time I work on this module
Matthew Wild <mwild1@gmail.com>
parents: 5804
diff changeset
30 -- hash_map[hash][subscribed_nodes] = true
1437
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
31 local hash_map = {};
1323
e1bfe7816761 mod_pep: Maintain user nodes for delayed delivery
Waqas Hussain <waqas20@gmail.com>
parents: 1136
diff changeset
32
2045
3b7473a3fa44 PEP: Better reload support.
Waqas Hussain <waqas20@gmail.com>
parents: 2044
diff changeset
33 module.save = function()
3b7473a3fa44 PEP: Better reload support.
Waqas Hussain <waqas20@gmail.com>
parents: 2044
diff changeset
34 return { data = data, recipients = recipients, hash_map = hash_map };
3b7473a3fa44 PEP: Better reload support.
Waqas Hussain <waqas20@gmail.com>
parents: 2044
diff changeset
35 end
3b7473a3fa44 PEP: Better reload support.
Waqas Hussain <waqas20@gmail.com>
parents: 2044
diff changeset
36 module.restore = function(state)
3b7473a3fa44 PEP: Better reload support.
Waqas Hussain <waqas20@gmail.com>
parents: 2044
diff changeset
37 data = state.data or {};
3b7473a3fa44 PEP: Better reload support.
Waqas Hussain <waqas20@gmail.com>
parents: 2044
diff changeset
38 recipients = state.recipients or {};
3b7473a3fa44 PEP: Better reload support.
Waqas Hussain <waqas20@gmail.com>
parents: 2044
diff changeset
39 hash_map = state.hash_map or {};
3b7473a3fa44 PEP: Better reload support.
Waqas Hussain <waqas20@gmail.com>
parents: 2044
diff changeset
40 end
3b7473a3fa44 PEP: Better reload support.
Waqas Hussain <waqas20@gmail.com>
parents: 2044
diff changeset
41
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
42 local function subscription_presence(user_bare, recipient)
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
43 local recipient_bare = jid_bare(recipient);
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
44 if (recipient_bare == user_bare) then return true end
3130
80e630e60f06 mod_pep: Use is_contact_subscribed (which uses the new rostermanager fix to avoid unnecessary roster loads)
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
45 local username, host = jid_split(user_bare);
80e630e60f06 mod_pep: Use is_contact_subscribed (which uses the new rostermanager fix to avoid unnecessary roster loads)
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
46 return is_contact_subscribed(username, host, recipient_bare);
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
47 end
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
48
6544
2f709bc35575 mod_pep: Fire an event when an item is published
Kim Alvefur <zash@zash.se>
parents: 5805
diff changeset
49 module:hook("pep-publish-item", function (event)
7453
b1efeee55972 mod_pep: Include the bare user jid in event
Kim Alvefur <zash@zash.se>
parents: 6866
diff changeset
50 local session, bare, node, id, item = event.session, event.user, event.node, event.id, event.item;
2041
8cf9b978ab36 PEP: Fixed namespace for the <item> element in PEP broadcasts.
Waqas Hussain <waqas20@gmail.com>
parents: 1696
diff changeset
51 item.attr.xmlns = nil;
2326
814eaba0c777 mod_pep: Allow storage of urn:xmpp:avatar:data node (payload only with base64 data)
Paul Aurich <paul@darkrain42.org>
parents: 2045
diff changeset
52 local disable = #item.tags ~= 1 or #item.tags[1] == 0;
1619
ae3250783db2 mod_pep: Added support for pubsub item retraction
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
53 if #item.tags == 0 then item.name = "retract"; end
1402
34723bbd5acb mod_pep: Broadcast from the user's bare JID, not full JID
Waqas Hussain <waqas20@gmail.com>
parents: 1401
diff changeset
54 local stanza = st.message({from=bare, type='headline'})
1136
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
55 :tag('event', {xmlns='http://jabber.org/protocol/pubsub#event'})
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
56 :tag('items', {node=node})
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
57 :add_child(item)
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
58 :up()
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
59 :up();
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
60
1323
e1bfe7816761 mod_pep: Maintain user nodes for delayed delivery
Waqas Hussain <waqas20@gmail.com>
parents: 1136
diff changeset
61 -- store for the future
e1bfe7816761 mod_pep: Maintain user nodes for delayed delivery
Waqas Hussain <waqas20@gmail.com>
parents: 1136
diff changeset
62 local user_data = data[bare];
1401
a3ce55c1e43a mod_pep: Remove data when a user disables a node
Waqas Hussain <waqas20@gmail.com>
parents: 1400
diff changeset
63 if disable then
1440
d3117a6ad1bf mod_pep: Fixed a nil access error
Waqas Hussain <waqas20@gmail.com>
parents: 1439
diff changeset
64 if user_data then
d3117a6ad1bf mod_pep: Fixed a nil access error
Waqas Hussain <waqas20@gmail.com>
parents: 1439
diff changeset
65 user_data[node] = nil;
d3117a6ad1bf mod_pep: Fixed a nil access error
Waqas Hussain <waqas20@gmail.com>
parents: 1439
diff changeset
66 if not next(user_data) then data[bare] = nil; end
d3117a6ad1bf mod_pep: Fixed a nil access error
Waqas Hussain <waqas20@gmail.com>
parents: 1439
diff changeset
67 end
1401
a3ce55c1e43a mod_pep: Remove data when a user disables a node
Waqas Hussain <waqas20@gmail.com>
parents: 1400
diff changeset
68 else
a3ce55c1e43a mod_pep: Remove data when a user disables a node
Waqas Hussain <waqas20@gmail.com>
parents: 1400
diff changeset
69 if not user_data then user_data = {}; data[bare] = user_data; end
5682
e7b9ba2d0638 mod_pep: When a client supplies no id on a published item, reflect our generated id back to it
Florian Zeitz <florob@babelmonkeys.de>
parents: 5170
diff changeset
70 user_data[node] = {id, item};
1401
a3ce55c1e43a mod_pep: Remove data when a user disables a node
Waqas Hussain <waqas20@gmail.com>
parents: 1400
diff changeset
71 end
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
72
1430
39169cf8d36f mod_pep: Broadcast only to available recipients with caps
Waqas Hussain <waqas20@gmail.com>
parents: 1429
diff changeset
73 -- broadcast
1437
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
74 for recipient, notify in pairs(recipients[bare] or NULL) do
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
75 if notify[node] then
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
76 stanza.attr.to = recipient;
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
77 core_post_stanza(session, stanza);
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
78 end
1136
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
79 end
6544
2f709bc35575 mod_pep: Fire an event when an item is published
Kim Alvefur <zash@zash.se>
parents: 5805
diff changeset
80 end);
2f709bc35575 mod_pep: Fire an event when an item is published
Kim Alvefur <zash@zash.se>
parents: 5805
diff changeset
81
1439
f989608964ec mod_pep: Use cached caps
Waqas Hussain <waqas20@gmail.com>
parents: 1437
diff changeset
82 local function publish_all(user, recipient, session)
f989608964ec mod_pep: Use cached caps
Waqas Hussain <waqas20@gmail.com>
parents: 1437
diff changeset
83 local d = data[user];
f989608964ec mod_pep: Use cached caps
Waqas Hussain <waqas20@gmail.com>
parents: 1437
diff changeset
84 local notify = recipients[user] and recipients[user][recipient];
f989608964ec mod_pep: Use cached caps
Waqas Hussain <waqas20@gmail.com>
parents: 1437
diff changeset
85 if d and notify then
1451
cc0aa9470775 mod_pep: Fixed boolean indexing error while casting all messages for a user
Waqas Hussain <waqas20@gmail.com>
parents: 1440
diff changeset
86 for node in pairs(notify) do
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
87 if d[node] then
10555
f73947a9bd8c mod_pep_simple: Ignore unused variable [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
88 -- luacheck: ignore id
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
89 local id, item = unpack(d[node]);
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
90 session.send(st.message({from=user, to=recipient, type='headline'})
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
91 :tag('event', {xmlns='http://jabber.org/protocol/pubsub#event'})
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
92 :tag('items', {node=node})
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
93 :add_child(item)
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
94 :up()
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
95 :up());
1439
f989608964ec mod_pep: Use cached caps
Waqas Hussain <waqas20@gmail.com>
parents: 1437
diff changeset
96 end
f989608964ec mod_pep: Use cached caps
Waqas Hussain <waqas20@gmail.com>
parents: 1437
diff changeset
97 end
f989608964ec mod_pep: Use cached caps
Waqas Hussain <waqas20@gmail.com>
parents: 1437
diff changeset
98 end
f989608964ec mod_pep: Use cached caps
Waqas Hussain <waqas20@gmail.com>
parents: 1437
diff changeset
99 end
1136
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
100
1428
02e97e716675 mod_pep: Added function get_caps_hash_from_presence
Waqas Hussain <waqas20@gmail.com>
parents: 1425
diff changeset
101 local function get_caps_hash_from_presence(stanza, current)
1429
51cfb152cb38 mod_pep: Ignore presence subscriptions when extractng hash information
Waqas Hussain <waqas20@gmail.com>
parents: 1428
diff changeset
102 local t = stanza.attr.type;
51cfb152cb38 mod_pep: Ignore presence subscriptions when extractng hash information
Waqas Hussain <waqas20@gmail.com>
parents: 1428
diff changeset
103 if not t then
1428
02e97e716675 mod_pep: Added function get_caps_hash_from_presence
Waqas Hussain <waqas20@gmail.com>
parents: 1425
diff changeset
104 for _, child in pairs(stanza.tags) do
02e97e716675 mod_pep: Added function get_caps_hash_from_presence
Waqas Hussain <waqas20@gmail.com>
parents: 1425
diff changeset
105 if child.name == "c" and child.attr.xmlns == "http://jabber.org/protocol/caps" then
02e97e716675 mod_pep: Added function get_caps_hash_from_presence
Waqas Hussain <waqas20@gmail.com>
parents: 1425
diff changeset
106 local attr = child.attr;
02e97e716675 mod_pep: Added function get_caps_hash_from_presence
Waqas Hussain <waqas20@gmail.com>
parents: 1425
diff changeset
107 if attr.hash then -- new caps
02e97e716675 mod_pep: Added function get_caps_hash_from_presence
Waqas Hussain <waqas20@gmail.com>
parents: 1425
diff changeset
108 if attr.hash == 'sha-1' and attr.node and attr.ver then return attr.ver, attr.node.."#"..attr.ver; end
02e97e716675 mod_pep: Added function get_caps_hash_from_presence
Waqas Hussain <waqas20@gmail.com>
parents: 1425
diff changeset
109 else -- legacy caps
02e97e716675 mod_pep: Added function get_caps_hash_from_presence
Waqas Hussain <waqas20@gmail.com>
parents: 1425
diff changeset
110 if attr.node and attr.ver then return attr.node.."#"..attr.ver.."#"..(attr.ext or ""), attr.node.."#"..attr.ver; end
02e97e716675 mod_pep: Added function get_caps_hash_from_presence
Waqas Hussain <waqas20@gmail.com>
parents: 1425
diff changeset
111 end
02e97e716675 mod_pep: Added function get_caps_hash_from_presence
Waqas Hussain <waqas20@gmail.com>
parents: 1425
diff changeset
112 return; -- bad caps format
02e97e716675 mod_pep: Added function get_caps_hash_from_presence
Waqas Hussain <waqas20@gmail.com>
parents: 1425
diff changeset
113 end
02e97e716675 mod_pep: Added function get_caps_hash_from_presence
Waqas Hussain <waqas20@gmail.com>
parents: 1425
diff changeset
114 end
1429
51cfb152cb38 mod_pep: Ignore presence subscriptions when extractng hash information
Waqas Hussain <waqas20@gmail.com>
parents: 1428
diff changeset
115 elseif t == "unavailable" or t == "error" then
51cfb152cb38 mod_pep: Ignore presence subscriptions when extractng hash information
Waqas Hussain <waqas20@gmail.com>
parents: 1428
diff changeset
116 return;
1428
02e97e716675 mod_pep: Added function get_caps_hash_from_presence
Waqas Hussain <waqas20@gmail.com>
parents: 1425
diff changeset
117 end
1429
51cfb152cb38 mod_pep: Ignore presence subscriptions when extractng hash information
Waqas Hussain <waqas20@gmail.com>
parents: 1428
diff changeset
118 return current; -- no caps, could mean caps optimization, so return current
1428
02e97e716675 mod_pep: Added function get_caps_hash_from_presence
Waqas Hussain <waqas20@gmail.com>
parents: 1425
diff changeset
119 end
02e97e716675 mod_pep: Added function get_caps_hash_from_presence
Waqas Hussain <waqas20@gmail.com>
parents: 1425
diff changeset
120
1399
8879f8278762 mod_pep: Fixed detection of contact presence changes
Waqas Hussain <waqas20@gmail.com>
parents: 1338
diff changeset
121 module:hook("presence/bare", function(event)
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8330
diff changeset
122 -- inbound presence to bare JID received
1399
8879f8278762 mod_pep: Fixed detection of contact presence changes
Waqas Hussain <waqas20@gmail.com>
parents: 1338
diff changeset
123 local origin, stanza = event.origin, event.stanza;
1325
b58645973d7d mod_pep: Send items to contacts coming online
Waqas Hussain <waqas20@gmail.com>
parents: 1324
diff changeset
124 local user = stanza.attr.to or (origin.username..'@'..origin.host);
3132
4d2251242ac1 mod_pep: Corrected and optimized handling of non-available presence stanzas.
Waqas Hussain <waqas20@gmail.com>
parents: 3130
diff changeset
125 local t = stanza.attr.type;
3664
345cd1e04e80 mod_pep: Optimised PEP requests for disco info on caps change (issue #150).
Waqas Hussain <waqas20@gmail.com>
parents: 3648
diff changeset
126 local self = not stanza.attr.to;
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
127
6865
20b0f0b48655 mod_pep: Don't store contacts' subscriptions to a user's nodes when that user is offline
Matthew Wild <mwild1@gmail.com>
parents: 6864
diff changeset
128 -- Only cache subscriptions if user is online
20b0f0b48655 mod_pep: Don't store contacts' subscriptions to a user's nodes when that user is offline
Matthew Wild <mwild1@gmail.com>
parents: 6864
diff changeset
129 if not bare_sessions[user] then return; end
20b0f0b48655 mod_pep: Don't store contacts' subscriptions to a user's nodes when that user is offline
Matthew Wild <mwild1@gmail.com>
parents: 6864
diff changeset
130
3132
4d2251242ac1 mod_pep: Corrected and optimized handling of non-available presence stanzas.
Waqas Hussain <waqas20@gmail.com>
parents: 3130
diff changeset
131 if not t then -- available presence
3664
345cd1e04e80 mod_pep: Optimised PEP requests for disco info on caps change (issue #150).
Waqas Hussain <waqas20@gmail.com>
parents: 3648
diff changeset
132 if self or subscription_presence(user, stanza.attr.from) then
3132
4d2251242ac1 mod_pep: Corrected and optimized handling of non-available presence stanzas.
Waqas Hussain <waqas20@gmail.com>
parents: 3130
diff changeset
133 local recipient = stanza.attr.from;
4d2251242ac1 mod_pep: Corrected and optimized handling of non-available presence stanzas.
Waqas Hussain <waqas20@gmail.com>
parents: 3130
diff changeset
134 local current = recipients[user] and recipients[user][recipient];
4d2251242ac1 mod_pep: Corrected and optimized handling of non-available presence stanzas.
Waqas Hussain <waqas20@gmail.com>
parents: 3130
diff changeset
135 local hash = get_caps_hash_from_presence(stanza, current);
4207
06eb75d071ec mod_pep: Fix comparison between incoming hash and the cached hash for a JID, fixes repeated PEP events on presence (fixes #225)
Matthew Wild <mwild1@gmail.com>
parents: 3738
diff changeset
136 if current == hash or (current and current == hash_map[hash]) then return; end
3132
4d2251242ac1 mod_pep: Corrected and optimized handling of non-available presence stanzas.
Waqas Hussain <waqas20@gmail.com>
parents: 3130
diff changeset
137 if not hash then
4d2251242ac1 mod_pep: Corrected and optimized handling of non-available presence stanzas.
Waqas Hussain <waqas20@gmail.com>
parents: 3130
diff changeset
138 if recipients[user] then recipients[user][recipient] = nil; end
1439
f989608964ec mod_pep: Use cached caps
Waqas Hussain <waqas20@gmail.com>
parents: 1437
diff changeset
139 else
3132
4d2251242ac1 mod_pep: Corrected and optimized handling of non-available presence stanzas.
Waqas Hussain <waqas20@gmail.com>
parents: 3130
diff changeset
140 recipients[user] = recipients[user] or {};
4d2251242ac1 mod_pep: Corrected and optimized handling of non-available presence stanzas.
Waqas Hussain <waqas20@gmail.com>
parents: 3130
diff changeset
141 if hash_map[hash] then
4d2251242ac1 mod_pep: Corrected and optimized handling of non-available presence stanzas.
Waqas Hussain <waqas20@gmail.com>
parents: 3130
diff changeset
142 recipients[user][recipient] = hash_map[hash];
4d2251242ac1 mod_pep: Corrected and optimized handling of non-available presence stanzas.
Waqas Hussain <waqas20@gmail.com>
parents: 3130
diff changeset
143 publish_all(user, recipient, origin);
4d2251242ac1 mod_pep: Corrected and optimized handling of non-available presence stanzas.
Waqas Hussain <waqas20@gmail.com>
parents: 3130
diff changeset
144 else
4d2251242ac1 mod_pep: Corrected and optimized handling of non-available presence stanzas.
Waqas Hussain <waqas20@gmail.com>
parents: 3130
diff changeset
145 recipients[user][recipient] = hash;
3738
ae2ac97b23b1 mod_pep: Fixed a traceback when non-local users send presence.
Waqas Hussain <waqas20@gmail.com>
parents: 3737
diff changeset
146 local from_bare = origin.type == "c2s" and origin.username.."@"..origin.host;
3737
659563b1db89 mod_pep: Handle the case where local contacts send directed presence with caps hash.
Waqas Hussain <waqas20@gmail.com>
parents: 3668
diff changeset
147 if self or origin.type ~= "c2s" or (recipients[from_bare] and recipients[from_bare][origin.full_jid]) ~= hash then
5804
bb27ba619932 mod_pep: Update COMPAT comment, it seems Asterisk 1.8 also suffers from this issue (thanks Lonnie Abelbeck)
Matthew Wild <mwild1@gmail.com>
parents: 5682
diff changeset
148 -- COMPAT from ~= stanza.attr.to because OneTeam and Asterisk 1.8 can't deal with missing from attribute
3664
345cd1e04e80 mod_pep: Optimised PEP requests for disco info on caps change (issue #150).
Waqas Hussain <waqas20@gmail.com>
parents: 3648
diff changeset
149 origin.send(
4394
676b0845eae4 mod_pep: Always include a 'from' attribute on service discovery requests to local clients (compatibility fix for OneTeam).
Waqas Hussain <waqas20@gmail.com>
parents: 4207
diff changeset
150 st.stanza("iq", {from=user, to=stanza.attr.from, id="disco", type="get"})
3664
345cd1e04e80 mod_pep: Optimised PEP requests for disco info on caps change (issue #150).
Waqas Hussain <waqas20@gmail.com>
parents: 3648
diff changeset
151 :query("http://jabber.org/protocol/disco#info")
345cd1e04e80 mod_pep: Optimised PEP requests for disco info on caps change (issue #150).
Waqas Hussain <waqas20@gmail.com>
parents: 3648
diff changeset
152 );
345cd1e04e80 mod_pep: Optimised PEP requests for disco info on caps change (issue #150).
Waqas Hussain <waqas20@gmail.com>
parents: 3648
diff changeset
153 end
3132
4d2251242ac1 mod_pep: Corrected and optimized handling of non-available presence stanzas.
Waqas Hussain <waqas20@gmail.com>
parents: 3130
diff changeset
154 end
1439
f989608964ec mod_pep: Use cached caps
Waqas Hussain <waqas20@gmail.com>
parents: 1437
diff changeset
155 end
1325
b58645973d7d mod_pep: Send items to contacts coming online
Waqas Hussain <waqas20@gmail.com>
parents: 1324
diff changeset
156 end
3132
4d2251242ac1 mod_pep: Corrected and optimized handling of non-available presence stanzas.
Waqas Hussain <waqas20@gmail.com>
parents: 3130
diff changeset
157 elseif t == "unavailable" then
4d2251242ac1 mod_pep: Corrected and optimized handling of non-available presence stanzas.
Waqas Hussain <waqas20@gmail.com>
parents: 3130
diff changeset
158 if recipients[user] then recipients[user][stanza.attr.from] = nil; end
3668
29a340777d7b mod_pep: Remove PEP subscriptions on getting a presence unsubscribe.
Waqas Hussain <waqas20@gmail.com>
parents: 3667
diff changeset
159 elseif not self and t == "unsubscribe" then
29a340777d7b mod_pep: Remove PEP subscriptions on getting a presence unsubscribe.
Waqas Hussain <waqas20@gmail.com>
parents: 3667
diff changeset
160 local from = jid_bare(stanza.attr.from);
29a340777d7b mod_pep: Remove PEP subscriptions on getting a presence unsubscribe.
Waqas Hussain <waqas20@gmail.com>
parents: 3667
diff changeset
161 local subscriptions = recipients[user];
29a340777d7b mod_pep: Remove PEP subscriptions on getting a presence unsubscribe.
Waqas Hussain <waqas20@gmail.com>
parents: 3667
diff changeset
162 if subscriptions then
29a340777d7b mod_pep: Remove PEP subscriptions on getting a presence unsubscribe.
Waqas Hussain <waqas20@gmail.com>
parents: 3667
diff changeset
163 for subscriber in pairs(subscriptions) do
29a340777d7b mod_pep: Remove PEP subscriptions on getting a presence unsubscribe.
Waqas Hussain <waqas20@gmail.com>
parents: 3667
diff changeset
164 if jid_bare(subscriber) == from then
29a340777d7b mod_pep: Remove PEP subscriptions on getting a presence unsubscribe.
Waqas Hussain <waqas20@gmail.com>
parents: 3667
diff changeset
165 recipients[user][subscriber] = nil;
29a340777d7b mod_pep: Remove PEP subscriptions on getting a presence unsubscribe.
Waqas Hussain <waqas20@gmail.com>
parents: 3667
diff changeset
166 end
29a340777d7b mod_pep: Remove PEP subscriptions on getting a presence unsubscribe.
Waqas Hussain <waqas20@gmail.com>
parents: 3667
diff changeset
167 end
29a340777d7b mod_pep: Remove PEP subscriptions on getting a presence unsubscribe.
Waqas Hussain <waqas20@gmail.com>
parents: 3667
diff changeset
168 end
1325
b58645973d7d mod_pep: Send items to contacts coming online
Waqas Hussain <waqas20@gmail.com>
parents: 1324
diff changeset
169 end
1327
20285e9d71ee mod_pep: Give the presence handler a higher than default priority
Waqas Hussain <waqas20@gmail.com>
parents: 1325
diff changeset
170 end, 10);
1325
b58645973d7d mod_pep: Send items to contacts coming online
Waqas Hussain <waqas20@gmail.com>
parents: 1324
diff changeset
171
1404
12abd2da8885 mod_pep: Use new style events
Waqas Hussain <waqas20@gmail.com>
parents: 1402
diff changeset
172 module:hook("iq/bare/http://jabber.org/protocol/pubsub:pubsub", function(event)
12abd2da8885 mod_pep: Use new style events
Waqas Hussain <waqas20@gmail.com>
parents: 1402
diff changeset
173 local session, stanza = event.origin, event.stanza;
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
174 local payload = stanza.tags[1];
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
175
1136
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
176 if stanza.attr.type == 'set' and (not stanza.attr.to or jid_bare(stanza.attr.from) == stanza.attr.to) then
8965
1cc5ea1df5ba mod_pep: Move comment to a shorter line [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8728
diff changeset
177 payload = payload.tags[1]; -- <publish node='http://jabber.org/protocol/tune'>
1cc5ea1df5ba mod_pep: Move comment to a shorter line [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8728
diff changeset
178 if payload and (payload.name == 'publish' or payload.name == 'retract') and payload.attr.node then
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
179 local node = payload.attr.node;
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
180 payload = payload.tags[1];
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
181 if payload and payload.name == "item" then -- <item>
5682
e7b9ba2d0638 mod_pep: When a client supplies no id on a published item, reflect our generated id back to it
Florian Zeitz <florob@babelmonkeys.de>
parents: 5170
diff changeset
182 local id = payload.attr.id or "1";
e7b9ba2d0638 mod_pep: When a client supplies no id on a published item, reflect our generated id back to it
Florian Zeitz <florob@babelmonkeys.de>
parents: 5170
diff changeset
183 payload.attr.id = id;
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
184 session.send(st.reply(stanza));
6544
2f709bc35575 mod_pep: Fire an event when an item is published
Kim Alvefur <zash@zash.se>
parents: 5805
diff changeset
185 module:fire_event("pep-publish-item", {
8124
20e92f6688b2 mod_pep: Split long line [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7871
diff changeset
186 node = node, user = jid_bare(session.full_jid), actor = session.jid,
20e92f6688b2 mod_pep: Split long line [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7871
diff changeset
187 id = id, session = session, item = st.clone(payload);
6544
2f709bc35575 mod_pep: Fire an event when an item is published
Kim Alvefur <zash@zash.se>
parents: 5805
diff changeset
188 });
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
189 return true;
7871
09aa0453bdcc mod_pep: Add some additional debug logging
Kim Alvefur <zash@zash.se>
parents: 7454
diff changeset
190 else
09aa0453bdcc mod_pep: Add some additional debug logging
Kim Alvefur <zash@zash.se>
parents: 7454
diff changeset
191 module:log("debug", "Payload is missing the <item>", node);
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
192 end
7871
09aa0453bdcc mod_pep: Add some additional debug logging
Kim Alvefur <zash@zash.se>
parents: 7454
diff changeset
193 else
09aa0453bdcc mod_pep: Add some additional debug logging
Kim Alvefur <zash@zash.se>
parents: 7454
diff changeset
194 module:log("debug", "Unhandled payload: %s", payload and payload:top_tag() or "(no payload)");
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
195 end
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
196 elseif stanza.attr.type == 'get' then
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
197 local user = stanza.attr.to and jid_bare(stanza.attr.to) or session.username..'@'..session.host;
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
198 if subscription_presence(user, stanza.attr.from) then
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
199 local user_data = data[user];
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
200 local node, requested_id;
1136
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
201 payload = payload.tags[1];
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
202 if payload and payload.name == 'items' then
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
203 node = payload.attr.node;
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
204 local item = payload.tags[1];
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
205 if item and item.name == "item" then
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
206 requested_id = item.attr.id;
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
207 end
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
208 end
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
209 if node and user_data and user_data[node] then -- Send the last item
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
210 local id, item = unpack(user_data[node]);
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
211 if not requested_id or id == requested_id then
8966
9106e9286203 mod_pep: Rename variables to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8965
diff changeset
212 local reply_stanza = st.reply(stanza)
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
213 :tag('pubsub', {xmlns='http://jabber.org/protocol/pubsub'})
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
214 :tag('items', {node=node})
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
215 :add_child(item)
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
216 :up()
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
217 :up();
8966
9106e9286203 mod_pep: Rename variables to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8965
diff changeset
218 session.send(reply_stanza);
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
219 return true;
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
220 else -- requested item doesn't exist
8966
9106e9286203 mod_pep: Rename variables to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8965
diff changeset
221 local reply_stanza = st.reply(stanza)
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
222 :tag('pubsub', {xmlns='http://jabber.org/protocol/pubsub'})
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
223 :tag('items', {node=node})
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
224 :up();
8966
9106e9286203 mod_pep: Rename variables to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8965
diff changeset
225 session.send(reply_stanza);
1136
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
226 return true;
1425
8187f72b7425 mod_pep: Removed some YODO comments
Waqas Hussain <waqas20@gmail.com>
parents: 1424
diff changeset
227 end
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
228 elseif node then -- node doesn't exist
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
229 session.send(st.error_reply(stanza, 'cancel', 'item-not-found'));
7871
09aa0453bdcc mod_pep: Add some additional debug logging
Kim Alvefur <zash@zash.se>
parents: 7454
diff changeset
230 module:log("debug", "Item '%s' not found", node)
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
231 return true;
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
232 else --invalid request
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
233 session.send(st.error_reply(stanza, 'modify', 'bad-request'));
10111
0f335815244f plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 9691
diff changeset
234 module:log("debug", "Invalid request: %s", payload);
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
235 return true;
1425
8187f72b7425 mod_pep: Removed some YODO comments
Waqas Hussain <waqas20@gmail.com>
parents: 1424
diff changeset
236 end
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
237 else --no presence subscription
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
238 session.send(st.error_reply(stanza, 'auth', 'not-authorized')
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
239 :tag('presence-subscription-required', {xmlns='http://jabber.org/protocol/pubsub#errors'}));
10111
0f335815244f plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 9691
diff changeset
240 module:log("debug", "Unauthorized request: %s", payload);
2327
5839f303addf mod_pep: Support item retrieval use cases
Paul Aurich <paul@darkrain42.org>
parents: 2326
diff changeset
241 return true;
1136
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
242 end
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
243 end
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
244 end);
506012db54e8 mod_pep: Initial commit (extremely basic implementation)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
245
3648
c0148fddd81f mod_pep: Updated disco#info result handler to use new event name format.
Waqas Hussain <waqas20@gmail.com>
parents: 3344
diff changeset
246 module:hook("iq-result/bare/disco", function(event)
1424
6969ad97ca58 mod_pep: Added handler for disco responses
Waqas Hussain <waqas20@gmail.com>
parents: 1404
diff changeset
247 local session, stanza = event.origin, event.stanza;
6969ad97ca58 mod_pep: Added handler for disco responses
Waqas Hussain <waqas20@gmail.com>
parents: 1404
diff changeset
248 if stanza.attr.type == "result" then
6969ad97ca58 mod_pep: Added handler for disco responses
Waqas Hussain <waqas20@gmail.com>
parents: 1404
diff changeset
249 local disco = stanza.tags[1];
6969ad97ca58 mod_pep: Added handler for disco responses
Waqas Hussain <waqas20@gmail.com>
parents: 1404
diff changeset
250 if disco and disco.name == "query" and disco.attr.xmlns == "http://jabber.org/protocol/disco#info" then
6969ad97ca58 mod_pep: Added handler for disco responses
Waqas Hussain <waqas20@gmail.com>
parents: 1404
diff changeset
251 -- Process disco response
3664
345cd1e04e80 mod_pep: Optimised PEP requests for disco info on caps change (issue #150).
Waqas Hussain <waqas20@gmail.com>
parents: 3648
diff changeset
252 local self = not stanza.attr.to;
1437
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
253 local user = stanza.attr.to or (session.username..'@'..session.host);
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
254 local contact = stanza.attr.from;
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
255 local current = recipients[user] and recipients[user][contact];
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
256 if type(current) ~= "string" then return; end -- check if waiting for recipient's response
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
257 local ver = current;
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
258 if not string.find(current, "#") then
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
259 ver = calculate_hash(disco.tags); -- calculate hash
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
260 end
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
261 local notify = {};
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
262 for _, feature in pairs(disco.tags) do
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
263 if feature.name == "feature" and feature.attr.var then
1461
51f0202b0868 mod_pep: Escape + in pattern
Matthew Wild <mwild1@gmail.com>
parents: 1457
diff changeset
264 local nfeature = feature.attr.var:match("^(.*)%+notify$");
1437
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
265 if nfeature then notify[nfeature] = true; end
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
266 end
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
267 end
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
268 hash_map[ver] = notify; -- update hash map
3664
345cd1e04e80 mod_pep: Optimised PEP requests for disco info on caps change (issue #150).
Waqas Hussain <waqas20@gmail.com>
parents: 3648
diff changeset
269 if self then
3666
44c4789d6e17 mod_pep: Fixed a nil access (thanks Zash).
Waqas Hussain <waqas20@gmail.com>
parents: 3664
diff changeset
270 for jid, item in pairs(session.roster) do -- for all interested contacts
3664
345cd1e04e80 mod_pep: Optimised PEP requests for disco info on caps change (issue #150).
Waqas Hussain <waqas20@gmail.com>
parents: 3648
diff changeset
271 if item.subscription == "both" or item.subscription == "from" then
345cd1e04e80 mod_pep: Optimised PEP requests for disco info on caps change (issue #150).
Waqas Hussain <waqas20@gmail.com>
parents: 3648
diff changeset
272 if not recipients[jid] then recipients[jid] = {}; end
345cd1e04e80 mod_pep: Optimised PEP requests for disco info on caps change (issue #150).
Waqas Hussain <waqas20@gmail.com>
parents: 3648
diff changeset
273 recipients[jid][contact] = notify;
3667
5c39dce29eaf mod_pep: Fixed regression where PEP messages were not correctly being broadcasted on caps hash change.
Waqas Hussain <waqas20@gmail.com>
parents: 3666
diff changeset
274 publish_all(jid, contact, session);
3664
345cd1e04e80 mod_pep: Optimised PEP requests for disco info on caps change (issue #150).
Waqas Hussain <waqas20@gmail.com>
parents: 3648
diff changeset
275 end
345cd1e04e80 mod_pep: Optimised PEP requests for disco info on caps change (issue #150).
Waqas Hussain <waqas20@gmail.com>
parents: 3648
diff changeset
276 end
345cd1e04e80 mod_pep: Optimised PEP requests for disco info on caps change (issue #150).
Waqas Hussain <waqas20@gmail.com>
parents: 3648
diff changeset
277 end
3667
5c39dce29eaf mod_pep: Fixed regression where PEP messages were not correctly being broadcasted on caps hash change.
Waqas Hussain <waqas20@gmail.com>
parents: 3666
diff changeset
278 recipients[user][contact] = notify; -- set recipient's data to calculated data
1437
cf2eba9b1716 mod_pep: Entity capabilities
Waqas Hussain <waqas20@gmail.com>
parents: 1430
diff changeset
279 -- send messages to recipient
1439
f989608964ec mod_pep: Use cached caps
Waqas Hussain <waqas20@gmail.com>
parents: 1437
diff changeset
280 publish_all(user, contact, session);
1424
6969ad97ca58 mod_pep: Added handler for disco responses
Waqas Hussain <waqas20@gmail.com>
parents: 1404
diff changeset
281 end
6969ad97ca58 mod_pep: Added handler for disco responses
Waqas Hussain <waqas20@gmail.com>
parents: 1404
diff changeset
282 end
6969ad97ca58 mod_pep: Added handler for disco responses
Waqas Hussain <waqas20@gmail.com>
parents: 1404
diff changeset
283 end);
2384
7bec10f26082 mod_pep: Handle service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 2327
diff changeset
284
7bec10f26082 mod_pep: Handle service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 2327
diff changeset
285 module:hook("account-disco-info", function(event)
5627
0439d1349dc1 mod_disco: Emit events for disco requests, which contain a node, on user accounts
Florian Zeitz <florob@babelmonkeys.de>
parents: 5170
diff changeset
286 local reply = event.reply;
0439d1349dc1 mod_disco: Emit events for disco requests, which contain a node, on user accounts
Florian Zeitz <florob@babelmonkeys.de>
parents: 5170
diff changeset
287 reply:tag('identity', {category='pubsub', type='pep'}):up();
8330
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
288 reply:tag('feature', {var=xmlns_pubsub}):up();
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
289 local features = {
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
290 "access-presence",
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
291 "auto-create",
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
292 "auto-subscribe",
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
293 "filtered-notifications",
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
294 "item-ids",
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
295 "last-published",
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
296 "presence-notifications",
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
297 "presence-subscribe",
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
298 "publish",
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
299 "retract-items",
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
300 "retrieve-items",
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
301 };
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
302 for _, feature in ipairs(features) do
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
303 reply:tag('feature', {var=xmlns_pubsub.."#"..feature}):up();
8d5c2eef1654 mod_pep: Advertise pubsub features that I believe to be implented
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
304 end
2384
7bec10f26082 mod_pep: Handle service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 2327
diff changeset
305 end);
7bec10f26082 mod_pep: Handle service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 2327
diff changeset
306
7bec10f26082 mod_pep: Handle service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 2327
diff changeset
307 module:hook("account-disco-items", function(event)
5627
0439d1349dc1 mod_disco: Emit events for disco requests, which contain a node, on user accounts
Florian Zeitz <florob@babelmonkeys.de>
parents: 5170
diff changeset
308 local reply = event.reply;
0439d1349dc1 mod_disco: Emit events for disco requests, which contain a node, on user accounts
Florian Zeitz <florob@babelmonkeys.de>
parents: 5170
diff changeset
309 local bare = reply.attr.to;
2384
7bec10f26082 mod_pep: Handle service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 2327
diff changeset
310 local user_data = data[bare];
7bec10f26082 mod_pep: Handle service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 2327
diff changeset
311
7bec10f26082 mod_pep: Handle service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 2327
diff changeset
312 if user_data then
7bec10f26082 mod_pep: Handle service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 2327
diff changeset
313 for node, _ in pairs(user_data) do
8125
5f0c642a41a1 mod_pep: Handle disco#info queries to nodes (fixes #805)
Kim Alvefur <zash@zash.se>
parents: 8124
diff changeset
314 reply:tag('item', {jid=bare, node=node}):up();
2384
7bec10f26082 mod_pep: Handle service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 2327
diff changeset
315 end
7bec10f26082 mod_pep: Handle service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 2327
diff changeset
316 end
7bec10f26082 mod_pep: Handle service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 2327
diff changeset
317 end);
6865
20b0f0b48655 mod_pep: Don't store contacts' subscriptions to a user's nodes when that user is offline
Matthew Wild <mwild1@gmail.com>
parents: 6864
diff changeset
318
8125
5f0c642a41a1 mod_pep: Handle disco#info queries to nodes (fixes #805)
Kim Alvefur <zash@zash.se>
parents: 8124
diff changeset
319 module:hook("account-disco-info-node", function (event)
8967
c809f334363c mod_pep: Remove unused variable [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8966
diff changeset
320 local stanza, node = event.stanza, event.node;
8125
5f0c642a41a1 mod_pep: Handle disco#info queries to nodes (fixes #805)
Kim Alvefur <zash@zash.se>
parents: 8124
diff changeset
321 local user = stanza.attr.to;
5f0c642a41a1 mod_pep: Handle disco#info queries to nodes (fixes #805)
Kim Alvefur <zash@zash.se>
parents: 8124
diff changeset
322 local user_data = data[user];
5f0c642a41a1 mod_pep: Handle disco#info queries to nodes (fixes #805)
Kim Alvefur <zash@zash.se>
parents: 8124
diff changeset
323 if user_data and user_data[node] then
5f0c642a41a1 mod_pep: Handle disco#info queries to nodes (fixes #805)
Kim Alvefur <zash@zash.se>
parents: 8124
diff changeset
324 event.exists = true;
5f0c642a41a1 mod_pep: Handle disco#info queries to nodes (fixes #805)
Kim Alvefur <zash@zash.se>
parents: 8124
diff changeset
325 event.reply:tag('identity', {category='pubsub', type='leaf'}):up();
5f0c642a41a1 mod_pep: Handle disco#info queries to nodes (fixes #805)
Kim Alvefur <zash@zash.se>
parents: 8124
diff changeset
326 end
5f0c642a41a1 mod_pep: Handle disco#info queries to nodes (fixes #805)
Kim Alvefur <zash@zash.se>
parents: 8124
diff changeset
327 end);
5f0c642a41a1 mod_pep: Handle disco#info queries to nodes (fixes #805)
Kim Alvefur <zash@zash.se>
parents: 8124
diff changeset
328
6865
20b0f0b48655 mod_pep: Don't store contacts' subscriptions to a user's nodes when that user is offline
Matthew Wild <mwild1@gmail.com>
parents: 6864
diff changeset
329 module:hook("resource-unbind", function (event)
20b0f0b48655 mod_pep: Don't store contacts' subscriptions to a user's nodes when that user is offline
Matthew Wild <mwild1@gmail.com>
parents: 6864
diff changeset
330 local user_bare_jid = event.session.username.."@"..event.session.host;
20b0f0b48655 mod_pep: Don't store contacts' subscriptions to a user's nodes when that user is offline
Matthew Wild <mwild1@gmail.com>
parents: 6864
diff changeset
331 if not bare_sessions[user_bare_jid] then -- User went offline
20b0f0b48655 mod_pep: Don't store contacts' subscriptions to a user's nodes when that user is offline
Matthew Wild <mwild1@gmail.com>
parents: 6864
diff changeset
332 -- We don't need this info cached anymore, clear it.
20b0f0b48655 mod_pep: Don't store contacts' subscriptions to a user's nodes when that user is offline
Matthew Wild <mwild1@gmail.com>
parents: 6864
diff changeset
333 recipients[user_bare_jid] = nil;
20b0f0b48655 mod_pep: Don't store contacts' subscriptions to a user's nodes when that user is offline
Matthew Wild <mwild1@gmail.com>
parents: 6864
diff changeset
334 end
20b0f0b48655 mod_pep: Don't store contacts' subscriptions to a user's nodes when that user is offline
Matthew Wild <mwild1@gmail.com>
parents: 6864
diff changeset
335 end);