Skip to content

Commit

Permalink
register-new-matrix-user: add a flag to ignore already existing users
Browse files Browse the repository at this point in the history
This allows to register users in a more declarative and stateless way.

Signed-off-by: Jörg Thalheim <joerg@thalheim.io>
  • Loading branch information
Mic92 committed Jun 19, 2024
1 parent 1992230 commit b8a8576
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 3 deletions.
2 changes: 2 additions & 0 deletions changelog.d/17304.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
`register_new_matrix_user` now supports a --exists-ok flag to allow registration of users that already exist in the database.
This is useful for scripts that bootstrap user accounts with initial passwords.
2 changes: 1 addition & 1 deletion debian/changelog
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
matrix-synapse-py3 (1.109.0+nmu1) UNRELEASED; urgency=medium

* `register_new_matrix_user` now supports a --password-file flag.
* `register_new_matrix_user` now supports a --password-file and a --exists-ok flag.

-- Synapse Packaging team <packages@matrix.org> Tue, 18 Jun 2024 13:29:36 +0100

Expand Down
3 changes: 3 additions & 0 deletions debian/register_new_matrix_user.ronn
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ A sample YAML file accepted by `register_new_matrix_user` is described below:
Shared secret as defined in server config file. This is an optional
parameter as it can be also supplied via the YAML file.

* `--exists-ok`:
Do not fail if the user already exists. The user account will be not updated in this case.

* `server_url`:
URL of the home server. Defaults to 'https://localhost:8448'.

Expand Down
22 changes: 20 additions & 2 deletions synapse/_scripts/register_new_matrix_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ def request_registration(
user_type: Optional[str] = None,
_print: Callable[[str], None] = print,
exit: Callable[[int], None] = sys.exit,
exists_ok: bool = False,
) -> None:
url = "%s/_synapse/admin/v1/register" % (server_location.rstrip("/"),)

Expand Down Expand Up @@ -97,6 +98,10 @@ def request_registration(
r = requests.post(url, json=data)

if r.status_code != 200:
response = r.json()
if exists_ok and response["errcode"] == "M_USER_IN_USE":
_print("User already exists. Skipping.")
return
_print("ERROR! Received %d %s" % (r.status_code, r.reason))
if 400 <= r.status_code < 500:
try:
Expand All @@ -115,6 +120,7 @@ def register_new_user(
shared_secret: str,
admin: Optional[bool],
user_type: Optional[str],
exists_ok: bool = False,
) -> None:
if not user:
try:
Expand Down Expand Up @@ -154,7 +160,13 @@ def register_new_user(
admin = False

request_registration(
user, password, server_location, shared_secret, bool(admin), user_type
user,
password,
server_location,
shared_secret,
bool(admin),
user_type,
exists_ok=exists_ok,
)


Expand All @@ -173,6 +185,11 @@ def main() -> None:
default=None,
help="Local part of the new user. Will prompt if omitted.",
)
parser.add_argument(
"--exists-ok",
action="store_true",
help="Do not fail if user already exists.",
)
password_group = parser.add_mutually_exclusive_group()
password_group.add_argument(
"-p",
Expand All @@ -192,6 +209,7 @@ def main() -> None:
default=None,
help="User type as specified in synapse.api.constants.UserTypes",
)

admin_group = parser.add_mutually_exclusive_group()
admin_group.add_argument(
"-a",
Expand Down Expand Up @@ -281,7 +299,7 @@ def main() -> None:
if args.admin or args.no_admin:
admin = args.admin

register_new_user(args.user, password, server_url, secret, admin, args.user_type)
register_new_user(args.user, password, server_url, secret, admin, args.user_type, exists_ok=args.exists_ok)


def _read_file(file_path: Any, config_path: str) -> str:
Expand Down

0 comments on commit b8a8576

Please sign in to comment.