Software / code / prosody
Comparison
plugins/mod_tls.lua @ 2605:ade70495fe7f
mod_tls: Cleanup.
| author | Waqas Hussain <waqas20@gmail.com> |
|---|---|
| date | Fri, 12 Feb 2010 03:46:48 +0500 |
| parent | 2604:ed32f7bad620 |
| child | 2607:35a5d1c5ea28 |
comparison
equal
deleted
inserted
replaced
| 2604:ed32f7bad620 | 2605:ade70495fe7f |
|---|---|
| 6 -- COPYING file in the source package for more information. | 6 -- COPYING file in the source package for more information. |
| 7 -- | 7 -- |
| 8 | 8 |
| 9 local st = require "util.stanza"; | 9 local st = require "util.stanza"; |
| 10 | 10 |
| 11 local xmlns_stream = 'http://etherx.jabber.org/streams'; | |
| 12 local xmlns_starttls = 'urn:ietf:params:xml:ns:xmpp-tls'; | |
| 13 | |
| 14 local secure_auth_only = module:get_option("c2s_require_encryption") or module:get_option("require_encryption"); | 11 local secure_auth_only = module:get_option("c2s_require_encryption") or module:get_option("require_encryption"); |
| 15 local secure_s2s_only = module:get_option("s2s_require_encryption"); | 12 local secure_s2s_only = module:get_option("s2s_require_encryption"); |
| 16 | 13 |
| 14 local xmlns_starttls = 'urn:ietf:params:xml:ns:xmpp-tls'; | |
| 15 local starttls_attr = { xmlns = xmlns_starttls }; | |
| 16 local starttls_proceed = st.stanza("proceed", starttls_attr); | |
| 17 local starttls_failure = st.stanza("failure", starttls_attr); | |
| 18 local c2s_feature = st.stanza("starttls", starttls_attr); | |
| 19 local s2s_feature = st.stanza("starttls", starttls_attr); | |
| 20 if secure_auth_only then c2s_feature:tag("required"):up(); end | |
| 21 if secure_s2s_only then s2s_feature:tag("required"):up(); end | |
| 22 | |
| 17 local global_ssl_ctx = prosody.global_ssl_ctx; | 23 local global_ssl_ctx = prosody.global_ssl_ctx; |
| 18 | 24 |
| 25 -- Hook <starttls/> | |
| 19 module:hook("stanza/urn:ietf:params:xml:ns:xmpp-tls:starttls", function(event) | 26 module:hook("stanza/urn:ietf:params:xml:ns:xmpp-tls:starttls", function(event) |
| 20 local origin = event.origin; | 27 local origin = event.origin; |
| 21 if origin.conn.starttls then | 28 if origin.conn.starttls then |
| 22 (origin.sends2s or origin.send)(st.stanza("proceed", { xmlns = xmlns_starttls })); | 29 (origin.sends2s or origin.send)(starttls_proceed); |
| 23 origin:reset_stream(); | 30 origin:reset_stream(); |
| 24 local host = origin.to_host or origin.host; | 31 local host = origin.to_host or origin.host; |
| 25 local ssl_ctx = host and hosts[host].ssl_ctx_in or global_ssl_ctx; | 32 local ssl_ctx = host and hosts[host].ssl_ctx_in or global_ssl_ctx; |
| 26 origin.conn:starttls(ssl_ctx); | 33 origin.conn:starttls(ssl_ctx); |
| 27 origin.log("info", "TLS negotiation started for %s...", origin.type); | 34 origin.log("info", "TLS negotiation started for %s...", origin.type); |
| 28 origin.secure = false; | 35 origin.secure = false; |
| 29 else | 36 else |
| 30 origin.log("warn", "Attempt to start TLS, but TLS is not available on this %s connection", origin.type); | 37 origin.log("warn", "Attempt to start TLS, but TLS is not available on this %s connection", origin.type); |
| 31 (origin.sends2s or origin.send)(st.stanza("failure", { xmlns = xmlns_starttls })); | 38 (origin.sends2s or origin.send)(starttls_failure); |
| 32 origin:close(); | 39 origin:close(); |
| 33 end | 40 end |
| 34 return true; | 41 return true; |
| 35 end); | 42 end); |
| 36 | 43 |
| 37 | 44 -- Advertize stream feature |
| 38 local starttls_attr = { xmlns = xmlns_starttls }; | 45 module:add_event_hook("stream-features", function(session, features) |
| 39 module:add_event_hook("stream-features", | 46 if not session.username and session.conn.starttls then |
| 40 function (session, features) | 47 features:add_child(c2s_feature); |
| 41 if not session.username and session.conn.starttls then | 48 end |
| 42 features:tag("starttls", starttls_attr); | 49 end); |
| 43 if secure_auth_only then | 50 module:hook("s2s-stream-features", function(event) |
| 44 features:tag("required"):up():up(); | 51 local session, features = event.session, event.features; |
| 45 else | 52 if session.to_host and session.type ~= "s2sin" and session.conn.starttls then |
| 46 features:up(); | 53 features:add_child(s2s_feature); |
| 47 end | 54 end |
| 48 end | 55 end); |
| 49 end); | |
| 50 | |
| 51 module:hook("s2s-stream-features", | |
| 52 function (data) | |
| 53 local session, features = data.session, data.features; | |
| 54 if session.to_host and session.type ~= "s2sin" and session.conn.starttls then | |
| 55 features:tag("starttls", starttls_attr) | |
| 56 if secure_s2s_only then | |
| 57 features:tag("required"):up():up(); | |
| 58 else | |
| 59 features:up(); | |
| 60 end | |
| 61 end | |
| 62 end); | |
| 63 | 56 |
| 64 -- For s2sout connections, start TLS if we can | 57 -- For s2sout connections, start TLS if we can |
| 65 module:hook_stanza(xmlns_stream, "features", | 58 module:hook_stanza("http://etherx.jabber.org/streams", "features", function (session, stanza) |
| 66 function (session, stanza) | 59 module:log("debug", "Received features element"); |
| 67 module:log("debug", "Received features element"); | 60 if session.conn.starttls and stanza:child_with_ns(xmlns_starttls) then |
| 68 if session.conn.starttls and stanza:child_with_ns(xmlns_starttls) then | 61 module:log("%s is offering TLS, taking up the offer...", session.to_host); |
| 69 module:log("%s is offering TLS, taking up the offer...", session.to_host); | 62 session.sends2s("<starttls xmlns='"..xmlns_starttls.."'/>"); |
| 70 session.sends2s("<starttls xmlns='"..xmlns_starttls.."'/>"); | 63 return true; |
| 71 return true; | 64 end |
| 72 end | 65 end, 500); |
| 73 end, 500); | 66 module:hook_stanza(xmlns_starttls, "proceed", function (session, stanza) |
| 74 | 67 module:log("debug", "Proceeding with TLS on s2sout..."); |
| 75 module:hook_stanza(xmlns_starttls, "proceed", | 68 session:reset_stream(); |
| 76 function (session, stanza) | 69 local ssl_ctx = session.from_host and hosts[session.from_host].ssl_ctx or global_ssl_ctx; |
| 77 module:log("debug", "Proceeding with TLS on s2sout..."); | 70 session.conn:starttls(ssl_ctx, true); |
| 78 session:reset_stream(); | 71 session.secure = false; |
| 79 local ssl_ctx = session.from_host and hosts[session.from_host].ssl_ctx or global_ssl_ctx; | 72 return true; |
| 80 session.conn:starttls(ssl_ctx, true); | 73 end); |
| 81 session.secure = false; | |
| 82 return true; | |
| 83 end); |