Annotate

plugins/mod_presence.lua @ 13684:026a75a443de 13.0

mod_admin_shell: Hide secondary role commands, focus on primary roles Secondary roles are an advanced feature without any strong use cases currently. Having multiple ways to manage roles is confusing. Now the 'user:role' command will just show the primary role if that is all there is, but will list secondary roles too if there are any (which in 99.9% of cases there won't be).
author Matthew Wild <mwild1@gmail.com>
date Thu, 13 Feb 2025 16:18:59 +0000
parent 13676:40c309f8b676
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 1508
diff changeset
1 -- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2643
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2643
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5416
diff changeset
4 --
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
6 -- COPYING file in the source package for more information.
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
7 --
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
8
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
9 local log = module._log;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
10
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
11 local require = require;
5416
0ba3a49d3863 mod_presence: Remove some unused variables
Matthew Wild <mwild1@gmail.com>
parents: 5370
diff changeset
12 local pairs = pairs;
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
13 local s_find = string.find;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
14 local tonumber = tonumber;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
15
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: 4993
diff changeset
16 local core_post_stanza = prosody.core_post_stanza;
10813
4a9ff4f61796 mod_presence: Send unavailable presence in current thread run
Kim Alvefur <zash@zash.se>
parents: 10694
diff changeset
17 local core_process_stanza = prosody.core_process_stanza;
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 10813
diff changeset
18 local st = require "prosody.util.stanza";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 10813
diff changeset
19 local jid_split = require "prosody.util.jid".split;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 10813
diff changeset
20 local jid_bare = require "prosody.util.jid".bare;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 10813
diff changeset
21 local datetime = require "prosody.util.datetime";
5370
7838acadb0fa mod_announce, mod_auth_anonymous, mod_c2s, mod_c2s, mod_component, mod_iq, mod_message, mod_presence, mod_tls: Access prosody.{hosts,bare_sessions,full_sessions} instead of the old globals
Kim Alvefur <zash@zash.se>
parents: 5297
diff changeset
22 local hosts = prosody.hosts;
7838acadb0fa mod_announce, mod_auth_anonymous, mod_c2s, mod_c2s, mod_component, mod_iq, mod_message, mod_presence, mod_tls: Access prosody.{hosts,bare_sessions,full_sessions} instead of the old globals
Kim Alvefur <zash@zash.se>
parents: 5297
diff changeset
23 local bare_sessions = prosody.bare_sessions;
7838acadb0fa mod_announce, mod_auth_anonymous, mod_c2s, mod_c2s, mod_component, mod_iq, mod_message, mod_presence, mod_tls: Access prosody.{hosts,bare_sessions,full_sessions} instead of the old globals
Kim Alvefur <zash@zash.se>
parents: 5297
diff changeset
24 local full_sessions = prosody.full_sessions;
2592
3af266f7037f mod_presence: Don't depend on sessions array existing for a user when handling outgoing presence broadcast.
Waqas Hussain <waqas20@gmail.com>
parents: 2532
diff changeset
25 local NULL = {};
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
26
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 10813
diff changeset
27 local rostermanager = require "prosody.core.rostermanager";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 10813
diff changeset
28 local sessionmanager = require "prosody.core.sessionmanager";
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
29
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 10813
diff changeset
30 local recalc_resource_map = require "prosody.util.presence".recalc_resource_map;
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
31
7265
78be11bf62bf mod_presence: Use type-specific config API for boolean 'ignore_presence_priority' option
Kim Alvefur <zash@zash.se>
parents: 6613
diff changeset
32 local ignore_presence_priority = module:get_option_boolean("ignore_presence_priority", false);
3084
9b17449fb5f4 mod_presence: Added option 'ignore_presence_priority'.
Waqas Hussain <waqas20@gmail.com>
parents: 3083
diff changeset
33
10694
0cda5d597607 mod_presence: Advertise support for Subscription Pre-Approval
Kim Alvefur <zash@zash.se>
parents: 10556
diff changeset
34 local pre_approval_stream_feature = st.stanza("sub", {xmlns="urn:xmpp:features:pre-approval"});
0cda5d597607 mod_presence: Advertise support for Subscription Pre-Approval
Kim Alvefur <zash@zash.se>
parents: 10556
diff changeset
35 module:hook("stream-features", function(event)
0cda5d597607 mod_presence: Advertise support for Subscription Pre-Approval
Kim Alvefur <zash@zash.se>
parents: 10556
diff changeset
36 local origin, features = event.origin, event.features;
0cda5d597607 mod_presence: Advertise support for Subscription Pre-Approval
Kim Alvefur <zash@zash.se>
parents: 10556
diff changeset
37 if origin.username then
0cda5d597607 mod_presence: Advertise support for Subscription Pre-Approval
Kim Alvefur <zash@zash.se>
parents: 10556
diff changeset
38 features:add_child(pre_approval_stream_feature);
0cda5d597607 mod_presence: Advertise support for Subscription Pre-Approval
Kim Alvefur <zash@zash.se>
parents: 10556
diff changeset
39 end
0cda5d597607 mod_presence: Advertise support for Subscription Pre-Approval
Kim Alvefur <zash@zash.se>
parents: 10556
diff changeset
40 end);
0cda5d597607 mod_presence: Advertise support for Subscription Pre-Approval
Kim Alvefur <zash@zash.se>
parents: 10556
diff changeset
41
3153
fd435cab928f mod_presence: Removed unnecessary parameter 'core_route_stanza' from various functions.
Waqas Hussain <waqas20@gmail.com>
parents: 3112
diff changeset
42 function handle_normal_presence(origin, stanza)
3084
9b17449fb5f4 mod_presence: Added option 'ignore_presence_priority'.
Waqas Hussain <waqas20@gmail.com>
parents: 3083
diff changeset
43 if ignore_presence_priority then
6302
76699a0ae4c4 mod_lastactivity, mod_legacyauth, mod_presence, mod_saslauth, mod_tls: Use the newer stanza:get_child APIs and optimize away some table lookups
Kim Alvefur <zash@zash.se>
parents: 6291
diff changeset
44 local priority = stanza:get_child("priority");
3084
9b17449fb5f4 mod_presence: Added option 'ignore_presence_priority'.
Waqas Hussain <waqas20@gmail.com>
parents: 3083
diff changeset
45 if priority and priority[1] ~= "0" then
9b17449fb5f4 mod_presence: Added option 'ignore_presence_priority'.
Waqas Hussain <waqas20@gmail.com>
parents: 3083
diff changeset
46 for i=#priority.tags,1,-1 do priority.tags[i] = nil; end
8071
c3790ca4144f mod_presence: No need to overwrite index 1 since it's set on the line below
Kim Alvefur <zash@zash.se>
parents: 7779
diff changeset
47 for i=#priority,2,-1 do priority[i] = nil; end
3084
9b17449fb5f4 mod_presence: Added option 'ignore_presence_priority'.
Waqas Hussain <waqas20@gmail.com>
parents: 3083
diff changeset
48 priority[1] = "0";
9b17449fb5f4 mod_presence: Added option 'ignore_presence_priority'.
Waqas Hussain <waqas20@gmail.com>
parents: 3083
diff changeset
49 end
9b17449fb5f4 mod_presence: Added option 'ignore_presence_priority'.
Waqas Hussain <waqas20@gmail.com>
parents: 3083
diff changeset
50 end
8072
194409dcba22 mod_presence: Use get_child_text on priority child element (fixes #552)
Kim Alvefur <zash@zash.se>
parents: 8071
diff changeset
51 local priority = stanza:get_child_text("priority");
194409dcba22 mod_presence: Use get_child_text on priority child element (fixes #552)
Kim Alvefur <zash@zash.se>
parents: 8071
diff changeset
52 if priority and s_find(priority, "^[+-]?[0-9]+$") then
194409dcba22 mod_presence: Use get_child_text on priority child element (fixes #552)
Kim Alvefur <zash@zash.se>
parents: 8071
diff changeset
53 priority = tonumber(priority);
194409dcba22 mod_presence: Use get_child_text on priority child element (fixes #552)
Kim Alvefur <zash@zash.se>
parents: 8071
diff changeset
54 if priority < -128 then priority = -128 end
194409dcba22 mod_presence: Use get_child_text on priority child element (fixes #552)
Kim Alvefur <zash@zash.se>
parents: 8071
diff changeset
55 if priority > 127 then priority = 127 end
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3518
diff changeset
56 else priority = 0; end
13676
40c309f8b676 mod_presence: Fix traceback if origin gets disconnected during processing
Matthew Wild <mwild1@gmail.com>
parents: 12977
diff changeset
57
40c309f8b676 mod_presence: Fix traceback if origin gets disconnected during processing
Matthew Wild <mwild1@gmail.com>
parents: 12977
diff changeset
58 local node, host = origin.username, origin.host;
40c309f8b676 mod_presence: Fix traceback if origin gets disconnected during processing
Matthew Wild <mwild1@gmail.com>
parents: 12977
diff changeset
59 local roster = origin.roster;
2643
21eb99b06f4d mod_presence: Reflect the user's own presence back to them.
Waqas Hussain <waqas20@gmail.com>
parents: 2593
diff changeset
60 if full_sessions[origin.full_jid] then -- if user is still connected
21eb99b06f4d mod_presence: Reflect the user's own presence back to them.
Waqas Hussain <waqas20@gmail.com>
parents: 2593
diff changeset
61 origin.send(stanza); -- reflect their presence back to them
21eb99b06f4d mod_presence: Reflect the user's own presence back to them.
Waqas Hussain <waqas20@gmail.com>
parents: 2593
diff changeset
62 end
2592
3af266f7037f mod_presence: Don't depend on sessions array existing for a user when handling outgoing presence broadcast.
Waqas Hussain <waqas20@gmail.com>
parents: 2532
diff changeset
63 local user = bare_sessions[node.."@"..host];
3af266f7037f mod_presence: Don't depend on sessions array existing for a user when handling outgoing presence broadcast.
Waqas Hussain <waqas20@gmail.com>
parents: 2532
diff changeset
64 for _, res in pairs(user and user.sessions or NULL) do -- broadcast to all resources
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
65 if res ~= origin and res.presence then -- to resource
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
66 stanza.attr.to = res.full_jid;
3198
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
67 core_post_stanza(origin, stanza, true);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
68 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
69 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
70 for jid, item in pairs(roster) do -- broadcast to all interested contacts
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
71 if item.subscription == "both" or item.subscription == "from" then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
72 stanza.attr.to = jid;
3198
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
73 core_post_stanza(origin, stanza, true);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
74 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
75 end
13676
40c309f8b676 mod_presence: Fix traceback if origin gets disconnected during processing
Matthew Wild <mwild1@gmail.com>
parents: 12977
diff changeset
76
40c309f8b676 mod_presence: Fix traceback if origin gets disconnected during processing
Matthew Wild <mwild1@gmail.com>
parents: 12977
diff changeset
77 -- It's possible that after the network activity above, the origin
40c309f8b676 mod_presence: Fix traceback if origin gets disconnected during processing
Matthew Wild <mwild1@gmail.com>
parents: 12977
diff changeset
78 -- has been disconnected (particularly if something happened while
40c309f8b676 mod_presence: Fix traceback if origin gets disconnected during processing
Matthew Wild <mwild1@gmail.com>
parents: 12977
diff changeset
79 -- sending the reflection). So we abort further presence processing
40c309f8b676 mod_presence: Fix traceback if origin gets disconnected during processing
Matthew Wild <mwild1@gmail.com>
parents: 12977
diff changeset
80 -- in that case.
40c309f8b676 mod_presence: Fix traceback if origin gets disconnected during processing
Matthew Wild <mwild1@gmail.com>
parents: 12977
diff changeset
81 if not origin.type then return; end
40c309f8b676 mod_presence: Fix traceback if origin gets disconnected during processing
Matthew Wild <mwild1@gmail.com>
parents: 12977
diff changeset
82
9788
f47b2ab877d0 mod_presence: Revert empty 'to' attribute of presence before presence/initial event (fixes #1296)
Kim Alvefur <zash@zash.se>
parents: 8728
diff changeset
83 stanza.attr.to = nil;
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
84 if stanza.attr.type == nil and not origin.presence then -- initial presence
6291
7a604381d6fc mod_presence: Move presence/initial event to correct place so it actually fires
Kim Alvefur <zash@zash.se>
parents: 6281
diff changeset
85 module:fire_event("presence/initial", { origin = origin, stanza = stanza } );
2532
b1b1b4a7db26 mod_presence: Quick fix to make probes from local users to local hosts work.
Waqas Hussain <waqas20@gmail.com>
parents: 2531
diff changeset
86 origin.presence = stanza; -- FIXME repeated later
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
87 local probe = st.presence({from = origin.full_jid, type = "probe"});
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
88 for jid, item in pairs(roster) do -- probe all contacts we are subscribed to
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
89 if item.subscription == "both" or item.subscription == "to" then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
90 probe.attr.to = jid;
3183
28a5c0bda928 mod_presence: Enable firing of pre-events for probes.
Waqas Hussain <waqas20@gmail.com>
parents: 3182
diff changeset
91 core_post_stanza(origin, probe, true);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
92 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
93 end
2592
3af266f7037f mod_presence: Don't depend on sessions array existing for a user when handling outgoing presence broadcast.
Waqas Hussain <waqas20@gmail.com>
parents: 2532
diff changeset
94 for _, res in pairs(user and user.sessions or NULL) do -- broadcast from all available resources
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
95 if res ~= origin and res.presence then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
96 res.presence.attr.to = origin.full_jid;
3198
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
97 core_post_stanza(res, res.presence, true);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
98 res.presence.attr.to = nil;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
99 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
100 end
9671
e50559a42dfe rostermanager, mod_presence: Store stanza for incoming subscription requests (fixes #689) (thanks Zash, Ge0rG)
Matthew Wild <mwild1@gmail.com>
parents: 8728
diff changeset
101 for jid, pending_request in pairs(roster[false].pending) do -- resend incoming subscription requests
9677
d0cc1c4e1a1c mod_presence: Handle older boolean subscription request data (thanks Martin)
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
102 if type(pending_request) == "table" then
d0cc1c4e1a1c mod_presence: Handle older boolean subscription request data (thanks Martin)
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
103 local subscribe = st.deserialize(pending_request);
d0cc1c4e1a1c mod_presence: Handle older boolean subscription request data (thanks Martin)
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
104 subscribe.attr.type, subscribe.attr.from = "subscribe", jid;
d0cc1c4e1a1c mod_presence: Handle older boolean subscription request data (thanks Martin)
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
105 origin.send(subscribe);
d0cc1c4e1a1c mod_presence: Handle older boolean subscription request data (thanks Martin)
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
106 else
d0cc1c4e1a1c mod_presence: Handle older boolean subscription request data (thanks Martin)
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
107 origin.send(st.presence({type="subscribe", from=jid}));
d0cc1c4e1a1c mod_presence: Handle older boolean subscription request data (thanks Martin)
Kim Alvefur <zash@zash.se>
parents: 9676
diff changeset
108 end
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
109 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
110 local request = st.presence({type="subscribe", from=origin.username.."@"..origin.host});
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
111 for jid, item in pairs(roster) do -- resend outgoing subscription requests
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
112 if item.ask then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
113 request.attr.to = jid;
3198
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
114 core_post_stanza(origin, request, true);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
115 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
116 end
3518
d3399d1b484a Don't send offline messages to resource with negative priorities
Robert Hoelz <rob@hoelz.ro>
parents: 3235
diff changeset
117
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3518
diff changeset
118 if priority >= 0 then
5171
b4b302fe415c mod_presence: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 5060
diff changeset
119 local event = { origin = origin }
b4b302fe415c mod_presence: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 5060
diff changeset
120 module:fire_event('message/offline/broadcast', event);
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3518
diff changeset
121 end
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
122 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
123 if stanza.attr.type == "unavailable" then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
124 origin.presence = nil;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
125 if origin.priority then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
126 origin.priority = nil;
2593
06995c8bfe80 mod_presence: Don't depend on user being online when calculating top resources.
Waqas Hussain <waqas20@gmail.com>
parents: 2592
diff changeset
127 recalc_resource_map(user);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
128 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
129 if origin.directed then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
130 for jid in pairs(origin.directed) do
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
131 stanza.attr.to = jid;
3198
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
132 core_post_stanza(origin, stanza, true);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
133 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
134 origin.directed = nil;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
135 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
136 else
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
137 origin.presence = stanza;
5297
7453245f16e7 mod_presence: Put a timestamp on presence we store for probes
Kim Alvefur <zash@zash.se>
parents: 5171
diff changeset
138 stanza:tag("delay", { xmlns = "urn:xmpp:delay", from = host, stamp = datetime.datetime() }):up();
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
139 if origin.priority ~= priority then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
140 origin.priority = priority;
2593
06995c8bfe80 mod_presence: Don't depend on user being online when calculating top resources.
Waqas Hussain <waqas20@gmail.com>
parents: 2592
diff changeset
141 recalc_resource_map(user);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
142 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
143 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
144 stanza.attr.to = nil; -- reset it
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
145 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
146
8579
801ae5cb1341 mod_presence: Ignore unused argument but make note of its use elsewhere [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8574
diff changeset
147 -- luacheck: ignore 212/recipient_session
801ae5cb1341 mod_presence: Ignore unused argument but make note of its use elsewhere [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8574
diff changeset
148 -- TODO This argument is used in 3rd party modules
3153
fd435cab928f mod_presence: Removed unnecessary parameter 'core_route_stanza' from various functions.
Waqas Hussain <waqas20@gmail.com>
parents: 3112
diff changeset
149 function send_presence_of_available_resources(user, host, jid, recipient_session, stanza)
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
150 local h = hosts[host];
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
151 local count = 0;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
152 if h and h.type == "local" then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
153 local u = h.sessions[user];
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
154 if u then
7470
893378a1c03e mod_presence: remove unused one-letter loop variable [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7433
diff changeset
155 for _, session in pairs(u.sessions) do
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
156 local pres = session.presence;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
157 if pres then
2038
4ab83f96585a mod_presence: Send unavailable presence when sending unsubscribed presence stanzas (some legacy clients continue to display unsubscribed contacts as available).
Waqas Hussain <waqas20@gmail.com>
parents: 1731
diff changeset
158 if stanza then pres = stanza; pres.attr.from = session.full_jid; end
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
159 pres.attr.to = jid;
3198
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
160 core_post_stanza(session, pres, true);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
161 pres.attr.to = nil;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
162 count = count + 1;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
163 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
164 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
165 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
166 end
4993
5243b74a4cbb Hopefully inert commit to clean up logging across a number of modules, removing all cases of concatenation when building log messages
Matthew Wild <mwild1@gmail.com>
parents: 4967
diff changeset
167 log("debug", "broadcasted presence of %d resources from %s@%s to %s", count, user, host, jid);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
168 return count;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
169 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
170
3153
fd435cab928f mod_presence: Removed unnecessary parameter 'core_route_stanza' from various functions.
Waqas Hussain <waqas20@gmail.com>
parents: 3112
diff changeset
171 function handle_outbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare)
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
172 local node, host = jid_split(from_bare);
3235
651139e831b1 mod_presence: Fixed a traceback on outgoing subscriptions from offline users.
Waqas Hussain <waqas20@gmail.com>
parents: 3215
diff changeset
173 if to_bare == from_bare then return; end -- No self contacts
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
174 local st_from, st_to = stanza.attr.from, stanza.attr.to;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
175 stanza.attr.from, stanza.attr.to = from_bare, to_bare;
4993
5243b74a4cbb Hopefully inert commit to clean up logging across a number of modules, removing all cases of concatenation when building log messages
Matthew Wild <mwild1@gmail.com>
parents: 4967
diff changeset
176 log("debug", "outbound presence %s from %s for %s", stanza.attr.type, from_bare, to_bare);
3182
a19dbb6446a0 mod_presence: Don't stop pre-event for outgoing probes.
Waqas Hussain <waqas20@gmail.com>
parents: 3181
diff changeset
177 if stanza.attr.type == "probe" then
a19dbb6446a0 mod_presence: Don't stop pre-event for outgoing probes.
Waqas Hussain <waqas20@gmail.com>
parents: 3181
diff changeset
178 stanza.attr.from, stanza.attr.to = st_from, st_to;
a19dbb6446a0 mod_presence: Don't stop pre-event for outgoing probes.
Waqas Hussain <waqas20@gmail.com>
parents: 3181
diff changeset
179 return;
a19dbb6446a0 mod_presence: Don't stop pre-event for outgoing probes.
Waqas Hussain <waqas20@gmail.com>
parents: 3181
diff changeset
180 elseif stanza.attr.type == "subscribe" then
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
181 -- 1. route stanza
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
182 -- 2. roster push (subscription = none, ask = subscribe)
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
183 if rostermanager.set_contact_pending_out(node, host, to_bare) then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
184 rostermanager.roster_push(node, host, to_bare);
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
185 end -- else file error
3198
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
186 core_post_stanza(origin, stanza);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
187 elseif stanza.attr.type == "unsubscribe" then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
188 -- 1. route stanza
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
189 -- 2. roster push (subscription = none or from)
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
190 if rostermanager.unsubscribe(node, host, to_bare) then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
191 rostermanager.roster_push(node, host, to_bare); -- FIXME do roster push when roster has in fact not changed?
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
192 end -- else file error
3198
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
193 core_post_stanza(origin, stanza);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
194 elseif stanza.attr.type == "subscribed" then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
195 -- 1. route stanza
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
196 -- 2. roster_push ()
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
197 -- 3. send_presence_of_available_resources
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
198 if rostermanager.subscribed(node, host, to_bare) then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
199 rostermanager.roster_push(node, host, to_bare);
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
200 end
10514
f0e9e5bda415 rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents: 9790
diff changeset
201 if rostermanager.is_contact_subscribed(node, host, to_bare) then
f0e9e5bda415 rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents: 9790
diff changeset
202 core_post_stanza(origin, stanza);
f0e9e5bda415 rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents: 9790
diff changeset
203 send_presence_of_available_resources(node, host, to_bare, origin);
f0e9e5bda415 rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents: 9790
diff changeset
204 end
7778
62e7d6a73c72 mod_presence: Send probe once subscribed (fixes #794)
Kim Alvefur <zash@zash.se>
parents: 7430
diff changeset
205 if rostermanager.is_user_subscribed(node, host, to_bare) then
62e7d6a73c72 mod_presence: Send probe once subscribed (fixes #794)
Kim Alvefur <zash@zash.se>
parents: 7430
diff changeset
206 core_post_stanza(origin, st.presence({ type = "probe", from = from_bare, to = to_bare }));
62e7d6a73c72 mod_presence: Send probe once subscribed (fixes #794)
Kim Alvefur <zash@zash.se>
parents: 7430
diff changeset
207 end
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
208 elseif stanza.attr.type == "unsubscribed" then
5060
b0e36777f715 mod_presence, rostermanager: Bring outbound subscription cancellation in line with RFC6121.
Waqas Hussain <waqas20@gmail.com>
parents: 5013
diff changeset
209 -- 1. send unavailable
b0e36777f715 mod_presence, rostermanager: Bring outbound subscription cancellation in line with RFC6121.
Waqas Hussain <waqas20@gmail.com>
parents: 5013
diff changeset
210 -- 2. route stanza
b0e36777f715 mod_presence, rostermanager: Bring outbound subscription cancellation in line with RFC6121.
Waqas Hussain <waqas20@gmail.com>
parents: 5013
diff changeset
211 -- 3. roster push (subscription = from or both)
10556
79fe4ed1332b mod_presence: Ignore an unused variable [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10514
diff changeset
212 -- luacheck: ignore 211/pending_in
79fe4ed1332b mod_presence: Ignore an unused variable [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10514
diff changeset
213 -- Is pending_in meant to be used?
5060
b0e36777f715 mod_presence, rostermanager: Bring outbound subscription cancellation in line with RFC6121.
Waqas Hussain <waqas20@gmail.com>
parents: 5013
diff changeset
214 local success, pending_in, subscribed = rostermanager.unsubscribed(node, host, to_bare);
b0e36777f715 mod_presence, rostermanager: Bring outbound subscription cancellation in line with RFC6121.
Waqas Hussain <waqas20@gmail.com>
parents: 5013
diff changeset
215 if success then
b0e36777f715 mod_presence, rostermanager: Bring outbound subscription cancellation in line with RFC6121.
Waqas Hussain <waqas20@gmail.com>
parents: 5013
diff changeset
216 if subscribed then
b0e36777f715 mod_presence, rostermanager: Bring outbound subscription cancellation in line with RFC6121.
Waqas Hussain <waqas20@gmail.com>
parents: 5013
diff changeset
217 rostermanager.roster_push(node, host, to_bare);
b0e36777f715 mod_presence, rostermanager: Bring outbound subscription cancellation in line with RFC6121.
Waqas Hussain <waqas20@gmail.com>
parents: 5013
diff changeset
218 end
b0e36777f715 mod_presence, rostermanager: Bring outbound subscription cancellation in line with RFC6121.
Waqas Hussain <waqas20@gmail.com>
parents: 5013
diff changeset
219 core_post_stanza(origin, stanza);
b0e36777f715 mod_presence, rostermanager: Bring outbound subscription cancellation in line with RFC6121.
Waqas Hussain <waqas20@gmail.com>
parents: 5013
diff changeset
220 if subscribed then
b0e36777f715 mod_presence, rostermanager: Bring outbound subscription cancellation in line with RFC6121.
Waqas Hussain <waqas20@gmail.com>
parents: 5013
diff changeset
221 send_presence_of_available_resources(node, host, to_bare, origin, st.presence({ type = "unavailable" }));
b0e36777f715 mod_presence, rostermanager: Bring outbound subscription cancellation in line with RFC6121.
Waqas Hussain <waqas20@gmail.com>
parents: 5013
diff changeset
222 end
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
223 end
4139
eef75a0c85e3 mod_presence: Bounce errors for invalid presence types (thanks nolan/Astro)
Matthew Wild <mwild1@gmail.com>
parents: 3969
diff changeset
224 else
eef75a0c85e3 mod_presence: Bounce errors for invalid presence types (thanks nolan/Astro)
Matthew Wild <mwild1@gmail.com>
parents: 3969
diff changeset
225 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid presence type"));
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
226 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
227 stanza.attr.from, stanza.attr.to = st_from, st_to;
3181
1f73b3a960cf mod_presence: Small refactoring.
Waqas Hussain <waqas20@gmail.com>
parents: 3156
diff changeset
228 return true;
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
229 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
230
3153
fd435cab928f mod_presence: Removed unnecessary parameter 'core_route_stanza' from various functions.
Waqas Hussain <waqas20@gmail.com>
parents: 3112
diff changeset
231 function handle_inbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare)
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
232 local node, host = jid_split(to_bare);
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
233 local st_from, st_to = stanza.attr.from, stanza.attr.to;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
234 stanza.attr.from, stanza.attr.to = from_bare, to_bare;
4993
5243b74a4cbb Hopefully inert commit to clean up logging across a number of modules, removing all cases of concatenation when building log messages
Matthew Wild <mwild1@gmail.com>
parents: 4967
diff changeset
235 log("debug", "inbound presence %s from %s for %s", stanza.attr.type, from_bare, to_bare);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5416
diff changeset
236
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
237 if stanza.attr.type == "probe" then
3112
c311fdffccce mod_presence: Don't send 'unsubscribed' in response to probes when roster loading fails.
Waqas Hussain <waqas20@gmail.com>
parents: 3109
diff changeset
238 local result, err = rostermanager.is_contact_subscribed(node, host, from_bare);
c311fdffccce mod_presence: Don't send 'unsubscribed' in response to probes when roster loading fails.
Waqas Hussain <waqas20@gmail.com>
parents: 3109
diff changeset
239 if result then
3153
fd435cab928f mod_presence: Removed unnecessary parameter 'core_route_stanza' from various functions.
Waqas Hussain <waqas20@gmail.com>
parents: 3112
diff changeset
240 if 0 == send_presence_of_available_resources(node, host, st_from, origin) then
3198
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
241 core_post_stanza(hosts[host], st.presence({from=to_bare, to=st_from, type="unavailable"}), true); -- TODO send last activity
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
242 end
3112
c311fdffccce mod_presence: Don't send 'unsubscribed' in response to probes when roster loading fails.
Waqas Hussain <waqas20@gmail.com>
parents: 3109
diff changeset
243 elseif not err then
3198
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
244 core_post_stanza(hosts[host], st.presence({from=to_bare, to=from_bare, type="unsubscribed"}), true);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
245 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
246 elseif stanza.attr.type == "subscribe" then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
247 if rostermanager.is_contact_subscribed(node, host, from_bare) then
3198
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
248 core_post_stanza(hosts[host], st.presence({from=to_bare, to=from_bare, type="subscribed"}), true); -- already subscribed
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
249 -- Sending presence is not clearly stated in the RFC, but it seems appropriate
3153
fd435cab928f mod_presence: Removed unnecessary parameter 'core_route_stanza' from various functions.
Waqas Hussain <waqas20@gmail.com>
parents: 3112
diff changeset
250 if 0 == send_presence_of_available_resources(node, host, from_bare, origin) then
3198
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
251 core_post_stanza(hosts[host], st.presence({from=to_bare, to=from_bare, type="unavailable"}), true); -- TODO send last activity
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
252 end
10514
f0e9e5bda415 rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents: 9790
diff changeset
253 elseif rostermanager.is_contact_preapproved(node, host, from_bare) then
f0e9e5bda415 rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents: 9790
diff changeset
254 if not rostermanager.is_contact_pending_in(node, host, from_bare) then
f0e9e5bda415 rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents: 9790
diff changeset
255 if rostermanager.set_contact_pending_in(node, host, from_bare, stanza) then
f0e9e5bda415 rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents: 9790
diff changeset
256 core_post_stanza(hosts[host], st.presence({from=to_bare, to=from_bare, type="subscribed"}), true);
f0e9e5bda415 rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents: 9790
diff changeset
257 end -- TODO else return error, unable to save
f0e9e5bda415 rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents: 9790
diff changeset
258 end
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
259 else
3198
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
260 core_post_stanza(hosts[host], st.presence({from=to_bare, to=from_bare, type="unavailable"}), true); -- acknowledging receipt
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
261 if not rostermanager.is_contact_pending_in(node, host, from_bare) then
9671
e50559a42dfe rostermanager, mod_presence: Store stanza for incoming subscription requests (fixes #689) (thanks Zash, Ge0rG)
Matthew Wild <mwild1@gmail.com>
parents: 8728
diff changeset
262 if rostermanager.set_contact_pending_in(node, host, from_bare, stanza) then
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
263 sessionmanager.send_to_available_resources(node, host, stanza);
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
264 end -- TODO else return error, unable to save
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
265 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
266 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
267 elseif stanza.attr.type == "unsubscribe" then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
268 if rostermanager.process_inbound_unsubscribe(node, host, from_bare) then
2143
13ac68e8760b mod_presence: Route incoming presence subscription stanzas (types unsubscribe, subscribed and unsubscribed) to the user before roster pushes.
Waqas Hussain <waqas20@gmail.com>
parents: 2142
diff changeset
269 sessionmanager.send_to_interested_resources(node, host, stanza);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
270 rostermanager.roster_push(node, host, from_bare);
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
271 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
272 elseif stanza.attr.type == "subscribed" then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
273 if rostermanager.process_inbound_subscription_approval(node, host, from_bare) then
2143
13ac68e8760b mod_presence: Route incoming presence subscription stanzas (types unsubscribe, subscribed and unsubscribed) to the user before roster pushes.
Waqas Hussain <waqas20@gmail.com>
parents: 2142
diff changeset
274 sessionmanager.send_to_interested_resources(node, host, stanza);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
275 rostermanager.roster_push(node, host, from_bare);
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
276 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
277 elseif stanza.attr.type == "unsubscribed" then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
278 if rostermanager.process_inbound_subscription_cancellation(node, host, from_bare) then
2143
13ac68e8760b mod_presence: Route incoming presence subscription stanzas (types unsubscribe, subscribed and unsubscribed) to the user before roster pushes.
Waqas Hussain <waqas20@gmail.com>
parents: 2142
diff changeset
279 sessionmanager.send_to_interested_resources(node, host, stanza);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
280 rostermanager.roster_push(node, host, from_bare);
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
281 end
4139
eef75a0c85e3 mod_presence: Bounce errors for invalid presence types (thanks nolan/Astro)
Matthew Wild <mwild1@gmail.com>
parents: 3969
diff changeset
282 else
eef75a0c85e3 mod_presence: Bounce errors for invalid presence types (thanks nolan/Astro)
Matthew Wild <mwild1@gmail.com>
parents: 3969
diff changeset
283 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid presence type"));
eef75a0c85e3 mod_presence: Bounce errors for invalid presence types (thanks nolan/Astro)
Matthew Wild <mwild1@gmail.com>
parents: 3969
diff changeset
284 end
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
285 stanza.attr.from, stanza.attr.to = st_from, st_to;
3181
1f73b3a960cf mod_presence: Small refactoring.
Waqas Hussain <waqas20@gmail.com>
parents: 3156
diff changeset
286 return true;
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
287 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
288
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
289 local outbound_presence_handler = function(data)
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8579
diff changeset
290 -- outbound presence received
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
291 local origin, stanza = data.origin, data.stanza;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
292
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
293 local to = stanza.attr.to;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
294 if to then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
295 local t = stanza.attr.type;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
296 if t ~= nil and t ~= "unavailable" and t ~= "error" then -- check for subscriptions and probes
3181
1f73b3a960cf mod_presence: Small refactoring.
Waqas Hussain <waqas20@gmail.com>
parents: 3156
diff changeset
297 return handle_outbound_presence_subscriptions_and_probes(origin, stanza, jid_bare(stanza.attr.from), jid_bare(stanza.attr.to));
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
298 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
299
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
300 local to_bare = jid_bare(to);
3215
e55782f20679 mod_presence: Fixed a traceback.
Waqas Hussain <waqas20@gmail.com>
parents: 3198
diff changeset
301 local roster = origin.roster;
e55782f20679 mod_presence: Fixed a traceback.
Waqas Hussain <waqas20@gmail.com>
parents: 3198
diff changeset
302 if roster and not(roster[to_bare] and (roster[to_bare].subscription == "both" or roster[to_bare].subscription == "from")) then -- directed presence
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
303 origin.directed = origin.directed or {};
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
304 if t then -- removing from directed presence list on sending an error or unavailable
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
305 origin.directed[to] = nil; -- FIXME does it make more sense to add to_bare rather than to?
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
306 else
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
307 origin.directed[to] = true; -- FIXME does it make more sense to add to_bare rather than to?
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
308 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
309 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
310 end -- TODO maybe handle normal presence here, instead of letting it pass to incoming handlers?
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
311 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
312
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
313 module:hook("pre-presence/full", outbound_presence_handler);
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
314 module:hook("pre-presence/bare", outbound_presence_handler);
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
315 module:hook("pre-presence/host", outbound_presence_handler);
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
316
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
317 module:hook("presence/bare", function(data)
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8579
diff changeset
318 -- inbound presence to bare JID received
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
319 local origin, stanza = data.origin, data.stanza;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
320
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
321 local to = stanza.attr.to;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
322 local t = stanza.attr.type;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
323 if to then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
324 if t ~= nil and t ~= "unavailable" and t ~= "error" then -- check for subscriptions and probes sent to bare JID
3181
1f73b3a960cf mod_presence: Small refactoring.
Waqas Hussain <waqas20@gmail.com>
parents: 3156
diff changeset
325 return handle_inbound_presence_subscriptions_and_probes(origin, stanza, jid_bare(stanza.attr.from), jid_bare(stanza.attr.to));
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
326 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5416
diff changeset
327
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
328 local user = bare_sessions[to];
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
329 if user then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
330 for _, session in pairs(user.sessions) do
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
331 if session.presence then -- only send to available resources
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
332 session.send(stanza);
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
333 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
334 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
335 end -- no resources not online, discard
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
336 elseif not t or t == "unavailable" then
3153
fd435cab928f mod_presence: Removed unnecessary parameter 'core_route_stanza' from various functions.
Waqas Hussain <waqas20@gmail.com>
parents: 3112
diff changeset
337 handle_normal_presence(origin, stanza);
4139
eef75a0c85e3 mod_presence: Bounce errors for invalid presence types (thanks nolan/Astro)
Matthew Wild <mwild1@gmail.com>
parents: 3969
diff changeset
338 else
eef75a0c85e3 mod_presence: Bounce errors for invalid presence types (thanks nolan/Astro)
Matthew Wild <mwild1@gmail.com>
parents: 3969
diff changeset
339 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid presence type"));
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
340 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
341 return true;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
342 end);
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
343 module:hook("presence/full", function(data)
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8579
diff changeset
344 -- inbound presence to full JID received
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
345 local origin, stanza = data.origin, data.stanza;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
346
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
347 local t = stanza.attr.type;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
348 if t ~= nil and t ~= "unavailable" and t ~= "error" then -- check for subscriptions and probes sent to full JID
3181
1f73b3a960cf mod_presence: Small refactoring.
Waqas Hussain <waqas20@gmail.com>
parents: 3156
diff changeset
349 return handle_inbound_presence_subscriptions_and_probes(origin, stanza, jid_bare(stanza.attr.from), jid_bare(stanza.attr.to));
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
350 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
351
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
352 local session = full_sessions[stanza.attr.to];
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
353 if session then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
354 -- TODO fire post processing event
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
355 session.send(stanza);
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
356 end -- resource not online, discard
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
357 return true;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
358 end);
2531
697ff4f98033 mod_presence: Added handler for presence subscriptions and probes to local hosts.
Waqas Hussain <waqas20@gmail.com>
parents: 2525
diff changeset
359 module:hook("presence/host", function(data)
697ff4f98033 mod_presence: Added handler for presence subscriptions and probes to local hosts.
Waqas Hussain <waqas20@gmail.com>
parents: 2525
diff changeset
360 -- inbound presence to the host
5416
0ba3a49d3863 mod_presence: Remove some unused variables
Matthew Wild <mwild1@gmail.com>
parents: 5370
diff changeset
361 local stanza = data.stanza;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5416
diff changeset
362
2531
697ff4f98033 mod_presence: Added handler for presence subscriptions and probes to local hosts.
Waqas Hussain <waqas20@gmail.com>
parents: 2525
diff changeset
363 local from_bare = jid_bare(stanza.attr.from);
697ff4f98033 mod_presence: Added handler for presence subscriptions and probes to local hosts.
Waqas Hussain <waqas20@gmail.com>
parents: 2525
diff changeset
364 local t = stanza.attr.type;
697ff4f98033 mod_presence: Added handler for presence subscriptions and probes to local hosts.
Waqas Hussain <waqas20@gmail.com>
parents: 2525
diff changeset
365 if t == "probe" then
3198
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
366 core_post_stanza(hosts[module.host], st.presence({ from = module.host, to = from_bare, id = stanza.attr.id }));
2531
697ff4f98033 mod_presence: Added handler for presence subscriptions and probes to local hosts.
Waqas Hussain <waqas20@gmail.com>
parents: 2525
diff changeset
367 elseif t == "subscribe" then
3198
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
368 core_post_stanza(hosts[module.host], st.presence({ from = module.host, to = from_bare, id = stanza.attr.id, type = "subscribed" }));
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
369 core_post_stanza(hosts[module.host], st.presence({ from = module.host, to = from_bare, id = stanza.attr.id }));
2531
697ff4f98033 mod_presence: Added handler for presence subscriptions and probes to local hosts.
Waqas Hussain <waqas20@gmail.com>
parents: 2525
diff changeset
370 end
697ff4f98033 mod_presence: Added handler for presence subscriptions and probes to local hosts.
Waqas Hussain <waqas20@gmail.com>
parents: 2525
diff changeset
371 return true;
697ff4f98033 mod_presence: Added handler for presence subscriptions and probes to local hosts.
Waqas Hussain <waqas20@gmail.com>
parents: 2525
diff changeset
372 end);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
373
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
374 module:hook("resource-unbind", function(event)
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
375 local session, err = event.session, event.error;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
376 -- Send unavailable presence
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
377 if session.presence then
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
378 local pres = st.presence{ type = "unavailable" };
4967
b7bcf088e723 mod_presence: Handle nil disconnection error
Matthew Wild <mwild1@gmail.com>
parents: 4139
diff changeset
379 if err then
b7bcf088e723 mod_presence: Handle nil disconnection error
Matthew Wild <mwild1@gmail.com>
parents: 4139
diff changeset
380 pres:tag("status"):text("Disconnected: "..err):up();
b7bcf088e723 mod_presence: Handle nil disconnection error
Matthew Wild <mwild1@gmail.com>
parents: 4139
diff changeset
381 end
10813
4a9ff4f61796 mod_presence: Send unavailable presence in current thread run
Kim Alvefur <zash@zash.se>
parents: 10694
diff changeset
382 core_process_stanza(session, pres);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
383 elseif session.directed then
1606
bbadcaab0036 mod_presence: Tag outgoing unavailables generated by a disconnect with a from attribute
Matthew Wild <mwild1@gmail.com>
parents: 1568
diff changeset
384 local pres = st.presence{ type = "unavailable", from = session.full_jid };
4967
b7bcf088e723 mod_presence: Handle nil disconnection error
Matthew Wild <mwild1@gmail.com>
parents: 4139
diff changeset
385 if err then
b7bcf088e723 mod_presence: Handle nil disconnection error
Matthew Wild <mwild1@gmail.com>
parents: 4139
diff changeset
386 pres:tag("status"):text("Disconnected: "..err):up();
b7bcf088e723 mod_presence: Handle nil disconnection error
Matthew Wild <mwild1@gmail.com>
parents: 4139
diff changeset
387 end
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
388 for jid in pairs(session.directed) do
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
389 pres.attr.to = jid;
3198
5a4e766a3577 mod_presence: Enable firing of pre-events for all outbound stanzas, and switching completely to core_post_stanza.
Waqas Hussain <waqas20@gmail.com>
parents: 3196
diff changeset
390 core_post_stanza(session, pres, true);
1508
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
391 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
392 session.directed = nil;
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
393 end
762d758e116a mod_presence: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1488
diff changeset
394 end);
7331
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
395
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
396 module:hook("roster-item-removed", function (event)
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
397 local username = event.username;
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
398 local session = event.origin;
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
399 local roster = event.roster or session and session.roster;
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
400 local jid = event.jid;
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
401 local item = event.item;
7345
0c69305ab525 mod_presence: Fix variable name
Kim Alvefur <zash@zash.se>
parents: 7344
diff changeset
402 local from_jid = session.full_jid or (username .. "@" .. module.host);
7331
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
403
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
404 local subscription = item and item.subscription or "none";
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
405 local ask = item and item.ask;
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
406 local pending = roster and roster[false].pending[jid];
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
407
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
408 if subscription == "both" or subscription == "from" or pending then
7344
81efa212db1e mod_presence: Construct a 'from' JID when roster items are removed outside of a session
Kim Alvefur <zash@zash.se>
parents: 7332
diff changeset
409 core_post_stanza(session, st.presence({type="unsubscribed", from=from_jid, to=jid}));
7331
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
410 end
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
411
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
412 if subscription == "both" or subscription == "to" or ask then
7332
ba32289e8d0b mod_presence: Send unavailable presence when roster items are removed (fixes #331)
Kim Alvefur <zash@zash.se>
parents: 7331
diff changeset
413 send_presence_of_available_resources(username, module.host, jid, session, st.presence({type="unavailable"}));
7344
81efa212db1e mod_presence: Construct a 'from' JID when roster items are removed outside of a session
Kim Alvefur <zash@zash.se>
parents: 7332
diff changeset
414 core_post_stanza(session, st.presence({type="unsubscribe", from=from_jid, to=jid}));
7331
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
415 end
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
416
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
417 end, -1);
c8ad387aab1c mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence
Kim Alvefur <zash@zash.se>
parents: 7281
diff changeset
418