Skip to content

Commit 11556e7

Browse files
committed
update
1 parent 660e370 commit 11556e7

File tree

2 files changed

+23
-18
lines changed

2 files changed

+23
-18
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: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,18 @@
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
6-
from django.test import RequestFactory, override_settings
7+
from django.test import RequestFactory
78
from requests.exceptions import ConnectionError as RequestsConnectionError
9+
from social_core.exceptions import AuthCanceled, AuthFailed
810

911
from dojo.middleware import CustomSocialAuthExceptionMiddleware
1012

1113
from .dojo_test_case import DojoTestCase
1214

1315

14-
@override_settings(
15-
SOCIAL_AUTH_OIDC_AUTH_ENABLED=True,
16-
SOCIAL_AUTH_AUTH0_OAUTH2_ENABLED=True,
17-
GOOGLE_OAUTH_ENABLED=True,
18-
SOCIAL_AUTH_OKTA_OAUTH2_ENABLED=True,
19-
AZUREAD_TENANT_OAUTH2_ENABLED=True,
20-
GITLAB_OAUTH2_ENABLED=True,
21-
KEYCLOAK_OAUTH2_ENABLED=True,
22-
GITHUB_ENTERPRISE_OAUTH2_ENABLED=True,
23-
)
2416
class TestSocialAuthFailureHandling(DojoTestCase):
2517

2618
def setUp(self):
@@ -46,10 +38,17 @@ def test_social_auth_exception_redirects_to_login(self):
4638
"/login/keycloak-oauth2/",
4739
"/login/github/",
4840
]
49-
41+
exceptions = [
42+
(RequestsConnectionError("Host unreachable"), "Login via social authentication is temporarily unavailable. Please use the standard login below."),
43+
(AuthCanceled("User canceled login"), "Social login was canceled. Please try again or use the standard login."),
44+
(AuthFailed("Token exchange failed"), "Social login failed. Please try again or use the standard login."),
45+
]
5046
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")
47+
for exception, expected_message in exceptions:
48+
with self.subTest(path=path, exception=type(exception).__name__):
49+
request = self._prepare_request(path)
50+
response = self.middleware.process_exception(request, exception)
51+
self.assertEqual(response.status_code, 302)
52+
self.assertEqual(response.url, "/login")
53+
storage = list(messages.get_messages(request))
54+
self.assertTrue(any(expected_message in str(msg) for msg in storage))

0 commit comments

Comments
 (0)