Skip to content

Commit ee4446d

Browse files
committed
WIP Add rate limiter logic in auth providers
1 parent 632804e commit ee4446d

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

flask_multipass/auth.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ class AuthProvider(metaclass=SupportsMeta):
3434
#: Useful to reliably retrieve identifier data in applications that use
3535
#: multiple auth providers.
3636
identifier_field_name = None
37+
#: The rate limiter used for login attempts in local auth providers.
38+
#: This should be an instance of :class:`~flask_limiter.Limiter`.
39+
rate_limiter = None
40+
#: The rate limiter used for login attempts bound to a specific user
41+
#: This should be an instance of :class:`~flask_limiter.Limiter`.
42+
rate_limiter_user = None
3743

3844
def __init__(self, multipass, name, settings):
3945
self.multipass = multipass
@@ -50,6 +56,13 @@ def is_external(self):
5056
"""
5157
return self.login_form is None
5258

59+
@property
60+
def is_rate_limited(self):
61+
"""True if rate limiters are set for local auth provider."""
62+
if self.is_external:
63+
return False
64+
return self.rate_limiter is not None or self.rate_limiter_user is not None
65+
5366
def process_local_login(self, data): # pragma: no cover
5467
"""Handles the login process based on form data.
5568
@@ -117,5 +130,14 @@ def process_logout(self, return_url):
117130
"""
118131
return None
119132

133+
def notify_failed_login(self, identifier=None):
134+
"""Notify the provider about a failed login attempt."""
135+
if not self.is_rate_limited:
136+
return
137+
if identifier and self.rate_limiter_user:
138+
self.rate_limiter_user.hit(identifier)
139+
elif self.rate_limiter:
140+
self.rate_limiter.hit()
141+
120142
def __repr__(self):
121143
return f'<{type(self).__name__}({self.name})>'

0 commit comments

Comments
 (0)