Changeset

6571:4a864b6e8963

Merge 0.10->trunk
author Kim Alvefur <zash@zash.se>
date Mon, 09 Feb 2015 00:48:08 +0100
parents 6560:6f39c58bdcc4 (current diff) 6570:70e65ac65219 (diff)
children 6573:afd638e9c6d0
files
diffstat 3 files changed, 45 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/core/certmanager.lua	Mon Jan 26 15:27:19 2015 +0100
+++ b/core/certmanager.lua	Mon Feb 09 00:48:08 2015 +0100
@@ -6,10 +6,22 @@
 -- COPYING file in the source package for more information.
 --
 
+local softreq = require"util.dependencies".softreq;
+local ssl = softreq"ssl";
+if not ssl then
+	return {
+		create_context = function ()
+			return nil, "LuaSec (required for encryption) was not found";
+		end;
+		reload_ssl_config = function () end;
+	}
+end
+
 local configmanager = require "core.configmanager";
 local log = require "util.logger".init("certmanager");
-local ssl = _G.ssl;
-local ssl_newcontext = ssl and ssl.newcontext;
+local ssl_context = ssl.context or softreq"ssl.context";
+local ssl_x509 = ssl.x509 or softreq"ssl.x509";
+local ssl_newcontext = ssl.newcontext;
 local new_config = require"util.sslconfig".new;
 
 local tostring = tostring;
@@ -22,13 +34,16 @@
 local resolve_path = require"util.paths".resolve_relative_path;
 local config_path = prosody.paths.config;
 
-local luasec_has_noticket, luasec_has_verifyext, luasec_has_no_compression;
-if ssl then
-	local luasec_major, luasec_minor = ssl._VERSION:match("^(%d+)%.(%d+)");
-	luasec_has_noticket = tonumber(luasec_major)>0 or tonumber(luasec_minor)>=4;
-	luasec_has_verifyext = tonumber(luasec_major)>0 or tonumber(luasec_minor)>=5;
-	luasec_has_no_compression = tonumber(luasec_major)>0 or tonumber(luasec_minor)>=5;
-end
+local luasec_major, luasec_minor = ssl._VERSION:match("^(%d+)%.(%d+)");
+local luasec_version = luasec_major * 100 + luasec_minor;
+local luasec_has = {
+	-- TODO If LuaSec ever starts exposing these things itself, use that instead
+	cipher_server_preference = luasec_version >= 2;
+	no_ticket = luasec_version >= 4;
+	no_compression = luasec_version >= 5;
+	single_dh_use = luasec_version >= 2;
+	single_ecdh_use = luasec_version >= 2;
+};
 
 module "certmanager"
 
@@ -38,15 +53,15 @@
 -- Built-in defaults
 local core_defaults = {
 	capath = "/etc/ssl/certs";
+	depth = 9;
 	protocol = "tlsv1+";
-	verify = (ssl and ssl.x509 and { "peer", "client_once", }) or "none";
+	verify = (ssl_x509 and { "peer", "client_once", }) or "none";
 	options = {
-		cipher_server_preference = true;
-		no_ticket = luasec_has_noticket;
-		no_compression = luasec_has_no_compression and configmanager.get("*", "ssl_compression") ~= true;
-		-- Has no_compression? Then it has these too...
-		single_dh_use = luasec_has_no_compression;
-		single_ecdh_use = luasec_has_no_compression;
+		cipher_server_preference = luasec_has.cipher_server_preference;
+		no_ticket = luasec_has.no_ticket;
+		no_compression = luasec_has.no_compression and configmanager.get("*", "ssl_compression") ~= true;
+		single_dh_use = luasec_has.single_dh_use;
+		single_ecdh_use = luasec_has.single_ecdh_use;
 	};
 	verifyext = { "lsec_continue", "lsec_ignore_purpose" };
 	curve = "secp384r1";
@@ -56,7 +71,7 @@
 	key = true, certificate = true, cafile = true, capath = true, dhparam = true
 }
 
-if ssl and not luasec_has_verifyext and ssl.x509 then
+if luasec_version < 5 and ssl_x509 then
 	-- COMPAT mw/luasec-hg
 	for i=1,#core_defaults.verifyext do -- Remove lsec_ prefix
 		core_defaults.verify[#core_defaults.verify+1] = core_defaults.verifyext[i]:sub(6);
@@ -64,8 +79,6 @@
 end
 
 function create_context(host, mode, ...)
-	if not ssl then return nil, "LuaSec (required for encryption) was not found"; end
-
 	local cfg = new_config();
 	cfg:apply(core_defaults);
 	cfg:apply(global_ssl_config);
@@ -108,7 +121,7 @@
 	-- of it ourselves (W/A for #x)
 	if ctx and user_ssl_config.ciphers then
 		local success;
-		success, err = ssl.context.setcipher(ctx, user_ssl_config.ciphers);
+		success, err = ssl_context.setcipher(ctx, user_ssl_config.ciphers);
 		if not success then ctx = nil; end
 	end
 
@@ -143,7 +156,7 @@
 
 function reload_ssl_config()
 	global_ssl_config = configmanager.get("*", "ssl");
-	if luasec_has_no_compression then
+	if luasec_has.no_compression then
 		core_defaults.options.no_compression = configmanager.get("*", "ssl_compression") ~= true;
 	end
 end
--- a/core/sessionmanager.lua	Mon Jan 26 15:27:19 2015 +0100
+++ b/core/sessionmanager.lua	Mon Feb 09 00:48:08 2015 +0100
@@ -117,6 +117,16 @@
 	if session.resource then return nil, "cancel", "already-bound", "Cannot bind multiple resources on a single connection"; end
 	-- We don't support binding multiple resources
 
+	local event_payload = { session = session, resource = resource };
+	if hosts[session.host].events.fire_event("pre-resource-bind", event_payload) == false then
+		local err = event_payload.error;
+		if err then return nil, err.type, err.condition, err.text; end
+		return nil, "cancel", "not-allowed";
+	else
+		-- In case a plugin wants to poke at it
+		resource = event_payload.resource;
+	end
+
 	resource = resourceprep(resource);
 	resource = resource ~= "" and resource or uuid_generate();
 	--FIXME: Randomly-generated resources must be unique per-user, and never conflict with existing
--- a/util/statistics.lua	Mon Jan 26 15:27:19 2015 +0100
+++ b/util/statistics.lua	Mon Feb 09 00:48:08 2015 +0100
@@ -8,7 +8,7 @@
 	local n = pc/100 * (length + 1);
 	local k, d = m_floor(n), n%1;
 	if k == 0 then
-		return arr[1];
+		return arr[1] or 0;
 	elseif k >= length then
 		return arr[length];
 	end