Annotate

mod_cloud_notify/mod_cloud_notify.lua @ 6319:63ef69b2f046

mod_http_oauth2: Assume Prosody 13.0+ roles are available Per the README, 0.12 is not supported, so we should not need to worry about this. Plus it is assumed to be present elsewhere and that would throw errors.
author Kim Alvefur <zash@zash.se>
date Wed, 02 Jul 2025 16:15:32 +0200
parent 6143:61422d3c60fb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 -- XEP-0357: Push (aka: My mobile OS vendor won't let me have persistent TCP connections)
2247
d09014d8c901 mod_cloud_notify: Update copyright year
Kim Alvefur <zash@zash.se>
parents: 2246
diff changeset
2 -- Copyright (C) 2015-2016 Kim Alvefur
3619
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
3 -- Copyright (C) 2017-2019 Thilo Molitor
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 --
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 -- This file is MIT/X11 licensed.
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6
6143
61422d3c60fb mod_cloud_notify: Prevent loading if Prosody indicates it is already bundled
Matthew Wild <mwild1@gmail.com>
parents: 5215
diff changeset
7 -- This module is only for 0.12, later versions have mod_cloud_notify bundled
61422d3c60fb mod_cloud_notify: Prevent loading if Prosody indicates it is already bundled
Matthew Wild <mwild1@gmail.com>
parents: 5215
diff changeset
8 --% conflicts: mod_cloud_notify
61422d3c60fb mod_cloud_notify: Prevent loading if Prosody indicates it is already bundled
Matthew Wild <mwild1@gmail.com>
parents: 5215
diff changeset
9
3055
6abee021d9db mod_cloud_notify: Limit number of devices to 5 and change some default settings
tmolitor <thilo@eightysoft.de>
parents: 3010
diff changeset
10 local os_time = os.time;
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 local st = require"util.stanza";
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 local jid = require"util.jid";
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 local dataform = require"util.dataforms".new;
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
14 local hashes = require"util.hashes";
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
15 local random = require"util.random";
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
16 local cache = require"util.cache";
4968
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
17 local watchdog = require "util.watchdog";
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 local xmlns_push = "urn:xmpp:push:0";
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20
1909
c7389fe74de7 mod_cloud_notify: Make inclusion of message sender and body optional via config option
Kim Alvefur <zash@zash.se>
parents: 1908
diff changeset
21 -- configuration
2246
a3e3dc9131e7 mod_cloud_notify: Use typed config API
Kim Alvefur <zash@zash.se>
parents: 2201
diff changeset
22 local include_body = module:get_option_boolean("push_notification_with_body", false);
a3e3dc9131e7 mod_cloud_notify: Use typed config API
Kim Alvefur <zash@zash.se>
parents: 2201
diff changeset
23 local include_sender = module:get_option_boolean("push_notification_with_sender", false);
3055
6abee021d9db mod_cloud_notify: Limit number of devices to 5 and change some default settings
tmolitor <thilo@eightysoft.de>
parents: 3010
diff changeset
24 local max_push_errors = module:get_option_number("push_max_errors", 16);
6abee021d9db mod_cloud_notify: Limit number of devices to 5 and change some default settings
tmolitor <thilo@eightysoft.de>
parents: 3010
diff changeset
25 local max_push_devices = module:get_option_number("push_max_devices", 5);
6abee021d9db mod_cloud_notify: Limit number of devices to 5 and change some default settings
tmolitor <thilo@eightysoft.de>
parents: 3010
diff changeset
26 local dummy_body = module:get_option_string("push_notification_important_body", "New Message!");
5053
00e8cc6860cb mod_cloud_notify: Fix default extended timeout from 72 days -> 72 hours
Matthew Wild <mwild1@gmail.com>
parents: 5052
diff changeset
27 local extended_hibernation_timeout = module:get_option_number("push_max_hibernation_timeout", 72*3600); -- use same timeout like ejabberd
1909
c7389fe74de7 mod_cloud_notify: Make inclusion of message sender and body optional via config option
Kim Alvefur <zash@zash.se>
parents: 1908
diff changeset
28
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
29 local host_sessions = prosody.hosts[module.host].sessions;
4367
33f82988d7a9 mod_cloud_notify: Make push_errors a shared table to persist across reloads and share with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4355
diff changeset
30 local push_errors = module:shared("push_errors");
2791
008cf272b7ea mod_cloud_notify: Fix regression in error handling
tmolitor <thilo@eightysoft.de>
parents: 2751
diff changeset
31 local id2node = {};
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
32 local id2identifier = {};
3619
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
33
5215
fd6cb4365438 mod_cloud_notify: Log warning when used on Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents: 5057
diff changeset
34 if _VERSION:match("5%.1") then
fd6cb4365438 mod_cloud_notify: Log warning when used on Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents: 5057
diff changeset
35 module:log("warn", "This module may behave incorrectly on Lua 5.1. It is recommended to upgrade to a newer Lua version.");
fd6cb4365438 mod_cloud_notify: Log warning when used on Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents: 5057
diff changeset
36 end
fd6cb4365438 mod_cloud_notify: Log warning when used on Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents: 5057
diff changeset
37
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
38 -- For keeping state across reloads while caching reads
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
39 -- This uses util.cache for caching the most recent devices and removing all old devices when max_push_devices is reached
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
40 local push_store = (function()
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
41 local store = module:open_store();
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
42 local push_services = {};
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
43 local api = {};
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
44 --luacheck: ignore 212/self
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
45 function api:get(user)
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
46 if not push_services[user] then
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
47 local loaded, err = store:get(user);
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
48 if not loaded and err then
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
49 module:log("warn", "Error reading push notification storage for user '%s': %s", user, tostring(err));
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
50 push_services[user] = cache.new(max_push_devices):table();
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
51 return push_services[user], false;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
52 end
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
53 if loaded then
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
54 push_services[user] = cache.new(max_push_devices):table();
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
55 -- copy over plain table loaded from disk into our cache
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
56 for k, v in pairs(loaded) do push_services[user][k] = v; end
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
57 else
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
58 push_services[user] = cache.new(max_push_devices):table();
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
59 end
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
60 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
61 return push_services[user], true;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
62 end
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
63 function api:flush_to_disk(user)
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
64 local plain_table = {};
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
65 for k, v in pairs(push_services[user]) do plain_table[k] = v; end
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
66 local ok, err = store:set(user, plain_table);
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
67 if not ok then
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
68 module:log("error", "Error writing push notification storage for user '%s': %s", user, tostring(err));
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
69 return false;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
70 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
71 return true;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
72 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
73 function api:set_identifier(user, push_identifier, data)
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
74 local services = self:get(user);
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
75 services[push_identifier] = data;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
76 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
77 return api;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
78 end)();
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
79
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
80
2642
0f1421af7f6a mod_cloud_notify: Move declarations of handle_push_success/error to fix referencing undefined variables (introduced in 6ab46ff685d0)
Matthew Wild <mwild1@gmail.com>
parents: 2625
diff changeset
81 -- Forward declarations, as both functions need to reference each other
0f1421af7f6a mod_cloud_notify: Move declarations of handle_push_success/error to fix referencing undefined variables (introduced in 6ab46ff685d0)
Matthew Wild <mwild1@gmail.com>
parents: 2625
diff changeset
82 local handle_push_success, handle_push_error;
0f1421af7f6a mod_cloud_notify: Move declarations of handle_push_success/error to fix referencing undefined variables (introduced in 6ab46ff685d0)
Matthew Wild <mwild1@gmail.com>
parents: 2625
diff changeset
83
0f1421af7f6a mod_cloud_notify: Move declarations of handle_push_success/error to fix referencing undefined variables (introduced in 6ab46ff685d0)
Matthew Wild <mwild1@gmail.com>
parents: 2625
diff changeset
84 function handle_push_error(event)
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
85 local stanza = event.stanza;
4827
fe5303da99cb mod_cloud_notify: Include extra error details if available
Kim Alvefur <zash@zash.se>
parents: 4730
diff changeset
86 local error_type, condition, error_text = stanza:get_error();
2791
008cf272b7ea mod_cloud_notify: Fix regression in error handling
tmolitor <thilo@eightysoft.de>
parents: 2751
diff changeset
87 local node = id2node[stanza.attr.id];
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
88 local identifier = id2identifier[stanza.attr.id];
5057
c728e82265a7 mod_cloud_notify: Improve logging for various error cases
Matthew Wild <mwild1@gmail.com>
parents: 5053
diff changeset
89 if node == nil then
c728e82265a7 mod_cloud_notify: Improve logging for various error cases
Matthew Wild <mwild1@gmail.com>
parents: 5053
diff changeset
90 module:log("warn", "Received push error with unrecognised id: %s", stanza.attr.id);
c728e82265a7 mod_cloud_notify: Improve logging for various error cases
Matthew Wild <mwild1@gmail.com>
parents: 5053
diff changeset
91 return false; -- unknown stanza? Ignore for now!
c728e82265a7 mod_cloud_notify: Improve logging for various error cases
Matthew Wild <mwild1@gmail.com>
parents: 5053
diff changeset
92 end
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
93 local from = stanza.attr.from;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
94 local user_push_services = push_store:get(node);
5057
c728e82265a7 mod_cloud_notify: Improve logging for various error cases
Matthew Wild <mwild1@gmail.com>
parents: 5053
diff changeset
95 local found, changed = false, false;
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
96
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
97 for push_identifier, _ in pairs(user_push_services) do
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
98 if push_identifier == identifier then
5057
c728e82265a7 mod_cloud_notify: Improve logging for various error cases
Matthew Wild <mwild1@gmail.com>
parents: 5053
diff changeset
99 found = true;
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
100 if user_push_services[push_identifier] and user_push_services[push_identifier].jid == from and error_type ~= "wait" then
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
101 push_errors[push_identifier] = push_errors[push_identifier] + 1;
4827
fe5303da99cb mod_cloud_notify: Include extra error details if available
Kim Alvefur <zash@zash.se>
parents: 4730
diff changeset
102 module:log("info", "Got error <%s:%s:%s> for identifier '%s': "
fe5303da99cb mod_cloud_notify: Include extra error details if available
Kim Alvefur <zash@zash.se>
parents: 4730
diff changeset
103 .."error count for this identifier is now at %s", error_type, condition, error_text or "", push_identifier,
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
104 tostring(push_errors[push_identifier]));
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
105 if push_errors[push_identifier] >= max_push_errors then
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
106 module:log("warn", "Disabling push notifications for identifier '%s'", push_identifier);
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
107 -- remove push settings from sessions
2749
9756211fcbe3 mod_cloud_notify: Fix small bug.
tmolitor <thilo@eightysoft.de>
parents: 2736
diff changeset
108 if host_sessions[node] then
9756211fcbe3 mod_cloud_notify: Fix small bug.
tmolitor <thilo@eightysoft.de>
parents: 2736
diff changeset
109 for _, session in pairs(host_sessions[node].sessions) do
9756211fcbe3 mod_cloud_notify: Fix small bug.
tmolitor <thilo@eightysoft.de>
parents: 2736
diff changeset
110 if session.push_identifier == push_identifier then
9756211fcbe3 mod_cloud_notify: Fix small bug.
tmolitor <thilo@eightysoft.de>
parents: 2736
diff changeset
111 session.push_identifier = nil;
9756211fcbe3 mod_cloud_notify: Fix small bug.
tmolitor <thilo@eightysoft.de>
parents: 2736
diff changeset
112 session.push_settings = nil;
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
113 session.first_hibernated_push = nil;
4968
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
114 -- check for prosody 0.12 mod_smacks
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
115 if session.hibernating_watchdog and session.original_smacks_callback and session.original_smacks_timeout then
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
116 -- restore old smacks watchdog
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
117 session.hibernating_watchdog:cancel();
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
118 session.hibernating_watchdog = watchdog.new(session.original_smacks_timeout, session.original_smacks_callback);
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
119 end
2749
9756211fcbe3 mod_cloud_notify: Fix small bug.
tmolitor <thilo@eightysoft.de>
parents: 2736
diff changeset
120 end
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
121 end
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
122 end
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
123 -- save changed global config
3085
1ea6861b533f mod_cloud_notify: Don't change table while iterating it
tmolitor <thilo@eightysoft.de>
parents: 3079
diff changeset
124 changed = true;
1ea6861b533f mod_cloud_notify: Don't change table while iterating it
tmolitor <thilo@eightysoft.de>
parents: 3079
diff changeset
125 user_push_services[push_identifier] = nil
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
126 push_errors[push_identifier] = nil;
2669
e6d243ed88ca mod_cloud_notify: Fix module:unhook calls not available in prosody 0.9, fixes #874
tmolitor <thilo@eightysoft.de>
parents: 2643
diff changeset
127 -- unhook iq handlers for this identifier (if possible)
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
128 module:unhook("iq-error/host/"..stanza.attr.id, handle_push_error);
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
129 module:unhook("iq-result/host/"..stanza.attr.id, handle_push_success);
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
130 id2node[stanza.attr.id] = nil;
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
131 id2identifier[stanza.attr.id] = nil;
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
132 end
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
133 elseif user_push_services[push_identifier] and user_push_services[push_identifier].jid == from and error_type == "wait" then
4827
fe5303da99cb mod_cloud_notify: Include extra error details if available
Kim Alvefur <zash@zash.se>
parents: 4730
diff changeset
134 module:log("debug", "Got error <%s:%s:%s> for identifier '%s': "
fe5303da99cb mod_cloud_notify: Include extra error details if available
Kim Alvefur <zash@zash.se>
parents: 4730
diff changeset
135 .."NOT increasing error count for this identifier", error_type, condition, error_text or "", push_identifier);
5057
c728e82265a7 mod_cloud_notify: Improve logging for various error cases
Matthew Wild <mwild1@gmail.com>
parents: 5053
diff changeset
136 else
c728e82265a7 mod_cloud_notify: Improve logging for various error cases
Matthew Wild <mwild1@gmail.com>
parents: 5053
diff changeset
137 module:log("debug", "Unhandled push error <%s:%s:%s> from %s for identifier '%s'",
c728e82265a7 mod_cloud_notify: Improve logging for various error cases
Matthew Wild <mwild1@gmail.com>
parents: 5053
diff changeset
138 error_type, condition, error_text or "", from, push_identifier
c728e82265a7 mod_cloud_notify: Improve logging for various error cases
Matthew Wild <mwild1@gmail.com>
parents: 5053
diff changeset
139 );
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
140 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
141 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
142 end
3085
1ea6861b533f mod_cloud_notify: Don't change table while iterating it
tmolitor <thilo@eightysoft.de>
parents: 3079
diff changeset
143 if changed then
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
144 push_store:flush_to_disk(node);
5057
c728e82265a7 mod_cloud_notify: Improve logging for various error cases
Matthew Wild <mwild1@gmail.com>
parents: 5053
diff changeset
145 elseif not found then
c728e82265a7 mod_cloud_notify: Improve logging for various error cases
Matthew Wild <mwild1@gmail.com>
parents: 5053
diff changeset
146 module:log("warn", "Unable to find matching registration for push error <%s:%s:%s> from %s", error_type, condition, error_text or "", from);
3085
1ea6861b533f mod_cloud_notify: Don't change table while iterating it
tmolitor <thilo@eightysoft.de>
parents: 3079
diff changeset
147 end
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
148 return true;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
149 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
150
2642
0f1421af7f6a mod_cloud_notify: Move declarations of handle_push_success/error to fix referencing undefined variables (introduced in 6ab46ff685d0)
Matthew Wild <mwild1@gmail.com>
parents: 2625
diff changeset
151 function handle_push_success(event)
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
152 local stanza = event.stanza;
2791
008cf272b7ea mod_cloud_notify: Fix regression in error handling
tmolitor <thilo@eightysoft.de>
parents: 2751
diff changeset
153 local node = id2node[stanza.attr.id];
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
154 local identifier = id2identifier[stanza.attr.id];
2791
008cf272b7ea mod_cloud_notify: Fix regression in error handling
tmolitor <thilo@eightysoft.de>
parents: 2751
diff changeset
155 if node == nil then return false; end -- unknown stanza? Ignore for now!
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
156 local from = stanza.attr.from;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
157 local user_push_services = push_store:get(node);
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
158
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
159 for push_identifier, _ in pairs(user_push_services) do
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
160 if push_identifier == identifier then
2670
6e01878103c0 mod_smacks: Ignore user when writing or reading session_cache on prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 2669
diff changeset
161 if user_push_services[push_identifier] and user_push_services[push_identifier].jid == from and push_errors[push_identifier] > 0 then
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
162 push_errors[push_identifier] = 0;
3619
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
163 -- unhook iq handlers for this identifier (if possible)
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
164 module:unhook("iq-error/host/"..stanza.attr.id, handle_push_error);
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
165 module:unhook("iq-result/host/"..stanza.attr.id, handle_push_success);
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
166 id2node[stanza.attr.id] = nil;
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
167 id2identifier[stanza.attr.id] = nil;
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
168 module:log("debug", "Push succeeded, error count for identifier '%s' is now at %s again",
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
169 push_identifier, tostring(push_errors[push_identifier])
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
170 );
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
171 end
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
172 end
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
173 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
174 return true;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
175 end
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
176
1908
eba279ddc050 mod_cloud_notify: Add some comments describing code blocks
Kim Alvefur <zash@zash.se>
parents: 1907
diff changeset
177 -- http://xmpp.org/extensions/xep-0357.html#disco
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
178 local function account_dico_info(event)
2200
e9e38ae8037f mod_cloud_notify: Advertise feature on bare jid disco (thanks iNPUTmice)
Kim Alvefur <zash@zash.se>
parents: 2198
diff changeset
179 (event.reply or event.stanza):tag("feature", {var=xmlns_push}):up();
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
180 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
181 module:hook("account-disco-info", account_dico_info);
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
182
1907
7fe7bd7b33b6 mod_cloud_notify: Allow the 'node' to be left out when disabling, clients MAY include it (and therefore leave it out)
Kim Alvefur <zash@zash.se>
parents: 1784
diff changeset
183 -- http://xmpp.org/extensions/xep-0357.html#enabling
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
184 local function push_enable(event)
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
185 local origin, stanza = event.origin, event.stanza;
2254
122cb5f4930f mod_cloud_notify: Cache <enable> in local
Kim Alvefur <zash@zash.se>
parents: 2253
diff changeset
186 local enable = stanza.tags[1];
2252
a96f2d0f8750 mod_cloud_notify: Add some logging when a client attempts to enable push notifications
Kim Alvefur <zash@zash.se>
parents: 2247
diff changeset
187 origin.log("debug", "Attempting to enable push notifications");
1907
7fe7bd7b33b6 mod_cloud_notify: Allow the 'node' to be left out when disabling, clients MAY include it (and therefore leave it out)
Kim Alvefur <zash@zash.se>
parents: 1784
diff changeset
188 -- MUST contain a 'jid' attribute of the XMPP Push Service being enabled
2254
122cb5f4930f mod_cloud_notify: Cache <enable> in local
Kim Alvefur <zash@zash.se>
parents: 2253
diff changeset
189 local push_jid = enable.attr.jid;
1907
7fe7bd7b33b6 mod_cloud_notify: Allow the 'node' to be left out when disabling, clients MAY include it (and therefore leave it out)
Kim Alvefur <zash@zash.se>
parents: 1784
diff changeset
190 -- SHOULD contain a 'node' attribute
2254
122cb5f4930f mod_cloud_notify: Cache <enable> in local
Kim Alvefur <zash@zash.se>
parents: 2253
diff changeset
191 local push_node = enable.attr.node;
2736
fff185e7ab73 mod_cloud_notify: Implement the "stripped stanzas" proposal.
tmolitor <thilo@eightysoft.de>
parents: 2714
diff changeset
192 -- CAN contain a 'include_payload' attribute
fff185e7ab73 mod_cloud_notify: Implement the "stripped stanzas" proposal.
tmolitor <thilo@eightysoft.de>
parents: 2714
diff changeset
193 local include_payload = enable.attr.include_payload;
1907
7fe7bd7b33b6 mod_cloud_notify: Allow the 'node' to be left out when disabling, clients MAY include it (and therefore leave it out)
Kim Alvefur <zash@zash.se>
parents: 1784
diff changeset
194 if not push_jid then
2257
f84b51f9aa82 mod_cloud_notify: Log message when 'jid' is missing from enable request
Kim Alvefur <zash@zash.se>
parents: 2255
diff changeset
195 origin.log("debug", "Push notification enable request missing the 'jid' field");
1907
7fe7bd7b33b6 mod_cloud_notify: Allow the 'node' to be left out when disabling, clients MAY include it (and therefore leave it out)
Kim Alvefur <zash@zash.se>
parents: 1784
diff changeset
196 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing jid"));
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
197 return true;
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
198 end
3996
42682505e692 mod_cloud_notify: Forbid user from registering their own JID as their push server
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3979
diff changeset
199 if push_jid == stanza.attr.from then
42682505e692 mod_cloud_notify: Forbid user from registering their own JID as their push server
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3979
diff changeset
200 origin.log("debug", "Push notification enable request 'jid' field identical to our own");
42682505e692 mod_cloud_notify: Forbid user from registering their own JID as their push server
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3979
diff changeset
201 origin.send(st.error_reply(stanza, "modify", "bad-request", "JID must be different from ours"));
42682505e692 mod_cloud_notify: Forbid user from registering their own JID as their push server
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3979
diff changeset
202 return true;
42682505e692 mod_cloud_notify: Forbid user from registering their own JID as their push server
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3979
diff changeset
203 end
2255
cdfc917a8cc7 mod_cloud_notify: Retrieve data form by name and namespace so unknown elements are ignored
Kim Alvefur <zash@zash.se>
parents: 2254
diff changeset
204 local publish_options = enable:get_child("x", "jabber:x:data");
2258
3abc51faf945 mod_cloud_notify: Log message if no dataform is found
Kim Alvefur <zash@zash.se>
parents: 2257
diff changeset
205 if not publish_options then
3abc51faf945 mod_cloud_notify: Log message if no dataform is found
Kim Alvefur <zash@zash.se>
parents: 2257
diff changeset
206 -- Could be intentional
3abc51faf945 mod_cloud_notify: Log message if no dataform is found
Kim Alvefur <zash@zash.se>
parents: 2257
diff changeset
207 origin.log("debug", "No publish options in request");
3abc51faf945 mod_cloud_notify: Log message if no dataform is found
Kim Alvefur <zash@zash.se>
parents: 2257
diff changeset
208 end
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
209 local push_identifier = push_jid .. "<" .. (push_node or "");
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
210 local push_service = {
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
211 jid = push_jid;
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
212 node = push_node;
2736
fff185e7ab73 mod_cloud_notify: Implement the "stripped stanzas" proposal.
tmolitor <thilo@eightysoft.de>
parents: 2714
diff changeset
213 include_payload = include_payload;
2253
97ebd28a8a75 mod_cloud_notify: Apply pre-serialization to publish-options
Kim Alvefur <zash@zash.se>
parents: 2252
diff changeset
214 options = publish_options and st.preserialize(publish_options);
3055
6abee021d9db mod_cloud_notify: Limit number of devices to 5 and change some default settings
tmolitor <thilo@eightysoft.de>
parents: 3010
diff changeset
215 timestamp = os_time();
4716
8b3e91249cff mod_cloud_notify: Move client info out of sub-object to improve usability with map store API
Matthew Wild <mwild1@gmail.com>
parents: 4713
diff changeset
216 client_id = origin.client_id;
4718
6e3254e13fb7 mod_cloud_notify: Fix traceback for clients without a stable client_id
Matthew Wild <mwild1@gmail.com>
parents: 4716
diff changeset
217 resource = not origin.client_id and origin.resource or nil;
4716
8b3e91249cff mod_cloud_notify: Move client info out of sub-object to improve usability with map store API
Matthew Wild <mwild1@gmail.com>
parents: 4713
diff changeset
218 language = stanza.attr["xml:lang"];
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
219 };
4325
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
220 local allow_registration = module:fire_event("cloud_notify/registration", {
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
221 origin = origin, stanza = stanza, push_info = push_service;
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
222 });
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
223 if allow_registration == false then
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
224 return true; -- Assume error reply already sent
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
225 end
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
226 push_store:set_identifier(origin.username, push_identifier, push_service);
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
227 local ok = push_store:flush_to_disk(origin.username);
2201
eb5555a3a535 mod_cloud_notify: Enable persistent storage of user notification settings
Kim Alvefur <zash@zash.se>
parents: 2200
diff changeset
228 if not ok then
eb5555a3a535 mod_cloud_notify: Enable persistent storage of user notification settings
Kim Alvefur <zash@zash.se>
parents: 2200
diff changeset
229 origin.send(st.error_reply(stanza, "wait", "internal-server-error"));
eb5555a3a535 mod_cloud_notify: Enable persistent storage of user notification settings
Kim Alvefur <zash@zash.se>
parents: 2200
diff changeset
230 else
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
231 origin.push_identifier = push_identifier;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
232 origin.push_settings = push_service;
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
233 origin.first_hibernated_push = nil;
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
234 origin.log("info", "Push notifications enabled for %s (%s)", tostring(stanza.attr.from), tostring(origin.push_identifier));
2201
eb5555a3a535 mod_cloud_notify: Enable persistent storage of user notification settings
Kim Alvefur <zash@zash.se>
parents: 2200
diff changeset
235 origin.send(st.reply(stanza));
eb5555a3a535 mod_cloud_notify: Enable persistent storage of user notification settings
Kim Alvefur <zash@zash.se>
parents: 2200
diff changeset
236 end
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
237 return true;
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
238 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
239 module:hook("iq-set/self/"..xmlns_push..":enable", push_enable);
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
240
1907
7fe7bd7b33b6 mod_cloud_notify: Allow the 'node' to be left out when disabling, clients MAY include it (and therefore leave it out)
Kim Alvefur <zash@zash.se>
parents: 1784
diff changeset
241 -- http://xmpp.org/extensions/xep-0357.html#disabling
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
242 local function push_disable(event)
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
243 local origin, stanza = event.origin, event.stanza;
1907
7fe7bd7b33b6 mod_cloud_notify: Allow the 'node' to be left out when disabling, clients MAY include it (and therefore leave it out)
Kim Alvefur <zash@zash.se>
parents: 1784
diff changeset
244 local push_jid = stanza.tags[1].attr.jid; -- MUST include a 'jid' attribute
7fe7bd7b33b6 mod_cloud_notify: Allow the 'node' to be left out when disabling, clients MAY include it (and therefore leave it out)
Kim Alvefur <zash@zash.se>
parents: 1784
diff changeset
245 local push_node = stanza.tags[1].attr.node; -- A 'node' attribute MAY be included
7fe7bd7b33b6 mod_cloud_notify: Allow the 'node' to be left out when disabling, clients MAY include it (and therefore leave it out)
Kim Alvefur <zash@zash.se>
parents: 1784
diff changeset
246 if not push_jid then
7fe7bd7b33b6 mod_cloud_notify: Allow the 'node' to be left out when disabling, clients MAY include it (and therefore leave it out)
Kim Alvefur <zash@zash.se>
parents: 1784
diff changeset
247 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing jid"));
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
248 return true;
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
249 end
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
250 local user_push_services = push_store:get(origin.username);
1907
7fe7bd7b33b6 mod_cloud_notify: Allow the 'node' to be left out when disabling, clients MAY include it (and therefore leave it out)
Kim Alvefur <zash@zash.se>
parents: 1784
diff changeset
251 for key, push_info in pairs(user_push_services) do
7fe7bd7b33b6 mod_cloud_notify: Allow the 'node' to be left out when disabling, clients MAY include it (and therefore leave it out)
Kim Alvefur <zash@zash.se>
parents: 1784
diff changeset
252 if push_info.jid == push_jid and (not push_node or push_info.node == push_node) then
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
253 origin.log("info", "Push notifications disabled (%s)", tostring(key));
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
254 if origin.push_identifier == key then
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
255 origin.push_identifier = nil;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
256 origin.push_settings = nil;
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
257 origin.first_hibernated_push = nil;
4968
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
258 -- check for prosody 0.12 mod_smacks
4980
da151f9af861 replaced 'session' with 'origin' in push_disable
arcseconds
parents: 4968
diff changeset
259 if origin.hibernating_watchdog and origin.original_smacks_callback and origin.original_smacks_timeout then
4968
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
260 -- restore old smacks watchdog
4980
da151f9af861 replaced 'session' with 'origin' in push_disable
arcseconds
parents: 4968
diff changeset
261 origin.hibernating_watchdog:cancel();
da151f9af861 replaced 'session' with 'origin' in push_disable
arcseconds
parents: 4968
diff changeset
262 origin.hibernating_watchdog = watchdog.new(origin.original_smacks_timeout, origin.original_smacks_callback);
4968
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
263 end
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
264 end
1907
7fe7bd7b33b6 mod_cloud_notify: Allow the 'node' to be left out when disabling, clients MAY include it (and therefore leave it out)
Kim Alvefur <zash@zash.se>
parents: 1784
diff changeset
265 user_push_services[key] = nil;
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
266 push_errors[key] = nil;
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
267 for stanza_id, identifier in pairs(id2identifier) do
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
268 if identifier == key then
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
269 module:unhook("iq-error/host/"..stanza_id, handle_push_error);
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
270 module:unhook("iq-result/host/"..stanza_id, handle_push_success);
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
271 id2node[stanza_id] = nil;
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
272 id2identifier[stanza_id] = nil;
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
273 end
2669
e6d243ed88ca mod_cloud_notify: Fix module:unhook calls not available in prosody 0.9, fixes #874
tmolitor <thilo@eightysoft.de>
parents: 2643
diff changeset
274 end
1907
7fe7bd7b33b6 mod_cloud_notify: Allow the 'node' to be left out when disabling, clients MAY include it (and therefore leave it out)
Kim Alvefur <zash@zash.se>
parents: 1784
diff changeset
275 end
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
276 end
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
277 local ok = push_store:flush_to_disk(origin.username);
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
278 if not ok then
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
279 origin.send(st.error_reply(stanza, "wait", "internal-server-error"));
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
280 else
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
281 origin.send(st.reply(stanza));
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
282 end
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
283 return true;
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
284 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
285 module:hook("iq-set/self/"..xmlns_push..":disable", push_disable);
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
286
4730
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
287 -- urgent stanzas should be delivered without delay
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
288 local function is_urgent(stanza)
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
289 -- TODO
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
290 if stanza.name == "message" then
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
291 if stanza:get_child("propose", "urn:xmpp:jingle-message:0") then
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
292 return true, "jingle call";
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
293 end
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
294 end
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
295 end
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
296
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
297 -- is this push a high priority one (this is needed for ios apps not using voip pushes)
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
298 local function is_important(stanza)
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
299 local st_name = stanza and stanza.name or nil;
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
300 if not st_name then return false; end -- nonzas are never important here
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
301 if st_name == "presence" then
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
302 return false; -- same for presences
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
303 elseif st_name == "message" then
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
304 -- unpack carbon copied message stanzas
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
305 local carbon = stanza:find("{urn:xmpp:carbons:2}/{urn:xmpp:forward:0}/{jabber:client}message");
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
306 local stanza_direction = carbon and stanza:child_with_name("sent") and "out" or "in";
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
307 if carbon then stanza = carbon; end
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
308 local st_type = stanza.attr.type;
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
309
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
310 -- headline message are always not important
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
311 if st_type == "headline" then return false; end
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
312
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
313 -- carbon copied outgoing messages are not important
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
314 if carbon and stanza_direction == "out" then return false; end
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
315
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
316 -- We can't check for body contents in encrypted messages, so let's treat them as important
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
317 -- Some clients don't even set a body or an empty body for encrypted messages
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
318
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
319 -- check omemo https://xmpp.org/extensions/inbox/omemo.html
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
320 if stanza:get_child("encrypted", "eu.siacs.conversations.axolotl") or stanza:get_child("encrypted", "urn:xmpp:omemo:0") then return true; end
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
321
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
322 -- check xep27 pgp https://xmpp.org/extensions/xep-0027.html
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
323 if stanza:get_child("x", "jabber:x:encrypted") then return true; end
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
324
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
325 -- check xep373 pgp (OX) https://xmpp.org/extensions/xep-0373.html
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
326 if stanza:get_child("openpgp", "urn:xmpp:openpgp:0") then return true; end
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
327
4464
ea820de69265 mod_cloud_notify: Consider incoming XEP-0353 call requests as important
Matthew Wild <mwild1@gmail.com>
parents: 4429
diff changeset
328 -- XEP-0353: Jingle Message Initiation (incoming call request)
ea820de69265 mod_cloud_notify: Consider incoming XEP-0353 call requests as important
Matthew Wild <mwild1@gmail.com>
parents: 4429
diff changeset
329 if stanza:get_child("propose", "urn:xmpp:jingle-message:0") then return true; end
ea820de69265 mod_cloud_notify: Consider incoming XEP-0353 call requests as important
Matthew Wild <mwild1@gmail.com>
parents: 4429
diff changeset
330
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
331 local body = stanza:get_child_text("body");
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
332
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
333 -- groupchat subjects are not important here
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
334 if st_type == "groupchat" and stanza:get_child_text("subject") then
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
335 return false;
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
336 end
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
337
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
338 -- empty bodies are not important
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
339 return body ~= nil and body ~= "";
2736
fff185e7ab73 mod_cloud_notify: Implement the "stripped stanzas" proposal.
tmolitor <thilo@eightysoft.de>
parents: 2714
diff changeset
340 end
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
341 return false; -- this stanza wasn't one of the above cases --> it is not important, too
2736
fff185e7ab73 mod_cloud_notify: Implement the "stripped stanzas" proposal.
tmolitor <thilo@eightysoft.de>
parents: 2714
diff changeset
342 end
fff185e7ab73 mod_cloud_notify: Implement the "stripped stanzas" proposal.
tmolitor <thilo@eightysoft.de>
parents: 2714
diff changeset
343
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
344 local push_form = dataform {
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
345 { name = "FORM_TYPE"; type = "hidden"; value = "urn:xmpp:push:summary"; };
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
346 { name = "message-count"; type = "text-single"; };
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
347 { name = "pending-subscription-count"; type = "text-single"; };
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
348 { name = "last-message-sender"; type = "jid-single"; };
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
349 { name = "last-message-body"; type = "text-single"; };
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
350 };
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
351
1907
7fe7bd7b33b6 mod_cloud_notify: Allow the 'node' to be left out when disabling, clients MAY include it (and therefore leave it out)
Kim Alvefur <zash@zash.se>
parents: 1784
diff changeset
352 -- http://xmpp.org/extensions/xep-0357.html#publishing
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
353 local function handle_notify_request(stanza, node, user_push_services, log_push_decline)
2712
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
354 local pushes = 0;
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
355 if not #user_push_services then return pushes end
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
356
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
357 for push_identifier, push_info in pairs(user_push_services) do
2712
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
358 local send_push = true; -- only send push to this node when not already done for this stanza or if no stanza is given at all
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
359 if stanza then
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
360 if not stanza._push_notify then stanza._push_notify = {}; end
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
361 if stanza._push_notify[push_identifier] then
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
362 if log_push_decline then
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
363 module:log("debug", "Already sent push notification for %s@%s to %s (%s)", node, module.host, push_info.jid, tostring(push_info.node));
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
364 end
2712
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
365 send_push = false;
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
366 end
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
367 stanza._push_notify[push_identifier] = true;
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
368 end
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
369
2712
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
370 if send_push then
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
371 -- construct push stanza
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
372 local stanza_id = hashes.sha256(random.bytes(8), true);
4332
7a5ca4b285cb mod_cloud_notify: Some restructuring to allow direct access to notification element within push event
Matthew Wild <mwild1@gmail.com>
parents: 4328
diff changeset
373 local push_notification_payload = st.stanza("notification", { xmlns = xmlns_push });
2712
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
374 local form_data = {
3010
7ee59f417c16 mod_cloud_notify: remove useless counter (hardcode it to 1)
tmolitor <thilo@eightysoft.de>
parents: 2976
diff changeset
375 -- hardcode to 1 because other numbers are just meaningless (the XEP does not specify *what exactly* to count)
7ee59f417c16 mod_cloud_notify: remove useless counter (hardcode it to 1)
tmolitor <thilo@eightysoft.de>
parents: 2976
diff changeset
376 ["message-count"] = "1";
2712
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
377 };
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
378 if stanza and include_sender then
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
379 form_data["last-message-sender"] = stanza.attr.from;
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
380 end
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
381 if stanza and include_body then
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
382 form_data["last-message-body"] = stanza:get_child_text("body");
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
383 elseif stanza and dummy_body and is_important(stanza) then
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
384 form_data["last-message-body"] = tostring(dummy_body);
2712
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
385 end
4332
7a5ca4b285cb mod_cloud_notify: Some restructuring to allow direct access to notification element within push event
Matthew Wild <mwild1@gmail.com>
parents: 4328
diff changeset
386
4429
157fa4e535b0 mod_cloud_notify: Fix nesting of push form (thanks ivucica/Andrzej)
Matthew Wild <mwild1@gmail.com>
parents: 4412
diff changeset
387 push_notification_payload:add_child(push_form:form(form_data));
157fa4e535b0 mod_cloud_notify: Fix nesting of push form (thanks ivucica/Andrzej)
Matthew Wild <mwild1@gmail.com>
parents: 4412
diff changeset
388
4332
7a5ca4b285cb mod_cloud_notify: Some restructuring to allow direct access to notification element within push event
Matthew Wild <mwild1@gmail.com>
parents: 4328
diff changeset
389 local push_publish = st.iq({ to = push_info.jid, from = module.host, type = "set", id = stanza_id })
7a5ca4b285cb mod_cloud_notify: Some restructuring to allow direct access to notification element within push event
Matthew Wild <mwild1@gmail.com>
parents: 4328
diff changeset
390 :tag("pubsub", { xmlns = "http://jabber.org/protocol/pubsub" })
7a5ca4b285cb mod_cloud_notify: Some restructuring to allow direct access to notification element within push event
Matthew Wild <mwild1@gmail.com>
parents: 4328
diff changeset
391 :tag("publish", { node = push_info.node })
7a5ca4b285cb mod_cloud_notify: Some restructuring to allow direct access to notification element within push event
Matthew Wild <mwild1@gmail.com>
parents: 4328
diff changeset
392 :tag("item")
7a5ca4b285cb mod_cloud_notify: Some restructuring to allow direct access to notification element within push event
Matthew Wild <mwild1@gmail.com>
parents: 4328
diff changeset
393 :add_child(push_notification_payload)
7a5ca4b285cb mod_cloud_notify: Some restructuring to allow direct access to notification element within push event
Matthew Wild <mwild1@gmail.com>
parents: 4328
diff changeset
394 :up()
7a5ca4b285cb mod_cloud_notify: Some restructuring to allow direct access to notification element within push event
Matthew Wild <mwild1@gmail.com>
parents: 4328
diff changeset
395 :up();
7a5ca4b285cb mod_cloud_notify: Some restructuring to allow direct access to notification element within push event
Matthew Wild <mwild1@gmail.com>
parents: 4328
diff changeset
396
2712
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
397 if push_info.options then
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
398 push_publish:tag("publish-options"):add_child(st.deserialize(push_info.options));
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
399 end
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
400 -- send out push
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
401 module:log("debug", "Sending %s push notification for %s@%s to %s (%s)",
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
402 form_data["last-message-body"] and "important" or "unimportant",
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
403 node, module.host, push_info.jid, tostring(push_info.node)
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
404 );
2736
fff185e7ab73 mod_cloud_notify: Implement the "stripped stanzas" proposal.
tmolitor <thilo@eightysoft.de>
parents: 2714
diff changeset
405 -- module:log("debug", "PUSH STANZA: %s", tostring(push_publish));
4325
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
406 local push_event = {
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
407 notification_stanza = push_publish;
4332
7a5ca4b285cb mod_cloud_notify: Some restructuring to allow direct access to notification element within push event
Matthew Wild <mwild1@gmail.com>
parents: 4328
diff changeset
408 notification_payload = push_notification_payload;
4325
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
409 original_stanza = stanza;
4996
031e0dd90f4b mod_cloud_notify: Rename field in event for clarity ('node' is ambiguous here)
Matthew Wild <mwild1@gmail.com>
parents: 4980
diff changeset
410 username = node;
4325
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
411 push_info = push_info;
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
412 push_summary = form_data;
4328
5a30daf2ac02 mod_cloud_notify: Include 'important' flag in push event data
Matthew Wild <mwild1@gmail.com>
parents: 4325
diff changeset
413 important = not not form_data["last-message-body"];
4325
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
414 };
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
415
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
416 if module:fire_event("cloud_notify/push", push_event) then
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
417 module:log("debug", "Push was blocked by event handler: %s", push_event.reason or "Unknown reason");
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
418 else
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
419 -- handle push errors for this node
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
420 if push_errors[push_identifier] == nil then
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
421 push_errors[push_identifier] = 0;
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
422 end
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
423 module:hook("iq-error/host/"..stanza_id, handle_push_error);
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
424 module:hook("iq-result/host/"..stanza_id, handle_push_success);
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
425 id2node[stanza_id] = node;
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
426 id2identifier[stanza_id] = push_identifier;
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
427 module:send(push_publish);
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
428 pushes = pushes + 1;
2712
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
429 end
1909
c7389fe74de7 mod_cloud_notify: Make inclusion of message sender and body optional via config option
Kim Alvefur <zash@zash.se>
parents: 1908
diff changeset
430 end
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
431 end
2712
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
432 return pushes;
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
433 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
434
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
435 -- small helper function to extract relevant push settings
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
436 local function get_push_settings(stanza, session)
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
437 local to = stanza.attr.to;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
438 local node = to and jid.split(to) or session.username;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
439 local user_push_services = push_store:get(node);
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
440 return node, user_push_services;
2141
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
441 end
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
442
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
443 -- publish on offline message
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
444 module:hook("message/offline/handle", function(event)
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
445 local node, user_push_services = get_push_settings(event.stanza, event.origin);
2736
fff185e7ab73 mod_cloud_notify: Implement the "stripped stanzas" proposal.
tmolitor <thilo@eightysoft.de>
parents: 2714
diff changeset
446 module:log("debug", "Invoking cloud handle_notify_request() for offline stanza");
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
447 handle_notify_request(event.stanza, node, user_push_services, true);
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
448 end, 1);
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
449
4698
4157773ed4d3 mod_cloud_notify: notify on groupchat messages sent to bare JID
arcseconds <arcseconds@zoho.com>
parents: 4464
diff changeset
450 -- publish on bare groupchat
4712
48d7a5c16f2b mod_cloud_notify: Fix some minor luacheck offences
Matthew Wild <mwild1@gmail.com>
parents: 4698
diff changeset
451 -- this picks up MUC messages when there are no devices connected
4698
4157773ed4d3 mod_cloud_notify: notify on groupchat messages sent to bare JID
arcseconds <arcseconds@zoho.com>
parents: 4464
diff changeset
452 module:hook("message/bare/groupchat", function(event)
4157773ed4d3 mod_cloud_notify: notify on groupchat messages sent to bare JID
arcseconds <arcseconds@zoho.com>
parents: 4464
diff changeset
453 module:log("debug", "Invoking cloud handle_notify_request() for bare groupchat stanza");
4157773ed4d3 mod_cloud_notify: notify on groupchat messages sent to bare JID
arcseconds <arcseconds@zoho.com>
parents: 4464
diff changeset
454 local node, user_push_services = get_push_settings(event.stanza, event.origin);
4157773ed4d3 mod_cloud_notify: notify on groupchat messages sent to bare JID
arcseconds <arcseconds@zoho.com>
parents: 4464
diff changeset
455 handle_notify_request(event.stanza, node, user_push_services, true);
4157773ed4d3 mod_cloud_notify: notify on groupchat messages sent to bare JID
arcseconds <arcseconds@zoho.com>
parents: 4464
diff changeset
456 end, 1);
4157773ed4d3 mod_cloud_notify: notify on groupchat messages sent to bare JID
arcseconds <arcseconds@zoho.com>
parents: 4464
diff changeset
457
4157773ed4d3 mod_cloud_notify: notify on groupchat messages sent to bare JID
arcseconds <arcseconds@zoho.com>
parents: 4464
diff changeset
458
3619
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
459 local function process_stanza_queue(queue, session, queue_type)
2714
75b137cf869a mod_cloud_notify: Don't notify for all smacks queued stanzas in a row
tmolitor <thilo@eightysoft.de>
parents: 2712
diff changeset
460 if not session.push_identifier then return; end
75b137cf869a mod_cloud_notify: Don't notify for all smacks queued stanzas in a row
tmolitor <thilo@eightysoft.de>
parents: 2712
diff changeset
461 local user_push_services = {[session.push_identifier] = session.push_settings};
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
462 local notified = { unimportant = false; important = false }
2714
75b137cf869a mod_cloud_notify: Don't notify for all smacks queued stanzas in a row
tmolitor <thilo@eightysoft.de>
parents: 2712
diff changeset
463 for i=1, #queue do
75b137cf869a mod_cloud_notify: Don't notify for all smacks queued stanzas in a row
tmolitor <thilo@eightysoft.de>
parents: 2712
diff changeset
464 local stanza = queue[i];
3979
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
465 -- fast ignore of already pushed stanzas
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
466 if stanza and not (stanza._push_notify and stanza._push_notify[session.push_identifier]) then
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
467 local node = get_push_settings(stanza, session);
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
468 local stanza_type = "unimportant";
3979
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
469 if dummy_body and is_important(stanza) then stanza_type = "important"; end
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
470 if not notified[stanza_type] then -- only notify if we didn't try to push for this stanza type already
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
471 -- session.log("debug", "Invoking cloud handle_notify_request() for smacks queued stanza: %d", i);
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
472 if handle_notify_request(stanza, node, user_push_services, false) ~= 0 then
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
473 if session.hibernating and not session.first_hibernated_push then
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
474 -- if important stanzas are treated differently (pushed with last-message-body field set to dummy string)
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
475 -- if the message was important (e.g. had a last-message-body field) OR if we treat all pushes equally,
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
476 -- then record the time of first push in the session for the smack module which will extend its hibernation
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
477 -- timeout based on the value of session.first_hibernated_push
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
478 if not dummy_body or (dummy_body and is_important(stanza)) then
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
479 session.first_hibernated_push = os_time();
4968
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
480 -- check for prosody 0.12 mod_smacks
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
481 if session.hibernating_watchdog and session.original_smacks_callback and session.original_smacks_timeout then
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
482 -- restore old smacks watchdog (--> the start of our original timeout will be delayed until first push)
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
483 session.hibernating_watchdog:cancel();
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
484 session.hibernating_watchdog = watchdog.new(session.original_smacks_timeout, session.original_smacks_callback);
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
485 end
3979
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
486 end
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
487 end
3979
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
488 session.log("debug", "Cloud handle_notify_request() > 0, not notifying for other %s queued stanzas of type %s", queue_type, stanza_type);
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
489 notified[stanza_type] = true
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
490 end
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
491 end
2714
75b137cf869a mod_cloud_notify: Don't notify for all smacks queued stanzas in a row
tmolitor <thilo@eightysoft.de>
parents: 2712
diff changeset
492 end
3979
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
493 if notified.unimportant and notified.important then break; end -- stop processing the queue if all push types are exhausted
2714
75b137cf869a mod_cloud_notify: Don't notify for all smacks queued stanzas in a row
tmolitor <thilo@eightysoft.de>
parents: 2712
diff changeset
494 end
75b137cf869a mod_cloud_notify: Don't notify for all smacks queued stanzas in a row
tmolitor <thilo@eightysoft.de>
parents: 2712
diff changeset
495 end
75b137cf869a mod_cloud_notify: Don't notify for all smacks queued stanzas in a row
tmolitor <thilo@eightysoft.de>
parents: 2712
diff changeset
496
3619
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
497 -- publish on unacked smacks message (use timer to send out push for all stanzas submitted in a row only once)
4324
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
498 local function process_stanza(session, stanza)
3619
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
499 if session.push_identifier then
4273
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
500 session.log("debug", "adding new stanza to push_queue");
3619
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
501 if not session.push_queue then session.push_queue = {}; end
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
502 local queue = session.push_queue;
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
503 queue[#queue+1] = st.clone(stanza);
4355
31afa4f314cc mod_cloud_notify: Fix handling of push_queue
tmolitor <thilo@eightysoft.de>
parents: 4332
diff changeset
504 if not session.awaiting_push_timer then -- timer not already running --> start new timer
3619
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
505 session.log("debug", "Invoking cloud handle_notify_request() for newly smacks queued stanza (in a moment)");
4324
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
506 session.awaiting_push_timer = module:add_timer(1.0, function ()
3619
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
507 session.log("debug", "Invoking cloud handle_notify_request() for newly smacks queued stanzas (now in timer)");
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
508 process_stanza_queue(session.push_queue, session, "push");
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
509 session.push_queue = {}; -- clean up queue after push
4324
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
510 session.awaiting_push_timer = nil;
3619
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
511 end);
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
512 end
4324
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
513 end
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
514 return stanza;
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
515 end
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
516
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
517 local function process_smacks_stanza(event)
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
518 local session = event.origin;
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
519 local stanza = event.stanza;
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
520 if not session.push_identifier then
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
521 session.log("debug", "NOT invoking cloud handle_notify_request() for newly smacks queued stanza (session.push_identifier is not set: %s)",
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
522 session.push_identifier
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
523 );
4324
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
524 else
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
525 process_stanza(session, stanza)
3619
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
526 end
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
527 end
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
528
2141
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
529 -- smacks hibernation is started
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
530 local function hibernate_session(event)
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
531 local session = event.origin;
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
532 local queue = event.queue;
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
533 session.first_hibernated_push = nil;
5052
d7ece68de066 mod_cloud_notify: Only delay hibernation timeout for push-enabled clients
Matthew Wild <mwild1@gmail.com>
parents: 4996
diff changeset
534 if session.push_identifier and session.hibernating_watchdog then -- check for prosody 0.12 mod_smacks
4968
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
535 -- save old watchdog callback and timeout
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
536 session.original_smacks_callback = session.hibernating_watchdog.callback;
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
537 session.original_smacks_timeout = session.hibernating_watchdog.timeout;
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
538 -- cancel old watchdog and create a new watchdog with extended timeout
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
539 session.hibernating_watchdog:cancel();
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
540 session.hibernating_watchdog = watchdog.new(extended_hibernation_timeout, function()
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
541 session.log("debug", "Push-extended smacks watchdog triggered");
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
542 if session.original_smacks_callback then
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
543 session.log("debug", "Calling original smacks watchdog handler");
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
544 session.original_smacks_callback();
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
545 end
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
546 end);
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
547 end
2395
2e641ab995b3 mod_cloud_notify: added code to respond to the new event "smacks-ack-delayed" issued by mod_smacks when acks are delayed for a certain amount of time. This allows to send out notification requests before the read timeout or connection close event really happens, thus allowing conversations to be smoother.
tmolitor <thilo@eightysoft.de>
parents: 2263
diff changeset
548 -- process unacked stanzas
3619
74aa35aeb08a mod_cloud_notify: only push once on csi queue flush in hibernated state, unhook response handlers
tmolitor <thilo@eightysoft.de>
parents: 3108
diff changeset
549 process_stanza_queue(queue, session, "smacks");
2141
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
550 end
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
551
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
552 -- smacks hibernation is ended
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
553 local function restore_session(event)
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
554 local session = event.resumed;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
555 if session then -- older smacks module versions send only the "intermediate" session in event.session and no session.resumed one
4412
e5493a10c4d1 mod_cloud_notify: use stanza from mod_smacks to behave O(1)
tmolitor <thilo@eightysoft.de>
parents: 4367
diff changeset
556 if session.awaiting_push_timer then
e5493a10c4d1 mod_cloud_notify: use stanza from mod_smacks to behave O(1)
tmolitor <thilo@eightysoft.de>
parents: 4367
diff changeset
557 session.awaiting_push_timer:stop();
e5493a10c4d1 mod_cloud_notify: use stanza from mod_smacks to behave O(1)
tmolitor <thilo@eightysoft.de>
parents: 4367
diff changeset
558 session.awaiting_push_timer = nil;
e5493a10c4d1 mod_cloud_notify: use stanza from mod_smacks to behave O(1)
tmolitor <thilo@eightysoft.de>
parents: 4367
diff changeset
559 end
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
560 session.first_hibernated_push = nil;
4968
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
561 -- the extended smacks watchdog will be canceled by the smacks module, no need to anything here
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
562 end
2141
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
563 end
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
564
2395
2e641ab995b3 mod_cloud_notify: added code to respond to the new event "smacks-ack-delayed" issued by mod_smacks when acks are delayed for a certain amount of time. This allows to send out notification requests before the read timeout or connection close event really happens, thus allowing conversations to be smoother.
tmolitor <thilo@eightysoft.de>
parents: 2263
diff changeset
565 -- smacks ack is delayed
2e641ab995b3 mod_cloud_notify: added code to respond to the new event "smacks-ack-delayed" issued by mod_smacks when acks are delayed for a certain amount of time. This allows to send out notification requests before the read timeout or connection close event really happens, thus allowing conversations to be smoother.
tmolitor <thilo@eightysoft.de>
parents: 2263
diff changeset
566 local function ack_delayed(event)
2e641ab995b3 mod_cloud_notify: added code to respond to the new event "smacks-ack-delayed" issued by mod_smacks when acks are delayed for a certain amount of time. This allows to send out notification requests before the read timeout or connection close event really happens, thus allowing conversations to be smoother.
tmolitor <thilo@eightysoft.de>
parents: 2263
diff changeset
567 local session = event.origin;
2e641ab995b3 mod_cloud_notify: added code to respond to the new event "smacks-ack-delayed" issued by mod_smacks when acks are delayed for a certain amount of time. This allows to send out notification requests before the read timeout or connection close event really happens, thus allowing conversations to be smoother.
tmolitor <thilo@eightysoft.de>
parents: 2263
diff changeset
568 local queue = event.queue;
4412
e5493a10c4d1 mod_cloud_notify: use stanza from mod_smacks to behave O(1)
tmolitor <thilo@eightysoft.de>
parents: 4367
diff changeset
569 local stanza = event.stanza;
4324
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
570 if not session.push_identifier then return; end
4412
e5493a10c4d1 mod_cloud_notify: use stanza from mod_smacks to behave O(1)
tmolitor <thilo@eightysoft.de>
parents: 4367
diff changeset
571 if stanza then process_stanza(session, stanza); return; end -- don't iterate through smacks queue if we know which stanza triggered this
4324
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
572 for i=1, #queue do
4712
48d7a5c16f2b mod_cloud_notify: Fix some minor luacheck offences
Matthew Wild <mwild1@gmail.com>
parents: 4698
diff changeset
573 local queued_stanza = queue[i];
4324
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
574 -- process unacked stanzas (handle_notify_request() will only send push requests for new stanzas)
4712
48d7a5c16f2b mod_cloud_notify: Fix some minor luacheck offences
Matthew Wild <mwild1@gmail.com>
parents: 4698
diff changeset
575 process_stanza(session, queued_stanza);
4324
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
576 end
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
577 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
578
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
579 -- archive message added
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
580 local function archive_message_added(event)
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
581 -- event is: { origin = origin, stanza = stanza, for_user = store_user, id = id }
3055
6abee021d9db mod_cloud_notify: Limit number of devices to 5 and change some default settings
tmolitor <thilo@eightysoft.de>
parents: 3010
diff changeset
582 -- only notify for new mam messages when at least one device is online
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
583 if not event.for_user or not host_sessions[event.for_user] then return; end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
584 local stanza = event.stanza;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
585 local user_session = host_sessions[event.for_user].sessions;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
586 local to = stanza.attr.to;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
587 to = to and jid.split(to) or event.origin.username;
2643
777d07e0cd73 mod_cloud_notify: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents: 2642
diff changeset
588
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
589 -- only notify if the stanza destination is the mam user we store it for
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
590 if event.for_user == to then
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
591 local user_push_services = push_store:get(to);
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
592
4730
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
593 -- Urgent stanzas are time-sensitive (e.g. calls) and should
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
594 -- be pushed immediately to avoid getting stuck in the smacks
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
595 -- queue in case of dead connections, for example
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
596 local is_urgent_stanza, urgent_reason = is_urgent(event.stanza);
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
597
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
598 local notify_push_services;
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
599 if is_urgent_stanza then
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
600 module:log("debug", "Urgent push for %s (%s)", to, urgent_reason);
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
601 notify_push_services = user_push_services;
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
602 else
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
603 -- only notify nodes with no active sessions (smacks is counted as active and handled separate)
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
604 notify_push_services = {};
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
605 for identifier, push_info in pairs(user_push_services) do
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
606 local identifier_found = nil;
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
607 for _, session in pairs(user_session) do
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
608 if session.push_identifier == identifier then
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
609 identifier_found = session;
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
610 break;
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
611 end
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
612 end
4730
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
613 if identifier_found then
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
614 identifier_found.log("debug", "Not cloud notifying '%s' of new MAM stanza (session still alive)", identifier);
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
615 else
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
616 notify_push_services[identifier] = push_info;
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
617 end
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
618 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
619 end
2643
777d07e0cd73 mod_cloud_notify: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents: 2642
diff changeset
620
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
621 handle_notify_request(event.stanza, to, notify_push_services, true);
2395
2e641ab995b3 mod_cloud_notify: added code to respond to the new event "smacks-ack-delayed" issued by mod_smacks when acks are delayed for a certain amount of time. This allows to send out notification requests before the read timeout or connection close event really happens, thus allowing conversations to be smoother.
tmolitor <thilo@eightysoft.de>
parents: 2263
diff changeset
622 end
2e641ab995b3 mod_cloud_notify: added code to respond to the new event "smacks-ack-delayed" issued by mod_smacks when acks are delayed for a certain amount of time. This allows to send out notification requests before the read timeout or connection close event really happens, thus allowing conversations to be smoother.
tmolitor <thilo@eightysoft.de>
parents: 2263
diff changeset
623 end
2e641ab995b3 mod_cloud_notify: added code to respond to the new event "smacks-ack-delayed" issued by mod_smacks when acks are delayed for a certain amount of time. This allows to send out notification requests before the read timeout or connection close event really happens, thus allowing conversations to be smoother.
tmolitor <thilo@eightysoft.de>
parents: 2263
diff changeset
624
2141
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
625 module:hook("smacks-hibernation-start", hibernate_session);
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
626 module:hook("smacks-hibernation-end", restore_session);
2395
2e641ab995b3 mod_cloud_notify: added code to respond to the new event "smacks-ack-delayed" issued by mod_smacks when acks are delayed for a certain amount of time. This allows to send out notification requests before the read timeout or connection close event really happens, thus allowing conversations to be smoother.
tmolitor <thilo@eightysoft.de>
parents: 2263
diff changeset
627 module:hook("smacks-ack-delayed", ack_delayed);
4273
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
628 module:hook("smacks-hibernation-stanza-queued", process_smacks_stanza);
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
629 module:hook("archive-message-added", archive_message_added);
2141
218a3d3f7f97 mod_cloud_notify: added ability to notify even if the session is hibernated by mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 2051
diff changeset
630
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
631 local function send_ping(event)
3626
c84bbf36c878 mod_cloud_notify: fix local variable usage
tmolitor <thilo@eightysoft.de>
parents: 3622
diff changeset
632 local user = event.user;
3627
9639c493f4b9 mod_cloud_notify: fix typo (used || instead of or)
tmolitor <thilo@eightysoft.de>
parents: 3626
diff changeset
633 local push_services = event.push_services or push_store:get(user);
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
634 module:log("debug", "Handling event 'cloud-notify-ping' for user '%s'", user);
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
635 local retval = handle_notify_request(nil, user, push_services, true);
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
636 module:log("debug", "handle_notify_request() returned %s", tostring(retval));
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
637 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
638 -- can be used by other modules to ping one or more (or all) push endpoints
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
639 module:hook("cloud-notify-ping", send_ping);
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
640
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
641 module:log("info", "Module loaded");
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
642 function module.unload()
4273
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
643 module:log("info", "Unloading module");
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
644 -- cleanup some settings, reloading this module can cause process_smacks_stanza() to stop working otherwise
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
645 for user, _ in pairs(host_sessions) do
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
646 for _, session in pairs(host_sessions[user].sessions) do
4273
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
647 if session.awaiting_push_timer then session.awaiting_push_timer:stop(); end
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
648 session.awaiting_push_timer = nil;
4968
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
649 session.push_queue = nil;
4273
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
650 session.first_hibernated_push = nil;
4968
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
651 -- check for prosody 0.12 mod_smacks
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
652 if session.hibernating_watchdog and session.original_smacks_callback and session.original_smacks_timeout then
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
653 -- restore old smacks watchdog
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
654 session.hibernating_watchdog:cancel();
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
655 session.hibernating_watchdog = watchdog.new(session.original_smacks_timeout, session.original_smacks_callback);
487f1eb829cf mod_cloud_notify: Compat for prosody 0.12
tmolitor <thilo@eightysoft.de>
parents: 4827
diff changeset
656 end
4273
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
657 end
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
658 end
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
659 module:log("info", "Module unloaded");
2643
777d07e0cd73 mod_cloud_notify: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents: 2642
diff changeset
660 end