Comparison

core/s2smanager.lua @ 3651:337391d34b70

s2s: SASL EXTERNAL
author Paul Aurich <paul@darkrain42.org>
date Sun, 21 Nov 2010 21:10:43 -0800
parent 3650:2b80450bd7ae
child 3663:300ae72fd692
comparison
equal deleted inserted replaced
3650:2b80450bd7ae 3651:337391d34b70
25 local wrapclient = require "net.server".wrapclient; 25 local wrapclient = require "net.server".wrapclient;
26 local modulemanager = require "core.modulemanager"; 26 local modulemanager = require "core.modulemanager";
27 local st = require "stanza"; 27 local st = require "stanza";
28 local stanza = st.stanza; 28 local stanza = st.stanza;
29 local nameprep = require "util.encodings".stringprep.nameprep; 29 local nameprep = require "util.encodings".stringprep.nameprep;
30 local cert_verify_identity = require "util.certverification".verify_identity;
30 31
31 local fire_event = prosody.events.fire_event; 32 local fire_event = prosody.events.fire_event;
32 local uuid_gen = require "util.uuid".generate; 33 local uuid_gen = require "util.uuid".generate;
33 34
34 local logger_init = require "util.logger".init; 35 local logger_init = require "util.logger".init;
371 xmlns='jabber:server', ["xmlns:db"]='jabber:server:dialback', 372 xmlns='jabber:server', ["xmlns:db"]='jabber:server:dialback',
372 ["xmlns:stream"]='http://etherx.jabber.org/streams', 373 ["xmlns:stream"]='http://etherx.jabber.org/streams',
373 from=from, to=to, version='1.0', ["xml:lang"]='en'}):top_tag()); 374 from=from, to=to, version='1.0', ["xml:lang"]='en'}):top_tag());
374 end 375 end
375 376
377 local function check_cert_status(session)
378 local conn = session.conn:socket()
379 local cert = conn:getpeercertificate()
380
381 if cert then
382 local chain_valid, err = conn:getpeerchainvalid()
383 if not chain_valid then
384 session.cert_chain_status = "invalid";
385 (session.log or log)("debug", "certificate chain validation result: %s", err);
386 else
387 session.cert_chain_status = "valid";
388
389 local host = session.direction == "incoming" and session.from_host or session.to_host
390
391 -- We'll go ahead and verify the asserted identity if the
392 -- connecting server specified one.
393 if host then
394 if cert_verify_identity(host, "xmpp-server", cert) then
395 session.cert_identity_status = "valid"
396 else
397 session.cert_identity_status = "invalid"
398 end
399 end
400 end
401 end
402 end
403
376 function streamopened(session, attr) 404 function streamopened(session, attr)
377 local send = session.sends2s; 405 local send = session.sends2s;
378 406
379 -- TODO: #29: SASL/TLS on s2s streams 407 -- TODO: #29: SASL/TLS on s2s streams
380 session.version = tonumber(attr.version) or 0; 408 session.version = tonumber(attr.version) or 0;
381 409
410 -- TODO: Rename session.secure to session.encrypted
382 if session.secure == false then 411 if session.secure == false then
383 session.secure = true; 412 session.secure = true;
384 end 413 end
385 414
386 if session.direction == "incoming" then 415 if session.direction == "incoming" then
387 -- Send a reply stream header 416 -- Send a reply stream header
388 session.to_host = attr.to and nameprep(attr.to); 417 session.to_host = attr.to and nameprep(attr.to);
389 session.from_host = attr.from and nameprep(attr.from); 418 session.from_host = attr.from and nameprep(attr.from);
390 419
405 text = "Server-to-server communication is not allowed to this host"; 434 text = "Server-to-server communication is not allowed to this host";
406 }); 435 });
407 return; 436 return;
408 end 437 end
409 end 438 end
439
440 if session.secure and not session.cert_chain_status then check_cert_status(session); end
441
410 send("<?xml version='1.0'?>"); 442 send("<?xml version='1.0'?>");
411 send(stanza("stream:stream", { xmlns='jabber:server', ["xmlns:db"]='jabber:server:dialback', 443 send(stanza("stream:stream", { xmlns='jabber:server', ["xmlns:db"]='jabber:server:dialback',
412 ["xmlns:stream"]='http://etherx.jabber.org/streams', id=session.streamid, from=session.to_host, to=session.from_host, version=(session.version > 0 and "1.0" or nil) }):top_tag()); 444 ["xmlns:stream"]='http://etherx.jabber.org/streams', id=session.streamid, from=session.to_host, to=session.from_host, version=(session.version > 0 and "1.0" or nil) }):top_tag());
413 if session.version >= 1.0 then 445 if session.version >= 1.0 then
414 local features = st.stanza("stream:features"); 446 local features = st.stanza("stream:features");
424 end 456 end
425 elseif session.direction == "outgoing" then 457 elseif session.direction == "outgoing" then
426 -- If we are just using the connection for verifying dialback keys, we won't try and auth it 458 -- If we are just using the connection for verifying dialback keys, we won't try and auth it
427 if not attr.id then error("stream response did not give us a streamid!!!"); end 459 if not attr.id then error("stream response did not give us a streamid!!!"); end
428 session.streamid = attr.id; 460 session.streamid = attr.id;
429 461
462 if session.secure and not session.cert_chain_status then check_cert_status(session); end
463
430 -- Send unauthed buffer 464 -- Send unauthed buffer
431 -- (stanzas which are fine to send before dialback) 465 -- (stanzas which are fine to send before dialback)
432 -- Note that this is *not* the stanza queue (which 466 -- Note that this is *not* the stanza queue (which
433 -- we can only send if auth succeeds) :) 467 -- we can only send if auth succeeds) :)
434 local send_buffer = session.send_buffer; 468 local send_buffer = session.send_buffer;