Merge 0.10->trunk
authorKim Alvefur <zash@zash.se>
Sun, 10 Jan 2016 03:57:17 +0100
changeset 7077 3ff83773ffc0
parent 7066 bc1b375f379e (current diff)
parent 7076 31fa6770019c (diff)
child 7078 47a2deb74b56
Merge 0.10->trunk
net/server_select.lua
plugins/mod_admin_telnet.lua
--- a/Makefile	Fri Jan 08 16:21:05 2016 +0100
+++ b/Makefile	Sun Jan 10 03:57:17 2016 +0100
@@ -52,6 +52,9 @@
 	rm -f prosody.version
 	$(MAKE) clean -C util-src
 
+test:
+	cd tests && ./run_tests.sh
+
 util/%.so:
 	$(MAKE) install -C util-src
 
--- a/core/rostermanager.lua	Fri Jan 08 16:21:05 2016 +0100
+++ b/core/rostermanager.lua	Sun Jan 10 03:57:17 2016 +0100
@@ -300,17 +300,17 @@
 	if pending then
 		roster[false].pending[jid] = nil;
 	end
-	local subscribed;
+	local is_subscribed;
 	if item then
 		if item.subscription == "from" then
 			item.subscription = "none";
-			subscribed = true;
+			is_subscribed = true;
 		elseif item.subscription == "both" then
 			item.subscription = "to";
-			subscribed = true;
+			is_subscribed = true;
 		end
 	end
-	local success = (pending or subscribed) and save_roster(username, host, roster);
+	local success = (pending or is_subscribed) and save_roster(username, host, roster);
 	return success, pending, subscribed;
 end
 
--- a/net/server_select.lua	Fri Jan 08 16:21:05 2016 +0100
+++ b/net/server_select.lua	Sun Jan 10 03:57:17 2016 +0100
@@ -391,6 +391,9 @@
 		out_put "server.lua: closed client handler and removed socket from list"
 		return true
 	end
+	handler.server = function ( )
+		return server
+	end
 	handler.ip = function( )
 		return ip
 	end
--- a/plugins/mod_admin_telnet.lua	Fri Jan 08 16:21:05 2016 +0100
+++ b/plugins/mod_admin_telnet.lua	Sun Jan 10 03:57:17 2016 +0100
@@ -22,7 +22,7 @@
 
 local iterators = require "util.iterators";
 local keys, values = iterators.keys, iterators.values;
-local jid_bare, jid_split = import("util.jid", "bare", "prepped_split");
+local jid_bare, jid_split, jid_join = import("util.jid", "bare", "prepped_split", "join");
 local set, array = require "util.set", require "util.array";
 local cert_verify_identity = require "util.x509".verify_identity;
 local envload = require "util.envload".envload;
@@ -576,35 +576,46 @@
 
 def_env.c2s = {};
 
+local function get_jid(session)
+	if session.username then
+		return session.full_jid or jid_join(session.username, session.host, session.resource);
+	end
+
+	local conn = session.conn;
+	local ip = session.ip or "?";
+	local clientport = conn and conn:clientport() or "?";
+	local serverip = conn and conn.server and conn:server():ip() or "?";
+	local serverport = conn and conn:serverport() or "?"
+	return jid_join("["..ip.."]:"..clientport, session.host or "["..serverip.."]:"..serverport);
+end
+
 local function show_c2s(callback)
-	for hostname, host in pairs(hosts) do
-		for username, user in pairs(host.sessions or {}) do
-			for resource, session in pairs(user.sessions or {}) do
-				local jid = username.."@"..hostname.."/"..resource;
-				callback(jid, session);
+	local c2s = array.collect(values(module:shared"/*/c2s/sessions"));
+	c2s:sort(function(a, b)
+		if a.host == b.host then
+			if a.username == b.username then
+				return a.resource or "" > b.resource or "";
 			end
+			return a.username or "" > b.username or "";
 		end
-	end
+		return a.host or "" > b.host or "";
+	end):map(function (session)
+		callback(get_jid(session), session)
+	end);
 end
 
 function def_env.c2s:count(match_jid)
