163 component_listener.ondisconnect(session.conn, "stream error"); |
163 component_listener.ondisconnect(session.conn, "stream error"); |
164 end |
164 end |
165 end |
165 end |
166 |
166 |
167 --- Component connlistener |
167 --- Component connlistener |
|
168 function component_listener.onconnect(conn) |
|
169 local _send = conn.write; |
|
170 local session = { type = "component", conn = conn, send = function (data) return _send(conn, tostring(data)); end }; |
|
171 |
|
172 -- Logging functions -- |
|
173 local conn_name = "jcp"..tostring(conn):match("[a-f0-9]+$"); |
|
174 session.log = logger.init(conn_name); |
|
175 session.close = session_close; |
|
176 |
|
177 session.log("info", "Incoming Jabber component connection"); |
|
178 |
|
179 local stream = new_xmpp_stream(session, stream_callbacks); |
|
180 session.stream = stream; |
|
181 |
|
182 session.notopen = true; |
|
183 |
|
184 function session.reset_stream() |
|
185 session.notopen = true; |
|
186 session.stream:reset(); |
|
187 end |
|
188 |
|
189 function session.data(conn, data) |
|
190 local ok, err = stream:feed(data); |
|
191 if ok then return; end |
|
192 log("debug", "Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " "):gsub("[%z\1-\31]", "_")); |
|
193 session:close("not-well-formed"); |
|
194 end |
|
195 |
|
196 session.dispatch_stanza = stream_callbacks.handlestanza; |
|
197 |
|
198 sessions[conn] = session; |
|
199 end |
168 function component_listener.onincoming(conn, data) |
200 function component_listener.onincoming(conn, data) |
169 local session = sessions[conn]; |
201 local session = sessions[conn]; |
170 if not session then |
202 session.data(conn, data); |
171 local _send = conn.write; |
203 end |
172 session = { type = "component", conn = conn, send = function (data) return _send(conn, tostring(data)); end }; |
|
173 sessions[conn] = session; |
|
174 |
|
175 -- Logging functions -- |
|
176 |
|
177 local conn_name = "jcp"..tostring(conn):match("[a-f0-9]+$"); |
|
178 session.log = logger.init(conn_name); |
|
179 session.close = session_close; |
|
180 |
|
181 session.log("info", "Incoming Jabber component connection"); |
|
182 |
|
183 local stream = new_xmpp_stream(session, stream_callbacks); |
|
184 session.stream = stream; |
|
185 |
|
186 session.notopen = true; |
|
187 |
|
188 function session.reset_stream() |
|
189 session.notopen = true; |
|
190 session.stream:reset(); |
|
191 end |
|
192 |
|
193 function session.data(conn, data) |
|
194 local ok, err = stream:feed(data); |
|
195 if ok then return; end |
|
196 log("debug", "Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " "):gsub("[%z\1-\31]", "_")); |
|
197 session:close("not-well-formed"); |
|
198 end |
|
199 |
|
200 session.dispatch_stanza = stream_callbacks.handlestanza; |
|
201 |
|
202 end |
|
203 if data then |
|
204 session.data(conn, data); |
|
205 end |
|
206 end |
|
207 |
|
208 function component_listener.ondisconnect(conn, err) |
204 function component_listener.ondisconnect(conn, err) |
209 local session = sessions[conn]; |
205 local session = sessions[conn]; |
210 if session then |
206 if session then |
211 (session.log or log)("info", "component disconnected: %s (%s)", tostring(session.host), tostring(err)); |
207 (session.log or log)("info", "component disconnected: %s (%s)", tostring(session.host), tostring(err)); |
212 if session.on_destroy then session:on_destroy(err); end |
208 if session.on_destroy then session:on_destroy(err); end |