Annotate

plugins/mod_cloud_notify.lua @ 13752:49bbdc22846d 13.0

certmanager: Add more debug logging around cert indexing Currently it's not obvious which directories have been indexed (especially when the resulting index is empty), or why certain files have been skipped.
author Matthew Wild <mwild1@gmail.com>
date Mon, 24 Feb 2025 17:48:58 +0000
parent 13701:1aa7efabeacb
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
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 function handle_push_error(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 local stanza = event.stanza;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 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
80 local node = id2node[stanza.attr.id];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 local identifier = id2identifier[stanza.attr.id];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 if node == nil then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 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
84 return false; -- unknown stanza? Ignore for now!
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 local from = stanza.attr.from;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 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
88 local found, changed = false, false;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 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
91 if push_identifier == identifier then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 found = true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 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
94 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
95 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
96 .."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
97 tostring(push_errors[push_identifier]));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 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
99 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
100 -- remove push settings from sessions
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 if host_sessions[node] then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 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
103 if session.push_identifier == push_identifier then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 session.push_identifier = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 session.push_settings = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 session.first_hibernated_push = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 -- check for prosody 0.12 mod_smacks
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 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
109 -- restore old smacks watchdog
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 session.hibernating_watchdog:cancel();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 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
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 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 -- save changed global config
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 changed = true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 user_push_services[push_identifier] = nil
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 push_errors[push_identifier] = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 -- unhook iq handlers for this identifier (if possible)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 module:unhook("iq-error/host/"..stanza.attr.id, handle_push_error);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 module:unhook("iq-result/host/"..stanza.attr.id, handle_push_success);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 id2node[stanza.attr.id] = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 id2identifier[stanza.attr.id] = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 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
127 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
128 .."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
129 else
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130 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
131 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
132 );
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 end
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 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136 if changed then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137 push_store:flush_to_disk(node);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 elseif not found then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139 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
140 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
141 return true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
143
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
144 function handle_push_success(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
145 local stanza = event.stanza;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 local node = id2node[stanza.attr.id];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 local identifier = id2identifier[stanza.attr.id];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148 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
149 local from = stanza.attr.from;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 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
151
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
152 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
153 if push_identifier == identifier then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
154 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
155 push_errors[push_identifier] = 0;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
156 -- unhook iq handlers for this identifier (if possible)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
157 module:unhook("iq-error/host/"..stanza.attr.id, handle_push_error);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
158 module:unhook("iq-result/host/"..stanza.attr.id, handle_push_success);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159 id2node[stanza.attr.id] = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
160 id2identifier[stanza.attr.id] = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
161 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
162 push_identifier, tostring(push_errors[push_identifier])
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 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167 return true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
168 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
170 -- 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
171 local function account_dico_info(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172 (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
173 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174 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
175
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 -- 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
177 local function push_enable(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
178 local origin, stanza = event.origin, event.stanza;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
179 local enable = stanza.tags[1];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
180 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
181 -- 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
182 local push_jid = enable.attr.jid;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
183 -- SHOULD contain a 'node' attribute
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184 local push_node = enable.attr.node;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
185 -- CAN contain a 'include_payload' attribute
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
186 local include_payload = enable.attr.include_payload;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
187 if not push_jid then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
188 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
189 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
190 return true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
191 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
192 if push_jid == stanza.attr.from then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
193 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
194 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
195 return true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
196 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
197 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
198 if not publish_options then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
199 -- Could be intentional
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
200 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
201 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
202 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
203 local push_service = {
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
204 jid = push_jid;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
205 node = push_node;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
206 include_payload = include_payload;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
207 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
208 timestamp = os_time();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
209 client_id = origin.client_id;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
210 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
211 language = stanza.attr["xml:lang"];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
212 };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
213 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
214 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
215 });
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
216 if allow_registration == false then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
217 return true; -- Assume error reply already sent
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
218 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
219 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
220 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
221 if not ok then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
222 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
223 else
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
224 origin.push_identifier = push_identifier;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
225 origin.push_settings = push_service;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
226 origin.first_hibernated_push = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
227 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
228 origin.send(st.reply(stanza));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
229 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
230 return true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
231 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
232 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
233
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
234 -- 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
235 local function push_disable(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
236 local origin, stanza = event.origin, event.stanza;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
237 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
238 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
239 if not push_jid then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
240 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
241 return true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
242 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
243 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
244 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
245 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
246 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
247 if origin.push_identifier == key then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
248 origin.push_identifier = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
249 origin.push_settings = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
250 origin.first_hibernated_push = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
251 -- check for prosody 0.12 mod_smacks
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
252 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
253 -- restore old smacks watchdog
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
254 origin.hibernating_watchdog:cancel();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
255 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
256 end
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 user_push_services[key] = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
259 push_errors[key] = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
260 for stanza_id, identifier in pairs(id2identifier) do
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
261 if identifier == key then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
262 module:unhook("iq-error/host/"..stanza_id, handle_push_error);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
263 module:unhook("iq-result/host/"..stanza_id, handle_push_success);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
264 id2node[stanza_id] = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
265 id2identifier[stanza_id] = nil;
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 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
270 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
271 if not ok then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
272 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
273 else
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
274 origin.send(st.reply(stanza));
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
275 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
276 return true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
277 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
278 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
279
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
280 -- urgent stanzas should be delivered without delay
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
281 local function is_urgent(stanza)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
282 -- TODO
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
283 if stanza.name == "message" then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
284 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
285 return true, "jingle call";
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
286 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
287 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
288 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
289
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
290 -- 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
291 local function is_important(stanza)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
292 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
293 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
294 if st_name == "presence" then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
295 return false; -- same for presences
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
296 elseif st_name == "message" then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
297 -- unpack carbon copied message stanzas
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
298 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
299 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
300 if carbon then stanza = carbon; end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
301 local st_type = stanza.attr.type;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
302
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
303 -- headline message are always not important
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
304 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
305
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
306 -- carbon copied outgoing messages are not important
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
307 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
308
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
309 -- 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
310 -- 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
311
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
312 -- 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
313 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
314
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
315 -- 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
316 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
317
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
318 -- 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
319 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
320
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
321 -- 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
322 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
323
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
324 local body = stanza:get_child_text("body");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
325
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
326 -- groupchat subjects are not important here
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
327 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
328 return false;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
329 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
330
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
331 -- empty bodies are not important
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
332 return body ~= nil and body ~= "";
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
333 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
334 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
335 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
336
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
337 local push_form = dataform {
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
338 { 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
339 { name = "message-count"; type = "text-single"; };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
340 { name = "pending-subscription-count"; type = "text-single"; };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
341 { name = "last-message-sender"; type = "jid-single"; };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
342 { name = "last-message-body"; type = "text-single"; };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
343 };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
344
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
345 -- 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
346 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
347 local pushes = 0;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
348 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
349
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
350 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
351 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
352 if stanza then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
353 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
354 if stanza._push_notify[push_identifier] then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
355 if log_push_decline then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
356 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
357 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
358 send_push = false;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
359 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
360 stanza._push_notify[push_identifier] = true;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
361 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
362
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
363 if send_push then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
364 -- construct push stanza
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
365 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
366 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
367 local form_data = {
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
368 -- 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
369 ["message-count"] = "1";
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
370 };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
371 if stanza and include_sender then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
372 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
373 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
374 if stanza and include_body then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
375 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
376 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
377 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
378 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
379
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
380 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
381
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
382 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
383 :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
384 :tag("publish", { node = push_info.node })
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
385 :tag("item")
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
386 :add_child(push_notification_payload)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
387 :up()
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
388 :up();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
389
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
390 if push_info.options then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
391 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
392 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
393 -- send out push
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
394 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
395 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
396 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
397 );
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
398 -- 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
399 local push_event = {
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
400 notification_stanza = push_publish;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
401 notification_payload = push_notification_payload;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
402 original_stanza = stanza;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
403 username = node;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
404 push_info = push_info;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
405 push_summary = form_data;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
406 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
407 };
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
408
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
409 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
410 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
411 else
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
412 -- handle push errors for this node
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
413 if push_errors[push_identifier] == nil then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
414 push_errors[push_identifier] = 0;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
415 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
416 module:hook("iq-error/host/"..stanza_id, handle_push_error);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
417 module:hook("iq-result/host/"..stanza_id, handle_push_success);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
418 id2node[stanza_id] = node;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
419 id2identifier[stanza_id] = push_identifier;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
420 module:send(push_publish);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
421 pushes = pushes + 1;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
422 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
423 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
424 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
425 return pushes;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
426 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
427
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
428 -- 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
429 local function get_push_settings(stanza, session)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
430 local to = stanza.attr.to;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
431 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
432 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
433 return node, user_push_services;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
434 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
435
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
436 -- publish on offline message
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
437 module:hook("message/offline/handle", function(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
438 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
439 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
440 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
441 end, 1);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
442
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
443 -- publish on bare groupchat
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
444 -- 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
445 module:hook("message/bare/groupchat", function(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
446 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
447 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
448 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
449 end, 1);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
450
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
451
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
452 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
453 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
454 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
455 local notified = { unimportant = false; important = false }
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
456 for i=1, #queue do
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
457 local stanza = queue[i];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
458 -- fast ignore of already pushed stanzas
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
459 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
460 local node = get_push_settings(stanza, session);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
461 local stanza_type = "unimportant";
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
462 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
463 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
464 -- 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
465 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
466 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
467 -- 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
468 -- 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
469 -- 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
470 -- 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
471 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
472 session.first_hibernated_push = os_time();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
473 -- check for prosody 0.12 mod_smacks
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
474 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
475 -- 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
476 session.hibernating_watchdog:cancel();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
477 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
478 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
479 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
480 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
481 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
482 notified[stanza_type] = true
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
483 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
484 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
485 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
486 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
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
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
490 -- 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
491 local function process_stanza(session, stanza)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
492 if session.push_identifier then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
493 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
494 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
495 local queue = session.push_queue;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
496 queue[#queue+1] = st.clone(stanza);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
497 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
498 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
499 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
500 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
501 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
502 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
503 session.awaiting_push_timer = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
504 end);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
505 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
506 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
507 return stanza;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
508 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
509
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
510 local function process_smacks_stanza(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
511 local session = event.origin;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
512 local stanza = event.stanza;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
513 if not session.push_identifier then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
514 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
515 session.push_identifier
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
516 );
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
517 else
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
518 process_stanza(session, stanza)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
519 end
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
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
522 -- smacks hibernation is started
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
523 local function hibernate_session(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
524 local session = event.origin;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
525 local queue = event.queue;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
526 session.first_hibernated_push = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
527 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
528 -- save old watchdog callback and timeout
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
529 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
530 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
531 -- 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
532 session.hibernating_watchdog:cancel();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
533 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
534 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
535 if session.original_smacks_callback then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
536 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
537 session.original_smacks_callback();
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 end);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
540 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
541 -- process unacked stanzas
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
542 process_stanza_queue(queue, session, "smacks");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
543 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
544
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
545 -- smacks hibernation is ended
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
546 local function restore_session(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
547 local session = event.resumed;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
548 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
549 if session.awaiting_push_timer then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
550 session.awaiting_push_timer:stop();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
551 session.awaiting_push_timer = nil;
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 session.first_hibernated_push = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
554 -- 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
555 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
556 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
557
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
558 -- smacks ack is delayed
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
559 local function ack_delayed(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
560 local session = event.origin;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
561 local queue = event.queue;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
562 local stanza = event.stanza;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
563 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
564 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
565 for i=1, #queue do
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
566 local queued_stanza = queue[i];
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
567 -- 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
568 process_stanza(session, queued_stanza);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
569 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
570 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
571
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
572 -- archive message added
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
573 local function archive_message_added(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
574 -- 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
575 -- 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
576 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
577 local stanza = event.stanza;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
578 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
579 local to = stanza.attr.to;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
580 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
581
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
582 -- 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
583 if event.for_user == to then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
584 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
585
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
586 -- 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
587 -- 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
588 -- 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
589 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
590
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
591 local notify_push_services;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
592 if is_urgent_stanza then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
593 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
594 notify_push_services = user_push_services;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
595 else
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
596 -- 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
597 notify_push_services = {};
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
598 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
599 local identifier_found = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
600 for _, session in pairs(user_session) do
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
601 if session.push_identifier == identifier then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
602 identifier_found = session;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
603 break;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
604 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
605 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
606 if identifier_found then
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
607 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
608 else
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
609 notify_push_services[identifier] = push_info;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
610 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
611 end
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
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
614 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
615 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
616 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
617
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
618 module:hook("smacks-hibernation-start", hibernate_session);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
619 module:hook("smacks-hibernation-end", restore_session);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
620 module:hook("smacks-ack-delayed", ack_delayed);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
621 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
622 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
623
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
624 local function send_ping(event)
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
625 local user = event.user;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
626 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
627 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
628 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
629 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
630 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
631 -- 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
632 module:hook("cloud-notify-ping", send_ping);
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
633
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
634 module:log("info", "Module loaded");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
635 function module.unload()
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
636 module:log("info", "Unloading module");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
637 -- 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
638 for user, _ in pairs(host_sessions) do
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
639 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
640 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
641 session.awaiting_push_timer = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
642 session.push_queue = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
643 session.first_hibernated_push = nil;
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
644 -- check for prosody 0.12 mod_smacks
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
645 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
646 -- restore old smacks watchdog
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
647 session.hibernating_watchdog:cancel();
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
648 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
649 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
650 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
651 end
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
652 module:log("info", "Module unloaded");
2f38f3275a74 mod_cloud_notify: Merge from prosody-modules@fc521fb5ffa0
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
653 end