# HG changeset patch
# User Matthew Wild <mwild1@gmail.com>
# Date 1736275644 0
# Node ID 6fafe51df1880d705fa8750133742e68465a25aa
# Parent  abbdcef552fb513ad712591045a4d6316275f836
prosodyctl: adduser: use shell user:create() to provide the implementation

This allows user creation to happen inside the running Prosody process, which
improves a number of things - such as executing event handlers for user
creation, fixing issues and race conditions with some storage drivers, etc.

The intent is to do the same for the other prosodyctl commands, but this is
the first proof of concept for the approach.

diff -r abbdcef552fb -r 6fafe51df188 prosodyctl
--- a/prosodyctl	Tue Jan 07 18:17:57 2025 +0000
+++ b/prosodyctl	Tue Jan 07 18:47:24 2025 +0000
@@ -146,38 +146,9 @@
 		show_usage([[adduser JID]], [[Create the specified user account in Prosody]]);
 		return opts.help and 0 or 1;
 	end
-	local user, host = jid_split(arg[1]);
-	if not user and host then
-		show_message [[Failed to understand JID, please supply the JID you want to create]]
-		show_usage [[adduser user@host]]
-		return 1;
-	end
 
-	if not host then
-		show_message [[Please specify a JID, including a host. e.g. alice@example.com]];
-		return 1;
-	end
-
-	if not prosody.hosts[host] then
-		show_warning("The host '%s' is not listed in the configuration file (or is not enabled).", host)
-		show_warning("The user will not be able to log in until this is changed.");
-		prosody.hosts[host] = startup.make_host(host); --luacheck: ignore 122
-	end
-
-	if prosodyctl.user_exists{ user = user, host = host } then
-		show_message [[That user already exists]];
-		return 1;
-	end
-
-	local password = read_password();
-	if not password then return 1; end
-
-	local ok, msg = prosodyctl.adduser { user = user, host = host, password = password };
-
-	if ok then return 0; end
-
-	show_message(error_messages[msg])
-	return 1;
+	local shell = require "prosody.util.prosodyctl.shell";
+	return shell.shell({ ("user:create(%q, nil, %q)"):format(arg[1], "prosody:member") });
 end
 
 function commands.passwd(arg)