Software / code / verse
Comparison
plugins/sasl.lua @ 467:8e6a7a5e70b3
sasl: Expose what mechanisms were offered on authentication-failure
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Fri, 17 Mar 2023 09:24:36 +0000 |
| parent | 456:6a65142052c8 |
| child | 490:6b2f31da9610 |
comparison
equal
deleted
inserted
replaced
| 466:1eaec52ff71a | 467:8e6a7a5e70b3 |
|---|---|
| 9 local sasl_mechanisms = features_stanza:get_child("mechanisms", xmlns_sasl); | 9 local sasl_mechanisms = features_stanza:get_child("mechanisms", xmlns_sasl); |
| 10 if not sasl_mechanisms then return end | 10 if not sasl_mechanisms then return end |
| 11 | 11 |
| 12 local mechanisms = {}; | 12 local mechanisms = {}; |
| 13 local preference = {}; | 13 local preference = {}; |
| 14 local offered = {}; | |
| 14 | 15 |
| 15 for mech in sasl_mechanisms:childtags("mechanism") do | 16 for mech in sasl_mechanisms:childtags("mechanism") do |
| 16 mech = mech:get_text(); | 17 mech = mech:get_text(); |
| 17 stream:debug("Server offers %s", mech); | 18 stream:debug("Server offers %s", mech); |
| 19 offered[mech] = true; | |
| 18 if not mechanisms[mech] then | 20 if not mechanisms[mech] then |
| 19 local name = mech:match("[^-]+"); | 21 local name = mech:match("[^-]+"); |
| 20 local ok, impl = pcall(require, "util.sasl."..name:lower()); | 22 local ok, impl = pcall(require, "util.sasl."..name:lower()); |
| 21 if ok then | 23 if ok then |
| 22 stream:debug("Loaded SASL %s module", name); | 24 stream:debug("Loaded SASL %s module", name); |
| 30 local supported = {}; -- by the server | 32 local supported = {}; -- by the server |
| 31 for mech in pairs(mechanisms) do | 33 for mech in pairs(mechanisms) do |
| 32 table.insert(supported, mech); | 34 table.insert(supported, mech); |
| 33 end | 35 end |
| 34 if not supported[1] then | 36 if not supported[1] then |
| 35 stream:event("authentication-failure", { condition = "no-supported-sasl-mechanisms", mechanisms = mechanisms }); | 37 stream:event("authentication-failure", { condition = "no-supported-sasl-mechanisms", mechanisms = offered }); |
| 36 stream:close(); | 38 stream:close(); |
| 37 return; | 39 return; |
| 38 end | 40 end |
| 39 table.sort(supported, function (a, b) return preference[a] > preference[b]; end); | 41 table.sort(supported, function (a, b) return preference[a] > preference[b]; end); |
| 40 local mechanism, initial_data = supported[1]; | 42 local mechanism, initial_data = supported[1]; |