comparison mod_s2s_auth_dane/mod_s2s_auth_dane.lua @ 1701:9b429fc9e8a0

mod_s2s_auth_dane: Simplify cases where there are only one SRV record
author Kim Alvefur <zash@zash.se>
date Wed, 06 May 2015 00:53:27 +0200
parents ab3175685f94
children d011b87b7f58
comparison
equal deleted inserted replaced
1700:ab3175685f94 1701:9b429fc9e8a0
103 end 103 end
104 if n == 1 and answer[1].srv.target == '.' then 104 if n == 1 and answer[1].srv.target == '.' then
105 return cb(host_session); -- No service ... This shouldn't happen? 105 return cb(host_session); -- No service ... This shouldn't happen?
106 end 106 end
107 local srv_hosts = { answer = answer }; 107 local srv_hosts = { answer = answer };
108 local dane = {};
109 host_session.dane = dane;
110 host_session.srv_hosts = srv_hosts; 108 host_session.srv_hosts = srv_hosts;
109 local dane;
111 for _, record in ipairs(answer) do 110 for _, record in ipairs(answer) do
112 t_insert(srv_hosts, record.srv); 111 t_insert(srv_hosts, record.srv);
113 dns_lookup(function(dane_answer) 112 dns_lookup(function(dane_answer)
114 n = n - 1; 113 n = n - 1;
115 if dane_answer.bogus then 114 -- There are three kinds of answers
115 -- Insecure, Secure and Bogus
116 --
117 -- We collect Secure answers for later use
118 --
119 -- Insecure (legacy) answers are simply ignored
120 --
121 -- If we get a Bogus (dnssec error) reply, keep the
122 -- status around. If there were only bogus replies, the
123 -- connection will be aborted. If there were at least
124 -- one non-Bogus reply, we proceed. If none of the
125 -- replies matched, we consider the connection insecure.
126
127 if (dane_answer.bogus or dane_answer.secure) and not dane then
128 -- The first answer we care about
129 -- For services with only one SRV record, this will be the only one
130 dane = dane_answer;
131 elseif dane_answer.bogus then
116 dane.bogus = dane_answer.bogus; 132 dane.bogus = dane_answer.bogus;
117 elseif dane_answer.secure then 133 elseif dane_answer.secure then
118 for _, dane_record in ipairs(dane_answer) do 134 for _, dane_record in ipairs(dane_answer) do
119 t_insert(dane, dane_record); 135 t_insert(dane, dane_record);
120 end 136 end
121 end 137 end
122 if n == 0 then 138 if n == 0 then
123 if #dane > 0 and dane.bogus then 139 if dane then
124 -- Got at least one non-bogus reply, 140 host_session.dane = dane;
125 -- This should trigger a failure if one of them did not match 141 if #dane > 0 and dane.bogus then
126 host_session.log("warn", "Ignoring bogus replies"); 142 -- Got at least one non-bogus reply,
127 dane.bogus = nil; 143 -- This should trigger a failure if one of them did not match
128 end 144 host_session.log("warn", "Ignoring bogus replies");
129 if #dane == 0 and dane.bogus == nil then 145 dane.bogus = nil;
130 -- Got no usable data 146 end
131 host_session.dane = false; 147 if #dane == 0 and dane.bogus == nil then
148 -- Got no usable data
149 host_session.dane = false;
150 end
132 end 151 end
133 return cb(host_session); 152 return cb(host_session);
134 end 153 end
135 end, ("_%d._tcp.%s."):format(record.srv.port, record.srv.target), "TLSA"); 154 end, ("_%d._tcp.%s."):format(record.srv.port, record.srv.target), "TLSA");
136 end 155 end