Merge 13.0->trunk

This commit is contained in:
Matthew Wild 2025-03-13 11:41:32 +00:00
commit 77fb638f4d
3 changed files with 45 additions and 20 deletions

View file

@ -92,13 +92,8 @@ end
-- Seed with default sections and their description text
help_topic "console" "Help regarding the console itself" [[
Hey! Welcome to Prosody's admin console.
First thing, if you're ever wondering how to get out, simply type 'quit'.
Secondly, note that we don't support the full telnet protocol yet (it's coming)
so you may have trouble using the arrow keys, etc. depending on your system.
For now we offer a couple of handy shortcuts:
!! - Repeat the last command
!old!new! - repeat the last command, but with 'old' replaced by 'new'
If you're ever wondering how to get out, simply type 'quit' (ctrl+d should also
work).
For those well-versed in Prosody's internals, or taking instruction from those who are,
you can prefix a command with > to escape the console sandbox, and access everything in
@ -347,6 +342,8 @@ local function handle_line(event)
local line = event.stanza:get_text();
local useglobalenv;
session.repl = event.stanza.attr.repl ~= "0";
local result = st.stanza("repl-result");
if line:match("^>") then
@ -427,10 +424,6 @@ local function handle_line(event)
end
end
if not source then
session.repl = true;
end
taskok, message = chunk(flags);
if promise.is_promise(taskok) then

View file

@ -11,6 +11,7 @@ local jid_split = require "prosody.util.jid".prepped_split;
local modulemanager = require "prosody.core.modulemanager";
local async = require "prosody.util.async";
local httputil = require "prosody.util.http";
local human_units = require "prosody.util.human.units";
local function api(host)
return setmetatable({ name = "prosodyctl.check"; host = host; log = prosody.log }, { __index = moduleapi })
@ -1493,6 +1494,10 @@ local function check(arg)
local function print_feature_status(feature, host)
if quiet then return; end
print("", feature.ok and "OK" or "(!)", feature.name);
if feature.desc then
print("", "", feature.desc);
print("");
end
if not feature.ok then
if feature.lacking_modules then
table.sort(feature.lacking_modules);
@ -1552,6 +1557,11 @@ local function check(arg)
end
end
end
if feature.meta then
for k, v in it.sorted_pairs(feature.meta) do
print("", "", (" - %s: %s"):format(k, v));
end
end
print("");
end
@ -1638,29 +1648,33 @@ local function check(arg)
current_feature.lacking_components = current_feature.lacking_components or {};
table.insert(current_feature.lacking_components, suggested);
end
return found;
end
local features = {
{
name = "Basic functionality";
desc = "Support for secure connections, authentication and messaging";
check = function ()
check_module("disco");
check_module("roster");
check_module("saslauth");
check_module("tls");
check_module("pep");
end;
};
{
name = "Multi-device sync";
name = "Multi-device messaging and data synchronization";
desc = "Multiple clients connected to the same account stay in sync";
check = function ()
check_module("carbons");
check_module("mam");
check_module("bookmarks");
check_module("pep");
end;
};
{
name = "Mobile optimizations";
desc = "Help mobile clients reduce battery and data usage";
check = function ()
check_module("smacks");
check_module("csi_simple", "csi_battery_saver");
@ -1668,6 +1682,7 @@ local function check(arg)
};
{
name = "Web connections";
desc = "Allow connections from browser-based web clients";
check = function ()
check_module("bosh");
check_module("websocket");
@ -1675,24 +1690,28 @@ local function check(arg)
};
{
name = "User profiles";
desc = "Enable users to publish profile information";
check = function ()
check_module("vcard_legacy", "vcard");
end;
};
{
name = "Blocking";
desc = "Block communication with chosen entities";
check = function ()
check_module("blocklist");
end;
};
{
name = "Push notifications";
desc = "Receive notifications on platforms that don't support persistent connections";
check = function ()
check_module("cloud_notify");
end;
};
{
name = "Audio/video calls";
name = "Audio/video calls and P2P";
desc = "Assist clients in setting up connections between each other";
check = function ()
check_module(
"turn_external",
@ -1704,12 +1723,25 @@ local function check(arg)
};
{
name = "File sharing";
check = function ()
check_component("http_file_share", "http_upload", "http_upload_external");
desc = "Sharing of files to groups and offline users";
check = function (self)
local service = check_component("http_file_share", "http_upload", "http_upload_external");
if service then
local size_limit;
if api(service):get_option("component_module") == "http_file_share" then
size_limit = api(service):get_option_number("http_file_share_size_limit", 10*1024*1024);
end
if size_limit then
self.meta = {
["Size limit"] = human_units.format(size_limit, "b", "b");
};
end
end
end;
};
{
name = "Group chats";
desc = "Create group chats and channels";
check = function ()
check_component("muc");
end;
@ -1722,7 +1754,7 @@ local function check(arg)
for _, feature in ipairs(features) do
current_feature = feature;
feature.check();
feature:check();
feature.ok = (
not feature.lacking_modules and
not feature.lacking_components and

View file

@ -29,8 +29,8 @@ local function read_line(prompt_string)
end
end
local function send_line(client, line)
client.send(st.stanza("repl-input", { width = tostring(term_width()) }):text(line));
local function send_line(client, line, interactive)
client.send(st.stanza("repl-input", { width = tostring(term_width()), repl = interactive == false and "0" or "1" }):text(line));
end
local function repl(client)
@ -91,7 +91,7 @@ local function start(arg) --luacheck: ignore 212/arg
end
client.events.add_handler("connected", function()
send_line(client, arg[1]);
send_line(client, arg[1], false);
return true;
end, 1);