-	local count = 0;
-	show_c2s(function (jid, session)
-		if (not match_jid) or jid:match(match_jid) then
-			count = count + 1;
-		end
-	end);
-	return true, "Total: "..count.." clients";
+	return true, "Total: "..  iterators.count(values(module:shared"/*/c2s/sessions")) .." clients";
 end
 
 function def_env.c2s:show(match_jid, annotate)
 	local print, count = self.session.print, 0;
 	annotate = annotate or session_flags;
-	local curr_host;
+	local curr_host = false;
 	show_c2s(function (jid, session)
 		if curr_host ~= session.host then
 			curr_host = session.host;
-			print(curr_host);
+			print(curr_host or "(not connected to any host yet)");
 		end
 		if (not match_jid) or jid:match(match_jid) then
 			count = count + 1;
@@ -1162,8 +1173,8 @@
 -------------
 
 function printbanner(session)
-	local option = module:get_option("console_banner");
-	if option == nil or option == "full" or option == "graphic" then
+	local option = module:get_option_string("console_banner", "full");
+	if option == "full" or option == "graphic" then
 		session.print [[
                    ____                \   /     _
                     |  _ \ _ __ ___  ___  _-_   __| |_   _
@@ -1174,17 +1185,13 @@
 
 ]]
 	end
-	if option == nil or option == "short" or option == "full" then
+	if option == "short" or option == "full" then
 	session.print("Welcome to the Prosody administration console. For a list of commands, type: help");
 	session.print("You may find more help on using this console in our online documentation at ");
 	session.print("http://prosody.im/doc/console\n");
 	end
-	if option and option ~= "short" and option ~= "full" and option ~= "graphic" then
-		if type(option) == "string" then
-			session.print(option)
-		elseif type(option) == "function" then
-			module:log("warn", "Using functions as value for the console_banner option is no longer supported");
-		end
+	if option ~= "short" and option ~= "full" and option ~= "graphic" then
+		session.print(option);
 	end
 end
 
--- a/prosodyctl	Fri Jan 08 16:21:05 2016 +0100
+++ b/prosodyctl	Sun Jan 10 03:57:17 2016 +0100
@@ -792,6 +792,8 @@
 			and openssl.req{new=true, x509=true, nodes=true, key=key_filename,
 				days=365, sha256=true, utf8=true, config=conf_filename, out=cert_filename} then
 			show_message("Certificate written to ".. cert_filename);
+			print();
+			show_message(("Example config:\n\nssl = {\n\tcertificate = %q;\n\tkey = %q;\n}"):format(cert_filename, key_filename));
 		else
 			show_message("There was a problem, see OpenSSL output");
 		end
--- a/tests/test.lua	Fri Jan 08 16:21:05 2016 +0100
+++ b/tests/test.lua	Sun Jan 10 03:57:17 2016 +0100
@@ -22,6 +22,7 @@
 	dotest "util.sasl.scram"
 	dotest "util.cache"
 	dotest "util.throttle"
+	dotest "util.uuid"
 
 	dosingletest("test_sasl.lua", "latin1toutf8");
 	dosingletest("test_utf8.lua", "valid");
@@ -145,10 +146,10 @@
 		unit._M = unit;
 	end
 	setfenv(chunk, unit);
-	local success, err = pcall(chunk);
+	local success, ret = pcall(chunk);
 	_fakeG.module, _fakeG._M = oldmodule, old_M;
 	if not success then
-		print("WARNING: ", "Failed to initialise module: "..unitname, err);
+		print("WARNING: ", "Failed to initialise module: "..unitname, ret);
 		return;
 	end
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test_util_uuid.lua	Sun Jan 10 03:57:17 2016 +0100
@@ -0,0 +1,24 @@
+-- This tests the format, not the randomness
+
+-- https://tools.ietf.org/html/rfc4122#section-4.4
+
+local pattern = "^" .. table.concat({
+	string.rep("%x", 8),
+	string.rep("%x", 4),
+	"4" .. -- version
+	string.rep("%x", 3),
+	"[89ab]" .. -- reserved bits of 1 and 0
+	string.rep("%x", 3),
+	string.rep("%x", 12),
+}, "%-") .. "$";
+
+function generate(generate)
+	for i = 1, 100 do
+		assert_is(generate():match(pattern));
+	end
+end
+
+function seed(seed)
+	assert_equal(seed("random string here"), nil, "seed doesn't return anything");
+end
+