Mercurial > prosody-modules
comparison mod_s2s_auth_dane/mod_s2s_auth_dane.lua @ 1431:33a796b2cb91
mod_s2s_auth_dane: Cache logger to save some table lookups and improve readability
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Wed, 11 Jun 2014 12:50:57 +0200 |
| parents | 8791fa8a18c8 |
| children | 1caf971a2f0f |
comparison
equal
deleted
inserted
replaced
| 1430:18f5f1b13353 | 1431:33a796b2cb91 |
|---|---|
| 174 return certdata == tlsa.data; | 174 return certdata == tlsa.data; |
| 175 end | 175 end |
| 176 | 176 |
| 177 module:hook("s2s-check-certificate", function(event) | 177 module:hook("s2s-check-certificate", function(event) |
| 178 local session, cert = event.session, event.cert; | 178 local session, cert = event.session, event.cert; |
| 179 local log = session.log or module._log; | |
| 179 local dane = session.dane; | 180 local dane = session.dane; |
| 180 if type(dane) == "table" then | 181 if type(dane) == "table" then |
| 181 local use, tlsa, match_found, supported_found, chain, leafcert, cacert, is_match; | 182 local use, tlsa, match_found, supported_found, chain, leafcert, cacert, is_match; |
| 182 for i = 1, #dane do | 183 for i = 1, #dane do |
| 183 tlsa = dane[i].tlsa; | 184 tlsa = dane[i].tlsa; |
| 191 is_match = one_dane_check(tlsa, cert); | 192 is_match = one_dane_check(tlsa, cert); |
| 192 if is_match ~= nil then | 193 if is_match ~= nil then |
| 193 supported_found = true; | 194 supported_found = true; |
| 194 end | 195 end |
| 195 if is_match then | 196 if is_match then |
| 196 (session.log or module._log)("info", "DANE validation successful"); | 197 log("info", "DANE validation successful"); |
| 197 session.cert_identity_status = "valid"; | 198 session.cert_identity_status = "valid"; |
| 198 if use == 3 then -- DANE-EE, chain status equals DNSSEC chain status | 199 if use == 3 then -- DANE-EE, chain status equals DNSSEC chain status |
| 199 session.cert_chain_status = "valid"; | 200 session.cert_chain_status = "valid"; |
| 200 -- for usage 1, PKIX-EE, the chain has to be valid already | 201 -- for usage 1, PKIX-EE, the chain has to be valid already |
| 201 end | 202 end |
| 216 if use == 2 and not cacert:issued(leafcert or cacert) then | 217 if use == 2 and not cacert:issued(leafcert or cacert) then |
| 217 module:log("debug", "Broken chain"); | 218 module:log("debug", "Broken chain"); |
| 218 break; | 219 break; |
| 219 end | 220 end |
| 220 if is_match then | 221 if is_match then |
| 221 (session.log or module._log)("info", "DANE validation successful"); | 222 log("info", "DANE validation successful"); |
| 222 if use == 2 then -- DANE-TA | 223 if use == 2 then -- DANE-TA |
| 223 session.cert_identity_status = "valid"; | 224 session.cert_identity_status = "valid"; |
| 224 session.cert_chain_status = "valid"; | 225 session.cert_chain_status = "valid"; |
| 225 -- for usage 0, PKIX-CA, identity and chain has to be valid already | 226 -- for usage 0, PKIX-CA, identity and chain has to be valid already |
| 226 end | 227 end |
| 232 end | 233 end |
| 233 end | 234 end |
| 234 end | 235 end |
| 235 if supported_found and not match_found or dane.bogus then | 236 if supported_found and not match_found or dane.bogus then |
| 236 -- No TLSA matched or response was bogus | 237 -- No TLSA matched or response was bogus |
| 237 (session.log or module._log)("warn", "DANE validation failed"); | 238 log("warn", "DANE validation failed"); |
| 238 session.cert_identity_status = "invalid"; | 239 session.cert_identity_status = "invalid"; |
| 239 session.cert_chain_status = "invalid"; | 240 session.cert_chain_status = "invalid"; |
| 240 end | 241 end |
| 241 else | 242 else |
| 242 if session.cert_chain_status == "valid" and session.cert_identity_status ~= "valid" | 243 if session.cert_chain_status == "valid" and session.cert_identity_status ~= "valid" |
| 243 and session.srv_hosts and session.srv_hosts.answer and session.srv_hosts.answer.secure then | 244 and session.srv_hosts and session.srv_hosts.answer and session.srv_hosts.answer.secure then |
| 244 local srv_hosts, srv_choice, srv_target = session.srv_hosts, session.srv_choice; | 245 local srv_hosts, srv_choice, srv_target = session.srv_hosts, session.srv_choice; |
| 245 for i = srv_choice or 1, srv_choice or #srv_hosts do | 246 for i = srv_choice or 1, srv_choice or #srv_hosts do |
| 246 srv_target = session.srv_hosts[i].target:gsub("%.?$",""); | 247 srv_target = session.srv_hosts[i].target:gsub("%.?$",""); |
| 247 (session.log or module._log)("debug", "Comparing certificate with Secure SRV target %s", srv_target); | 248 log("debug", "Comparing certificate with Secure SRV target %s", srv_target); |
| 248 srv_target = nameprep(idna_to_unicode()); | 249 srv_target = nameprep(idna_to_unicode()); |
| 249 if srv_target and cert_verify_identity(srv_target, "xmpp-server", cert) then | 250 if srv_target and cert_verify_identity(srv_target, "xmpp-server", cert) then |
| 250 (session.log or module._log)("info", "Certificate matches Secure SRV target %s", srv_target); | 251 log("info", "Certificate matches Secure SRV target %s", srv_target); |
| 251 session.cert_identity_status = "valid"; | 252 session.cert_identity_status = "valid"; |
| 252 return; | 253 return; |
| 253 end | 254 end |
| 254 end | 255 end |
| 255 end | 256 end |
