From e26d097bd28f413479e73f95711fa8a4905fdd70 Mon Sep 17 00:00:00 2001 From: Mo Balaa Date: Fri, 26 Jul 2024 12:33:01 -0500 Subject: [PATCH] Matrix account creation (#6) * store MatrixCredential on login * Store credentials if fractal db is initialized * Update pyproject.toml --- fractal/cli/controllers/auth.py | 32 +++++++++++++++++++++++++++++--- pyproject.toml | 1 + 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/fractal/cli/controllers/auth.py b/fractal/cli/controllers/auth.py index 659b4d4..6529c1e 100644 --- a/fractal/cli/controllers/auth.py +++ b/fractal/cli/controllers/auth.py @@ -7,9 +7,11 @@ from asgiref.sync import async_to_sync from clicz import cli_method +from django.db import transaction from fractal.cli.utils import read_user_data, write_user_data from fractal.matrix import MatrixClient, get_homeserver_for_matrix_id from fractal.matrix.utils import parse_matrix_id, prompt_matrix_password +from fractal_database.utils import is_db_initialized from nio import LoginError, WhoamiError @@ -25,21 +27,24 @@ class AuthController: def login( self, matrix_id: str, + password: Optional[str] = None, homeserver_url: Optional[str] = None, access_token: Optional[str] = None, + **kwargs, ): """ Login to a Matrix homeserver. --- Args: - matrix_id: Matrix ID of user to login as - homeserver_url: Homeserver to login to + matrix_id: Matrix ID of user to login as. + password: Password for the Matrix ID. + homeserver_url: Homeserver to login to. access_token: Access token to use for login. """ if not access_token: homeserver_url, access_token = async_to_sync(self._login_with_password)( - matrix_id, homeserver_url=homeserver_url + matrix_id, homeserver_url=homeserver_url, password=password ) else: if not homeserver_url: @@ -62,6 +67,27 @@ def login( }, self.TOKEN_FILE, ) + if is_db_initialized(): + from fractal_database_matrix.models import ( + MatrixCredentials, + MatrixHomeserver, + ) + + try: + hs = MatrixHomeserver.objects.get(url=homeserver_url) + MatrixCredentials.objects.create( + matrix_id=matrix_id, + access_token=access_token, + homeserver=hs, + ) + except MatrixHomeserver.DoesNotExist: + with transaction.atomic(): + hs = MatrixHomeserver.objects.create(url=homeserver_url) + MatrixCredentials.objects.create( + matrix_id=matrix_id, + access_token=access_token, + homeserver=hs, + ) print(f"Successfully logged in as {matrix_id}") diff --git a/pyproject.toml b/pyproject.toml index 6e7da35..3b6d624 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,7 @@ appdirs = "^1.4.4" clicz = ">=0.0.2" asgiref = ">=3.7.2" fractal-matrix-client = ">=0.0.1" +fractal-database = ">=0.0.1" rich = ">=12.6.0" pytest = { version = "^7.4.3", optional = true } pytest-asyncio = { version = "^0.21.1", optional = true }