X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=net%2Fxmppclient_listener.lua;h=94daa2b2f7c95f8f846cf451da31ebe85620288a;hb=1881612f6e77c771984d73b85704e89818a82977;hp=623a98c8408f3b67eaf7005f73e2a242d5960e4e;hpb=bca1a48421947ca7d627c23433effed81a1d91f2;p=prosody.git diff --git a/net/xmppclient_listener.lua b/net/xmppclient_listener.lua index 623a98c8..94daa2b2 100644 --- a/net/xmppclient_listener.lua +++ b/net/xmppclient_listener.lua @@ -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