Mercurial > prosody-hg
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; |
