Software / code / prosody-modules
Comparison
mod_cloud_notify/mod_cloud_notify.lua @ 2791:008cf272b7ea
mod_cloud_notify: Fix regression in error handling
The last commit made push error handling not working at all.
| author | tmolitor <thilo@eightysoft.de> |
|---|---|
| date | Wed, 11 Oct 2017 03:10:40 +0200 |
| parent | 2751:6b710a8bdf03 |
| child | 2792:7622ec165cdd |
comparison
equal
deleted
inserted
replaced
| 2790:5163f7905371 | 2791:008cf272b7ea |
|---|---|
| 18 local include_sender = module:get_option_boolean("push_notification_with_sender", false); | 18 local include_sender = module:get_option_boolean("push_notification_with_sender", false); |
| 19 local max_push_errors = module:get_option_number("push_max_errors", 50); | 19 local max_push_errors = module:get_option_number("push_max_errors", 50); |
| 20 | 20 |
| 21 local host_sessions = prosody.hosts[module.host].sessions; | 21 local host_sessions = prosody.hosts[module.host].sessions; |
| 22 local push_errors = {}; | 22 local push_errors = {}; |
| 23 local id2node = {}; | |
| 23 | 24 |
| 24 -- For keeping state across reloads while caching reads | 25 -- For keeping state across reloads while caching reads |
| 25 local push_store = (function() | 26 local push_store = (function() |
| 26 local store = module:open_store(); | 27 local store = module:open_store(); |
| 27 local push_services = {}; | 28 local push_services = {}; |
| 60 local handle_push_success, handle_push_error; | 61 local handle_push_success, handle_push_error; |
| 61 | 62 |
| 62 function handle_push_error(event) | 63 function handle_push_error(event) |
| 63 local stanza = event.stanza; | 64 local stanza = event.stanza; |
| 64 local error_type, condition = stanza:get_error(); | 65 local error_type, condition = stanza:get_error(); |
| 65 local node = jid.split(stanza.attr.to); | 66 local node = id2node[stanza.attr.id]; |
| 67 if node == nil then return false; end -- unknown stanza? Ignore for now! | |
| 66 local from = stanza.attr.from; | 68 local from = stanza.attr.from; |
| 67 local user_push_services = push_store:get(node); | 69 local user_push_services = push_store:get(node); |
| 68 | 70 |
| 69 for push_identifier, _ in pairs(user_push_services) do | 71 for push_identifier, _ in pairs(user_push_services) do |
| 70 local stanza_id = hashes.sha256(push_identifier, true); | 72 local stanza_id = hashes.sha256(push_identifier, true); |
| 71 if stanza_id == stanza.attr.id then | 73 if stanza_id == stanza.attr.id then |
| 72 if user_push_services[push_identifier] and user_push_services[push_identifier].jid == from and error_type ~= "wait" then | 74 if user_push_services[push_identifier] and user_push_services[push_identifier].jid == from and error_type ~= "wait" then |
| 73 push_errors[push_identifier] = push_errors[push_identifier] + 1; | 75 push_errors[push_identifier] = push_errors[push_identifier] + 1; |
| 88 -- save changed global config | 90 -- save changed global config |
| 89 push_store:set_identifier(node, push_identifier, nil); | 91 push_store:set_identifier(node, push_identifier, nil); |
| 90 push_errors[push_identifier] = nil; | 92 push_errors[push_identifier] = nil; |
| 91 -- unhook iq handlers for this identifier (if possible) | 93 -- unhook iq handlers for this identifier (if possible) |
| 92 if module.unhook then | 94 if module.unhook then |
| 93 module:unhook("iq-error/bare/"..stanza_id, handle_push_error); | 95 module:unhook("iq-error/host/"..stanza_id, handle_push_error); |
| 94 module:unhook("iq-result/bare/"..stanza_id, handle_push_success); | 96 module:unhook("iq-result/host/"..stanza_id, handle_push_success); |
| 97 id2node[stanza_id] = nil; | |
| 95 end | 98 end |
| 96 end | 99 end |
| 97 elseif user_push_services[push_identifier] and user_push_services[push_identifier].jid == from and error_type == "wait" then | 100 elseif user_push_services[push_identifier] and user_push_services[push_identifier].jid == from and error_type == "wait" then |
| 98 module:log("debug", "Got error of type '%s' (%s) for identifier '%s': " | 101 module:log("debug", "Got error of type '%s' (%s) for identifier '%s': " |
| 99 .."NOT increasing error count for this identifier", error_type, condition, push_identifier); | 102 .."NOT increasing error count for this identifier", error_type, condition, push_identifier); |
| 103 return true; | 106 return true; |
| 104 end | 107 end |
| 105 | 108 |
| 106 function handle_push_success(event) | 109 function handle_push_success(event) |
| 107 local stanza = event.stanza; | 110 local stanza = event.stanza; |
| 108 local node = jid.split(stanza.attr.to); | 111 local node = id2node[stanza.attr.id]; |
| 112 if node == nil then return false; end -- unknown stanza? Ignore for now! | |
| 109 local from = stanza.attr.from; | 113 local from = stanza.attr.from; |
| 110 local user_push_services = push_store:get(node); | 114 local user_push_services = push_store:get(node); |
| 111 | 115 |
| 112 for push_identifier, _ in pairs(user_push_services) do | 116 for push_identifier, _ in pairs(user_push_services) do |
| 113 if hashes.sha256(push_identifier, true) == stanza.attr.id then | 117 if hashes.sha256(push_identifier, true) == stanza.attr.id then |
| 114 if user_push_services[push_identifier] and user_push_services[push_identifier].jid == from and push_errors[push_identifier] > 0 then | 118 if user_push_services[push_identifier] and user_push_services[push_identifier].jid == from and push_errors[push_identifier] > 0 then |
| 115 push_errors[push_identifier] = 0; | 119 push_errors[push_identifier] = 0; |
| 116 module:log("debug", "Push succeeded, error count for identifier '%s' is now at %s again", push_identifier, tostring(push_errors[push_identifier])); | 120 module:log("debug", "Push succeeded, error count for identifier '%s' is now at %s again", push_identifier, tostring(push_errors[push_identifier])); |
| 186 origin.push_settings = nil; | 190 origin.push_settings = nil; |
| 187 end | 191 end |
| 188 user_push_services[key] = nil; | 192 user_push_services[key] = nil; |
| 189 push_errors[key] = nil; | 193 push_errors[key] = nil; |
| 190 if module.unhook then | 194 if module.unhook then |
| 191 module:unhook("iq-error/bare/"..key, handle_push_error); | 195 module:unhook("iq-error/host/"..key, handle_push_error); |
| 192 module:unhook("iq-result/bare/"..key, handle_push_success); | 196 module:unhook("iq-result/host/"..key, handle_push_success); |
| 197 id2node[key] = nil; | |
| 193 end | 198 end |
| 194 end | 199 end |
| 195 end | 200 end |
| 196 local ok = push_store:set(origin.username, user_push_services); | 201 local ok = push_store:set(origin.username, user_push_services); |
| 197 if not ok then | 202 if not ok then |
| 224 { name = "FORM_TYPE"; type = "hidden"; value = "urn:xmpp:push:summary"; }; | 229 { name = "FORM_TYPE"; type = "hidden"; value = "urn:xmpp:push:summary"; }; |
| 225 { name = "message-count"; type = "text-single"; }; | 230 { name = "message-count"; type = "text-single"; }; |
| 226 { name = "pending-subscription-count"; type = "text-single"; }; | 231 { name = "pending-subscription-count"; type = "text-single"; }; |
| 227 { name = "last-message-sender"; type = "jid-single"; }; | 232 { name = "last-message-sender"; type = "jid-single"; }; |
| 228 { name = "last-message-body"; type = "text-single"; }; | 233 { name = "last-message-body"; type = "text-single"; }; |
| 234 { name = "last-message-priority"; type = "text-single"; }; | |
| 229 }; | 235 }; |
| 230 | 236 |
| 231 -- http://xmpp.org/extensions/xep-0357.html#publishing | 237 -- http://xmpp.org/extensions/xep-0357.html#publishing |
| 232 local function handle_notify_request(stanza, node, user_push_services) | 238 local function handle_notify_request(stanza, node, user_push_services) |
| 233 local pushes = 0; | 239 local pushes = 0; |
| 262 form_data["last-message-sender"] = stanza.attr.from; | 268 form_data["last-message-sender"] = stanza.attr.from; |
| 263 end | 269 end |
| 264 if stanza and include_body then | 270 if stanza and include_body then |
| 265 form_data["last-message-body"] = stanza:get_child_text("body"); | 271 form_data["last-message-body"] = stanza:get_child_text("body"); |
| 266 end | 272 end |
| 273 if stanza then | |
| 274 if stanza:get_child("body") or stanza:get_child("encrypted", "eu.siacs.conversations.axolotl") then | |
| 275 form_data["last-message-priority"] = "high"; | |
| 276 else | |
| 277 form_data["last-message-priority"] = "low"; | |
| 278 end | |
| 279 end | |
| 267 push_publish:add_child(push_form:form(form_data)); | 280 push_publish:add_child(push_form:form(form_data)); |
| 268 if stanza and push_info.include_payload == "stripped" then | 281 if stanza and push_info.include_payload == "stripped" then |
| 269 push_publish:tag("payload", { type = "stripped" }) | 282 push_publish:tag("payload", { type = "stripped" }) |
| 270 :add_child(strip_stanza(stanza)); | 283 :add_child(strip_stanza(stanza)); |
| 271 push_publish:up(); -- / payload | 284 push_publish:up(); -- / payload |
| 285 module:log("debug", "Sending push notification for %s@%s to %s (%s)", node, module.host, push_info.jid, tostring(push_info.node)); | 298 module:log("debug", "Sending push notification for %s@%s to %s (%s)", node, module.host, push_info.jid, tostring(push_info.node)); |
| 286 -- module:log("debug", "PUSH STANZA: %s", tostring(push_publish)); | 299 -- module:log("debug", "PUSH STANZA: %s", tostring(push_publish)); |
| 287 -- handle push errors for this node | 300 -- handle push errors for this node |
| 288 if push_errors[push_identifier] == nil then | 301 if push_errors[push_identifier] == nil then |
| 289 push_errors[push_identifier] = 0; | 302 push_errors[push_identifier] = 0; |
| 290 module:hook("iq-error/bare/"..stanza_id, handle_push_error); | 303 module:hook("iq-error/host/"..stanza_id, handle_push_error); |
| 291 module:hook("iq-result/bare/"..stanza_id, handle_push_success); | 304 module:hook("iq-result/host/"..stanza_id, handle_push_success); |
| 305 id2node[stanza_id] = node; | |
| 292 end | 306 end |
| 293 module:send(push_publish); | 307 module:send(push_publish); |
| 294 pushes = pushes + 1; | 308 pushes = pushes + 1; |
| 295 end | 309 end |
| 296 end | 310 end |
| 432 module:unhook("archive-message-added", archive_message_added); | 446 module:unhook("archive-message-added", archive_message_added); |
| 433 module:unhook("cloud-notify-ping", send_ping); | 447 module:unhook("cloud-notify-ping", send_ping); |
| 434 | 448 |
| 435 for push_identifier, _ in pairs(push_errors) do | 449 for push_identifier, _ in pairs(push_errors) do |
| 436 local stanza_id = hashes.sha256(push_identifier, true); | 450 local stanza_id = hashes.sha256(push_identifier, true); |
| 437 module:unhook("iq-error/bare/"..stanza_id, handle_push_error); | 451 module:unhook("iq-error/host/"..stanza_id, handle_push_error); |
| 438 module:unhook("iq-result/bare/"..stanza_id, handle_push_success); | 452 module:unhook("iq-result/host/"..stanza_id, handle_push_success); |
| 453 id2node[stanza_id] = nil; | |
| 439 end | 454 end |
| 440 end | 455 end |
| 441 | 456 |
| 442 module:log("info", "Module unloaded"); | 457 module:log("info", "Module unloaded"); |
| 443 end | 458 end |