Skip to content

Commit 8aeb513

Browse files
committed
update
1 parent 660e370 commit 8aeb513

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

dojo/middleware.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,15 @@ def __call__(self, request):
8282

8383
class CustomSocialAuthExceptionMiddleware(SocialAuthExceptionMiddleware):
8484
def process_exception(self, request, exception):
85-
if isinstance(exception, (requests.exceptions.RequestException, AuthCanceled, AuthFailed)):
85+
if isinstance(exception, requests.exceptions.RequestException):
8686
messages.error(request, "Login via social authentication is temporarily unavailable. Please use the standard login below.")
8787
return redirect("/login")
88+
if isinstance(exception, AuthCanceled):
89+
messages.warning(request, "Social login was canceled. Please try again or use the standard login.")
90+
return redirect("/login")
91+
if isinstance(exception, AuthFailed):
92+
messages.error(request, "Social login failed. Please try again or use the standard login.")
93+
return redirect("/login")
8894
return super().process_exception(request, exception)
8995

9096

unittests/test_social_auth_failure_handling.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11

2+
from django.contrib import messages
23
from django.contrib.auth.models import AnonymousUser
34
from django.contrib.messages.storage.fallback import FallbackStorage
45
from django.contrib.sessions.middleware import SessionMiddleware
56
from django.http import HttpResponse
67
from django.test import RequestFactory, override_settings
78
from requests.exceptions import ConnectionError as RequestsConnectionError
9+
from social_core.exceptions import AuthCanceled, AuthFailed
810

911
from dojo.middleware import CustomSocialAuthExceptionMiddleware
1012

@@ -47,9 +49,20 @@ def test_social_auth_exception_redirects_to_login(self):
4749
"/login/github/",
4850
]
4951

52+
exceptions = [
53+
(RequestsConnectionError("Host unreachable"), "Login via social authentication is temporarily unavailable. Please use the standard login below."),
54+
(AuthCanceled("User canceled login"), "Social login was canceled. Please try again or use the standard login."),
55+
(AuthFailed("Token exchange failed"), "Social login failed. Please try again or use the standard login."),
56+
]
57+
5058
for path in login_paths:
51-
with self.subTest(path=path):
52-
request = self._prepare_request(path)
53-
response = self.middleware.process_exception(request, RequestsConnectionError("Host unreachable"))
54-
self.assertEqual(response.status_code, 302)
55-
self.assertEqual(response.url, "/login")
59+
for exception, expected_message in exceptions:
60+
with self.subTest(path=path, exception=type(exception).__name__):
61+
request = self._prepare_request(path)
62+
response = self.middleware.process_exception(request, exception)
63+
64+
self.assertEqual(response.status_code, 302)
65+
self.assertEqual(response.url, "/login")
66+
67+
storage = list(messages.get_messages(request))
68+
self.assertTrue(any(expected_message in str(msg) for msg in storage))

0 commit comments

Comments
 (0)