Merge 0.6->0.7
[prosody.git] / net / xmppclient_listener.lua
index 623a98c8408f3b67eaf7005f73e2a242d5960e4e..94daa2b2f7c95f8f846cf451da31ebe85620288a 100644 (file)
@@ -11,7 +11,7 @@
 local logger = require "logger";
 local log = logger.init("xmppclient_listener");
 local lxp = require "lxp"
-local new_xmpp_stream = require "util.xmppstream".new;
+local init_xmlhandlers = require "core.xmlhandlers"
 local sm_new_session = require "core.sessionmanager".new_session;
 
 local connlisteners_register = require "net.connlisteners".register;
@@ -72,6 +72,23 @@ local xmppclient = { default_port = 5222, default_mode = "*a" };
 
 -- These are session methods --
 
+local function session_reset_stream(session)
+       -- Reset stream
+               local parser = lxp.new(init_xmlhandlers(session, stream_callbacks), "\1");
+               session.parser = parser;
+               
+               session.notopen = true;
+               
+               function session.data(conn, data)
+                       local ok, err = parser:parse(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");
+               end
+               
+               return true;
+end
+
 local stream_xmlns_attr = {xmlns='urn:ietf:params:xml:ns:xmpp-streams'};
 local default_stream_attr = { ["xmlns:stream"] = "http://etherx.jabber.org/streams", xmlns = stream_callbacks.default_ns, version = "1.0", id = "" };
 local function session_close(session, reason)
@@ -111,57 +128,32 @@ end
 
 -- End of session methods --
 
-function xmppclient.onconnect(conn)
-       local session = sm_new_session(conn);
-       sessions[conn] = session;
-       
-       session.log("info", "Client connected");
-       
-       -- Client is using legacy SSL (otherwise mod_tls sets this flag)
-       if conn:ssl() then
-               session.secure = true;
-       end
-       
-       if opt_keepalives ~= nil then
-               conn:setoption("keepalive", opt_keepalives);
-       end
-       
-       session.close = session_close;
-       
-       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
-       
-       local filter = session.filter;
-       function session.data(data)
-               data = filter("bytes/in", data);
-               if data then
-                       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");
+function xmppclient.onincoming(conn, data)
+       local session = sessions[conn];
+       if not session then
+               session = sm_new_session(conn);
+               sessions[conn] = session;
+
+               session.log("info", "Client connected");
+               
+               -- Client is using legacy SSL (otherwise mod_tls sets this flag)
+               if conn:ssl() then
+                       session.secure = true;
                end
-       end
-       
-       local handlestanza = stream_callbacks.handlestanza;
-       function session.dispatch_stanza(session, stanza)
-               stanza = filter("stanzas/in", stanza);
-               if stanza then
-                       return handlestanza(session, stanza);
+               
+               if opt_keepalives ~= nil then
+                       conn:setoption("keepalive", opt_keepalives);
                end
+               
+               session.reset_stream = session_reset_stream;
+               session.close = session_close;
+               
+               session_reset_stream(session); -- Initialise, ready for use
+               
+               session.dispatch_stanza = stream_callbacks.handlestanza;
        end
-end
-
-function xmppclient.onincoming(conn, data)
-       local session = sessions[conn];
-       if session then
-               session.data(data);
+       if data then
+               session.data(conn, data);
        end
 end