Merge 0.10->trunk
[prosody.git] / plugins / mod_tls.lua
index d9670d7338393bd5c522e4a29a673924314341c4..d1138e1c40e5dbf047648d69944f506f9a21dfa6 100644 (file)
@@ -21,6 +21,7 @@ end
 
 local xmlns_starttls = 'urn:ietf:params:xml:ns:xmpp-tls';
 local starttls_attr = { xmlns = xmlns_starttls };
+local starttls_initiate= st.stanza("starttls", starttls_attr);
 local starttls_proceed = st.stanza("proceed", starttls_attr);
 local starttls_failure = st.stanza("failure", starttls_attr);
 local c2s_feature = st.stanza("starttls", starttls_attr);
@@ -34,7 +35,7 @@ local host = hosts[module.host];
 local ssl_ctx_c2s, ssl_ctx_s2sout, ssl_ctx_s2sin;
 local ssl_cfg_c2s, ssl_cfg_s2sout, ssl_cfg_s2sin;
 do
-       local NULL = {};
+       local NULL, err = {};
        local global = module:context("*");
        local parent = module:context(module.host:match("%.(.*)$"));
 
@@ -49,18 +50,18 @@ do
        local parent_s2s = parent:get_option("s2s_ssl", NULL);
        local host_s2s   = module:get_option("s2s_ssl", parent_s2s);
 
-       ssl_ctx_c2s, ssl_cfg_c2s = create_context(host.host, "server", host_c2s, host_ssl, global_c2s); -- for incoming client connections
-       if not ssl_ctx_c2s then module:log("error", "Error creating context for c2s: %s", ssl_cfg_c2s); end
+       ssl_ctx_c2s, err, ssl_cfg_c2s = create_context(host.host, "server", host_c2s, host_ssl, global_c2s); -- for incoming client connections
+       if not ssl_ctx_c2s then module:log("error", "Error creating context for c2s: %s", err); end
 
-       ssl_ctx_s2sout, ssl_cfg_s2sout = create_context(host.host, "client", host_s2s, host_ssl, global_s2s); -- for outgoing server connections
-       if not ssl_ctx_s2sout then module:log("error", "Error creating contexts for s2sout: %s", ssl_cfg_s2sin); end
+       ssl_ctx_s2sout, err, ssl_cfg_s2sout = create_context(host.host, "client", host_s2s, host_ssl, global_s2s); -- for outgoing server connections
+       if not ssl_ctx_s2sout then module:log("error", "Error creating contexts for s2sout: %s", err); end
 
-       ssl_ctx_s2sin, ssl_cfg_s2sin = create_context(host.host, "server", host_s2s, host_ssl, global_s2s); -- for incoming server connections
-       if not ssl_ctx_s2sin then module:log("error", "Error creating contexts for s2sin: %s", ssl_cfg_s2sin); end
+       ssl_ctx_s2sin, err, ssl_cfg_s2sin = create_context(host.host, "server", host_s2s, host_ssl, global_s2s); -- for incoming server connections
+       if not ssl_ctx_s2sin then module:log("error", "Error creating contexts for s2sin: %s", err); end
 end
 
 local function can_do_tls(session)
-       if not session.conn.starttls then
+       if session.ssl_ctx == false or not session.conn.starttls then
                return false;
        elseif session.ssl_ctx then
                return true;
@@ -116,7 +117,7 @@ module:hook_stanza("http://etherx.jabber.org/streams", "features", function (ses
        module:log("debug", "Received features element");
        if can_do_tls(session) and stanza:get_child("starttls", xmlns_starttls) then
                module:log("debug", "%s is offering TLS, taking up the offer...", session.to_host);
-               session.sends2s("<starttls xmlns='"..xmlns_starttls.."'/>");
+               session.sends2s(starttls_initiate);
                return true;
        end
 end, 500);