Diff

core/modulemanager.lua @ 38:3fdfd6e0cb4e

SASL! (but before you get too excited, no resource binding yet. And yes, there are still plenty of rough edges to the code...) ((eg. must move <stream:features> out of xmlhandlers.lua o_O ))
author Matthew Wild <mwild1@gmail.com>
date Thu, 02 Oct 2008 01:08:58 +0100
parent 30:bcf539295f2d
child 39:89877d61ac51
line wrap: on
line diff
--- a/core/modulemanager.lua	Thu Oct 02 00:00:35 2008 +0100
+++ b/core/modulemanager.lua	Thu Oct 02 01:08:58 2008 +0100
@@ -23,19 +23,25 @@
 	if not handlers[origin_type].iq[xmlns] then
 		handlers[origin_type].iq[xmlns]= handler;
 		handler_info[handler] = getfenv(2).module;
-		log("debug", "mod_%s now handles iq,%s", getfenv(2).module.name, xmlns);
+		log("debug", "mod_%s now handles tag 'iq' with query namespace '%s'", getfenv(2).module.name, xmlns);
 	else
-		log("warning", "mod_%s wants to handle iq,%s but mod_%s already handles that", getfenv(2).module.name, xmlns, handler_info[handlers[origin_type].iq[xmlns]].module.name);
+		log("warning", "mod_%s wants to handle tag 'iq' with query namespace '%s' but mod_%s already handles that", getfenv(2).module.name, xmlns, handler_info[handlers[origin_type].iq[xmlns]].module.name);
 	end
 end
 
-function modulehelpers.add_presence_handler(origin_type, handler)
-end
-
-function modulehelpers.add_message_handler(origin_type, handler)
+function modulehelpers.add_handler(origin_type, tag, handler)
+	handlers[origin_type] = handlers[origin_type] or {};
+	if not handlers[origin_type][tag] then
+		handlers[origin_type][tag]= handler;
+		handler_info[handler] = getfenv(2).module;
+		log("debug", "mod_%s now handles tag '%s'", getfenv(2).module.name, tag);
+	elseif handler_info[handlers[origin_type][tag]] then
+		log("warning", "mod_%s wants to handle tag '%s' but mod_%s already handles that", getfenv(2).module.name, tag, handler_info[handlers[origin_type][tag]].module.name);
+	end
 end
 					
 function loadall()
+	load("saslauth");
 	load("legacyauth");
 	load("roster");
 end
@@ -58,9 +64,9 @@
 end
 
 function handle_stanza(origin, stanza)
-	local name, origin_type = stanza.name, origin.type;
+	local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns, origin.type;
 	
-	if name == "iq" then
+	if name == "iq" and xmlns == "jabber:client" and handlers[origin_type] then
 		log("debug", "Stanza is an <iq/>");
 		local child = stanza.tags[1];
 		if child then
@@ -73,6 +79,13 @@
 			end
 
 		end
+		--FIXME: All iq's must be replied to, here we should return service-unavailable I think
+	elseif handlers[origin_type] then
+		local handler = handlers[origin_type][name];
+		if  handler then
+			log("debug", "Passing stanza to mod_%s", handler_info[handler].name);
+			return handler(origin, stanza) or true;
+		end
 	end
 	log("debug", "Stanza unhandled by any modules");
 	return false; -- we didn't handle it