diff options
author | Kim Alvefur <zash@zash.se> | 2014-07-25 21:16:52 +0200 |
---|---|---|
committer | Kim Alvefur <zash@zash.se> | 2014-07-25 21:16:52 +0200 |
commit | 2991d9e427ea17227ee52240929d1ba1f98444dd (patch) | |
tree | 0190a83e1d446f56057f182c2393ca855b3285e0 /plugins/mod_s2s_auth_certs.lua | |
parent | ab16d298a1ee0c27f2a7bb9b74f9071983244774 (diff) | |
parent | a2718c16c6009c31883b73ba5d5121e42f647f78 (diff) | |
download | prosody-2991d9e427ea17227ee52240929d1ba1f98444dd.tar.gz prosody-2991d9e427ea17227ee52240929d1ba1f98444dd.zip |
Merge 0.10->trunk
Diffstat (limited to 'plugins/mod_s2s_auth_certs.lua')
-rw-r--r-- | plugins/mod_s2s_auth_certs.lua | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/plugins/mod_s2s_auth_certs.lua b/plugins/mod_s2s_auth_certs.lua new file mode 100644 index 00000000..efc81130 --- /dev/null +++ b/plugins/mod_s2s_auth_certs.lua @@ -0,0 +1,46 @@ +module:set_global(); + +local cert_verify_identity = require "util.x509".verify_identity; +local NULL = {}; +local log = module._log; + +module:hook("s2s-check-certificate", function(event) + local session, host, cert = event.session, event.host, event.cert; + local conn = session.conn:socket(); + + if cert then + local log = session.log or log; + local chain_valid, errors; + if conn.getpeerverification then + chain_valid, errors = conn:getpeerverification(); + elseif conn.getpeerchainvalid then -- COMPAT mw/luasec-hg + chain_valid, errors = conn:getpeerchainvalid(); + errors = (not chain_valid) and { { errors } } or nil; + else + chain_valid, errors = false, { { "Chain verification not supported by this version of LuaSec" } }; + end + -- Is there any interest in printing out all/the number of errors here? + if not chain_valid then + log("debug", "certificate chain validation result: invalid"); + for depth, t in pairs(errors or NULL) do + log("debug", "certificate error(s) at depth %d: %s", depth-1, table.concat(t, ", ")) + end + session.cert_chain_status = "invalid"; + else + log("debug", "certificate chain validation result: valid"); + session.cert_chain_status = "valid"; + + -- We'll go ahead and verify the asserted identity if the + -- connecting server specified one. + if host then + if cert_verify_identity(host, "xmpp-server", cert) then + session.cert_identity_status = "valid" + else + session.cert_identity_status = "invalid" + end + log("debug", "certificate identity validation result: %s", session.cert_identity_status); + end + end + end +end, 509); + |