annotate plugins/mod_cloud_notify.lua @ 14218:926f25af2ffe 13.0

util.tlsref: New util library to encapsulate the Mozilla/TLSRef recommendations Previously we embedded this data directly into core.certmanager. This splits it out, for various benefits: - Removes data from the business logic (the config parsing is complex enough as it is) - Allows easier testing and tracking of the data (this commit adds various consistency checks, so that we can have more confidence in future updates to the data not breaking stuff) This library also supports multiple versions of the recommendations. Previously we picked a single version, and put that into certmanager. But this meant we had to make choices for our users, and one of the choices is between advancing security standards and ensuring we don't break connectivity for people doing minor upgrades (deterring people from performing minor upgrades would have a security impact too). This library supports the concept of a "default" and a "latest" version, so we are now free to add new versions into stable releases, and admins can pick between compatibility and security.
author Matthew Wild <mwild1@gmail.com>
date Fri, 12 Jun 2026 13:01:56 +0100
parents f149652cb5ff
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13616
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 -- XEP-0357: Push (aka: My mobile OS vendor won't let me have persistent TCP connections)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 -- Copyright (C) 2015-2016 Kim Alvefur
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 -- Copyright (C) 2017-2019 Thilo Molitor
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 --
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 -- This file is MIT/X11 licensed.
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 local os_time = os.time;
13701
1aa7efabeacb mod_cloud_notify, mod_cron, mod_invites: Add 'prosody.' prefix to requires
Matthew Wild <mwild1@gmail.com>
parents: 13616
diff changeset
8 local st = require"prosody.util.stanza";
1aa7efabeacb mod_cloud_notify, mod_cron, mod_invites: Add 'prosody.' prefix to requires
Matthew Wild <mwild1@gmail.com>
parents: 13616
diff changeset
9 local jid = require"prosody.util.jid";
1aa7efabeacb mod_cloud_notify, mod_cron, mod_invites: Add 'prosody.' prefix to requires
Matthew Wild <mwild1@gmail.com>
parents: 13616
diff changeset
10 local dataform = require"prosody.util.dataforms".new;
1aa7efabeacb mod_cloud_notify, mod_cron, mod_invites: Add 'prosody.' prefix to requires
Matthew Wild <mwild1@gmail.com>
parents: 13616
diff changeset
11 local hashes = require"prosody.util.hashes";
1aa7efabeacb mod_cloud_notify, mod_cron, mod_invites: Add 'prosody.' prefix to requires
Matthew Wild <mwild1@gmail.com>
parents: 13616
diff changeset
12 local random = require"prosody.util.random";
1aa7efabeacb mod_cloud_notify, mod_cron, mod_invites: Add 'prosody.' prefix to requires
Matthew Wild <mwild1@gmail.com>
parents: 13616
diff changeset
13 local cache = require"prosody.util.cache";
1aa7efabeacb mod_cloud_notify, mod_cron, mod_invites: Add 'prosody.' prefix to requires
Matthew Wild <mwild1@gmail.com>
parents: 13616
diff changeset
14 local watchdog = require "prosody.util.watchdog";
13616
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 local xmlns_push = "urn:xmpp:push:0";
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 -- configuration
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 local include_body = module:get_option_boolean("push_notification_with_body", false);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 local include_sender = module:get_option_boolean("push_notification_with_sender", false);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 local max_push_errors = module:get_option_number("push_max_errors", 16);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 local max_push_devices = module:get_option_number("push_max_devices", 5);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 local dummy_body = module:get_option_string("push_notification_important_body", "New Message!");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 local extended_hibernation_timeout = module:get_option_number("push_max_hibernation_timeout", 72*3600); -- use same timeout like ejabberd
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 local host_sessions = prosody.hosts[module.host].sessions;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 local push_errors = module:shared("push_errors");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 local id2node = {};
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 local id2identifier = {};
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 -- For keeping state across reloads while caching reads
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 -- This uses util.cache for caching the most recent devices and removing all old devices when max_push_devices is reached
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 local push_store = (function()
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 local store = module:open_store();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 local push_services = {};
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 local api = {};
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 --luacheck: ignore 212/self
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 function api:get(user)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 if not push_services[user] then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 local loaded, err = store:get(user);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 if not loaded and err then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 module:log("warn", "Error reading push notification storage for user '%s': %s", user, tostring(err));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 push_services[user] = cache.new(max_push_devices):table();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 return push_services[user], false;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 if loaded then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 push_services[user] = cache.new(max_push_devices):table();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 -- copy over plain table loaded from disk into our cache
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 for k, v in pairs(loaded) do push_services[user][k] = v; end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 else
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 push_services[user] = cache.new(max_push_devices):table();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 return push_services[user], true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 function api:flush_to_disk(user)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 local plain_table = {};
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 for k, v in pairs(push_services[user]) do plain_table[k] = v; end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 local ok, err = store:set(user, plain_table);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 if not ok then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 module:log("error", "Error writing push notification storage for user '%s': %s", user, tostring(err));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 return false;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 return true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 function api:set_identifier(user, push_identifier, data)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 local services = self:get(user);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 services[push_identifier] = data;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 return api;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 end)();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 -- Forward declarations, as both functions need to reference each other
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 local handle_push_success, handle_push_error;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76
14134
041c7ff18f76 mod_cloud_notify: Fix leaking iq response handlers by using send_iq()
Matthew Wild <mwild1@gmail.com>
parents: 13701
diff changeset
77 function handle_push_error(stanza)
13616
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 local error_type, condition, error_text = stanza:get_error();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 local node = id2node[stanza.attr.id];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 local identifier = id2identifier[stanza.attr.id];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 if node == nil then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 module:log("warn", "Received push error with unrecognised id: %s", stanza.attr.id);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 return false; -- unknown stanza? Ignore for now!
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 local from = stanza.attr.from;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 local user_push_services = push_store:get(node);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 local found, changed = false, false;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 for push_identifier, _ in pairs(user_push_services) do
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 if push_identifier == identifier then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 found = true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 if user_push_services[push_identifier] and user_push_services[push_identifier].jid == from and error_type ~= "wait" then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 push_errors[push_identifier] = push_errors[push_identifier] + 1;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 module:log("info", "Got error <%s:%s:%s> for identifier '%s': "
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 .."error count for this identifier is now at %s", error_type, condition, error_text or "", push_identifier,
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 tostring(push_errors[push_identifier]));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 if push_errors[push_identifier] >= max_push_errors then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 module:log("warn", "Disabling push notifications for identifier '%s'", push_identifier);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 -- remove push settings from sessions
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 if host_sessions[node] then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 for _, session in pairs(host_sessions[node].sessions) do
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 if session.push_identifier == push_identifier then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 session.push_identifier = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 session.push_settings = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 session.first_hibernated_push = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 -- check for prosody 0.12 mod_smacks
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 if session.hibernating_watchdog and session.original_smacks_callback and session.original_smacks_timeout then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 -- restore old smacks watchdog
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 session.hibernating_watchdog:cancel();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 session.hibernating_watchdog = watchdog.new(session.original_smacks_timeout, session.original_smacks_callback);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 -- save changed global config
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 changed = true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 user_push_services[push_identifier] = nil
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 push_errors[push_identifier] = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 elseif user_push_services[push_identifier] and user_push_services[push_identifier].jid == from and error_type == "wait" then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 module:log("debug", "Got error <%s:%s:%s> for identifier '%s': "
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 .."NOT increasing error count for this identifier", error_type, condition, error_text or "", push_identifier);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 else
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 module:log("debug", "Unhandled push error <%s:%s:%s> from %s for identifier '%s'",
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 error_type, condition, error_text or "", from, push_identifier
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 );
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130 if changed then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
131 push_store:flush_to_disk(node);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132 elseif not found then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 module:log("warn", "Unable to find matching registration for push error <%s:%s:%s> from %s", error_type, condition, error_text or "", from);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135 return true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137
14134
041c7ff18f76 mod_cloud_notify: Fix leaking iq response handlers by using send_iq()
Matthew Wild <mwild1@gmail.com>
parents: 13701
diff changeset
138 function handle_push_success(stanza)
13616
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139 local node = id2node[stanza.attr.id];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140 local identifier = id2identifier[stanza.attr.id];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
141 if node == nil then return false; end -- unknown stanza? Ignore for now!
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 local from = stanza.attr.from;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
143 local user_push_services = push_store:get(node);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
144
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
145 for push_identifier, _ in pairs(user_push_services) do
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 if push_identifier == identifier then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 if user_push_services[push_identifier] and user_push_services[push_identifier].jid == from and push_errors[push_identifier] > 0 then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148 push_errors[push_identifier] = 0;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149 module:log("debug", "Push succeeded, error count for identifier '%s' is now at %s again",
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 push_identifier, tostring(push_errors[push_identifier])
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151 );
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
152 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
153 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
154 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
155 return true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
156 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
157
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
158 -- http://xmpp.org/extensions/xep-0357.html#disco
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159 local function account_dico_info(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
160 (event.reply or event.stanza):tag("feature", {var=xmlns_push}):up();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
161 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
162 module:hook("account-disco-info", account_dico_info);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
163
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
164 -- http://xmpp.org/extensions/xep-0357.html#enabling
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165 local function push_enable(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 local origin, stanza = event.origin, event.stanza;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167 local enable = stanza.tags[1];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
168 origin.log("debug", "Attempting to enable push notifications");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 -- MUST contain a 'jid' attribute of the XMPP Push Service being enabled
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
170 local push_jid = enable.attr.jid;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171 -- SHOULD contain a 'node' attribute
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172 local push_node = enable.attr.node;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
173 -- CAN contain a 'include_payload' attribute
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174 local include_payload = enable.attr.include_payload;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 if not push_jid then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 origin.log("debug", "Push notification enable request missing the 'jid' field");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing jid"));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
178 return true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
179 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
180 if push_jid == stanza.attr.from then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
181 origin.log("debug", "Push notification enable request 'jid' field identical to our own");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
182 origin.send(st.error_reply(stanza, "modify", "bad-request", "JID must be different from ours"));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
183 return true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
185 local publish_options = enable:get_child("x", "jabber:x:data");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
186 if not publish_options then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
187 -- Could be intentional
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
188 origin.log("debug", "No publish options in request");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
189 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
190 local push_identifier = push_jid .. "<" .. (push_node or "");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
191 local push_service = {
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
192 jid = push_jid;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
193 node = push_node;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
194 include_payload = include_payload;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
195 options = publish_options and st.preserialize(publish_options);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
196 timestamp = os_time();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
197 client_id = origin.client_id;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
198 resource = not origin.client_id and origin.resource or nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
199 language = stanza.attr["xml:lang"];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
200 };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
201 local allow_registration = module:fire_event("cloud_notify/registration", {
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
202 origin = origin, stanza = stanza, push_info = push_service;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
203 });
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
204 if allow_registration == false then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
205 return true; -- Assume error reply already sent
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
206 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
207 push_store:set_identifier(origin.username, push_identifier, push_service);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
208 local ok = push_store:flush_to_disk(origin.username);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
209 if not ok then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
210 origin.send(st.error_reply(stanza, "wait", "internal-server-error"));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
211 else
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
212 origin.push_identifier = push_identifier;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
213 origin.push_settings = push_service;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
214 origin.first_hibernated_push = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
215 origin.log("info", "Push notifications enabled for %s (%s)", tostring(stanza.attr.from), tostring(origin.push_identifier));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
216 origin.send(st.reply(stanza));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
217 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
218 return true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
219 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
220 module:hook("iq-set/self/"..xmlns_push..":enable", push_enable);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
221
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
222 -- http://xmpp.org/extensions/xep-0357.html#disabling
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
223 local function push_disable(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
224 local origin, stanza = event.origin, event.stanza;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
225 local push_jid = stanza.tags[1].attr.jid; -- MUST include a 'jid' attribute
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
226 local push_node = stanza.tags[1].attr.node; -- A 'node' attribute MAY be included
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
227 if not push_jid then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
228 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing jid"));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
229 return true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
230 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
231 local user_push_services = push_store:get(origin.username);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
232 for key, push_info in pairs(user_push_services) do
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
233 if push_info.jid == push_jid and (not push_node or push_info.node == push_node) then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
234 origin.log("info", "Push notifications disabled (%s)", tostring(key));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
235 if origin.push_identifier == key then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
236 origin.push_identifier = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
237 origin.push_settings = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
238 origin.first_hibernated_push = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
239 -- check for prosody 0.12 mod_smacks
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
240 if origin.hibernating_watchdog and origin.original_smacks_callback and origin.original_smacks_timeout then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
241 -- restore old smacks watchdog
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
242 origin.hibernating_watchdog:cancel();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
243 origin.hibernating_watchdog = watchdog.new(origin.original_smacks_timeout, origin.original_smacks_callback);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
244 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
245 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
246 user_push_services[key] = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
247 push_errors[key] = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
248 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
249 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
250 local ok = push_store:flush_to_disk(origin.username);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
251 if not ok then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
252 origin.send(st.error_reply(stanza, "wait", "internal-server-error"));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
253 else
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
254 origin.send(st.reply(stanza));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
255 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
256 return true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
257 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
258 module:hook("iq-set/self/"..xmlns_push..":disable", push_disable);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
259
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
260 -- urgent stanzas should be delivered without delay
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
261 local function is_urgent(stanza)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
262 -- TODO
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
263 if stanza.name == "message" then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
264 if stanza:get_child("propose", "urn:xmpp:jingle-message:0") then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
265 return true, "jingle call";
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
266 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
267 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
268 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
269
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
270 -- is this push a high priority one (this is needed for ios apps not using voip pushes)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
271 local function is_important(stanza)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
272 local st_name = stanza and stanza.name or nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
273 if not st_name then return false; end -- nonzas are never important here
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
274 if st_name == "presence" then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
275 return false; -- same for presences
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
276 elseif st_name == "message" then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
277 -- unpack carbon copied message stanzas
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
278 local carbon = stanza:find("{urn:xmpp:carbons:2}/{urn:xmpp:forward:0}/{jabber:client}message");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
279 local stanza_direction = carbon and stanza:child_with_name("sent") and "out" or "in";
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
280 if carbon then stanza = carbon; end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
281 local st_type = stanza.attr.type;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
282
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
283 -- headline message are always not important
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
284 if st_type == "headline" then return false; end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
285
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
286 -- carbon copied outgoing messages are not important
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
287 if carbon and stanza_direction == "out" then return false; end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
288
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
289 -- We can't check for body contents in encrypted messages, so let's treat them as important
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
290 -- Some clients don't even set a body or an empty body for encrypted messages
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
291
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
292 -- check omemo https://xmpp.org/extensions/inbox/omemo.html
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
293 if stanza:get_child("encrypted", "eu.siacs.conversations.axolotl") or stanza:get_child("encrypted", "urn:xmpp:omemo:0") then return true; end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
294
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
295 -- check xep27 pgp https://xmpp.org/extensions/xep-0027.html
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
296 if stanza:get_child("x", "jabber:x:encrypted") then return true; end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
297
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
298 -- check xep373 pgp (OX) https://xmpp.org/extensions/xep-0373.html
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
299 if stanza:get_child("openpgp", "urn:xmpp:openpgp:0") then return true; end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
300
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
301 -- XEP-0353: Jingle Message Initiation (incoming call request)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
302 if stanza:get_child("propose", "urn:xmpp:jingle-message:0") then return true; end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
303
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
304 local body = stanza:get_child_text("body");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
305
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
306 -- groupchat subjects are not important here
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
307 if st_type == "groupchat" and stanza:get_child_text("subject") then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
308 return false;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
309 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
310
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
311 -- empty bodies are not important
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
312 return body ~= nil and body ~= "";
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
313 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
314 return false; -- this stanza wasn't one of the above cases --> it is not important, too
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
315 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
316
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
317 local push_form = dataform {
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
318 { name = "FORM_TYPE"; type = "hidden"; value = "urn:xmpp:push:summary"; };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
319 { name = "message-count"; type = "text-single"; };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
320 { name = "pending-subscription-count"; type = "text-single"; };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
321 { name = "last-message-sender"; type = "jid-single"; };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
322 { name = "last-message-body"; type = "text-single"; };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
323 };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
324
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
325 -- http://xmpp.org/extensions/xep-0357.html#publishing
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
326 local function handle_notify_request(stanza, node, user_push_services, log_push_decline)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
327 local pushes = 0;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
328 if not #user_push_services then return pushes end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
329
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
330 for push_identifier, push_info in pairs(user_push_services) do
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
331 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
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
332 if stanza then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
333 if not stanza._push_notify then stanza._push_notify = {}; end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
334 if stanza._push_notify[push_identifier] then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
335 if log_push_decline then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
336 module:log("debug", "Already sent push notification for %s@%s to %s (%s)", node, module.host, push_info.jid, tostring(push_info.node));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
337 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
338 send_push = false;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
339 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
340 stanza._push_notify[push_identifier] = true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
341 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
342
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
343 if send_push then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
344 -- construct push stanza
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
345 local stanza_id = hashes.sha256(random.bytes(8), true);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
346 local push_notification_payload = st.stanza("notification", { xmlns = xmlns_push });
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
347 local form_data = {
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
348 -- hardcode to 1 because other numbers are just meaningless (the XEP does not specify *what exactly* to count)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
349 ["message-count"] = "1";
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
350 };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
351 if stanza and include_sender then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
352 form_data["last-message-sender"] = stanza.attr.from;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
353 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
354 if stanza and include_body then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
355 form_data["last-message-body"] = stanza:get_child_text("body");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
356 elseif stanza and dummy_body and is_important(stanza) then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
357 form_data["last-message-body"] = tostring(dummy_body);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
358 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
359
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
360 push_notification_payload:add_child(push_form:form(form_data));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
361
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
362 local push_publish = st.iq({ to = push_info.jid, from = module.host, type = "set", id = stanza_id })
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
363 :tag("pubsub", { xmlns = "http://jabber.org/protocol/pubsub" })
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
364 :tag("publish", { node = push_info.node })
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
365 :tag("item")
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
366 :add_child(push_notification_payload)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
367 :up()
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
368 :up();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
369
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
370 if push_info.options then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
371 push_publish:tag("publish-options"):add_child(st.deserialize(push_info.options));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
372 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
373 -- send out push
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
374 module:log("debug", "Sending %s push notification for %s@%s to %s (%s)",
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
375 form_data["last-message-body"] and "important" or "unimportant",
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
376 node, module.host, push_info.jid, tostring(push_info.node)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
377 );
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
378 -- module:log("debug", "PUSH STANZA: %s", tostring(push_publish));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
379 local push_event = {
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
380 notification_stanza = push_publish;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
381 notification_payload = push_notification_payload;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
382 original_stanza = stanza;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
383 username = node;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
384 push_info = push_info;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
385 push_summary = form_data;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
386 important = not not form_data["last-message-body"];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
387 };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
388
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
389 if module:fire_event("cloud_notify/push", push_event) then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
390 module:log("debug", "Push was blocked by event handler: %s", push_event.reason or "Unknown reason");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
391 else
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
392 -- handle push errors for this node
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
393 if push_errors[push_identifier] == nil then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
394 push_errors[push_identifier] = 0;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
395 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
396 id2node[stanza_id] = node;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
397 id2identifier[stanza_id] = push_identifier;
14134
041c7ff18f76 mod_cloud_notify: Fix leaking iq response handlers by using send_iq()
Matthew Wild <mwild1@gmail.com>
parents: 13701
diff changeset
398 module:send_iq(push_publish):next(handle_push_success, handle_push_error):finally(function ()
041c7ff18f76 mod_cloud_notify: Fix leaking iq response handlers by using send_iq()
Matthew Wild <mwild1@gmail.com>
parents: 13701
diff changeset
399 -- unhook iq handlers for this identifier (if possible)
14167
f149652cb5ff mod_cloud_notify: Use correct stanza id when clearing table entries (mem leak)
Matthew Wild <mwild1@gmail.com>
parents: 14134
diff changeset
400 id2node[stanza_id] = nil;
f149652cb5ff mod_cloud_notify: Use correct stanza id when clearing table entries (mem leak)
Matthew Wild <mwild1@gmail.com>
parents: 14134
diff changeset
401 id2identifier[stanza_id] = nil;
14134
041c7ff18f76 mod_cloud_notify: Fix leaking iq response handlers by using send_iq()
Matthew Wild <mwild1@gmail.com>
parents: 13701
diff changeset
402 end);
13616
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
403 pushes = pushes + 1;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
404 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
405 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
406 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
407 return pushes;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
408 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
409
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
410 -- small helper function to extract relevant push settings
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
411 local function get_push_settings(stanza, session)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
412 local to = stanza.attr.to;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
413 local node = to and jid.split(to) or session.username;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
414 local user_push_services = push_store:get(node);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
415 return node, user_push_services;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
416 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
417
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
418 -- publish on offline message
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
419 module:hook("message/offline/handle", function(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
420 local node, user_push_services = get_push_settings(event.stanza, event.origin);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
421 module:log("debug", "Invoking cloud handle_notify_request() for offline stanza");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
422 handle_notify_request(event.stanza, node, user_push_services, true);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
423 end, 1);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
424
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
425 -- publish on bare groupchat
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
426 -- this picks up MUC messages when there are no devices connected
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
427 module:hook("message/bare/groupchat", function(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
428 module:log("debug", "Invoking cloud handle_notify_request() for bare groupchat stanza");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
429 local node, user_push_services = get_push_settings(event.stanza, event.origin);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
430 handle_notify_request(event.stanza, node, user_push_services, true);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
431 end, 1);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
432
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
433
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
434 local function process_stanza_queue(queue, session, queue_type)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
435 if not session.push_identifier then return; end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
436 local user_push_services = {[session.push_identifier] = session.push_settings};
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
437 local notified = { unimportant = false; important = false }
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
438 for i=1, #queue do
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
439 local stanza = queue[i];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
440 -- fast ignore of already pushed stanzas
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
441 if stanza and not (stanza._push_notify and stanza._push_notify[session.push_identifier]) then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
442 local node = get_push_settings(stanza, session);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
443 local stanza_type = "unimportant";
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
444 if dummy_body and is_important(stanza) then stanza_type = "important"; end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
445 if not notified[stanza_type] then -- only notify if we didn't try to push for this stanza type already
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
446 -- session.log("debug", "Invoking cloud handle_notify_request() for smacks queued stanza: %d", i);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
447 if handle_notify_request(stanza, node, user_push_services, false) ~= 0 then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
448 if session.hibernating and not session.first_hibernated_push then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
449 -- if important stanzas are treated differently (pushed with last-message-body field set to dummy string)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
450 -- if the message was important (e.g. had a last-message-body field) OR if we treat all pushes equally,
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
451 -- then record the time of first push in the session for the smack module which will extend its hibernation
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
452 -- timeout based on the value of session.first_hibernated_push
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
453 if not dummy_body or (dummy_body and is_important(stanza)) then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
454 session.first_hibernated_push = os_time();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
455 -- check for prosody 0.12 mod_smacks
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
456 if session.hibernating_watchdog and session.original_smacks_callback and session.original_smacks_timeout then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
457 -- restore old smacks watchdog (--> the start of our original timeout will be delayed until first push)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
458 session.hibernating_watchdog:cancel();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
459 session.hibernating_watchdog = watchdog.new(session.original_smacks_timeout, session.original_smacks_callback);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
460 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
461 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
462 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
463 session.log("debug", "Cloud handle_notify_request() > 0, not notifying for other %s queued stanzas of type %s", queue_type, stanza_type);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
464 notified[stanza_type] = true
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
465 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
466 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
467 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
468 if notified.unimportant and notified.important then break; end -- stop processing the queue if all push types are exhausted
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
469 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
470 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
471
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
472 -- publish on unacked smacks message (use timer to send out push for all stanzas submitted in a row only once)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
473 local function process_stanza(session, stanza)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
474 if session.push_identifier then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
475 session.log("debug", "adding new stanza to push_queue");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
476 if not session.push_queue then session.push_queue = {}; end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
477 local queue = session.push_queue;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
478 queue[#queue+1] = st.clone(stanza);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
479 if not session.awaiting_push_timer then -- timer not already running --> start new timer
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
480 session.log("debug", "Invoking cloud handle_notify_request() for newly smacks queued stanza (in a moment)");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
481 session.awaiting_push_timer = module:add_timer(1.0, function ()
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
482 session.log("debug", "Invoking cloud handle_notify_request() for newly smacks queued stanzas (now in timer)");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
483 process_stanza_queue(session.push_queue, session, "push");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
484 session.push_queue = {}; -- clean up queue after push
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
485 session.awaiting_push_timer = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
486 end);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
487 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
488 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
489 return stanza;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
490 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
491
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
492 local function process_smacks_stanza(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
493 local session = event.origin;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
494 local stanza = event.stanza;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
495 if not session.push_identifier then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
496 session.log("debug", "NOT invoking cloud handle_notify_request() for newly smacks queued stanza (session.push_identifier is not set: %s)",
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
497 session.push_identifier
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
498 );
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
499 else
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
500 process_stanza(session, stanza)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
501 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
502 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
503
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
504 -- smacks hibernation is started
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
505 local function hibernate_session(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
506 local session = event.origin;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
507 local queue = event.queue;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
508 session.first_hibernated_push = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
509 if session.push_identifier and session.hibernating_watchdog then -- check for prosody 0.12 mod_smacks
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
510 -- save old watchdog callback and timeout
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
511 session.original_smacks_callback = session.hibernating_watchdog.callback;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
512 session.original_smacks_timeout = session.hibernating_watchdog.timeout;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
513 -- cancel old watchdog and create a new watchdog with extended timeout
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
514 session.hibernating_watchdog:cancel();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
515 session.hibernating_watchdog = watchdog.new(extended_hibernation_timeout, function()
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
516 session.log("debug", "Push-extended smacks watchdog triggered");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
517 if session.original_smacks_callback then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
518 session.log("debug", "Calling original smacks watchdog handler");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
519 session.original_smacks_callback();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
520 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
521 end);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
522 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
523 -- process unacked stanzas
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
524 process_stanza_queue(queue, session, "smacks");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
525 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
526
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
527 -- smacks hibernation is ended
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
528 local function restore_session(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
529 local session = event.resumed;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
530 if session then -- older smacks module versions send only the "intermediate" session in event.session and no session.resumed one
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
531 if session.awaiting_push_timer then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
532 session.awaiting_push_timer:stop();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
533 session.awaiting_push_timer = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
534 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
535 session.first_hibernated_push = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
536 -- the extended smacks watchdog will be canceled by the smacks module, no need to anything here
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
537 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
538 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
539
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
540 -- smacks ack is delayed
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
541 local function ack_delayed(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
542 local session = event.origin;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
543 local queue = event.queue;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
544 local stanza = event.stanza;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
545 if not session.push_identifier then return; end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
546 if stanza then process_stanza(session, stanza); return; end -- don't iterate through smacks queue if we know which stanza triggered this
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
547 for i=1, #queue do
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
548 local queued_stanza = queue[i];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
549 -- process unacked stanzas (handle_notify_request() will only send push requests for new stanzas)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
550 process_stanza(session, queued_stanza);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
551 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
552 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
553
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
554 -- archive message added
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
555 local function archive_message_added(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
556 -- event is: { origin = origin, stanza = stanza, for_user = store_user, id = id }
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
557 -- only notify for new mam messages when at least one device is online
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
558 if not event.for_user or not host_sessions[event.for_user] then return; end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
559 local stanza = event.stanza;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
560 local user_session = host_sessions[event.for_user].sessions;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
561 local to = stanza.attr.to;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
562 to = to and jid.split(to) or event.origin.username;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
563
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
564 -- only notify if the stanza destination is the mam user we store it for
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
565 if event.for_user == to then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
566 local user_push_services = push_store:get(to);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
567
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
568 -- Urgent stanzas are time-sensitive (e.g. calls) and should
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
569 -- be pushed immediately to avoid getting stuck in the smacks
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
570 -- queue in case of dead connections, for example
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
571 local is_urgent_stanza, urgent_reason = is_urgent(event.stanza);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
572
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
573 local notify_push_services;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
574 if is_urgent_stanza then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
575 module:log("debug", "Urgent push for %s (%s)", to, urgent_reason);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
576 notify_push_services = user_push_services;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
577 else
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
578 -- only notify nodes with no active sessions (smacks is counted as active and handled separate)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
579 notify_push_services = {};
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
580 for identifier, push_info in pairs(user_push_services) do
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
581 local identifier_found = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
582 for _, session in pairs(user_session) do
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
583 if session.push_identifier == identifier then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
584 identifier_found = session;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
585 break;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
586 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
587 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
588 if identifier_found then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
589 identifier_found.log("debug", "Not cloud notifying '%s' of new MAM stanza (session still alive)", identifier);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
590 else
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
591 notify_push_services[identifier] = push_info;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
592 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
593 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
594 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
595
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
596 handle_notify_request(event.stanza, to, notify_push_services, true);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
597 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
598 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
599
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
600 module:hook("smacks-hibernation-start", hibernate_session);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
601 module:hook("smacks-hibernation-end", restore_session);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
602 module:hook("smacks-ack-delayed", ack_delayed);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
603 module:hook("smacks-hibernation-stanza-queued", process_smacks_stanza);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
604 module:hook("archive-message-added", archive_message_added);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
605
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
606 local function send_ping(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
607 local user = event.user;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
608 local push_services = event.push_services or push_store:get(user);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
609 module:log("debug", "Handling event 'cloud-notify-ping' for user '%s'", user);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
610 local retval = handle_notify_request(nil, user, push_services, true);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
611 module:log("debug", "handle_notify_request() returned %s", tostring(retval));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
612 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
613 -- can be used by other modules to ping one or more (or all) push endpoints
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
614 module:hook("cloud-notify-ping", send_ping);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
615
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
616 module:log("info", "Module loaded");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
617 function module.unload()
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
618 module:log("info", "Unloading module");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
619 -- cleanup some settings, reloading this module can cause process_smacks_stanza() to stop working otherwise
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
620 for user, _ in pairs(host_sessions) do
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
621 for _, session in pairs(host_sessions[user].sessions) do
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
622 if session.awaiting_push_timer then session.awaiting_push_timer:stop(); end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
623 session.awaiting_push_timer = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
624 session.push_queue = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
625 session.first_hibernated_push = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
626 -- check for prosody 0.12 mod_smacks
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
627 if session.hibernating_watchdog and session.original_smacks_callback and session.original_smacks_timeout then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
628 -- restore old smacks watchdog
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
629 session.hibernating_watchdog:cancel();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
630 session.hibernating_watchdog = watchdog.new(session.original_smacks_timeout, session.original_smacks_callback);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
631 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
632 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
633 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
634 module:log("info", "Module unloaded");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
635 end