Merge 0.10->trunk
[prosody.git] / plugins / mod_s2s_auth_certs.lua
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         local log = session.log or log;
11
12         if not cert then
13                 log("warn", "No certificate provided by %s", host or "unknown host");
14                 return;
15         end
16
17         local chain_valid, errors;
18         if conn.getpeerverification then
19                 chain_valid, errors = conn:getpeerverification();
20         elseif conn.getpeerchainvalid then -- COMPAT mw/luasec-hg
21                 chain_valid, errors = conn:getpeerchainvalid();
22                 errors = (not chain_valid) and { { errors } } or nil;
23         else
24                 chain_valid, errors = false, { { "Chain verification not supported by this version of LuaSec" } };
25         end
26         -- Is there any interest in printing out all/the number of errors here?
27         if not chain_valid then
28                 log("debug", "certificate chain validation result: invalid");
29                 for depth, t in pairs(errors or NULL) do
30                         log("debug", "certificate error(s) at depth %d: %s", depth-1, table.concat(t, ", "))
31                 end
32                 session.cert_chain_status = "invalid";
33         else
34                 log("debug", "certificate chain validation result: valid");
35                 session.cert_chain_status = "valid";
36
37                 -- We'll go ahead and verify the asserted identity if the
38                 -- connecting server specified one.
39                 if host then
40                         if cert_verify_identity(host, "xmpp-server", cert) then
41                                 session.cert_identity_status = "valid"
42                         else
43                                 session.cert_identity_status = "invalid"
44                         end
45                         log("debug", "certificate identity validation result: %s", session.cert_identity_status);
46                 end
47         end
48 end, 509);
49