annotate mod_cloud_notify/mod_cloud_notify.lua @ 4730:1da4b815d2fe

mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls This covers the following things: - A session that appears online, but has a broken TCP connection - Clients such as Siskin and Snikket iOS that require a push for calls to work It allows the stanza to be pushed immediately instead of waiting for the session to hibernate or an ack to timeout. It shouldn't break any existing cases.
author Matthew Wild <mwild1@gmail.com>
date Wed, 27 Oct 2021 19:12:03 +0100
parents 6e3254e13fb7
children fe5303da99cb
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
3055
6abee021d9db mod_cloud_notify: Limit number of devices to 5 and change some default settings
tmolitor <thilo@eightysoft.de>
parents: 3010
diff changeset
7 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
8 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
9 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
10 local dataform = require"util.dataforms".new;
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
11 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
12 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
13 local cache = require"util.cache";
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 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
16
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
17 -- configuration
2246
a3e3dc9131e7 mod_cloud_notify: Use typed config API
Kim Alvefur <zash@zash.se>
parents: 2201
diff changeset
18 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
19 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
20 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
21 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
22 local dummy_body = module:get_option_string("push_notification_important_body", "New Message!");
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
23
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
24 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
25 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
26 local id2node = {};
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
27 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
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 -- 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
30 -- 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
31 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
32 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
33 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
34 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
35 --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
36 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
37 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
38 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
39 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
40 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
41 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
42 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
43 end
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
44 if loaded then
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
45 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
46 -- 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
47 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
48 else
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
49 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
50 end
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
51 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
52 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
53 end
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
54 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
55 local plain_table = {};
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(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
57 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
58 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
59 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
60 return false;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
61 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
62 return true;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
63 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
64 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
65 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
66 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
67 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
68 return api;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
69 end)();
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
70
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
71
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
72 -- 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
73 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
74
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
75 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
76 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
77 local error_type, condition = stanza:get_error();
2791
008cf272b7ea mod_cloud_notify: Fix regression in error handling
tmolitor <thilo@eightysoft.de>
parents: 2751
diff changeset
78 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
79 local identifier = id2identifier[stanza.attr.id];
2791
008cf272b7ea mod_cloud_notify: Fix regression in error handling
tmolitor <thilo@eightysoft.de>
parents: 2751
diff changeset
80 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
81 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
82 local user_push_services = push_store:get(node);
3085
1ea6861b533f mod_cloud_notify: Don't change table while iterating it
tmolitor <thilo@eightysoft.de>
parents: 3079
diff changeset
83 local changed = false;
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
84
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
85 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
86 if push_identifier == identifier then
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
87 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
88 push_errors[push_identifier] = push_errors[push_identifier] + 1;
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
89 module:log("info", "Got error of type '%s' (%s) for identifier '%s': "
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
90 .."error count for this identifier is now at %s", error_type, condition, push_identifier,
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
91 tostring(push_errors[push_identifier]));
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
92 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
93 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
94 -- remove push settings from sessions
2749
9756211fcbe3 mod_cloud_notify: Fix small bug.
tmolitor <thilo@eightysoft.de>
parents: 2736
diff changeset
95 if host_sessions[node] then
9756211fcbe3 mod_cloud_notify: Fix small bug.
tmolitor <thilo@eightysoft.de>
parents: 2736
diff changeset
96 for _, session in pairs(host_sessions[node].sessions) do
9756211fcbe3 mod_cloud_notify: Fix small bug.
tmolitor <thilo@eightysoft.de>
parents: 2736
diff changeset
97 if session.push_identifier == push_identifier then
9756211fcbe3 mod_cloud_notify: Fix small bug.
tmolitor <thilo@eightysoft.de>
parents: 2736
diff changeset
98 session.push_identifier = nil;
9756211fcbe3 mod_cloud_notify: Fix small bug.
tmolitor <thilo@eightysoft.de>
parents: 2736
diff changeset
99 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
100 session.first_hibernated_push = nil;
2749
9756211fcbe3 mod_cloud_notify: Fix small bug.
tmolitor <thilo@eightysoft.de>
parents: 2736
diff changeset
101 end
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
102 end
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
103 end
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
104 -- save changed global config
3085
1ea6861b533f mod_cloud_notify: Don't change table while iterating it
tmolitor <thilo@eightysoft.de>
parents: 3079
diff changeset
105 changed = true;
1ea6861b533f mod_cloud_notify: Don't change table while iterating it
tmolitor <thilo@eightysoft.de>
parents: 3079
diff changeset
106 user_push_services[push_identifier] = nil
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
107 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
108 -- 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
109 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
110 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
111 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
112 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
113 end
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
114 elseif 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
115 module:log("debug", "Got error of type '%s' (%s) for identifier '%s': "
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
116 .."NOT increasing error count for this identifier", error_type, condition, push_identifier);
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
117 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
118 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
119 end
3085
1ea6861b533f mod_cloud_notify: Don't change table while iterating it
tmolitor <thilo@eightysoft.de>
parents: 3079
diff changeset
120 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
121 push_store:flush_to_disk(node);
3085
1ea6861b533f mod_cloud_notify: Don't change table while iterating it
tmolitor <thilo@eightysoft.de>
parents: 3079
diff changeset
122 end
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
123 return true;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
124 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
125
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
126 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
127 local stanza = event.stanza;
2791
008cf272b7ea mod_cloud_notify: Fix regression in error handling
tmolitor <thilo@eightysoft.de>
parents: 2751
diff changeset
128 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
129 local identifier = id2identifier[stanza.attr.id];
2791
008cf272b7ea mod_cloud_notify: Fix regression in error handling
tmolitor <thilo@eightysoft.de>
parents: 2751
diff changeset
130 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
131 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
132 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
133
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
134 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
135 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
136 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
137 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
138 -- 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
139 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
140 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
141 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
142 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
143 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
144 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
145 );
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
146 end
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
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 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
149 return true;
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
150 end
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
151
1908
eba279ddc050 mod_cloud_notify: Add some comments describing code blocks
Kim Alvefur <zash@zash.se>
parents: 1907
diff changeset
152 -- 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
153 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
154 (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
155 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
156 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
157
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
158 -- 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
159 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
160 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
161 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
162 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
163 -- 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
164 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
165 -- SHOULD contain a 'node' attribute
2254
122cb5f4930f mod_cloud_notify: Cache <enable> in local
Kim Alvefur <zash@zash.se>
parents: 2253
diff changeset
166 local push_node = enable.attr.node;
2736
fff185e7ab73 mod_cloud_notify: Implement the "stripped stanzas" proposal.
tmolitor <thilo@eightysoft.de>
parents: 2714
diff changeset
167 -- CAN contain a 'include_payload' attribute
fff185e7ab73 mod_cloud_notify: Implement the "stripped stanzas" proposal.
tmolitor <thilo@eightysoft.de>
parents: 2714
diff changeset
168 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
169 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
170 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
171 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
172 return true;
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
173 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
174 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
175 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
176 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
177 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
178 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
179 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
180 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
181 -- Could be intentional
3abc51faf945 mod_cloud_notify: Log message if no dataform is found
Kim Alvefur <zash@zash.se>
parents: 2257
diff changeset
182 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
183 end
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 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
185 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
186 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
187 node = push_node;
2736
fff185e7ab73 mod_cloud_notify: Implement the "stripped stanzas" proposal.
tmolitor <thilo@eightysoft.de>
parents: 2714
diff changeset
188 include_payload = include_payload;
2253
97ebd28a8a75 mod_cloud_notify: Apply pre-serialization to publish-options
Kim Alvefur <zash@zash.se>
parents: 2252
diff changeset
189 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
190 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
191 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
192 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
193 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
194 };
4325
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
195 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
196 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
197 });
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
198 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
199 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
200 end
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
201 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
202 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
203 if not ok then
eb5555a3a535 mod_cloud_notify: Enable persistent storage of user notification settings
Kim Alvefur <zash@zash.se>
parents: 2200
diff changeset
204 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
205 else
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
206 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
207 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
208 origin.first_hibernated_push = nil;
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
209 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
210 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
211 end
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
212 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
213 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
214 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
215
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
216 -- 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
217 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
218 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
219 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
220 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
221 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
222 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
223 return true;
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
224 end
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
225 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
226 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
227 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
228 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
229 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
230 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
231 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
232 origin.first_hibernated_push = nil;
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
233 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
234 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
235 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
236 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
237 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
238 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
239 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
240 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
241 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
242 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
243 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
244 end
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
245 end
3943
f5e6368a1c39 mod_cloud_notify: Cleanup code and drop support for prosody 0.9
tmolitor <thilo@eightysoft.de>
parents: 3940
diff changeset
246 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
247 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
248 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
249 else
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
250 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
251 end
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
252 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
253 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
254 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
255
4730
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
256 -- 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
257 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
258 -- TODO
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
259 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
260 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
261 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
262 end
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
263 end
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
264 end
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
265
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
266 -- 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
267 local function is_important(stanza)
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
268 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
269 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
270 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
271 return false; -- same for presences
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
272 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
273 -- 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
274 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
275 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
276 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
277 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
278
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
279 -- headline message are always not important
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
280 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
281
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
282 -- 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
283 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
284
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
285 -- 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
286 -- 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
287
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
288 -- 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
289 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
290
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
291 -- 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
292 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
293
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
294 -- 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
295 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
296
4464
ea820de69265 mod_cloud_notify: Consider incoming XEP-0353 call requests as important
Matthew Wild <mwild1@gmail.com>
parents: 4429
diff changeset
297 -- 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
298 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
299
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
300 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
301
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
302 -- 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
303 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
304 return false;
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
305 end
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
306
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
307 -- 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
308 return body ~= nil and body ~= "";
2736
fff185e7ab73 mod_cloud_notify: Implement the "stripped stanzas" proposal.
tmolitor <thilo@eightysoft.de>
parents: 2714
diff changeset
309 end
2976
df86ce6bb0b4 Implement dummy body message to indicate high priority push
tmolitor <thilo@eightysoft.de>
parents: 2792
diff changeset
310 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
311 end
fff185e7ab73 mod_cloud_notify: Implement the "stripped stanzas" proposal.
tmolitor <thilo@eightysoft.de>
parents: 2714
diff changeset
312
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
313 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
314 { 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
315 { 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
316 { 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
317 { 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
318 { 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
319 };
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
320
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
321 -- 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
322 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
323 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
324 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
325
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
326 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
327 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
328 if stanza then
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
329 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
330 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
331 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
332 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
333 end
2712
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
334 send_push = false;
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
335 end
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
336 stanza._push_notify[push_identifier] = true;
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
337 end
4295
d44a8d3dd571 mod_cloud_notify: Some code cleanup, now luacheck-clean. No functionality changes.
Matthew Wild <mwild1@gmail.com>
parents: 4273
diff changeset
338
2712
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
339 if send_push then
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
340 -- 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
341 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
342 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
343 local form_data = {
3010
7ee59f417c16 mod_cloud_notify: remove useless counter (hardcode it to 1)
tmolitor <thilo@eightysoft.de>
parents: 2976
diff changeset
344 -- 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
345 ["message-count"] = "1";
2712
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
346 };
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
347 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
348 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
349 end
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
350 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
351 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
352 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
353 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
354 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
355
4429
157fa4e535b0 mod_cloud_notify: Fix nesting of push form (thanks ivucica/Andrzej)
Matthew Wild <mwild1@gmail.com>
parents: 4412
diff changeset
356 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
357
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
358 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
359 :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
360 :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
361 :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
362 :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
363 :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
364 :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
365
2712
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
366 if push_info.options then
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
367 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
368 end
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
369 -- 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
370 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
371 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
372 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
373 );
2736
fff185e7ab73 mod_cloud_notify: Implement the "stripped stanzas" proposal.
tmolitor <thilo@eightysoft.de>
parents: 2714
diff changeset
374 -- 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
375 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
376 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
377 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
378 original_stanza = stanza;
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
379 node = node;
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
380 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
381 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
382 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
383 };
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
384
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
385 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
386 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
387 else
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
388 -- 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
389 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
390 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
391 end
9b95241c6ae5 mod_cloud_notify: Fire register and push events for integration with other modules
Matthew Wild <mwild1@gmail.com>
parents: 4324
diff changeset
392 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
393 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
394 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
395 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
396 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
397 pushes = pushes + 1;
2712
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
398 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
399 end
1783
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
400 end
2712
d89ab70808f6 mod_cloud_notify: fix bug when multiple resources are used
tmolitor <thilo@eightysoft.de>
parents: 2670
diff changeset
401 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
402 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
403
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
404 -- 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
405 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
406 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
407 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
408 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
409 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
410 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
411
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
412 -- 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
413 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
414 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
415 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
416 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
417 end, 1);
b31fe2d22310 mod_cloud_notify: XEP-0357: Push - the server bits ("app server" not included)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
418
4698
4157773ed4d3 mod_cloud_notify: notify on groupchat messages sent to bare JID
arcseconds <arcseconds@zoho.com>
parents: 4464
diff changeset
419 -- publish on bare groupchat
4712
48d7a5c16f2b mod_cloud_notify: Fix some minor luacheck offences
Matthew Wild <mwild1@gmail.com>
parents: 4698
diff changeset
420 -- 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
421 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
422 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
423 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
424 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
425 end, 1);
4157773ed4d3 mod_cloud_notify: notify on groupchat messages sent to bare JID
arcseconds <arcseconds@zoho.com>
parents: 4464
diff changeset
426
4157773ed4d3 mod_cloud_notify: notify on groupchat messages sent to bare JID
arcseconds <arcseconds@zoho.com>
parents: 4464
diff changeset
427
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
428 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
429 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
430 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
431 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
432 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
433 local stanza = queue[i];
3979
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
434 -- fast ignore of already pushed stanzas
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
435 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
436 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
437 local stanza_type = "unimportant";
3979
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
438 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
439 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
440 -- 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
441 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
442 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
443 -- 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
444 -- 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
445 -- 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
446 -- 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
447 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
448 session.first_hibernated_push = os_time();
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
449 end
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
450 end
3979
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
451 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
452 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
453 end
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
454 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
455 end
3979
6bf362008052 mod_cloud_notify: make stanza queue processing faster
tmolitor <thilo@eightysoft.de>
parents: 3943
diff changeset
456 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
457 end
75b137cf869a mod_cloud_notify: Don't notify for all smacks queued stanzas in a row
tmolitor <thilo@eightysoft.de>
parents: 2712
diff changeset
458 end
75b137cf869a mod_cloud_notify: Don't notify for all smacks queued stanzas in a row
tmolitor <thilo@eightysoft.de>
parents: 2712
diff changeset
459
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
460 -- 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
461 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
462 if session.push_identifier then
4273
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
463 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
464 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
465 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
466 queue[#queue+1] = st.clone(stanza);
4355
31afa4f314cc mod_cloud_notify: Fix handling of push_queue
tmolitor <thilo@eightysoft.de>
parents: 4332
diff changeset
467 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
468 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
469 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
470 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
471 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
472 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
473 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
474 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
475 end
4324
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
476 end
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
477 return stanza;
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
478 end
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
479
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
480 local function process_smacks_stanza(event)
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
481 local session = event.origin;
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
482 local stanza = event.stanza;
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
483 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
484 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
485 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
486 );
4324
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
487 else
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
488 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
489 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
490 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
491
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
492 -- 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
493 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
494 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
495 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
496 session.first_hibernated_push = nil;
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
497 -- 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
498 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
499 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
500
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
501 -- 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
502 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
503 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
504 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
505 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
506 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
507 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
508 end
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
509 session.first_hibernated_push = nil;
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
510 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
511 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
512
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
513 -- 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
514 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
515 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
516 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
517 local stanza = event.stanza;
4324
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
518 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
519 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
520 for i=1, #queue do
4712
48d7a5c16f2b mod_cloud_notify: Fix some minor luacheck offences
Matthew Wild <mwild1@gmail.com>
parents: 4698
diff changeset
521 local queued_stanza = queue[i];
4324
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
522 -- 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
523 process_stanza(session, queued_stanza);
4324
45dcf5d4cd6c mod_cloud_notify: fix push flooding on delayed acks
tmolitor <thilo@eightysoft.de>
parents: 4295
diff changeset
524 end
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
525 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
526
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
527 -- 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
528 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
529 -- 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
530 -- 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
531 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
532 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
533 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
534 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
535 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
536
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
537 -- 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
538 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
539 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
540
4730
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
541 -- 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
542 -- 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
543 -- 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
544 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
545
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
546 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
547 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
548 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
549 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
550 else
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
551 -- 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
552 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
553 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
554 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
555 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
556 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
557 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
558 break;
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
559 end
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
560 end
4730
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
561 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
562 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
563 else
1da4b815d2fe mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
564 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
565 end
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
566 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
567 end
2643
777d07e0cd73 mod_cloud_notify: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents: 2642
diff changeset
568
3108
cfcb020bcd1d mod_cloud_notify: inform mod_smacks of first push in hibernated state
tmolitor <thilo@eightysoft.de>
parents: 3085
diff changeset
569 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
570 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
571 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
572
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
573 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
574 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
575 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
576 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
577 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
578
2609
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
579 local function send_ping(event)
3626
c84bbf36c878 mod_cloud_notify: fix local variable usage
tmolitor <thilo@eightysoft.de>
parents: 3622
diff changeset
580 local user = event.user;
3627
9639c493f4b9 mod_cloud_notify: fix typo (used || instead of or)
tmolitor <thilo@eightysoft.de>
parents: 3626
diff changeset
581 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
582 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
583 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
584 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
585 end
6ab46ff685d0 mod_cloud_notify: Respect Daniel's business rules and remove endpoints on error
tmolitor <thilo@eightysoft.de>
parents: 2395
diff changeset
586 -- 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
587 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
588
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
589 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
590 function module.unload()
4273
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
591 module:log("info", "Unloading module");
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
592 -- 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
593 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
594 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
595 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
596 session.awaiting_push_timer = nil;
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
597 session.first_hibernated_push = nil;
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
598 session.push_queue = nil;
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
599 end
8bf83e883593 mod_cloud_notify: Modernize interface to mod_smacks
tmolitor <thilo@eightysoft.de>
parents: 4221
diff changeset
600 end
2625
8c6562f16496 mod_cloud_notify: Fixed error in push deduplication
tmolitor <thilo@eightysoft.de>
parents: 2609
diff changeset
601 module:log("info", "Module unloaded");
2643
777d07e0cd73 mod_cloud_notify: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents: 2642
diff changeset
602 end