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