diff mod_delegation/mod_delegation.lua @ 1723:ef85c42ad977

mod_delegation: fixed bad handling of error replies from managing entity
author Goffi <goffi@goffi.org>
date Mon, 04 May 2015 18:44:00 +0200
parents c48c7f948cfb
children 2440a75e868f
line wrap: on
line diff
--- a/mod_delegation/mod_delegation.lua	Mon May 04 18:43:17 2015 +0200
+++ b/mod_delegation/mod_delegation.lua	Mon May 04 18:44:00 2015 +0200
@@ -183,18 +183,22 @@
 	end
 
 	local iq = forwarded.tags[1]
-	if #forwarded ~= 1 or iq.name ~= "iq" or #iq ~= 1 then
+	if #forwarded ~= 1 or iq.name ~= "iq" or
+		(iq.attr.type =='result' and #iq ~= 1) or
+		(iq.attr.type == 'error' and #iq > 2) then
 		module:log("warn", "ignoring invalid iq result from managing entity %s", stanza.attr.from)
 		stanza_cache[stanza.attr.from][stanza.attr.id] = nil
 		return true
 	end
 
-	local namespace = iq.tags[1].xmlns
-	local ns_data = ns_delegations[namespace]
 	local original = stanza_cache[stanza.attr.from][stanza.attr.id]
 	stanza_cache[stanza.attr.from][stanza.attr.id] = nil
+	-- we get namespace from original and not iq
+	-- because the namespace can be lacking in case of error
+	local namespace = original.tags[1].attr.xmlns
+	local ns_data = ns_delegations[namespace]
 
-	if stanza.attr.from ~= ns_data.connected or iq.attr.type ~= "result" or
+	if stanza.attr.from ~= ns_data.connected or (iq.attr.type ~= "result" and iq.attr.type ~= "error") or
 		iq.attr.id ~= original.attr.id or iq.attr.to ~= original.attr.from then
 		module:log("warn", "ignoring forbidden iq result from managing entity %s, please check that the component is no trying to do something bad (stanza: %s)", stanza.attr.from, tostring(stanza))
 		module:send(st.error_reply(original, 'cancel', 'service-unavailable'))