X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=net%2Fxmppcomponent_listener.lua;h=3ffa4ba45f6f74ac469607d1b43bd24fdc0223fa;hb=c43ea656e3ccdc159ba27904fe06a9226952e817;hp=2cba2c32385a4204406ec3b727a8509a871fc544;hpb=01f562896d4b16e8a4cafd91ab8a1ba4a6ac89fe;p=prosody.git diff --git a/net/xmppcomponent_listener.lua b/net/xmppcomponent_listener.lua index 2cba2c32..3ffa4ba4 100644 --- a/net/xmppcomponent_listener.lua +++ b/net/xmppcomponent_listener.lua @@ -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 @@ -67,13 +65,13 @@ end function stream_callbacks.streamopened(session, attr) if config.get(attr.to, "core", "component_module") ~= "component" then - -- Trying to act as a component domain which + -- Trying to act as a component domain which -- hasn't been configured session:close{ condition = "host-unknown", text = tostring(attr.to).." does not match any configured external components" }; return; end - -- Note that we don't create the internal component + -- Note that we don't create the internal component -- until after the external component auths successfully session.host = attr.to; @@ -86,7 +84,7 @@ function stream_callbacks.streamopened(session, attr) end function stream_callbacks.streamclosed(session) - session.log("Received "); + session.log("debug", "Received "); session:close(); end @@ -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; @@ -203,12 +206,8 @@ function component_listener.ondisconnect(conn, err) local session = sessions[conn]; if session then (session.log or log)("info", "component disconnected: %s (%s)", tostring(session.host), tostring(err)); - if session.host then - log("debug", "Deregistering component"); - cm_deregister_component(session.host); - hosts[session.host].connected = nil; - end - sessions[conn] = nil; + if session.on_destroy then session:on_destroy(err); end + sessions[conn] = nil; for k in pairs(session) do if k ~= "log" and k ~= "close" then session[k] = nil;