Mercurial > prosody-modules
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 |