Mercurial > prosody-modules
comparison mod_s2s_auth_dane/mod_s2s_auth_dane.lua @ 2181:f00cbfb812cd
mod_s2s_auth_dane: Attempt a new approach to async lookups that doesn't depend on connection pausing
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Thu, 26 May 2016 15:35:52 +0200 |
parents | 5e0102a07fdc |
children | 5df3b646c9ad |
comparison
equal
deleted
inserted
replaced
2180:5e0102a07fdc | 2181:f00cbfb812cd |
---|---|
196 end, ("_%d._tcp.%s."):format(srv_choice.port, srv_choice.target), "TLSA"); | 196 end, ("_%d._tcp.%s."):format(srv_choice.port, srv_choice.target), "TLSA"); |
197 return true; | 197 return true; |
198 end | 198 end |
199 end | 199 end |
200 | 200 |
201 local function resume(host_session) | |
202 host_session.log("debug", "DANE lookup completed, resuming connection"); | |
203 host_session.conn:resume() | |
204 end | |
205 | |
206 function module.add_host(module) | 201 function module.add_host(module) |
207 local function on_new_s2s(event) | |
208 local host_session = event.origin; | |
209 if host_session.type == "s2sout" or host_session.type == "s2sin" then | |
210 return; -- Already authenticated | |
211 end | |
212 if host_session.dane ~= nil then | |
213 return; -- Already done DANE lookup | |
214 end | |
215 if dane_lookup(host_session, resume) then | |
216 host_session.log("debug", "Pausing connection until DANE lookup is completed"); | |
217 host_session.conn:pause() | |
218 end | |
219 end | |
220 | |
221 -- New outgoing connections | |
222 module:hook("stanza/http://etherx.jabber.org/streams:features", on_new_s2s, 501); | |
223 module:hook("s2sout-authenticate-legacy", on_new_s2s, 200); | |
224 | |
225 -- New incoming connections | |
226 module:hook("s2s-stream-features", on_new_s2s, 10); | |
227 | |
228 module:hook("s2s-authenticated", function(event) | 202 module:hook("s2s-authenticated", function(event) |
229 local session = event.session; | 203 local session = event.session; |
230 if session.dane and type(session.dane) == "table" and next(session.dane) ~= nil and not session.secure then | 204 if session.dane and type(session.dane) == "table" and next(session.dane) ~= nil and not session.secure then |
231 -- TLSA record but no TLS, not ok. | 205 -- TLSA record but no TLS, not ok. |
232 -- TODO Optional? | 206 -- TODO Optional? |
270 log("warn", "Length mismatch: Cert: %d, TLSA: %d", #certdata, #tlsa.data); | 244 log("warn", "Length mismatch: Cert: %d, TLSA: %d", #certdata, #tlsa.data); |
271 end | 245 end |
272 return certdata == tlsa.data; | 246 return certdata == tlsa.data; |
273 end | 247 end |
274 | 248 |
249 -- Re-run streamopend() to continue | |
250 local function resume(session) | |
251 local attr = { | |
252 version = session.version, | |
253 to = session.to_host, | |
254 from = session.from_host, | |
255 id = session.streamid, | |
256 }; | |
257 session.cert_chain_status = nil; | |
258 session.open_stream.stream_callbacks.streamopened(session, attr); | |
259 end | |
260 | |
275 module:hook("s2s-check-certificate", function(event) | 261 module:hook("s2s-check-certificate", function(event) |
276 local session, cert, host = event.session, event.cert, event.host; | 262 local session, cert, host = event.session, event.cert, event.host; |
277 if not cert then return end | 263 if not cert then return end |
278 local log = session.log or module._log; | 264 local log = session.log or module._log; |
279 local dane = session.dane; | 265 local dane = session.dane; |
266 if dane == nil and dane_lookup(session, resume) then | |
267 return false; | |
268 end | |
280 if type(dane) == "table" then | 269 if type(dane) == "table" then |
281 local match_found, supported_found; | 270 local match_found, supported_found; |
282 for i = 1, #dane do | 271 for i = 1, #dane do |
283 local tlsa = dane[i].tlsa; | 272 local tlsa = dane[i].tlsa; |
284 log("debug", "TLSA #%d: %s", i, tostring(tlsa)) | 273 log("debug", "TLSA #%d: %s", i, tostring(tlsa)) |