From 110c07b5f61f7372bbf04386c6a345118f4abd95 Mon Sep 17 00:00:00 2001 From: default Date: Tue, 13 Aug 2024 10:57:02 +0000 Subject: [PATCH 01/17] logginable deleting bug fix --- auth_backend/auth_method/base.py | 1 + auth_backend/auth_method/oauth.py | 12 +++++++++--- auth_backend/auth_plugins/airflow.py | 1 + auth_backend/auth_plugins/coder.py | 1 + auth_backend/auth_plugins/mailu.py | 1 + auth_backend/auth_plugins/postgres.py | 1 + 6 files changed, 14 insertions(+), 3 deletions(-) diff --git a/auth_backend/auth_method/base.py b/auth_backend/auth_method/base.py index 6dc58aa7..e9658e1b 100644 --- a/auth_backend/auth_method/base.py +++ b/auth_backend/auth_method/base.py @@ -24,6 +24,7 @@ class AuthPluginMeta(metaclass=ABCMeta): router: APIRouter prefix: str tags: list[str] = [] + loginable: bool = True @classmethod def get_name(cls) -> str: diff --git a/auth_backend/auth_method/oauth.py b/auth_backend/auth_method/oauth.py index 4afea127..a19e7500 100644 --- a/auth_backend/auth_method/oauth.py +++ b/auth_backend/auth_method/oauth.py @@ -9,6 +9,7 @@ from auth_backend.exceptions import LastAuthMethodDelete from auth_backend.models.db import AuthMethod, User, UserSession from auth_backend.utils.security import UnionAuth +from auth_backend.auth_method import AUTH_METHODS from .base import AuthPluginMeta from .method_mixins import LoginableMixin, RegistrableMixin @@ -78,9 +79,14 @@ async def _delete_auth_methods(cls, user: User, *, db_session) -> list[AuthMetho ) .all() ) - all_auth_methods = AuthMethod.query(session=db_session).filter(AuthMethod.user_id == user.id).all() - if len(all_auth_methods) - len(auth_methods) == 0: - raise LastAuthMethodDelete() + LOGGINABLE_AUTH_METHODS: list = [method.get_name() for method in AUTH_METHODS.values() if method.loginable] + loginable_auth_methods = ( + AuthMethod.query(session=db_session) + .filter(AuthMethod.user_id == user.id, AuthMethod.auth_method.in_(LOGGINABLE_AUTH_METHODS)) + .all() + ) + if len(loginable_auth_methods) == 1 and loginable_auth_methods[0] in auth_methods: + raise LastAuthMethodDelete logger.debug(auth_methods) for method in auth_methods: method.is_deleted = True diff --git a/auth_backend/auth_plugins/airflow.py b/auth_backend/auth_plugins/airflow.py index 6988011f..4a19c3e8 100644 --- a/auth_backend/auth_plugins/airflow.py +++ b/auth_backend/auth_plugins/airflow.py @@ -19,6 +19,7 @@ class AirflowOuterAuthSettings(Settings): class AirflowOuterAuth(OuterAuthMeta): prefix = '/airflow' settings = AirflowOuterAuthSettings() + loginable = False @classmethod async def _is_outer_user_exists(cls, username: str) -> bool: diff --git a/auth_backend/auth_plugins/coder.py b/auth_backend/auth_plugins/coder.py index 2c1ecef2..e21639cd 100644 --- a/auth_backend/auth_plugins/coder.py +++ b/auth_backend/auth_plugins/coder.py @@ -18,6 +18,7 @@ class CoderOuterAuthSettings(Settings): class CoderOuterAuth(OuterAuthMeta): prefix = '/coder' settings = CoderOuterAuthSettings() + loginable = False @classmethod async def _is_outer_user_exists(cls, username: str) -> bool: diff --git a/auth_backend/auth_plugins/mailu.py b/auth_backend/auth_plugins/mailu.py index cd1eab58..af1d97df 100644 --- a/auth_backend/auth_plugins/mailu.py +++ b/auth_backend/auth_plugins/mailu.py @@ -18,6 +18,7 @@ class MailuOuterAuthSettings(Settings): class MailuOuterAuth(OuterAuthMeta): prefix = '/mailu' settings = MailuOuterAuthSettings() + loginable = False @classmethod async def _is_outer_user_exists(cls, username: str) -> bool: diff --git a/auth_backend/auth_plugins/postgres.py b/auth_backend/auth_plugins/postgres.py index 94def5ba..6830c8aa 100644 --- a/auth_backend/auth_plugins/postgres.py +++ b/auth_backend/auth_plugins/postgres.py @@ -21,6 +21,7 @@ class PostgresOuterAuthSettings(Settings): class PostgresOuterAuth(OuterAuthMeta): prefix = '/postgres' settings = PostgresOuterAuthSettings() + loginable = False __sessionmaker: type[Session] | None = None @classmethod From 1cd482dea918a2ce09b0a10d9fc5570ac5873070 Mon Sep 17 00:00:00 2001 From: default Date: Tue, 13 Aug 2024 11:09:45 +0000 Subject: [PATCH 02/17] linting --- auth_backend/auth_method/oauth.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth_backend/auth_method/oauth.py b/auth_backend/auth_method/oauth.py index a19e7500..ef95eacc 100644 --- a/auth_backend/auth_method/oauth.py +++ b/auth_backend/auth_method/oauth.py @@ -5,11 +5,11 @@ from fastapi_sqlalchemy import db from sqlalchemy.orm import Session as DbSession +from auth_backend.auth_method import AUTH_METHODS from auth_backend.base import Base from auth_backend.exceptions import LastAuthMethodDelete from auth_backend.models.db import AuthMethod, User, UserSession from auth_backend.utils.security import UnionAuth -from auth_backend.auth_method import AUTH_METHODS from .base import AuthPluginMeta from .method_mixins import LoginableMixin, RegistrableMixin From c916e023dbb2b1052e114ed0740a92ba2e038f09 Mon Sep 17 00:00:00 2001 From: default Date: Wed, 14 Aug 2024 08:35:12 +0000 Subject: [PATCH 03/17] loginable check change --- auth_backend/auth_method/oauth.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/auth_backend/auth_method/oauth.py b/auth_backend/auth_method/oauth.py index ef95eacc..96983a14 100644 --- a/auth_backend/auth_method/oauth.py +++ b/auth_backend/auth_method/oauth.py @@ -79,13 +79,14 @@ async def _delete_auth_methods(cls, user: User, *, db_session) -> list[AuthMetho ) .all() ) - LOGGINABLE_AUTH_METHODS: list = [method.get_name() for method in AUTH_METHODS.values() if method.loginable] - loginable_auth_methods = ( + if cls.loginable and len(auth_methods) == len( AuthMethod.query(session=db_session) - .filter(AuthMethod.user_id == user.id, AuthMethod.auth_method.in_(LOGGINABLE_AUTH_METHODS)) + .filter( + AuthMethod.user_id == user.id, + AuthMethod.auth_method.in_([method.get_name() for method in AUTH_METHODS.values() if method.loginable]), + ) .all() - ) - if len(loginable_auth_methods) == 1 and loginable_auth_methods[0] in auth_methods: + ): raise LastAuthMethodDelete logger.debug(auth_methods) for method in auth_methods: From a0052fff61fdc79339773983b5ae1911d7fa6c80 Mon Sep 17 00:00:00 2001 From: default Date: Wed, 14 Aug 2024 08:52:03 +0000 Subject: [PATCH 04/17] changing loginable check to only one request to db --- auth_backend/auth_method/oauth.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/auth_backend/auth_method/oauth.py b/auth_backend/auth_method/oauth.py index 96983a14..7f00bfe5 100644 --- a/auth_backend/auth_method/oauth.py +++ b/auth_backend/auth_method/oauth.py @@ -79,13 +79,19 @@ async def _delete_auth_methods(cls, user: User, *, db_session) -> list[AuthMetho ) .all() ) - if cls.loginable and len(auth_methods) == len( + + auth_methods: list[AuthMethod] = ( AuthMethod.query(session=db_session) .filter( AuthMethod.user_id == user.id, - AuthMethod.auth_method.in_([method.get_name() for method in AUTH_METHODS.values() if method.loginable]), + AuthMethod.auth_method.in_( + [cls.get_name()] + [method.get_name() for method in AUTH_METHODS.values() if method.loginable] + ), ) .all() + ) + if cls.loginable and len([method for method in auth_methods if method.auth_method == cls.get_name()]) == len( + auth_methods ): raise LastAuthMethodDelete logger.debug(auth_methods) From d01dbf589d7173a657a8553142b9e349d1c20864 Mon Sep 17 00:00:00 2001 From: default Date: Wed, 14 Aug 2024 20:53:44 +0000 Subject: [PATCH 05/17] loginable remove default value + optimizing sql request whilst deleting auth method --- auth_backend/auth_method/base.py | 2 +- auth_backend/auth_method/oauth.py | 14 ++------------ auth_backend/auth_plugins/email.py | 1 + auth_backend/auth_plugins/github.py | 1 + auth_backend/auth_plugins/google.py | 1 + auth_backend/auth_plugins/keycloak.py | 1 + auth_backend/auth_plugins/lkmsu.py | 1 + auth_backend/auth_plugins/mymsu.py | 1 + auth_backend/auth_plugins/physics.py | 1 + auth_backend/auth_plugins/telegram.py | 1 + auth_backend/auth_plugins/vk.py | 1 + auth_backend/auth_plugins/yandex.py | 1 + 12 files changed, 13 insertions(+), 13 deletions(-) diff --git a/auth_backend/auth_method/base.py b/auth_backend/auth_method/base.py index e9658e1b..587f9037 100644 --- a/auth_backend/auth_method/base.py +++ b/auth_backend/auth_method/base.py @@ -24,7 +24,7 @@ class AuthPluginMeta(metaclass=ABCMeta): router: APIRouter prefix: str tags: list[str] = [] - loginable: bool = True + loginable: bool @classmethod def get_name(cls) -> str: diff --git a/auth_backend/auth_method/oauth.py b/auth_backend/auth_method/oauth.py index 7f00bfe5..b501848c 100644 --- a/auth_backend/auth_method/oauth.py +++ b/auth_backend/auth_method/oauth.py @@ -75,21 +75,11 @@ async def _delete_auth_methods(cls, user: User, *, db_session) -> list[AuthMetho AuthMethod.query(session=db_session) .filter( AuthMethod.user_id == user.id, - AuthMethod.auth_method == cls.get_name(), - ) - .all() - ) - - auth_methods: list[AuthMethod] = ( - AuthMethod.query(session=db_session) - .filter( - AuthMethod.user_id == user.id, - AuthMethod.auth_method.in_( - [cls.get_name()] + [method.get_name() for method in AUTH_METHODS.values() if method.loginable] - ), + AuthMethod.auth_method.in_([method.get_name() for method in AUTH_METHODS.values() if method.loginable]), ) .all() ) + a = len([method for method in auth_methods if method.auth_method == cls.get_name()]) if cls.loginable and len([method for method in auth_methods if method.auth_method == cls.get_name()]) == len( auth_methods ): diff --git a/auth_backend/auth_plugins/email.py b/auth_backend/auth_plugins/email.py index a9a66c09..2090fe87 100644 --- a/auth_backend/auth_plugins/email.py +++ b/auth_backend/auth_plugins/email.py @@ -105,6 +105,7 @@ class ResetForgottenPassword(Base): class Email(UserdataMixin, LoginableMixin, RegistrableMixin, AuthPluginMeta): prefix = "/email" + loginable = True def __init__(self): super().__init__() diff --git a/auth_backend/auth_plugins/github.py b/auth_backend/auth_plugins/github.py index 1ef892a0..80ff480b 100644 --- a/auth_backend/auth_plugins/github.py +++ b/auth_backend/auth_plugins/github.py @@ -32,6 +32,7 @@ class GithubAuth(OauthMeta): """Вход в приложение по аккаунту GitHub""" prefix = '/github' + loginable = True tags = ['github'] settings = GithubSettings() diff --git a/auth_backend/auth_plugins/google.py b/auth_backend/auth_plugins/google.py index 90afb810..4ad31581 100644 --- a/auth_backend/auth_plugins/google.py +++ b/auth_backend/auth_plugins/google.py @@ -40,6 +40,7 @@ class GoogleAuth(OauthMeta): """Вход в приложение по аккаунту гугл""" prefix = '/google' + loginable = True tags = ['Google'] settings = GoogleSettings() diff --git a/auth_backend/auth_plugins/keycloak.py b/auth_backend/auth_plugins/keycloak.py index f86af864..17bf69e3 100644 --- a/auth_backend/auth_plugins/keycloak.py +++ b/auth_backend/auth_plugins/keycloak.py @@ -33,6 +33,7 @@ class KeycloakAuth(OauthMeta): """Вход в приложение по аккаунту Keycloak""" prefix = '/keycloak' + loginable = True tags = ['keycloak'] settings = KeycloakSettings() diff --git a/auth_backend/auth_plugins/lkmsu.py b/auth_backend/auth_plugins/lkmsu.py index b9cac630..ce508dbf 100644 --- a/auth_backend/auth_plugins/lkmsu.py +++ b/auth_backend/auth_plugins/lkmsu.py @@ -34,6 +34,7 @@ class LkmsuAuth(OauthMeta): """Вход в приложение по аккаунту гугл""" prefix = '/lk-msu' + loginable = True tags = ['lk_msu'] settings = LkmsuSettings() diff --git a/auth_backend/auth_plugins/mymsu.py b/auth_backend/auth_plugins/mymsu.py index 67c1e676..edc2fe23 100644 --- a/auth_backend/auth_plugins/mymsu.py +++ b/auth_backend/auth_plugins/mymsu.py @@ -20,4 +20,5 @@ class MyMsuAuth(YandexAuth): """Вход в приложение по почте @my.msu.ru""" prefix = '/my-msu' + loginable = True settings = MyMsuSettings() diff --git a/auth_backend/auth_plugins/physics.py b/auth_backend/auth_plugins/physics.py index 7ffd36f1..c7c77d83 100644 --- a/auth_backend/auth_plugins/physics.py +++ b/auth_backend/auth_plugins/physics.py @@ -27,4 +27,5 @@ class PhysicsAuth(GoogleAuth): """Вход в приложение по почте @physics.msu.ru""" prefix = '/physics-msu' + loginable = True settings = PhysicsSettings() diff --git a/auth_backend/auth_plugins/telegram.py b/auth_backend/auth_plugins/telegram.py index a1ffebc7..f7584927 100644 --- a/auth_backend/auth_plugins/telegram.py +++ b/auth_backend/auth_plugins/telegram.py @@ -31,6 +31,7 @@ class TelegramSettings(Settings): class TelegramAuth(OauthMeta): prefix = '/telegram' + loginable = True tags = ['Telegram'] settings = TelegramSettings() diff --git a/auth_backend/auth_plugins/vk.py b/auth_backend/auth_plugins/vk.py index 41173751..8b6e38d5 100644 --- a/auth_backend/auth_plugins/vk.py +++ b/auth_backend/auth_plugins/vk.py @@ -46,6 +46,7 @@ class VkSettings(Settings): class VkAuth(OauthMeta): prefix = '/vk' + loginable = True tags = ['vk'] settings = VkSettings() diff --git a/auth_backend/auth_plugins/yandex.py b/auth_backend/auth_plugins/yandex.py index f18a3655..b49c13f1 100644 --- a/auth_backend/auth_plugins/yandex.py +++ b/auth_backend/auth_plugins/yandex.py @@ -33,6 +33,7 @@ class YandexSettings(Settings): class YandexAuth(OauthMeta): prefix = '/yandex' + loginable = True tags = ['Yandex'] settings = YandexSettings() From 5bc4c52b59f39b580fe237734f79aad7fe4136e2 Mon Sep 17 00:00:00 2001 From: default Date: Wed, 14 Aug 2024 20:58:46 +0000 Subject: [PATCH 06/17] adding loginable to Test auth method --- tests/test_outermeta.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_outermeta.py b/tests/test_outermeta.py index ff0b178f..00453df2 100644 --- a/tests/test_outermeta.py +++ b/tests/test_outermeta.py @@ -7,6 +7,8 @@ class Test(OuterAuthMeta): + loginable = True + @classmethod async def _is_outer_user_exists(cls, username): return True From 38515ab6a40c568c18f29e7fd39916db3c136b1b Mon Sep 17 00:00:00 2001 From: default Date: Mon, 26 Aug 2024 18:11:07 +0000 Subject: [PATCH 07/17] redoing check for last loginable delete --- auth_backend/auth_method/oauth.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/auth_backend/auth_method/oauth.py b/auth_backend/auth_method/oauth.py index b501848c..16a3cb4e 100644 --- a/auth_backend/auth_method/oauth.py +++ b/auth_backend/auth_method/oauth.py @@ -70,19 +70,23 @@ async def _get_user(cls, key: str, value: str | int, *, db_session: DbSession) - @classmethod async def _delete_auth_methods(cls, user: User, *, db_session) -> list[AuthMethod]: - """Удаляет пользователю все AuthMethod конкретной авторизации""" auth_methods: list[AuthMethod] = ( AuthMethod.query(session=db_session) .filter( AuthMethod.user_id == user.id, - AuthMethod.auth_method.in_([method.get_name() for method in AUTH_METHODS.values() if method.loginable]), + AuthMethod.auth_method == cls.get_name(), ) .all() ) - a = len([method for method in auth_methods if method.auth_method == cls.get_name()]) - if cls.loginable and len([method for method in auth_methods if method.auth_method == cls.get_name()]) == len( - auth_methods - ): + loginable_auth_methods_count: int = ( + AuthMethod.query(session=db_session) + .filter( + AuthMethod.user_id == user.id, + AuthMethod.auth_method.in_([method.get_name() for method in AUTH_METHODS.values() if method.loginable]), + ) + .count() + ) + if cls.loginable and len(auth_methods) == loginable_auth_methods_count: raise LastAuthMethodDelete logger.debug(auth_methods) for method in auth_methods: From e344810e01301aeeb256f5daf09706a28814e0a1 Mon Sep 17 00:00:00 2001 From: default Date: Mon, 26 Aug 2024 18:18:32 +0000 Subject: [PATCH 08/17] fix --- auth_backend/auth_method/oauth.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/auth_backend/auth_method/oauth.py b/auth_backend/auth_method/oauth.py index 16a3cb4e..aa12bbff 100644 --- a/auth_backend/auth_method/oauth.py +++ b/auth_backend/auth_method/oauth.py @@ -78,16 +78,19 @@ async def _delete_auth_methods(cls, user: User, *, db_session) -> list[AuthMetho ) .all() ) - loginable_auth_methods_count: int = ( - AuthMethod.query(session=db_session) - .filter( - AuthMethod.user_id == user.id, - AuthMethod.auth_method.in_([method.get_name() for method in AUTH_METHODS.values() if method.loginable]), + if cls.loginable: + loginable_auth_methods_count: int = ( + AuthMethod.query(session=db_session) + .filter( + AuthMethod.user_id == user.id, + AuthMethod.auth_method.in_( + [method.get_name() for method in AUTH_METHODS.values() if method.loginable] + ), + ) + .count() ) - .count() - ) - if cls.loginable and len(auth_methods) == loginable_auth_methods_count: - raise LastAuthMethodDelete + if len(auth_methods) == loginable_auth_methods_count: + raise LastAuthMethodDelete logger.debug(auth_methods) for method in auth_methods: method.is_deleted = True From f34d29708557b2db993ce1723456a50efb2fffba Mon Sep 17 00:00:00 2001 From: default Date: Mon, 30 Sep 2024 06:24:19 +0000 Subject: [PATCH 09/17] fix --- auth_backend/auth_method/base.py | 2 -- auth_backend/auth_method/oauth.py | 6 +++++- auth_backend/auth_method/outer.py | 5 +++++ auth_backend/auth_plugins/airflow.py | 1 - auth_backend/auth_plugins/coder.py | 1 - auth_backend/auth_plugins/github.py | 5 ++--- auth_backend/auth_plugins/google.py | 5 ++--- auth_backend/auth_plugins/keycloak.py | 5 ++--- auth_backend/auth_plugins/lkmsu.py | 5 ++--- auth_backend/auth_plugins/mailu.py | 1 - auth_backend/auth_plugins/mymsu.py | 5 ++--- auth_backend/auth_plugins/physics.py | 4 ++-- auth_backend/auth_plugins/postgres.py | 1 - auth_backend/auth_plugins/telegram.py | 5 ++--- auth_backend/auth_plugins/vk.py | 5 ++--- auth_backend/auth_plugins/yandex.py | 5 ++--- 16 files changed, 28 insertions(+), 33 deletions(-) diff --git a/auth_backend/auth_method/base.py b/auth_backend/auth_method/base.py index 587f9037..00a88ddd 100644 --- a/auth_backend/auth_method/base.py +++ b/auth_backend/auth_method/base.py @@ -8,7 +8,6 @@ from fastapi import APIRouter from sqlalchemy.orm import Session as DbSession - from auth_backend.models.db import AuthMethod, User, UserSession from auth_backend.settings import get_settings @@ -24,7 +23,6 @@ class AuthPluginMeta(metaclass=ABCMeta): router: APIRouter prefix: str tags: list[str] = [] - loginable: bool @classmethod def get_name(cls) -> str: diff --git a/auth_backend/auth_method/oauth.py b/auth_backend/auth_method/oauth.py index aa12bbff..21789aa9 100644 --- a/auth_backend/auth_method/oauth.py +++ b/auth_backend/auth_method/oauth.py @@ -5,7 +5,7 @@ from fastapi_sqlalchemy import db from sqlalchemy.orm import Session as DbSession -from auth_backend.auth_method import AUTH_METHODS +from auth_backend.auth_method import AUTH_METHODS, LoginableMixin from auth_backend.base import Base from auth_backend.exceptions import LastAuthMethodDelete from auth_backend.models.db import AuthMethod, User, UserSession @@ -31,6 +31,10 @@ def __init__(self): self.router.add_api_route("/auth_url", self._auth_url, methods=["GET"], response_model=self.UrlSchema) self.router.add_api_route("", self._unregister, methods=["DELETE"]) + def __init_subclass__(cls, **kwargs): + super().__init_subclass__(**kwargs) + cls.loginable = issubclass(cls, LoginableMixin) + @staticmethod @abstractmethod async def _redirect_url(*args, **kwargs) -> UrlSchema: diff --git a/auth_backend/auth_method/outer.py b/auth_backend/auth_method/outer.py index 23153308..ae518cab 100644 --- a/auth_backend/auth_method/outer.py +++ b/auth_backend/auth_method/outer.py @@ -8,6 +8,7 @@ from starlette.status import HTTP_403_FORBIDDEN, HTTP_404_NOT_FOUND, HTTP_409_CONFLICT, HTTP_424_FAILED_DEPENDENCY from auth_backend.auth_method.base import AuthPluginMeta +from auth_backend.auth_method import LoginableMixin from auth_backend.base import Base from auth_backend.models.db import AuthMethod, UserSession from auth_backend.utils.security import UnionAuth @@ -77,6 +78,10 @@ def __init__(self): self.router.add_api_route("/{user_id}/link", self._link, methods=["POST"]) self.router.add_api_route("/{user_id}/link", self._unlink, methods=["DELETE"]) + def __init_subclass__(cls, **kwargs): + super().__init_subclass__(**kwargs) + cls.loginable = issubclass(cls, LoginableMixin) + @classmethod def get_scope(cls): """Права, необходимые пользователю для получения данных о внешнем аккаунте""" diff --git a/auth_backend/auth_plugins/airflow.py b/auth_backend/auth_plugins/airflow.py index 4a19c3e8..6988011f 100644 --- a/auth_backend/auth_plugins/airflow.py +++ b/auth_backend/auth_plugins/airflow.py @@ -19,7 +19,6 @@ class AirflowOuterAuthSettings(Settings): class AirflowOuterAuth(OuterAuthMeta): prefix = '/airflow' settings = AirflowOuterAuthSettings() - loginable = False @classmethod async def _is_outer_user_exists(cls, username: str) -> bool: diff --git a/auth_backend/auth_plugins/coder.py b/auth_backend/auth_plugins/coder.py index e21639cd..2c1ecef2 100644 --- a/auth_backend/auth_plugins/coder.py +++ b/auth_backend/auth_plugins/coder.py @@ -18,7 +18,6 @@ class CoderOuterAuthSettings(Settings): class CoderOuterAuth(OuterAuthMeta): prefix = '/coder' settings = CoderOuterAuthSettings() - loginable = False @classmethod async def _is_outer_user_exists(cls, username: str) -> bool: diff --git a/auth_backend/auth_plugins/github.py b/auth_backend/auth_plugins/github.py index 80ff480b..0af7fe8c 100644 --- a/auth_backend/auth_plugins/github.py +++ b/auth_backend/auth_plugins/github.py @@ -10,7 +10,7 @@ from fastapi_sqlalchemy import db from pydantic import BaseModel, Field -from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session +from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session, LoginableMixin from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession @@ -28,11 +28,10 @@ class GithubSettings(Settings): GITHUB_CLIENT_SECRET: str | None = None -class GithubAuth(OauthMeta): +class GithubAuth(OauthMeta, LoginableMixin): """Вход в приложение по аккаунту GitHub""" prefix = '/github' - loginable = True tags = ['github'] settings = GithubSettings() diff --git a/auth_backend/auth_plugins/google.py b/auth_backend/auth_plugins/google.py index 4ad31581..0d47cd87 100644 --- a/auth_backend/auth_plugins/google.py +++ b/auth_backend/auth_plugins/google.py @@ -12,7 +12,7 @@ from google.oauth2.id_token import verify_oauth2_token from pydantic import BaseModel, Field, Json -from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session +from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session, LoginableMixin from auth_backend.exceptions import AlreadyExists, OauthAuthFailed, OauthCredentialsIncorrect from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession @@ -36,11 +36,10 @@ class GoogleSettings(Settings): GOOGLE_BLACKLIST_DOMAINS: list[str] | None = ['physics.msu.ru'] -class GoogleAuth(OauthMeta): +class GoogleAuth(OauthMeta, LoginableMixin): """Вход в приложение по аккаунту гугл""" prefix = '/google' - loginable = True tags = ['Google'] settings = GoogleSettings() diff --git a/auth_backend/auth_plugins/keycloak.py b/auth_backend/auth_plugins/keycloak.py index 17bf69e3..d9b951e3 100644 --- a/auth_backend/auth_plugins/keycloak.py +++ b/auth_backend/auth_plugins/keycloak.py @@ -10,7 +10,7 @@ from fastapi_sqlalchemy import db from pydantic import BaseModel, Field -from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session +from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session, LoginableMixin from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession @@ -29,11 +29,10 @@ class KeycloakSettings(Settings): KEYCLOAK_CLIENT_SECRET: str | None = None -class KeycloakAuth(OauthMeta): +class KeycloakAuth(OauthMeta, LoginableMixin): """Вход в приложение по аккаунту Keycloak""" prefix = '/keycloak' - loginable = True tags = ['keycloak'] settings = KeycloakSettings() diff --git a/auth_backend/auth_plugins/lkmsu.py b/auth_backend/auth_plugins/lkmsu.py index ce508dbf..1fd4d297 100644 --- a/auth_backend/auth_plugins/lkmsu.py +++ b/auth_backend/auth_plugins/lkmsu.py @@ -10,7 +10,7 @@ from pydantic import BaseModel, Field from starlette.background import BackgroundTasks -from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session +from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session, LoginableMixin from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession @@ -30,11 +30,10 @@ class LkmsuSettings(Settings): LKMSU_FACULTY_NAME: str = 'Физический факультет' -class LkmsuAuth(OauthMeta): +class LkmsuAuth(OauthMeta, LoginableMixin): """Вход в приложение по аккаунту гугл""" prefix = '/lk-msu' - loginable = True tags = ['lk_msu'] settings = LkmsuSettings() diff --git a/auth_backend/auth_plugins/mailu.py b/auth_backend/auth_plugins/mailu.py index af1d97df..cd1eab58 100644 --- a/auth_backend/auth_plugins/mailu.py +++ b/auth_backend/auth_plugins/mailu.py @@ -18,7 +18,6 @@ class MailuOuterAuthSettings(Settings): class MailuOuterAuth(OuterAuthMeta): prefix = '/mailu' settings = MailuOuterAuthSettings() - loginable = False @classmethod async def _is_outer_user_exists(cls, username: str) -> bool: diff --git a/auth_backend/auth_plugins/mymsu.py b/auth_backend/auth_plugins/mymsu.py index edc2fe23..9b2230eb 100644 --- a/auth_backend/auth_plugins/mymsu.py +++ b/auth_backend/auth_plugins/mymsu.py @@ -1,7 +1,7 @@ from pydantic import Field from auth_backend.settings import Settings - +from auth_backend.auth_method import LoginableMixin from .yandex import YandexAuth @@ -16,9 +16,8 @@ class MyMsuSettings(Settings): YANDEX_BLACKLIST_DOMAINS: list[str] | None = None -class MyMsuAuth(YandexAuth): +class MyMsuAuth(YandexAuth, LoginableMixin): """Вход в приложение по почте @my.msu.ru""" prefix = '/my-msu' - loginable = True settings = MyMsuSettings() diff --git a/auth_backend/auth_plugins/physics.py b/auth_backend/auth_plugins/physics.py index c7c77d83..11875ba9 100644 --- a/auth_backend/auth_plugins/physics.py +++ b/auth_backend/auth_plugins/physics.py @@ -1,6 +1,7 @@ from pydantic import Field, Json from auth_backend.settings import Settings +from auth_backend.auth_method import LoginableMixin from .google import GoogleAuth @@ -23,9 +24,8 @@ class PhysicsSettings(Settings): GOOGLE_BLACKLIST_DOMAINS: list[str] | None = None -class PhysicsAuth(GoogleAuth): +class PhysicsAuth(GoogleAuth, LoginableMixin): """Вход в приложение по почте @physics.msu.ru""" prefix = '/physics-msu' - loginable = True settings = PhysicsSettings() diff --git a/auth_backend/auth_plugins/postgres.py b/auth_backend/auth_plugins/postgres.py index 6830c8aa..94def5ba 100644 --- a/auth_backend/auth_plugins/postgres.py +++ b/auth_backend/auth_plugins/postgres.py @@ -21,7 +21,6 @@ class PostgresOuterAuthSettings(Settings): class PostgresOuterAuth(OuterAuthMeta): prefix = '/postgres' settings = PostgresOuterAuthSettings() - loginable = False __sessionmaker: type[Session] | None = None @classmethod diff --git a/auth_backend/auth_plugins/telegram.py b/auth_backend/auth_plugins/telegram.py index f7584927..5674778c 100644 --- a/auth_backend/auth_plugins/telegram.py +++ b/auth_backend/auth_plugins/telegram.py @@ -11,7 +11,7 @@ from fastapi_sqlalchemy import db from pydantic import BaseModel, Field -from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session +from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session, LoginableMixin from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession @@ -29,9 +29,8 @@ class TelegramSettings(Settings): TELEGRAM_BOT_TOKEN: str | None = None -class TelegramAuth(OauthMeta): +class TelegramAuth(OauthMeta, LoginableMixin): prefix = '/telegram' - loginable = True tags = ['Telegram'] settings = TelegramSettings() diff --git a/auth_backend/auth_plugins/vk.py b/auth_backend/auth_plugins/vk.py index 8b6e38d5..89972477 100644 --- a/auth_backend/auth_plugins/vk.py +++ b/auth_backend/auth_plugins/vk.py @@ -10,7 +10,7 @@ from fastapi_sqlalchemy import db from pydantic import BaseModel, Field -from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session +from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session, LoginableMixin from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession @@ -44,9 +44,8 @@ class VkSettings(Settings): ] # Другие данные https://dev.vk.com/ru/reference/objects/user -class VkAuth(OauthMeta): +class VkAuth(OauthMeta, LoginableMixin): prefix = '/vk' - loginable = True tags = ['vk'] settings = VkSettings() diff --git a/auth_backend/auth_plugins/yandex.py b/auth_backend/auth_plugins/yandex.py index b49c13f1..a5faa1d0 100644 --- a/auth_backend/auth_plugins/yandex.py +++ b/auth_backend/auth_plugins/yandex.py @@ -10,7 +10,7 @@ from fastapi_sqlalchemy import db from pydantic import BaseModel, Field -from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session +from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session, LoginableMixin from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession @@ -31,9 +31,8 @@ class YandexSettings(Settings): YANDEX_BLACKLIST_DOMAINS: list[str] | None = ['my.msu.ru'] -class YandexAuth(OauthMeta): +class YandexAuth(OauthMeta, LoginableMixin): prefix = '/yandex' - loginable = True tags = ['Yandex'] settings = YandexSettings() From 2b6c3d71c170db0b0083dd809694443fdf2ef148 Mon Sep 17 00:00:00 2001 From: default Date: Mon, 30 Sep 2024 06:28:46 +0000 Subject: [PATCH 10/17] linting --- auth_backend/auth_method/base.py | 1 + auth_backend/auth_method/outer.py | 2 +- auth_backend/auth_plugins/github.py | 2 +- auth_backend/auth_plugins/google.py | 2 +- auth_backend/auth_plugins/keycloak.py | 2 +- auth_backend/auth_plugins/lkmsu.py | 2 +- auth_backend/auth_plugins/mymsu.py | 3 ++- auth_backend/auth_plugins/physics.py | 2 +- auth_backend/auth_plugins/telegram.py | 2 +- auth_backend/auth_plugins/vk.py | 2 +- auth_backend/auth_plugins/yandex.py | 2 +- 11 files changed, 12 insertions(+), 10 deletions(-) diff --git a/auth_backend/auth_method/base.py b/auth_backend/auth_method/base.py index 00a88ddd..6dc58aa7 100644 --- a/auth_backend/auth_method/base.py +++ b/auth_backend/auth_method/base.py @@ -8,6 +8,7 @@ from fastapi import APIRouter from sqlalchemy.orm import Session as DbSession + from auth_backend.models.db import AuthMethod, User, UserSession from auth_backend.settings import get_settings diff --git a/auth_backend/auth_method/outer.py b/auth_backend/auth_method/outer.py index ae518cab..d291bb33 100644 --- a/auth_backend/auth_method/outer.py +++ b/auth_backend/auth_method/outer.py @@ -7,8 +7,8 @@ from fastapi_sqlalchemy import db from starlette.status import HTTP_403_FORBIDDEN, HTTP_404_NOT_FOUND, HTTP_409_CONFLICT, HTTP_424_FAILED_DEPENDENCY -from auth_backend.auth_method.base import AuthPluginMeta from auth_backend.auth_method import LoginableMixin +from auth_backend.auth_method.base import AuthPluginMeta from auth_backend.base import Base from auth_backend.models.db import AuthMethod, UserSession from auth_backend.utils.security import UnionAuth diff --git a/auth_backend/auth_plugins/github.py b/auth_backend/auth_plugins/github.py index 0af7fe8c..f341a2a0 100644 --- a/auth_backend/auth_plugins/github.py +++ b/auth_backend/auth_plugins/github.py @@ -10,7 +10,7 @@ from fastapi_sqlalchemy import db from pydantic import BaseModel, Field -from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session, LoginableMixin +from auth_backend.auth_method import AuthPluginMeta, LoginableMixin, OauthMeta, Session from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession diff --git a/auth_backend/auth_plugins/google.py b/auth_backend/auth_plugins/google.py index 0d47cd87..6048c8b3 100644 --- a/auth_backend/auth_plugins/google.py +++ b/auth_backend/auth_plugins/google.py @@ -12,7 +12,7 @@ from google.oauth2.id_token import verify_oauth2_token from pydantic import BaseModel, Field, Json -from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session, LoginableMixin +from auth_backend.auth_method import AuthPluginMeta, LoginableMixin, OauthMeta, Session from auth_backend.exceptions import AlreadyExists, OauthAuthFailed, OauthCredentialsIncorrect from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession diff --git a/auth_backend/auth_plugins/keycloak.py b/auth_backend/auth_plugins/keycloak.py index d9b951e3..4f3f72e1 100644 --- a/auth_backend/auth_plugins/keycloak.py +++ b/auth_backend/auth_plugins/keycloak.py @@ -10,7 +10,7 @@ from fastapi_sqlalchemy import db from pydantic import BaseModel, Field -from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session, LoginableMixin +from auth_backend.auth_method import AuthPluginMeta, LoginableMixin, OauthMeta, Session from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession diff --git a/auth_backend/auth_plugins/lkmsu.py b/auth_backend/auth_plugins/lkmsu.py index 1fd4d297..f73f453f 100644 --- a/auth_backend/auth_plugins/lkmsu.py +++ b/auth_backend/auth_plugins/lkmsu.py @@ -10,7 +10,7 @@ from pydantic import BaseModel, Field from starlette.background import BackgroundTasks -from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session, LoginableMixin +from auth_backend.auth_method import AuthPluginMeta, LoginableMixin, OauthMeta, Session from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession diff --git a/auth_backend/auth_plugins/mymsu.py b/auth_backend/auth_plugins/mymsu.py index 9b2230eb..3caca3e5 100644 --- a/auth_backend/auth_plugins/mymsu.py +++ b/auth_backend/auth_plugins/mymsu.py @@ -1,7 +1,8 @@ from pydantic import Field -from auth_backend.settings import Settings from auth_backend.auth_method import LoginableMixin +from auth_backend.settings import Settings + from .yandex import YandexAuth diff --git a/auth_backend/auth_plugins/physics.py b/auth_backend/auth_plugins/physics.py index 11875ba9..90f11785 100644 --- a/auth_backend/auth_plugins/physics.py +++ b/auth_backend/auth_plugins/physics.py @@ -1,7 +1,7 @@ from pydantic import Field, Json -from auth_backend.settings import Settings from auth_backend.auth_method import LoginableMixin +from auth_backend.settings import Settings from .google import GoogleAuth diff --git a/auth_backend/auth_plugins/telegram.py b/auth_backend/auth_plugins/telegram.py index 5674778c..0270f320 100644 --- a/auth_backend/auth_plugins/telegram.py +++ b/auth_backend/auth_plugins/telegram.py @@ -11,7 +11,7 @@ from fastapi_sqlalchemy import db from pydantic import BaseModel, Field -from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session, LoginableMixin +from auth_backend.auth_method import AuthPluginMeta, LoginableMixin, OauthMeta, Session from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession diff --git a/auth_backend/auth_plugins/vk.py b/auth_backend/auth_plugins/vk.py index 89972477..52961513 100644 --- a/auth_backend/auth_plugins/vk.py +++ b/auth_backend/auth_plugins/vk.py @@ -10,7 +10,7 @@ from fastapi_sqlalchemy import db from pydantic import BaseModel, Field -from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session, LoginableMixin +from auth_backend.auth_method import AuthPluginMeta, LoginableMixin, OauthMeta, Session from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession diff --git a/auth_backend/auth_plugins/yandex.py b/auth_backend/auth_plugins/yandex.py index a5faa1d0..a629db62 100644 --- a/auth_backend/auth_plugins/yandex.py +++ b/auth_backend/auth_plugins/yandex.py @@ -10,7 +10,7 @@ from fastapi_sqlalchemy import db from pydantic import BaseModel, Field -from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session, LoginableMixin +from auth_backend.auth_method import AuthPluginMeta, LoginableMixin, OauthMeta, Session from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession From 9c7b7669deb14477302b6a051f9fc8fcaff6f67d Mon Sep 17 00:00:00 2001 From: default Date: Thu, 3 Oct 2024 16:46:56 +0000 Subject: [PATCH 11/17] another fix version --- auth_backend/auth_method/base.py | 2 +- auth_backend/auth_method/outer.py | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/auth_backend/auth_method/base.py b/auth_backend/auth_method/base.py index 6dc58aa7..a97a1fbf 100644 --- a/auth_backend/auth_method/base.py +++ b/auth_backend/auth_method/base.py @@ -12,7 +12,6 @@ from auth_backend.models.db import AuthMethod, User, UserSession from auth_backend.settings import get_settings - logger = logging.getLogger(__name__) settings = get_settings() @@ -36,6 +35,7 @@ def __init_subclass__(cls, **kwargs): if cls.__name__.endswith('Meta') or cls.__name__.endswith('Mixin'): return logger.info(f'Init authmethod {cls.__name__}') + cls.loginable = cls.__name__ == "LoginableMixin" AUTH_METHODS[cls.__name__] = cls async def _get_user( diff --git a/auth_backend/auth_method/outer.py b/auth_backend/auth_method/outer.py index d291bb33..1ad4db5b 100644 --- a/auth_backend/auth_method/outer.py +++ b/auth_backend/auth_method/outer.py @@ -78,10 +78,6 @@ def __init__(self): self.router.add_api_route("/{user_id}/link", self._link, methods=["POST"]) self.router.add_api_route("/{user_id}/link", self._unlink, methods=["DELETE"]) - def __init_subclass__(cls, **kwargs): - super().__init_subclass__(**kwargs) - cls.loginable = issubclass(cls, LoginableMixin) - @classmethod def get_scope(cls): """Права, необходимые пользователю для получения данных о внешнем аккаунте""" From a823d481e7d52c5f2326f9aa56b8cd5a6266aeee Mon Sep 17 00:00:00 2001 From: default Date: Thu, 3 Oct 2024 16:50:35 +0000 Subject: [PATCH 12/17] lint --- auth_backend/auth_method/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/auth_backend/auth_method/base.py b/auth_backend/auth_method/base.py index a97a1fbf..0cc47e08 100644 --- a/auth_backend/auth_method/base.py +++ b/auth_backend/auth_method/base.py @@ -12,6 +12,7 @@ from auth_backend.models.db import AuthMethod, User, UserSession from auth_backend.settings import get_settings + logger = logging.getLogger(__name__) settings = get_settings() From 9d9a73e63206d4fc379a5f0a226d6e3bb6a47b39 Mon Sep 17 00:00:00 2001 From: default Date: Thu, 3 Oct 2024 16:58:09 +0000 Subject: [PATCH 13/17] fix --- auth_backend/auth_method/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth_backend/auth_method/base.py b/auth_backend/auth_method/base.py index 0cc47e08..68f6fcff 100644 --- a/auth_backend/auth_method/base.py +++ b/auth_backend/auth_method/base.py @@ -36,7 +36,7 @@ def __init_subclass__(cls, **kwargs): if cls.__name__.endswith('Meta') or cls.__name__.endswith('Mixin'): return logger.info(f'Init authmethod {cls.__name__}') - cls.loginable = cls.__name__ == "LoginableMixin" + cls.loginable = False AUTH_METHODS[cls.__name__] = cls async def _get_user( From 3db5091ec4d67e10f0b184db36e9b5d74a5f5c47 Mon Sep 17 00:00:00 2001 From: default Date: Mon, 14 Oct 2024 08:47:39 +0000 Subject: [PATCH 14/17] fix --- auth_backend/auth_method/oauth.py | 5 +---- auth_backend/auth_method/outer.py | 1 - auth_backend/auth_plugins/email.py | 1 - auth_backend/auth_plugins/github.py | 2 +- auth_backend/auth_plugins/google.py | 2 +- auth_backend/auth_plugins/keycloak.py | 2 +- auth_backend/auth_plugins/lkmsu.py | 2 +- auth_backend/auth_plugins/mymsu.py | 2 +- auth_backend/auth_plugins/physics.py | 2 +- auth_backend/auth_plugins/telegram.py | 2 +- auth_backend/auth_plugins/vk.py | 2 +- auth_backend/auth_plugins/yandex.py | 2 +- 12 files changed, 10 insertions(+), 15 deletions(-) diff --git a/auth_backend/auth_method/oauth.py b/auth_backend/auth_method/oauth.py index 21789aa9..69d6980d 100644 --- a/auth_backend/auth_method/oauth.py +++ b/auth_backend/auth_method/oauth.py @@ -31,10 +31,6 @@ def __init__(self): self.router.add_api_route("/auth_url", self._auth_url, methods=["GET"], response_model=self.UrlSchema) self.router.add_api_route("", self._unregister, methods=["DELETE"]) - def __init_subclass__(cls, **kwargs): - super().__init_subclass__(**kwargs) - cls.loginable = issubclass(cls, LoginableMixin) - @staticmethod @abstractmethod async def _redirect_url(*args, **kwargs) -> UrlSchema: @@ -99,4 +95,5 @@ async def _delete_auth_methods(cls, user: User, *, db_session) -> list[AuthMetho for method in auth_methods: method.is_deleted = True db_session.flush() + db_session.commit() return {m.param: m.value for m in auth_methods} diff --git a/auth_backend/auth_method/outer.py b/auth_backend/auth_method/outer.py index 1ad4db5b..23153308 100644 --- a/auth_backend/auth_method/outer.py +++ b/auth_backend/auth_method/outer.py @@ -7,7 +7,6 @@ from fastapi_sqlalchemy import db from starlette.status import HTTP_403_FORBIDDEN, HTTP_404_NOT_FOUND, HTTP_409_CONFLICT, HTTP_424_FAILED_DEPENDENCY -from auth_backend.auth_method import LoginableMixin from auth_backend.auth_method.base import AuthPluginMeta from auth_backend.base import Base from auth_backend.models.db import AuthMethod, UserSession diff --git a/auth_backend/auth_plugins/email.py b/auth_backend/auth_plugins/email.py index 2090fe87..a9a66c09 100644 --- a/auth_backend/auth_plugins/email.py +++ b/auth_backend/auth_plugins/email.py @@ -105,7 +105,6 @@ class ResetForgottenPassword(Base): class Email(UserdataMixin, LoginableMixin, RegistrableMixin, AuthPluginMeta): prefix = "/email" - loginable = True def __init__(self): super().__init__() diff --git a/auth_backend/auth_plugins/github.py b/auth_backend/auth_plugins/github.py index f341a2a0..5a88ddf1 100644 --- a/auth_backend/auth_plugins/github.py +++ b/auth_backend/auth_plugins/github.py @@ -28,7 +28,7 @@ class GithubSettings(Settings): GITHUB_CLIENT_SECRET: str | None = None -class GithubAuth(OauthMeta, LoginableMixin): +class GithubAuth(OauthMeta): """Вход в приложение по аккаунту GitHub""" prefix = '/github' diff --git a/auth_backend/auth_plugins/google.py b/auth_backend/auth_plugins/google.py index 6048c8b3..98884ef0 100644 --- a/auth_backend/auth_plugins/google.py +++ b/auth_backend/auth_plugins/google.py @@ -36,7 +36,7 @@ class GoogleSettings(Settings): GOOGLE_BLACKLIST_DOMAINS: list[str] | None = ['physics.msu.ru'] -class GoogleAuth(OauthMeta, LoginableMixin): +class GoogleAuth(OauthMeta): """Вход в приложение по аккаунту гугл""" prefix = '/google' diff --git a/auth_backend/auth_plugins/keycloak.py b/auth_backend/auth_plugins/keycloak.py index 4f3f72e1..598f2e4e 100644 --- a/auth_backend/auth_plugins/keycloak.py +++ b/auth_backend/auth_plugins/keycloak.py @@ -29,7 +29,7 @@ class KeycloakSettings(Settings): KEYCLOAK_CLIENT_SECRET: str | None = None -class KeycloakAuth(OauthMeta, LoginableMixin): +class KeycloakAuth(OauthMeta): """Вход в приложение по аккаунту Keycloak""" prefix = '/keycloak' diff --git a/auth_backend/auth_plugins/lkmsu.py b/auth_backend/auth_plugins/lkmsu.py index f73f453f..40e0440c 100644 --- a/auth_backend/auth_plugins/lkmsu.py +++ b/auth_backend/auth_plugins/lkmsu.py @@ -30,7 +30,7 @@ class LkmsuSettings(Settings): LKMSU_FACULTY_NAME: str = 'Физический факультет' -class LkmsuAuth(OauthMeta, LoginableMixin): +class LkmsuAuth(OauthMeta): """Вход в приложение по аккаунту гугл""" prefix = '/lk-msu' diff --git a/auth_backend/auth_plugins/mymsu.py b/auth_backend/auth_plugins/mymsu.py index 3caca3e5..b5f9386d 100644 --- a/auth_backend/auth_plugins/mymsu.py +++ b/auth_backend/auth_plugins/mymsu.py @@ -17,7 +17,7 @@ class MyMsuSettings(Settings): YANDEX_BLACKLIST_DOMAINS: list[str] | None = None -class MyMsuAuth(YandexAuth, LoginableMixin): +class MyMsuAuth(YandexAuth): """Вход в приложение по почте @my.msu.ru""" prefix = '/my-msu' diff --git a/auth_backend/auth_plugins/physics.py b/auth_backend/auth_plugins/physics.py index 90f11785..be15f7ed 100644 --- a/auth_backend/auth_plugins/physics.py +++ b/auth_backend/auth_plugins/physics.py @@ -24,7 +24,7 @@ class PhysicsSettings(Settings): GOOGLE_BLACKLIST_DOMAINS: list[str] | None = None -class PhysicsAuth(GoogleAuth, LoginableMixin): +class PhysicsAuth(GoogleAuth): """Вход в приложение по почте @physics.msu.ru""" prefix = '/physics-msu' diff --git a/auth_backend/auth_plugins/telegram.py b/auth_backend/auth_plugins/telegram.py index 0270f320..b2576379 100644 --- a/auth_backend/auth_plugins/telegram.py +++ b/auth_backend/auth_plugins/telegram.py @@ -29,7 +29,7 @@ class TelegramSettings(Settings): TELEGRAM_BOT_TOKEN: str | None = None -class TelegramAuth(OauthMeta, LoginableMixin): +class TelegramAuth(OauthMeta): prefix = '/telegram' tags = ['Telegram'] settings = TelegramSettings() diff --git a/auth_backend/auth_plugins/vk.py b/auth_backend/auth_plugins/vk.py index 52961513..1adb6568 100644 --- a/auth_backend/auth_plugins/vk.py +++ b/auth_backend/auth_plugins/vk.py @@ -44,7 +44,7 @@ class VkSettings(Settings): ] # Другие данные https://dev.vk.com/ru/reference/objects/user -class VkAuth(OauthMeta, LoginableMixin): +class VkAuth(OauthMeta): prefix = '/vk' tags = ['vk'] settings = VkSettings() diff --git a/auth_backend/auth_plugins/yandex.py b/auth_backend/auth_plugins/yandex.py index a629db62..3de63f25 100644 --- a/auth_backend/auth_plugins/yandex.py +++ b/auth_backend/auth_plugins/yandex.py @@ -31,7 +31,7 @@ class YandexSettings(Settings): YANDEX_BLACKLIST_DOMAINS: list[str] | None = ['my.msu.ru'] -class YandexAuth(OauthMeta, LoginableMixin): +class YandexAuth(OauthMeta): prefix = '/yandex' tags = ['Yandex'] settings = YandexSettings() From 6c94e48d7af5cab08ad2bf081124adb5b96c6a4d Mon Sep 17 00:00:00 2001 From: default Date: Fri, 18 Oct 2024 18:05:53 +0000 Subject: [PATCH 15/17] fix --- auth_backend/auth_method/base.py | 1 - auth_backend/auth_method/oauth.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/auth_backend/auth_method/base.py b/auth_backend/auth_method/base.py index 68f6fcff..6dc58aa7 100644 --- a/auth_backend/auth_method/base.py +++ b/auth_backend/auth_method/base.py @@ -36,7 +36,6 @@ def __init_subclass__(cls, **kwargs): if cls.__name__.endswith('Meta') or cls.__name__.endswith('Mixin'): return logger.info(f'Init authmethod {cls.__name__}') - cls.loginable = False AUTH_METHODS[cls.__name__] = cls async def _get_user( diff --git a/auth_backend/auth_method/oauth.py b/auth_backend/auth_method/oauth.py index 69d6980d..b020c796 100644 --- a/auth_backend/auth_method/oauth.py +++ b/auth_backend/auth_method/oauth.py @@ -78,13 +78,13 @@ async def _delete_auth_methods(cls, user: User, *, db_session) -> list[AuthMetho ) .all() ) - if cls.loginable: + if issubclass(cls, LoginableMixin): loginable_auth_methods_count: int = ( AuthMethod.query(session=db_session) .filter( AuthMethod.user_id == user.id, AuthMethod.auth_method.in_( - [method.get_name() for method in AUTH_METHODS.values() if method.loginable] + [method.get_name() for method in AUTH_METHODS.values() if issubclass(method, LoginableMixin)] ), ) .count() From a6380ff08c8cd1a2341635f108fd32e1543856e6 Mon Sep 17 00:00:00 2001 From: default Date: Fri, 18 Oct 2024 18:13:50 +0000 Subject: [PATCH 16/17] removing unneeded imports --- auth_backend/auth_plugins/github.py | 2 +- auth_backend/auth_plugins/google.py | 2 +- auth_backend/auth_plugins/keycloak.py | 2 +- auth_backend/auth_plugins/lkmsu.py | 2 +- auth_backend/auth_plugins/mymsu.py | 1 - auth_backend/auth_plugins/physics.py | 1 - auth_backend/auth_plugins/telegram.py | 2 +- auth_backend/auth_plugins/vk.py | 2 +- auth_backend/auth_plugins/yandex.py | 2 +- 9 files changed, 7 insertions(+), 9 deletions(-) diff --git a/auth_backend/auth_plugins/github.py b/auth_backend/auth_plugins/github.py index 5a88ddf1..1ef892a0 100644 --- a/auth_backend/auth_plugins/github.py +++ b/auth_backend/auth_plugins/github.py @@ -10,7 +10,7 @@ from fastapi_sqlalchemy import db from pydantic import BaseModel, Field -from auth_backend.auth_method import AuthPluginMeta, LoginableMixin, OauthMeta, Session +from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession diff --git a/auth_backend/auth_plugins/google.py b/auth_backend/auth_plugins/google.py index 98884ef0..90afb810 100644 --- a/auth_backend/auth_plugins/google.py +++ b/auth_backend/auth_plugins/google.py @@ -12,7 +12,7 @@ from google.oauth2.id_token import verify_oauth2_token from pydantic import BaseModel, Field, Json -from auth_backend.auth_method import AuthPluginMeta, LoginableMixin, OauthMeta, Session +from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session from auth_backend.exceptions import AlreadyExists, OauthAuthFailed, OauthCredentialsIncorrect from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession diff --git a/auth_backend/auth_plugins/keycloak.py b/auth_backend/auth_plugins/keycloak.py index 598f2e4e..f86af864 100644 --- a/auth_backend/auth_plugins/keycloak.py +++ b/auth_backend/auth_plugins/keycloak.py @@ -10,7 +10,7 @@ from fastapi_sqlalchemy import db from pydantic import BaseModel, Field -from auth_backend.auth_method import AuthPluginMeta, LoginableMixin, OauthMeta, Session +from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession diff --git a/auth_backend/auth_plugins/lkmsu.py b/auth_backend/auth_plugins/lkmsu.py index 40e0440c..b9cac630 100644 --- a/auth_backend/auth_plugins/lkmsu.py +++ b/auth_backend/auth_plugins/lkmsu.py @@ -10,7 +10,7 @@ from pydantic import BaseModel, Field from starlette.background import BackgroundTasks -from auth_backend.auth_method import AuthPluginMeta, LoginableMixin, OauthMeta, Session +from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession diff --git a/auth_backend/auth_plugins/mymsu.py b/auth_backend/auth_plugins/mymsu.py index b5f9386d..67c1e676 100644 --- a/auth_backend/auth_plugins/mymsu.py +++ b/auth_backend/auth_plugins/mymsu.py @@ -1,6 +1,5 @@ from pydantic import Field -from auth_backend.auth_method import LoginableMixin from auth_backend.settings import Settings from .yandex import YandexAuth diff --git a/auth_backend/auth_plugins/physics.py b/auth_backend/auth_plugins/physics.py index be15f7ed..7ffd36f1 100644 --- a/auth_backend/auth_plugins/physics.py +++ b/auth_backend/auth_plugins/physics.py @@ -1,6 +1,5 @@ from pydantic import Field, Json -from auth_backend.auth_method import LoginableMixin from auth_backend.settings import Settings from .google import GoogleAuth diff --git a/auth_backend/auth_plugins/telegram.py b/auth_backend/auth_plugins/telegram.py index b2576379..a1ffebc7 100644 --- a/auth_backend/auth_plugins/telegram.py +++ b/auth_backend/auth_plugins/telegram.py @@ -11,7 +11,7 @@ from fastapi_sqlalchemy import db from pydantic import BaseModel, Field -from auth_backend.auth_method import AuthPluginMeta, LoginableMixin, OauthMeta, Session +from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession diff --git a/auth_backend/auth_plugins/vk.py b/auth_backend/auth_plugins/vk.py index 1adb6568..41173751 100644 --- a/auth_backend/auth_plugins/vk.py +++ b/auth_backend/auth_plugins/vk.py @@ -10,7 +10,7 @@ from fastapi_sqlalchemy import db from pydantic import BaseModel, Field -from auth_backend.auth_method import AuthPluginMeta, LoginableMixin, OauthMeta, Session +from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession diff --git a/auth_backend/auth_plugins/yandex.py b/auth_backend/auth_plugins/yandex.py index 3de63f25..f18a3655 100644 --- a/auth_backend/auth_plugins/yandex.py +++ b/auth_backend/auth_plugins/yandex.py @@ -10,7 +10,7 @@ from fastapi_sqlalchemy import db from pydantic import BaseModel, Field -from auth_backend.auth_method import AuthPluginMeta, LoginableMixin, OauthMeta, Session +from auth_backend.auth_method import AuthPluginMeta, OauthMeta, Session from auth_backend.exceptions import AlreadyExists, OauthAuthFailed from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import User, UserSession From be27c00166e566ad3a6374c1c0d0f89fede78104 Mon Sep 17 00:00:00 2001 From: default Date: Fri, 18 Oct 2024 18:18:33 +0000 Subject: [PATCH 17/17] fix --- auth_backend/auth_method/oauth.py | 1 + tests/test_outermeta.py | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/auth_backend/auth_method/oauth.py b/auth_backend/auth_method/oauth.py index b020c796..961e2767 100644 --- a/auth_backend/auth_method/oauth.py +++ b/auth_backend/auth_method/oauth.py @@ -70,6 +70,7 @@ async def _get_user(cls, key: str, value: str | int, *, db_session: DbSession) - @classmethod async def _delete_auth_methods(cls, user: User, *, db_session) -> list[AuthMethod]: + """Удаляет пользователю все AuthMethod конкретной авторизации""" auth_methods: list[AuthMethod] = ( AuthMethod.query(session=db_session) .filter( diff --git a/tests/test_outermeta.py b/tests/test_outermeta.py index 00453df2..ff0b178f 100644 --- a/tests/test_outermeta.py +++ b/tests/test_outermeta.py @@ -7,8 +7,6 @@ class Test(OuterAuthMeta): - loginable = True - @classmethod async def _is_outer_user_exists(cls, username): return True