From 60905a662e40b2484ff0ad9b649ed192f85d7674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Avil=C3=A9s?= Date: Mon, 7 Jul 2025 17:48:04 +0200 Subject: [PATCH 1/2] Use context-manager form of `pytest.rises()` Fixes RUF061. --- tests/test_util.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/test_util.py b/tests/test_util.py index 68f991e..72dee1a 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -145,8 +145,10 @@ class NoProvider: class InvalidProvider(AuthProvider, IdentityProvider): pass - pytest.raises(TypeError, get_provider_base, NoProvider) - pytest.raises(TypeError, get_provider_base, InvalidProvider) + with pytest.raises(TypeError): + get_provider_base(NoProvider) + with pytest.raises(TypeError): + get_provider_base(InvalidProvider) def test_login_view(mocker): @@ -267,7 +269,8 @@ def test_validate_provider_map(valid, auth_providers, identity_providers, provid if valid: validate_provider_map(state) else: - pytest.raises(ValueError, validate_provider_map, state) + with pytest.raises(ValueError): + validate_provider_map(state) def test_classproperty(): From 6a66cff45398f12306d494ee90b954d9cc0390b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Avil=C3=A9s?= Date: Wed, 16 Apr 2025 16:39:32 +0200 Subject: [PATCH 2/2] Retrieve user identifier from form data --- flask_multipass/auth.py | 10 ++++++++++ flask_multipass/providers/sqlalchemy.py | 2 ++ flask_multipass/providers/static.py | 1 + 3 files changed, 13 insertions(+) diff --git a/flask_multipass/auth.py b/flask_multipass/auth.py index 56863c3..9fe4e93 100644 --- a/flask_multipass/auth.py +++ b/flask_multipass/auth.py @@ -30,6 +30,10 @@ class AuthProvider(metaclass=SupportsMeta): #: form in your application, specify a :class:`~flask_wtf.Form` #: here (usually containing a username/email and a password field). login_form = None + #: The field name in the login form that contains the identifier. + #: Useful to reliably retrieve identifier data in applications that use + #: multiple auth providers. + identifier_field_name = None def __init__(self, multipass, name, settings): self.multipass = multipass @@ -113,5 +117,11 @@ def process_logout(self, return_url): """ return None + def get_identifier(self, data): + """Get the user identifier from form data.""" + if self.identifier_field_name is None: + raise NotImplementedError('No identifier field name set') + return data.get(self.identifier_field_name) + def __repr__(self): return f'<{type(self).__name__}({self.name})>' diff --git a/flask_multipass/providers/sqlalchemy.py b/flask_multipass/providers/sqlalchemy.py index 51f7217..041e5cb 100644 --- a/flask_multipass/providers/sqlalchemy.py +++ b/flask_multipass/providers/sqlalchemy.py @@ -40,6 +40,8 @@ class SQLAlchemyAuthProviderBase(AuthProvider): #: i.e. the username. This needs to be a SQLAlchemy column object, #: e.g. ``Identity.identifier`` identifier_column = None + #: The field name in the ``login_form`` that contains the identifier + identifier_field_name = 'identifier' def check_password(self, identity, password): """Checks the entered password. diff --git a/flask_multipass/providers/static.py b/flask_multipass/providers/static.py index 8c0a5eb..3f6f26f 100644 --- a/flask_multipass/providers/static.py +++ b/flask_multipass/providers/static.py @@ -33,6 +33,7 @@ class StaticAuthProvider(AuthProvider): """ login_form = StaticLoginForm + identifier_field_name = 'username' def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs)