Comparison

plugins/mod_s2s_auth_dane_in.lua @ 13416:d8e885db9851

mod_s2s_auth_dane_in: Simplify result processing Fewer loops
author Kim Alvefur <zash@zash.se>
date Thu, 11 Jan 2024 07:53:06 +0100
parent 13322:28211ed70b4c
child 13417:b1e2dd6e735b
comparison
equal deleted inserted replaced
13415:f34b33cb1383 13416:d8e885db9851
20 end 20 end
21 21
22 local function ensure_secure(r) 22 local function ensure_secure(r)
23 assert(r.secure, "insecure"); 23 assert(r.secure, "insecure");
24 return r; 24 return r;
25 end
26
27 local function flatten(a)
28 local seen = {};
29 local ret = {};
30 for _, rrset in ipairs(a) do
31 for _, rr in ipairs(rrset) do
32 if not seen[tostring(rr)] then
33 table.insert(ret, rr);
34 seen[tostring(rr)] = true;
35 end
36 end
37 end
38 return ret;
25 end 39 end
26 40
27 local lazy_tlsa_mt = { 41 local lazy_tlsa_mt = {
28 __index = function(t, i) 42 __index = function(t, i)
29 if i == 1 then 43 if i == 1 then
71 local tlsas = {}; 85 local tlsas = {};
72 for _, rr in ipairs(res) do 86 for _, rr in ipairs(res) do
73 if rr.srv.target == "." then return {}; end 87 if rr.srv.target == "." then return {}; end
74 table.insert(tlsas, resolver:lookup_promise(("_%d._tcp.%s"):format(rr.srv.port, rr.srv.target), "TLSA"):next(ensure_secure)); 88 table.insert(tlsas, resolver:lookup_promise(("_%d._tcp.%s"):format(rr.srv.port, rr.srv.target), "TLSA"):next(ensure_secure));
75 end 89 end
76 return promise.all(tlsas); 90 return promise.all(tlsas):next(flatten);
77 end 91 end
78 92
79 local ret = async.wait_for(promise.all({ 93 local ret = async.wait_for(promise.all({
80 resolver:lookup_promise("_xmpps-server._tcp." .. dns_domain, "SRV"):next(ensure_secure):next(fetch_tlsa); 94 resolver:lookup_promise("_xmpps-server._tcp." .. dns_domain, "SRV"):next(ensure_secure):next(fetch_tlsa);
81 resolver:lookup_promise("_xmpp-server._tcp." .. dns_domain, "SRV"):next(ensure_secure):next(fetch_tlsa); 95 resolver:lookup_promise("_xmpp-server._tcp." .. dns_domain, "SRV"):next(ensure_secure):next(fetch_tlsa);
82 })); 96 }):next(flatten));
83 97
84 if not ret then 98 if not ret then
85 return 99 return
86 end 100 end
87 101
88 local found_supported = false; 102 local found_supported = false;
89 for _, by_proto in ipairs(ret) do 103 for _, rr in ipairs(ret) do
90 for _, by_srv in ipairs(by_proto) do 104 if rr.tlsa.use == 3 and by_select_match[rr.tlsa.select] and rr.tlsa.match <= 2 then
91 for _, by_target in ipairs(by_srv) do 105 found_supported = true;
92 for _, rr in ipairs(by_target) do 106 if rr.tlsa.data == by_select_match[rr.tlsa.select][rr.tlsa.match] then
93 if rr.tlsa.use == 3 and by_select_match[rr.tlsa.select] and rr.tlsa.match <= 2 then 107 module:log("debug", "%s matches", rr)
94 found_supported = true; 108 session.cert_chain_status = "valid";
95 if rr.tlsa.data == by_select_match[rr.tlsa.select][rr.tlsa.match] then 109 session.cert_identity_status = "valid";
96 module:log("debug", "%s matches", rr) 110 return true;
97 session.cert_chain_status = "valid";
98 session.cert_identity_status = "valid";
99 return true;
100 end
101 else
102 log("debug", "Unsupported DANE TLSA record: %s", rr);
103 end
104 end
105 end 111 end
112 else
113 log("debug", "Unsupported DANE TLSA record: %s", rr);
106 end 114 end
107 end 115 end
108 116
109 if found_supported then 117 if found_supported then
110 session.cert_chain_status = "invalid"; 118 session.cert_chain_status = "invalid";