17 local connlisteners = require "net.connlisteners"; |
17 local connlisteners = require "net.connlisteners"; |
18 local uuid_gen = require "util.uuid".generate; |
18 local uuid_gen = require "util.uuid".generate; |
19 local jid_split = require "util.jid".split; |
19 local jid_split = require "util.jid".split; |
20 local sha1 = require "util.hashes".sha1; |
20 local sha1 = require "util.hashes".sha1; |
21 local st = require "util.stanza"; |
21 local st = require "util.stanza"; |
22 local init_xmlhandlers = require "core.xmlhandlers"; |
22 local new_xmpp_stream = require "util.xmppstream".new; |
23 |
23 |
24 local sessions = {}; |
24 local sessions = {}; |
25 |
25 |
26 local log = logger.init("componentlistener"); |
26 local log = logger.init("componentlistener"); |
27 |
27 |
28 local component_listener = { default_port = 5347; default_mode = "*a"; default_interface = config.get("*", "core", "component_interface") or "127.0.0.1" }; |
28 local component_listener = { default_port = 5347; default_mode = "*a"; default_interface = config.get("*", "core", "component_interface") or "127.0.0.1" }; |
29 |
29 |
30 local xmlns_component = 'jabber:component:accept'; |
30 local xmlns_component = 'jabber:component:accept'; |
31 |
31 |
32 --- Callbacks/data for xmlhandlers to handle streams for us --- |
32 --- Callbacks/data for xmppstream to handle streams for us --- |
33 |
33 |
34 local stream_callbacks = { default_ns = xmlns_component }; |
34 local stream_callbacks = { default_ns = xmlns_component }; |
35 |
35 |
36 local xmlns_xmpp_streams = "urn:ietf:params:xml:ns:xmpp-streams"; |
36 local xmlns_xmpp_streams = "urn:ietf:params:xml:ns:xmpp-streams"; |
37 |
37 |
175 session.log = logger.init(conn_name); |
175 session.log = logger.init(conn_name); |
176 session.close = session_close; |
176 session.close = session_close; |
177 |
177 |
178 session.log("info", "Incoming Jabber component connection"); |
178 session.log("info", "Incoming Jabber component connection"); |
179 |
179 |
180 local parser = lxp.new(init_xmlhandlers(session, stream_callbacks), "\1"); |
180 local stream = new_xmpp_stream(session, stream_callbacks); |
181 session.parser = parser; |
181 session.stream = stream; |
182 |
182 |
183 session.notopen = true; |
183 session.notopen = true; |
184 |
184 |
|
185 function session.reset_stream() |
|
186 session.notopen = true; |
|
187 session.stream:reset(); |
|
188 end |
|
189 |
185 function session.data(conn, data) |
190 function session.data(conn, data) |
186 local ok, err = parser:parse(data); |
191 local ok, err = stream:feed(data); |
187 if ok then return; end |
192 if ok then return; end |
188 log("debug", "Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " "):gsub("[%z\1-\31]", "_")); |
193 log("debug", "Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " "):gsub("[%z\1-\31]", "_")); |
189 session:close("not-well-formed"); |
194 session:close("not-well-formed"); |
190 end |
195 end |
191 |
196 |