diff options
-rw-r--r-- | plugins/mod_tls.lua | 90 |
1 files changed, 40 insertions, 50 deletions
diff --git a/plugins/mod_tls.lua b/plugins/mod_tls.lua index 3a5940b9..a17696c7 100644 --- a/plugins/mod_tls.lua +++ b/plugins/mod_tls.lua @@ -8,18 +8,25 @@ local st = require "util.stanza"; -local xmlns_stream = 'http://etherx.jabber.org/streams'; -local xmlns_starttls = 'urn:ietf:params:xml:ns:xmpp-tls'; - local secure_auth_only = module:get_option("c2s_require_encryption") or module:get_option("require_encryption"); local secure_s2s_only = module:get_option("s2s_require_encryption"); +local xmlns_starttls = 'urn:ietf:params:xml:ns:xmpp-tls'; +local starttls_attr = { xmlns = xmlns_starttls }; +local starttls_proceed = st.stanza("proceed", starttls_attr); +local starttls_failure = st.stanza("failure", starttls_attr); +local c2s_feature = st.stanza("starttls", starttls_attr); +local s2s_feature = st.stanza("starttls", starttls_attr); +if secure_auth_only then c2s_feature:tag("required"):up(); end +if secure_s2s_only then s2s_feature:tag("required"):up(); end + local global_ssl_ctx = prosody.global_ssl_ctx; +-- Hook <starttls/> module:hook("stanza/urn:ietf:params:xml:ns:xmpp-tls:starttls", function(event) local origin = event.origin; if origin.conn.starttls then - (origin.sends2s or origin.send)(st.stanza("proceed", { xmlns = xmlns_starttls })); + (origin.sends2s or origin.send)(starttls_proceed); origin:reset_stream(); local host = origin.to_host or origin.host; local ssl_ctx = host and hosts[host].ssl_ctx_in or global_ssl_ctx; @@ -28,56 +35,39 @@ module:hook("stanza/urn:ietf:params:xml:ns:xmpp-tls:starttls", function(event) origin.secure = false; else origin.log("warn", "Attempt to start TLS, but TLS is not available on this %s connection", origin.type); - (origin.sends2s or origin.send)(st.stanza("failure", { xmlns = xmlns_starttls })); + (origin.sends2s or origin.send)(starttls_failure); origin:close(); end return true; end); - -local starttls_attr = { xmlns = xmlns_starttls }; -module:add_event_hook("stream-features", - function (session, features) - if not session.username and session.conn.starttls then - features:tag("starttls", starttls_attr); - if secure_auth_only then - features:tag("required"):up():up(); - else - features:up(); - end - end - end); - -module:hook("s2s-stream-features", - function (data) - local session, features = data.session, data.features; - if session.to_host and session.type ~= "s2sin" and session.conn.starttls then - features:tag("starttls", starttls_attr) - if secure_s2s_only then - features:tag("required"):up():up(); - else - features:up(); - end - end - end); +-- Advertize stream feature +module:add_event_hook("stream-features", function(session, features) + if not session.username and session.conn.starttls then + features:add_child(c2s_feature); + end +end); +module:hook("s2s-stream-features", function(event) + local session, features = event.session, event.features; + if session.to_host and session.type ~= "s2sin" and session.conn.starttls then + features:add_child(s2s_feature); + end +end); -- For s2sout connections, start TLS if we can -module:hook_stanza(xmlns_stream, "features", - function (session, stanza) - module:log("debug", "Received features element"); - if session.conn.starttls and stanza:child_with_ns(xmlns_starttls) then - module:log("%s is offering TLS, taking up the offer...", session.to_host); - session.sends2s("<starttls xmlns='"..xmlns_starttls.."'/>"); - return true; - end - end, 500); - -module:hook_stanza(xmlns_starttls, "proceed", - function (session, stanza) - module:log("debug", "Proceeding with TLS on s2sout..."); - session:reset_stream(); - local ssl_ctx = session.from_host and hosts[session.from_host].ssl_ctx or global_ssl_ctx; - session.conn:starttls(ssl_ctx, true); - session.secure = false; - return true; - end); +module:hook_stanza("http://etherx.jabber.org/streams", "features", function (session, stanza) + module:log("debug", "Received features element"); + if session.conn.starttls and stanza:child_with_ns(xmlns_starttls) then + module:log("%s is offering TLS, taking up the offer...", session.to_host); + session.sends2s("<starttls xmlns='"..xmlns_starttls.."'/>"); + return true; + end +end, 500); +module:hook_stanza(xmlns_starttls, "proceed", function (session, stanza) + module:log("debug", "Proceeding with TLS on s2sout..."); + session:reset_stream(); + local ssl_ctx = session.from_host and hosts[session.from_host].ssl_ctx or global_ssl_ctx; + session.conn:starttls(ssl_ctx, true); + session.secure = false; + return true; +end); |