X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=plugins%2Fmod_component.lua;h=11abab799e3b2be35979ad4ba3ccc87e287ca22f;hb=8551bf5a2ae3d1c8bc47f052f531902fe4f0d919;hp=871a20e4a28f27a1f01507d5829c29c850d7f7ba;hpb=d132bca71d717f53b351c4cc1d5aebfd307499a6;p=prosody.git diff --git a/plugins/mod_component.lua b/plugins/mod_component.lua index 871a20e4..11abab79 100644 --- a/plugins/mod_component.lua +++ b/plugins/mod_component.lua @@ -9,6 +9,8 @@ module:set_global(); local t_concat = table.concat; +local xpcall, tostring, type = xpcall, tostring, type; +local traceback = debug.traceback; local logger = require "util.logger"; local sha1 = require "util.hashes".sha1; @@ -23,6 +25,8 @@ local hosts = prosody.hosts; local log = module._log; +local opt_keepalives = module:get_option_boolean("component_tcp_keepalives", module:get_option_boolean("tcp_keepalives", true)); + local sessions = module:shared("sessions"); function module.add_host(module) @@ -81,10 +85,11 @@ function module.add_host(module) session.type = "component"; module:log("info", "External component successfully authenticated"); session.send(st.stanza("handshake")); + module:fire_event("component-authenticated", { session = session }); return true; end - module:hook("stanza/jabber:component:accept:handshake", handle_component_auth); + module:hook("stanza/jabber:component:accept:handshake", handle_component_auth, -1); -- Handle stanzas addressed to this component local function handle_stanza(event) @@ -183,6 +188,7 @@ function stream_callbacks.streamclosed(session) session:close(); end +local function handleerr(err) log("error", "Traceback[component]: %s", traceback(tostring(err), 2)); end function stream_callbacks.handlestanza(session, stanza) -- Namespaces are icky. if not stanza.attr.xmlns and stanza.name == "handshake" then @@ -213,7 +219,10 @@ function stream_callbacks.handlestanza(session, stanza) return; end end - return core_process_stanza(session, stanza); + + if stanza then + return xpcall(function () return core_process_stanza(session, stanza) end, handleerr); + end end --- Closing a component connection @@ -263,6 +272,10 @@ function listener.onconnect(conn) local conn_name = "jcp"..tostring(session):match("[a-f0-9]+$"); session.log = logger.init(conn_name); session.close = session_close; + + if opt_keepalives then + conn:setoption("keepalive", opt_keepalives); + end session.log("info", "Incoming Jabber component connection"); @@ -307,6 +320,10 @@ function listener.ondisconnect(conn, err) end end +function listener.ondetach(conn) + sessions[conn] = nil; +end + module:provides("net", { name = "component"; private = true;