From 6328e718ce2ed1cd7d2bf81356e7da33f188eb90 Mon Sep 17 00:00:00 2001 From: Kumi Date: Sat, 16 Nov 2024 18:38:56 +0100 Subject: [PATCH] feat: Refines user registration approval process Consolidates email notification and user unlocking logic Validates Synapse server connection during startup Adds configuration checks for admin email Enhances error handling to notify admin if user unlocking fails --- .../registration/signals.py | 37 +++++++------------ .../synapse_registration/settings.py | 20 ++++++++++ 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/synapse_registration/registration/signals.py b/src/synapse_registration/registration/signals.py index 3e8ac98..8b396ac 100644 --- a/src/synapse_registration/registration/signals.py +++ b/src/synapse_registration/registration/signals.py @@ -14,36 +14,25 @@ def handle_status_change(sender, instance, created, **kwargs): status = instance.status if status == UserRegistration.STATUS_APPROVED: - send_mail( - "Registration Approved", - f"Congratulations, {instance.username}! Your registration at {settings.MATRIX_DOMAIN} has been approved.", - settings.DEFAULT_FROM_EMAIL, - [instance.email], - ) - - requests.put( + response = requests.put( f"{settings.SYNAPSE_SERVER}/_synapse/admin/v2/users/@{instance.username}:{settings.MATRIX_DOMAIN}", json={"locked": False}, headers={"Authorization": f"Bearer {settings.SYNAPSE_ADMIN_TOKEN}"}, ) - response = requests.post( - f"{settings.SYNAPSE_SERVER}/_synapse/admin/v2/users/{settings.ADMIN_USER}/rooms?access_token={settings.SYNAPSE_ADMIN_TOKEN}", - json={"preset": "private_chat"}, - ) + if response.status_code != 200: + send_mail( + "Unlocking Failed", + f"Failed to unlock the user {instance.username}. Please unlock the user manually if required.", + settings.DEFAULT_FROM_EMAIL, + [settings.ADMIN_EMAIL], + ) - room_id = response.json()["room_id"] - - response = requests.post( - f"{settings.SYNAPSE_SERVER}/_synapse/admin/v2/rooms/{room_id}/invite", - json={"user_id": f"@{instance.username}:{settings.MATRIX_DOMAIN}"}, - headers={"Authorization": f"Bearer {settings.SYNAPSE_ADMIN_TOKEN}"}, - ) - - response = requests.post( - f"{settings.SYNAPSE_SERVER}/_synapse/admin/v2/rooms/{room_id}/send", - json={"msgtype": "m.text", "body": f"Welcome, {instance.username}!"}, - headers={"Authorization": f"Bearer {settings.SYNAPSE_ADMIN_TOKEN}"}, + send_mail( + "Registration Approved", + f"Congratulations, {instance.username}! Your registration at {settings.MATRIX_DOMAIN} has been approved.", + settings.DEFAULT_FROM_EMAIL, + [instance.email], ) elif status == UserRegistration.STATUS_DENIED: diff --git a/src/synapse_registration/synapse_registration/settings.py b/src/synapse_registration/synapse_registration/settings.py index 1dc2434..469f13b 100644 --- a/src/synapse_registration/synapse_registration/settings.py +++ b/src/synapse_registration/synapse_registration/settings.py @@ -17,6 +17,7 @@ from django.core.management.utils import get_random_secret_key import os import yaml +import requests CONFIG_PATH = os.environ.get("CONFIG_PATH", "config.yaml") @@ -66,6 +67,16 @@ SYNAPSE_SERVER = config["synapse"]["server"] SYNAPSE_ADMIN_TOKEN = config["synapse"]["admin_token"] MATRIX_DOMAIN = config["synapse"]["domain"] +response = requests.get( + f"{SYNAPSE_SERVER}/_matrix/client/r0/account/whoami", + headers={"Authorization": f"Bearer {SYNAPSE_ADMIN_TOKEN}"}, +) + +if response.status_code != 200: + raise ConnectionError("Failed to connect to the Synapse server.") + +SYNAPSE_USER = response.json()["user_id"] + # Application definition @@ -172,6 +183,14 @@ if not all(key in config["email"] for key in ["host", "port", "username", "passw "Please specify the email host, port, username, and password in the configuration file." ) +if "admin" not in config: + raise KeyError("Please specify an admin configuration in the configuration file.") + +if "email" not in config["admin"]: + raise KeyError( + "Please specify an email address for the admin in the configuration file." + ) + EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend" EMAIL_HOST = config["email"]["host"] EMAIL_PORT = config["email"]["port"] @@ -181,3 +200,4 @@ EMAIL_HOST_USER = config["email"]["username"] EMAIL_HOST_PASSWORD = config["email"]["password"] EMAIL_SUBJECT_PREFIX = config["email"].get("subject_prefix", "") DEFAULT_FROM_EMAIL = config["email"].get("from", EMAIL_HOST_USER) +ADMIN_EMAIL = config["admin"]["email"]