comparison plugins/mod_component.lua @ 10411:db2a06b9ff98

Merge 0.11->trunk
author Kim Alvefur <zash@zash.se>
date Sat, 16 Nov 2019 16:52:31 +0100
parents 0f335815244f
children 29575fe64860
comparison
equal deleted inserted replaced
10410:659b577f280c 10411:db2a06b9ff98
47 env.session = false; 47 env.session = false;
48 48
49 local send; 49 local send;
50 50
51 local function on_destroy(session, err) --luacheck: ignore 212/err 51 local function on_destroy(session, err) --luacheck: ignore 212/err
52 module:set_status("warn", err and ("Disconnected: "..err) or "Disconnected");
52 env.connected = false; 53 env.connected = false;
53 env.session = false; 54 env.session = false;
54 send = nil; 55 send = nil;
55 session.on_destroy = nil; 56 session.on_destroy = nil;
56 end 57 end
100 session.component_validate_from = module:get_option_boolean("validate_from_addresses", true); 101 session.component_validate_from = module:get_option_boolean("validate_from_addresses", true);
101 session.type = "component"; 102 session.type = "component";
102 module:log("info", "External component successfully authenticated"); 103 module:log("info", "External component successfully authenticated");
103 session.send(st.stanza("handshake")); 104 session.send(st.stanza("handshake"));
104 module:fire_event("component-authenticated", { session = session }); 105 module:fire_event("component-authenticated", { session = session });
106 module:set_status("info", "Connected");
105 107
106 return true; 108 return true;
107 end 109 end
108 module:hook("stanza/jabber:component:accept:handshake", handle_component_auth, -1); 110 module:hook("stanza/jabber:component:accept:handshake", handle_component_auth, -1);
109 111
163 165
164 local xmlns_xmpp_streams = "urn:ietf:params:xml:ns:xmpp-streams"; 166 local xmlns_xmpp_streams = "urn:ietf:params:xml:ns:xmpp-streams";
165 167
166 function stream_callbacks.error(session, error, data) 168 function stream_callbacks.error(session, error, data)
167 if session.destroyed then return; end 169 if session.destroyed then return; end
168 module:log("warn", "Error processing component stream: %s", tostring(error)); 170 module:log("warn", "Error processing component stream: %s", error);
169 if error == "no-stream" then 171 if error == "no-stream" then
170 session:close("invalid-namespace"); 172 session:close("invalid-namespace");
171 elseif error == "parse-error" then 173 elseif error == "parse-error" then
172 session.log("warn", "External component %s XML parse error: %s", tostring(session.host), tostring(data)); 174 session.log("warn", "External component %s XML parse error: %s", session.host, data);
173 session:close("not-well-formed"); 175 session:close("not-well-formed");
174 elseif error == "stream-error" then 176 elseif error == "stream-error" then
175 local condition, text = "undefined-condition"; 177 local condition, text = "undefined-condition";
176 for child in data:childtags(nil, xmlns_xmpp_streams) do 178 for child in data:childtags(nil, xmlns_xmpp_streams) do
177 if child.name ~= "text" then 179 if child.name ~= "text" then
204 function stream_callbacks.streamclosed(session) 206 function stream_callbacks.streamclosed(session)
205 session.log("debug", "Received </stream:stream>"); 207 session.log("debug", "Received </stream:stream>");
206 session:close(); 208 session:close();
207 end 209 end
208 210
209 local function handleerr(err) log("error", "Traceback[component]: %s", traceback(tostring(err), 2)); end 211 local function handleerr(err) log("error", "Traceback[component]: %s", traceback(err, 2)); end
210 function stream_callbacks.handlestanza(session, stanza) 212 function stream_callbacks.handlestanza(session, stanza)
211 -- Namespaces are icky. 213 -- Namespaces are icky.
212 if not stanza.attr.xmlns and stanza.name == "handshake" then 214 if not stanza.attr.xmlns and stanza.name == "handshake" then
213 stanza.attr.xmlns = xmlns_component; 215 stanza.attr.xmlns = xmlns_component;
214 end 216 end
264 stanza:tag("text", stream_xmlns_attr):text(reason.text):up(); 266 stanza:tag("text", stream_xmlns_attr):text(reason.text):up();
265 end 267 end
266 if reason.extra then 268 if reason.extra then
267 stanza:add_child(reason.extra); 269 stanza:add_child(reason.extra);
268 end 270 end
269 module:log("info", "Disconnecting component, <stream:error> is: %s", tostring(stanza)); 271 module:log("info", "Disconnecting component, <stream:error> is: %s", stanza);
270 session.send(stanza); 272 session.send(stanza);
271 elseif reason.name then -- a stanza 273 elseif reason.name then -- a stanza
272 module:log("info", "Disconnecting component, <stream:error> is: %s", tostring(reason)); 274 module:log("info", "Disconnecting component, <stream:error> is: %s", reason);
273 session.send(reason); 275 session.send(reason);
274 end 276 end
275 end 277 end
276 end 278 end
277 session.send("</stream:stream>"); 279 session.send("</stream:stream>");
308 end 310 end
309 311
310 function session.data(_, data) 312 function session.data(_, data)
311 local ok, err = stream:feed(data); 313 local ok, err = stream:feed(data);
312 if ok then return; end 314 if ok then return; end
313 module:log("debug", "Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " "):gsub("[%z\1-\31]", "_")); 315 log("debug", "Received invalid XML (%s) %d bytes: %q", err, #data, data:sub(1, 300));
314 session:close("not-well-formed"); 316 session:close("not-well-formed");
315 end 317 end
316 318
317 session.dispatch_stanza = stream_callbacks.handlestanza; 319 session.dispatch_stanza = stream_callbacks.handlestanza;
318 320
323 session.data(conn, data); 325 session.data(conn, data);
324 end 326 end
325 function listener.ondisconnect(conn, err) 327 function listener.ondisconnect(conn, err)
326 local session = sessions[conn]; 328 local session = sessions[conn];
327 if session then 329 if session then
328 (session.log or log)("info", "component disconnected: %s (%s)", tostring(session.host), tostring(err)); 330 (session.log or log)("info", "component disconnected: %s (%s)", session.host, err);
329 if session.host then 331 if session.host then
330 module:context(session.host):fire_event("component-disconnected", { session = session, reason = err }); 332 module:context(session.host):fire_event("component-disconnected", { session = session, reason = err });
331 end 333 end
332 if session.on_destroy then session:on_destroy(err); end 334 if session.on_destroy then session:on_destroy(err); end
333 sessions[conn] = nil; 335 sessions[conn] = nil;