Mercurial > prosody-hg
comparison plugins/mod_s2s/mod_s2s.lua @ 10115:c0bd5daa9c7f
mod_s2s: Distinguish between high and low level errors in bounces
`remote-server-not-found` is reported for problems occurring without a
reply `<stream>` having been opened, e.g. DNS records were not found or
no TCP stream could be established to a functioning XMPP entity.
`remote-server-timeout` is reported for problems that occurring after a
stream has been opened, such as configuration problems, inability to
perform TLS or unsuccessful certificate validation.
Related: #770
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 01 Aug 2019 05:25:34 +0200 |
| parents | 0f335815244f |
| children | 756b8821007a |
comparison
equal
deleted
inserted
replaced
| 10114:2f7628804db6 | 10115:c0bd5daa9c7f |
|---|---|
| 75 dummy = true; | 75 dummy = true; |
| 76 close = function () | 76 close = function () |
| 77 (session.log or log)("error", "Attempting to close the dummy origin of s2s error replies, please report this! Traceback: %s", traceback()); | 77 (session.log or log)("error", "Attempting to close the dummy origin of s2s error replies, please report this! Traceback: %s", traceback()); |
| 78 end; | 78 end; |
| 79 }; | 79 }; |
| 80 -- FIXME Allow for more specific error conditions | |
| 81 -- TODO use util.error ? | |
| 82 local error_type = "cancel"; | |
| 83 local condition = "remote-server-not-found"; | |
| 84 if session.had_stream then -- set when a stream is opened by the remote | |
| 85 error_type, condition = "wait", "remote-server-timeout"; | |
| 86 end | |
| 80 for i, data in ipairs(sendq) do | 87 for i, data in ipairs(sendq) do |
| 81 local reply = data[2]; | 88 local reply = data[2]; |
| 82 if reply and not(reply.attr.xmlns) and bouncy_stanzas[reply.name] then | 89 if reply and not(reply.attr.xmlns) and bouncy_stanzas[reply.name] then |
| 83 reply.attr.type = "error"; | 90 reply.attr.type = "error"; |
| 84 reply:tag("error", {type = "cancel", by = session.from_host}) | 91 reply:tag("error", {type = error_type, by = session.from_host}) |
| 85 :tag("remote-server-not-found", {xmlns = "urn:ietf:params:xml:ns:xmpp-stanzas"}):up(); | 92 :tag(condition, {xmlns = "urn:ietf:params:xml:ns:xmpp-stanzas"}):up(); |
| 86 if reason then | 93 if reason then |
| 87 reply:tag("text", {xmlns = "urn:ietf:params:xml:ns:xmpp-stanzas"}) | 94 reply:tag("text", {xmlns = "urn:ietf:params:xml:ns:xmpp-stanzas"}) |
| 88 :text("Server-to-server connection failed: "..reason):up(); | 95 :text("Server-to-server connection failed: "..reason):up(); |
| 89 end | 96 end |
| 90 core_process_stanza(dummy, reply); | 97 core_process_stanza(dummy, reply); |
| 299 session.thread:run({ attr = attr }); | 306 session.thread:run({ attr = attr }); |
| 300 end | 307 end |
| 301 | 308 |
| 302 function stream_callbacks._streamopened(session, attr) | 309 function stream_callbacks._streamopened(session, attr) |
| 303 session.version = tonumber(attr.version) or 0; | 310 session.version = tonumber(attr.version) or 0; |
| 311 session.had_stream = true; -- Had a stream opened at least once | |
| 304 | 312 |
| 305 -- TODO: Rename session.secure to session.encrypted | 313 -- TODO: Rename session.secure to session.encrypted |
| 306 if session.secure == false then | 314 if session.secure == false then |
| 307 session.secure = true; | 315 session.secure = true; |
| 308 session.encrypted = true; | 316 session.encrypted = true; |
