comparison mod_cloud_notify/mod_cloud_notify.lua @ 3085:1ea6861b533f

mod_cloud_notify: Don't change table while iterating it
author tmolitor <thilo@eightysoft.de>
date Sat, 02 Jun 2018 02:58:45 +0200
parents 2a918a8c47db
children cfcb020bcd1d
comparison
equal deleted inserted replaced
3084:5b4e7db5943c 3085:1ea6861b533f
136 local error_type, condition = stanza:get_error(); 136 local error_type, condition = stanza:get_error();
137 local node = id2node[stanza.attr.id]; 137 local node = id2node[stanza.attr.id];
138 if node == nil then return false; end -- unknown stanza? Ignore for now! 138 if node == nil then return false; end -- unknown stanza? Ignore for now!
139 local from = stanza.attr.from; 139 local from = stanza.attr.from;
140 local user_push_services = push_store:get(node); 140 local user_push_services = push_store:get(node);
141 local changed = false;
141 142
142 for push_identifier, _ in pairs(user_push_services) do 143 for push_identifier, _ in pairs(user_push_services) do
143 local stanza_id = hashes.sha256(push_identifier, true); 144 local stanza_id = hashes.sha256(push_identifier, true);
144 if stanza_id == stanza.attr.id then 145 if stanza_id == stanza.attr.id then
145 if user_push_services[push_identifier] and user_push_services[push_identifier].jid == from and error_type ~= "wait" then 146 if user_push_services[push_identifier] and user_push_services[push_identifier].jid == from and error_type ~= "wait" then
157 session.push_settings = nil; 158 session.push_settings = nil;
158 end 159 end
159 end 160 end
160 end 161 end
161 -- save changed global config 162 -- save changed global config
162 push_store:set_identifier(node, push_identifier, nil); 163 changed = true;
164 user_push_services[push_identifier] = nil
163 push_errors[push_identifier] = nil; 165 push_errors[push_identifier] = nil;
164 -- unhook iq handlers for this identifier (if possible) 166 -- unhook iq handlers for this identifier (if possible)
165 if module.unhook then 167 if module.unhook then
166 module:unhook("iq-error/host/"..stanza_id, handle_push_error); 168 module:unhook("iq-error/host/"..stanza_id, handle_push_error);
167 module:unhook("iq-result/host/"..stanza_id, handle_push_success); 169 module:unhook("iq-result/host/"..stanza_id, handle_push_success);
171 elseif user_push_services[push_identifier] and user_push_services[push_identifier].jid == from and error_type == "wait" then 173 elseif user_push_services[push_identifier] and user_push_services[push_identifier].jid == from and error_type == "wait" then
172 module:log("debug", "Got error of type '%s' (%s) for identifier '%s': " 174 module:log("debug", "Got error of type '%s' (%s) for identifier '%s': "
173 .."NOT increasing error count for this identifier", error_type, condition, push_identifier); 175 .."NOT increasing error count for this identifier", error_type, condition, push_identifier);
174 end 176 end
175 end 177 end
178 end
179 if changed then
180 push_store:set(node, user_push_services);
176 end 181 end
177 return true; 182 return true;
178 end 183 end
179 184
180 function handle_push_success(event) 185 function handle_push_success(event)