xmppcomponent_listener: Switch to util.xmppstream from xmlhandlers
[prosody.git] / net / xmppcomponent_listener.lua
index 4f1cda4c45e5c7af0d4be806b17a3f4aa66f67a6..3ffa4ba45f6f74ac469607d1b43bd24fdc0223fa 100644 (file)
@@ -15,13 +15,11 @@ local lxp = require "lxp";
 local logger = require "util.logger";
 local config = require "core.configmanager";
 local connlisteners = require "net.connlisteners";
-local cm_register_component = require "core.componentmanager".register_component;
-local cm_deregister_component = require "core.componentmanager".deregister_component;
 local uuid_gen = require "util.uuid".generate;
 local jid_split = require "util.jid".split;
 local sha1 = require "util.hashes".sha1;
 local st = require "util.stanza";
-local init_xmlhandlers = require "core.xmlhandlers";
+local new_xmpp_stream = require "util.xmppstream".new;
 
 local sessions = {};
 
@@ -31,7 +29,7 @@ local component_listener = { default_port = 5347; default_mode = "*a"; default_i
 
 local xmlns_component = 'jabber:component:accept';
 
---- Callbacks/data for xmlhandlers to handle streams for us ---
+--- Callbacks/data for xmppstream to handle streams for us ---
 
 local stream_callbacks = { default_ns = xmlns_component };
 
@@ -44,7 +42,7 @@ function stream_callbacks.error(session, error, data, data2)
                session:close("invalid-namespace");
        elseif error == "parse-error" then
                session.log("warn", "External component %s XML parse error: %s", tostring(session.host), tostring(data));
-               session:close("xml-not-well-formed");
+               session:close("not-well-formed");
        elseif error == "stream-error" then
                local condition, text = "undefined-condition";
                for child in data:children() do
@@ -179,16 +177,21 @@ function component_listener.onincoming(conn, data)
                
                session.log("info", "Incoming Jabber component connection");
                
-               local parser = lxp.new(init_xmlhandlers(session, stream_callbacks), "\1");
-               session.parser = parser;
+               local stream = new_xmpp_stream(session, stream_callbacks);
+               session.stream = stream;
                
                session.notopen = true;
                
+               function session.reset_stream()
+                       session.notopen = true;
+                       session.stream:reset();
+               end
+       
                function session.data(conn, data)
-                       local ok, err = parser:parse(data);
+                       local ok, err = stream:feed(data);
                        if ok then return; end
                        log("debug", "Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " "):gsub("[%z\1-\31]", "_"));
-                       session:close("xml-not-well-formed");
+                       session:close("not-well-formed");
                end
                
                session.dispatch_stanza = stream_callbacks.handlestanza;
@@ -204,12 +207,7 @@ function component_listener.ondisconnect(conn, err)
        if session then
                (session.log or log)("info", "component disconnected: %s (%s)", tostring(session.host), tostring(err));
                if session.on_destroy then session:on_destroy(err); end
-               if hosts[session.host] then
-                       log("debug", "Deregistering component");
-                       cm_deregister_component(session.host);
-                       hosts[session.host].connected = nil;
-               end
-               sessions[conn]  = nil;
+               sessions[conn] = nil;
                for k in pairs(session) do
                        if k ~= "log" and k ~= "close" then
                                session[k] = nil;