plugins/mod_s2s_auth_certs.lua
changeset 6319 92d009af6eba
child 6320 17344d25a0f6
equal deleted inserted replaced
6315:7a3e2f2d43fc 6319:92d009af6eba
       
     1 module:set_global();
       
     2 
       
     3 local cert_verify_identity = require "util.x509".verify_identity;
       
     4 local NULL = {};
       
     5 local log = module._log;
       
     6 
       
     7 module:hook("s2s-check-certificate", function(event)
       
     8 	local session, host, cert = event.session, event.host, event.cert;
       
     9 	local conn = session.conn:socket();
       
    10 
       
    11 	if cert then
       
    12 		local chain_valid, errors;
       
    13 		if conn.getpeerverification then
       
    14 			chain_valid, errors = conn:getpeerverification();
       
    15 		elseif conn.getpeerchainvalid then -- COMPAT mw/luasec-hg
       
    16 			chain_valid, errors = conn:getpeerchainvalid();
       
    17 			errors = (not chain_valid) and { { errors } } or nil;
       
    18 		else
       
    19 			chain_valid, errors = false, { { "Chain verification not supported by this version of LuaSec" } };
       
    20 		end
       
    21 		-- Is there any interest in printing out all/the number of errors here?
       
    22 		if not chain_valid then
       
    23 			(session.log or log)("debug", "certificate chain validation result: invalid");
       
    24 			for depth, t in pairs(errors or NULL) do
       
    25 				(session.log or log)("debug", "certificate error(s) at depth %d: %s", depth-1, table.concat(t, ", "))
       
    26 			end
       
    27 			session.cert_chain_status = "invalid";
       
    28 		else
       
    29 			(session.log or log)("debug", "certificate chain validation result: valid");
       
    30 			session.cert_chain_status = "valid";
       
    31 
       
    32 			-- We'll go ahead and verify the asserted identity if the
       
    33 			-- connecting server specified one.
       
    34 			if host then
       
    35 				if cert_verify_identity(host, "xmpp-server", cert) then
       
    36 					session.cert_identity_status = "valid"
       
    37 				else
       
    38 					session.cert_identity_status = "invalid"
       
    39 				end
       
    40 				(session.log or log)("debug", "certificate identity validation result: %s", session.cert_identity_status);
       
    41 			end
       
    42 		end
       
    43 	end
       
    44 end, 509);
       
    45