Merge 0.9->0.10
authorKim Alvefur <zash@zash.se>
Tue, 09 Sep 2014 14:42:33 +0200
changeset 6403 b058486e6a79
parent 6398 ad434f47bfc0 (current diff)
parent 6402 e3de64f7c44d (diff)
child 6404 166d1bd8fc38
Merge 0.9->0.10
core/stanza_router.lua
--- a/core/stanza_router.lua	Fri Sep 05 19:08:42 2014 +0100
+++ b/core/stanza_router.lua	Tue Sep 09 14:42:33 2014 +0200
@@ -29,24 +29,25 @@
 deprecated_warning"core_process_stanza";
 deprecated_warning"core_route_stanza";
 
+local valid_stanzas = { message = true, presence = true, iq = true };
 local function handle_unhandled_stanza(host, origin, stanza)
 	local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns or "jabber:client", origin.type;
-	if name == "iq" and xmlns == "jabber:client" then
-		if stanza.attr.type == "get" or stanza.attr.type == "set" then
+	if xmlns == "jabber:client" and valid_stanzas[name] then
+		-- A normal stanza
+		local st_type = stanza.attr.type;
+		if st_type == "error" or (name == "iq" and st_type == "result") then
+			log("debug", "Discarding %s from %s of type: %s", name, origin_type, st_type or '<nil>');
+			return;
+		end
+		if name == "iq" and (st_type == "get" or st_type == "set") and stanza.tags[1] then
 			xmlns = stanza.tags[1].attr.xmlns or "jabber:client";
-			log("debug", "Stanza of type %s from %s has xmlns: %s", name, origin_type, xmlns);
-		else
-			log("debug", "Discarding %s from %s of type: %s", name, origin_type, stanza.attr.type);
-			return true;
 		end
-	end
-	if stanza.attr.xmlns == nil and origin.send then
-		log("debug", "Unhandled %s stanza: %s; xmlns=%s", origin.type, stanza.name, xmlns); -- we didn't handle it
-		if stanza.attr.type ~= "error" and stanza.attr.type ~= "result" then
+		log("debug", "Unhandled %s stanza: %s; xmlns=%s", origin_type, name, xmlns);
+		if origin.send then
 			origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
 		end
 	elseif not((name == "features" or name == "error") and xmlns == "http://etherx.jabber.org/streams") then -- FIXME remove check once we handle S2S features
-		log("warn", "Unhandled %s stream element or stanza: %s; xmlns=%s: %s", origin.type, stanza.name, xmlns, tostring(stanza)); -- we didn't handle it
+		log("warn", "Unhandled %s stream element or stanza: %s; xmlns=%s: %s", origin_type, name, xmlns, tostring(stanza)); -- we didn't handle it
 		origin:close("unsupported-stanza-type");
 	end
 end
@@ -55,19 +56,21 @@
 function core_process_stanza(origin, stanza)
 	(origin.log or log)("debug", "Received[%s]: %s", origin.type, stanza:top_tag())
 
-	-- TODO verify validity of stanza (as well as JID validity)
-	if stanza.attr.type == "error" and #stanza.tags == 0 then return; end -- TODO invalid stanza, log
-	if stanza.name == "iq" then
-		if not stanza.attr.id then stanza.attr.id = ""; end -- COMPAT Jabiru doesn't send the id attribute on roster requests
-		if not iq_types[stanza.attr.type] or ((stanza.attr.type == "set" or stanza.attr.type == "get") and (#stanza.tags ~= 1)) then
-			origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid IQ type or incorrect number of children"));
-			return;
+	if origin.type == "c2s" and not stanza.attr.xmlns then
+		local name, st_type = stanza.name, stanza.attr.type;
+		if st_type == "error" and #stanza.tags == 0 then
+			return handle_unhandled_stanza(origin.host, origin, stanza);
 		end
-	end
+		if name == "iq" then
+			if not stanza.attr.id then stanza.attr.id = ""; end -- COMPAT Jabiru doesn't send the id attribute on roster requests
+			if not iq_types[st_type] or (st_type ~= "result" and #stanza.tags ~= 1) then
+				origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid IQ type or incorrect number of children"));
+				return;
+			end
+		end
 
-	if origin.type == "c2s" and not stanza.attr.xmlns then
 		if not origin.full_jid
-			and not(stanza.name == "iq" and stanza.attr.type == "set" and stanza.tags[1] and stanza.tags[1].name == "bind"
+			and not(name == "iq" and st_type == "set" and stanza.tags[1] and stanza.tags[1].name == "bind"
 					and stanza.tags[1].attr.xmlns == "urn:ietf:params:xml:ns:xmpp-bind") then
 			-- authenticated client isn't bound and current stanza is not a bind request
 			if stanza.attr.type ~= "result" and stanza.attr.type ~= "error" then