aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile3
-rw-r--r--core/rostermanager.lua8
-rw-r--r--net/server_select.lua3
-rw-r--r--plugins/mod_admin_telnet.lua57
-rwxr-xr-xprosodyctl2
-rw-r--r--tests/test.lua5
-rw-r--r--tests/test_util_uuid.lua24
7 files changed, 71 insertions, 31 deletions
diff --git a/Makefile b/Makefile
index 130d8aa7..0138e05c 100644
--- a/Makefile
+++ b/Makefile
@@ -52,6 +52,9 @@ clean:
rm -f prosody.version
$(MAKE) clean -C util-src
+test:
+ cd tests && ./run_tests.sh
+
util/%.so:
$(MAKE) install -C util-src
diff --git a/core/rostermanager.lua b/core/rostermanager.lua
index f196ccf3..0b72d0a6 100644
--- a/core/rostermanager.lua
+++ b/core/rostermanager.lua
@@ -300,17 +300,17 @@ local function unsubscribed(username, host, jid)
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
diff --git a/net/server_select.lua b/net/server_select.lua
index 4df6e12d..c89747bb 100644
--- a/net/server_select.lua
+++ b/net/server_select.lua
@@ -391,6 +391,9 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
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
diff --git a/plugins/mod_admin_telnet.lua b/plugins/mod_admin_telnet.lua
index 02ba3ab0..bb5a13c3 100644
--- a/plugins/mod_admin_telnet.lua
+++ b/plugins/mod_admin_telnet.lua
@@ -22,7 +22,7 @@ local console_listener = { default_port = 5582; default_mode = "*a"; interface =
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 @@ end
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 @@ end
-------------
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 @@ function printbanner(session)
]]
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
diff --git a/prosodyctl b/prosodyctl
index e4ef45ad..0c80aca7 100755
--- a/prosodyctl
+++ b/prosodyctl
@@ -792,6 +792,8 @@ function cert_commands.generate(arg)
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
diff --git a/tests/test.lua b/tests/test.lua
index 1192b7b8..4f6c5335 100644
--- a/tests/test.lua
+++ b/tests/test.lua
@@ -22,6 +22,7 @@ function run_all_tests()
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 @@ function dotest(unitname)
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
diff --git a/tests/test_util_uuid.lua b/tests/test_util_uuid.lua
new file mode 100644
index 00000000..d3f72bb4
--- /dev/null
+++ b/tests/test_util_uuid.lua
@@ -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
+