Mercurial > prosody-modules
comparison mod_sasl2/mod_sasl2.lua @ 5038:88980b2dd986
mod_sasl2: Hacky support for channel binding
We should work out how to share this code properly between here and
mod_saslauth.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Tue, 06 Sep 2022 16:01:12 +0100 |
| parents | 1f2d2bfd29dd |
| children | c0d243b27e64 |
comparison
equal
deleted
inserted
replaced
| 5037:8a8100fff580 | 5038:88980b2dd986 |
|---|---|
| 9 | 9 |
| 10 local st = require "util.stanza"; | 10 local st = require "util.stanza"; |
| 11 local errors = require "util.error"; | 11 local errors = require "util.error"; |
| 12 local base64 = require "util.encodings".base64; | 12 local base64 = require "util.encodings".base64; |
| 13 local jid_join = require "util.jid".join; | 13 local jid_join = require "util.jid".join; |
| 14 local set = require "util.set"; | |
| 14 | 15 |
| 15 local usermanager_get_sasl_handler = require "core.usermanager".get_sasl_handler; | 16 local usermanager_get_sasl_handler = require "core.usermanager".get_sasl_handler; |
| 16 local sm_make_authenticated = require "core.sessionmanager".make_authenticated; | 17 local sm_make_authenticated = require "core.sessionmanager".make_authenticated; |
| 17 | 18 |
| 18 local xmlns_sasl2 = "urn:xmpp:sasl:1"; | 19 local xmlns_sasl2 = "urn:xmpp:sasl:1"; |
| 21 local insecure_mechanisms = module:get_option_set("insecure_sasl_mechanisms", allow_unencrypted_plain_auth and {} or {"PLAIN", "LOGIN"}); | 22 local insecure_mechanisms = module:get_option_set("insecure_sasl_mechanisms", allow_unencrypted_plain_auth and {} or {"PLAIN", "LOGIN"}); |
| 22 local disabled_mechanisms = module:get_option_set("disable_sasl_mechanisms", { "DIGEST-MD5" }); | 23 local disabled_mechanisms = module:get_option_set("disable_sasl_mechanisms", { "DIGEST-MD5" }); |
| 23 | 24 |
| 24 local host = module.host; | 25 local host = module.host; |
| 25 | 26 |
| 27 local function tls_unique(self) | |
| 28 return self.userdata["tls-unique"]:ssl_peerfinished(); | |
| 29 end | |
| 30 | |
| 31 local function tls_exporter(conn) | |
| 32 if not conn.ssl_exportkeyingmaterial then return end | |
| 33 return conn:ssl_exportkeyingmaterial("EXPORTER-Channel-Binding", 32, ""); | |
| 34 end | |
| 35 | |
| 36 local function sasl_tls_exporter(self) | |
| 37 return tls_exporter(self.userdata["tls-exporter"]); | |
| 38 end | |
| 39 | |
| 26 module:hook("stream-features", function(event) | 40 module:hook("stream-features", function(event) |
| 27 local origin, features = event.origin, event.features; | 41 local origin, features = event.origin, event.features; |
| 28 local log = origin.log or module._log; | 42 local log = origin.log or module._log; |
| 29 | 43 |
| 30 if origin.type ~= "c2s_unauthed" then | 44 if origin.type ~= "c2s_unauthed" then |
| 33 end | 47 end |
| 34 | 48 |
| 35 local sasl_handler = usermanager_get_sasl_handler(host, origin) | 49 local sasl_handler = usermanager_get_sasl_handler(host, origin) |
| 36 origin.sasl_handler = sasl_handler; | 50 origin.sasl_handler = sasl_handler; |
| 37 | 51 |
| 38 if sasl_handler.add_cb_handler then -- luacheck: ignore 542 | 52 local channel_bindings = set.new() |
| 39 -- FIXME bring back channel binding | 53 if origin.encrypted then |
| 54 -- check whether LuaSec has the nifty binding to the function needed for tls-unique | |
| 55 -- FIXME: would be nice to have this check only once and not for every socket | |
| 56 if sasl_handler.add_cb_handler then | |
| 57 local info = origin.conn:ssl_info(); | |
| 58 if info and info.protocol == "TLSv1.3" then | |
| 59 log("debug", "Channel binding 'tls-unique' undefined in context of TLS 1.3"); | |
| 60 if tls_exporter(origin.conn) then | |
| 61 log("debug", "Channel binding 'tls-exporter' supported"); | |
| 62 sasl_handler:add_cb_handler("tls-exporter", sasl_tls_exporter); | |
| 63 channel_bindings:add("tls-exporter"); | |
| 64 end | |
| 65 elseif origin.conn.ssl_peerfinished and origin.conn:ssl_peerfinished() then | |
| 66 log("debug", "Channel binding 'tls-unique' supported"); | |
| 67 sasl_handler:add_cb_handler("tls-unique", tls_unique); | |
| 68 channel_bindings:add("tls-unique"); | |
| 69 else | |
| 70 log("debug", "Channel binding 'tls-unique' not supported (by LuaSec?)"); | |
| 71 end | |
| 72 sasl_handler["userdata"] = { | |
| 73 ["tls-unique"] = origin.conn; | |
| 74 ["tls-exporter"] = origin.conn; | |
| 75 }; | |
| 76 else | |
| 77 log("debug", "Channel binding not supported by SASL handler"); | |
| 78 end | |
| 40 end | 79 end |
| 41 | 80 |
| 42 local mechanisms = st.stanza("mechanisms", { xmlns = xmlns_sasl2 }); | 81 local mechanisms = st.stanza("mechanisms", { xmlns = xmlns_sasl2 }); |
| 43 | 82 |
| 44 local available_mechanisms = sasl_handler:mechanisms() | 83 local available_mechanisms = sasl_handler:mechanisms() |
