From 419f16d72cdb3858810ec206676272e598ad2fb2 Mon Sep 17 00:00:00 2001 From: Mathijs de Bruin Date: Thu, 11 Jun 2026 12:35:09 +0100 Subject: [PATCH 1/5] fix(auth): redirect OAuth login failures to login page instead of raw JSON (#1273) All user-facing failure paths in oauth_callback and oauth_azure_hf_callback now redirect to /login?error=oauthSignin instead of returning raw JSON or a bare 500. Developer-facing config errors (missing oauth_callback, unknown provider) remain HTTPException. The frontend i18n lookup now tries the raw error key before lowercasing so camelCase keys (oauthSignin) resolve to their specific messages. Co-Authored-By: Claude Sonnet 4.6 --- backend/chainlit/server.py | 50 ++++----- backend/tests/test_server.py | 153 ++++++++++++++++++++++++++ cypress/e2e/oauth_auth/main.py | 23 ++++ cypress/e2e/oauth_auth/spec.cy.ts | 37 +++++++ frontend/src/components/LoginForm.tsx | 1 + 5 files changed, 239 insertions(+), 25 deletions(-) create mode 100644 cypress/e2e/oauth_auth/main.py create mode 100644 cypress/e2e/oauth_auth/spec.cy.ts diff --git a/backend/chainlit/server.py b/backend/chainlit/server.py index cab8fef9e6..f38bf5a3d7 100644 --- a/backend/chainlit/server.py +++ b/backend/chainlit/server.py @@ -668,29 +668,27 @@ async def oauth_callback( return _get_oauth_redirect_error(request, error) if not code or not state: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="Missing code or state", - ) + return _get_oauth_redirect_error(request, "oauthSignin") try: validate_oauth_state_cookie(request, state) except Exception as e: logger.exception("Unable to validate oauth state: %s", e) - - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail="Unauthorized", - ) + return _get_oauth_redirect_error(request, "oauthSignin") url = get_user_facing_url(request.url) - token = await provider.get_token(code, url) - - (raw_user_data, default_user) = await provider.get_user_info(token) + try: + token = await provider.get_token(code, url) + (raw_user_data, default_user) = await provider.get_user_info(token) + user = await config.code.oauth_callback( + provider_id, token, raw_user_data, default_user + ) + except Exception as e: + logger.exception("OAuth callback error: %s", e) + return _get_oauth_redirect_error(request, "oauthSignin") - user = await config.code.oauth_callback( - provider_id, token, raw_user_data, default_user - ) + if not user: + return _get_oauth_redirect_error(request, "oauthSignin") response = await _authenticate_user(request, user, redirect_to_callback=True) @@ -727,19 +725,21 @@ async def oauth_azure_hf_callback( return _get_oauth_redirect_error(request, error) if not code: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="Missing code", - ) + return _get_oauth_redirect_error(request, "oauthSignin") url = get_user_facing_url(request.url) - token = await provider.get_token(code, url) - - (raw_user_data, default_user) = await provider.get_user_info(token) + try: + token = await provider.get_token(code, url) + (raw_user_data, default_user) = await provider.get_user_info(token) + user = await config.code.oauth_callback( + provider_id, token, raw_user_data, default_user, id_token + ) + except Exception as e: + logger.exception("OAuth callback error: %s", e) + return _get_oauth_redirect_error(request, "oauthSignin") - user = await config.code.oauth_callback( - provider_id, token, raw_user_data, default_user, id_token - ) + if not user: + return _get_oauth_redirect_error(request, "oauthSignin") response = await _authenticate_user(request, user, redirect_to_callback=True) diff --git a/backend/tests/test_server.py b/backend/tests/test_server.py index 1441a3d8b2..017a05fe7b 100644 --- a/backend/tests/test_server.py +++ b/backend/tests/test_server.py @@ -1152,3 +1152,156 @@ def test_health_check(test_client: TestClient): response = test_client.get("/health") assert response.status_code == 200 assert response.json() == {"status": "ok"} + + +# --------------------------------------------------------------------------- +# OAuth callback redirect tests (regression for #1273) +# --------------------------------------------------------------------------- + + +@pytest.fixture +def mock_oauth_provider(monkeypatch: pytest.MonkeyPatch): + """Return a mock OAuthProvider and patch it into chainlit.server.""" + from chainlit.user import User + + provider = Mock() + provider.id = "github" + provider.get_token = AsyncMock(return_value="mock_token") + provider.get_user_info = AsyncMock( + return_value=({"login": "user"}, User(identifier="user")) + ) + monkeypatch.setattr("chainlit.server.get_oauth_provider", lambda _: provider) + return provider + + +def test_oauth_callback_provider_error_redirects( + test_client: TestClient, + test_config, + mock_oauth_provider, +): + """Provider-returned error param already redirects — guard the existing path.""" + test_config.code.oauth_callback = AsyncMock() + response = test_client.get( + "/auth/oauth/github/callback?error=access_denied", + follow_redirects=False, + ) + assert response.status_code in (302, 307) + assert "/login?error=" in response.headers["location"] + + +def test_oauth_callback_missing_code_redirects( + test_client: TestClient, + test_config, + mock_oauth_provider, +): + """Missing code/state → redirect instead of 400 JSON (regression for #1273).""" + test_config.code.oauth_callback = AsyncMock() + response = test_client.get( + "/auth/oauth/github/callback", + follow_redirects=False, + ) + assert response.status_code in (302, 307) + assert "/login?error=" in response.headers["location"] + + +def test_oauth_callback_invalid_state_redirects( + test_client: TestClient, + test_config, + mock_oauth_provider, +): + """Invalid state cookie → redirect instead of 401 JSON (regression for #1273).""" + test_config.code.oauth_callback = AsyncMock() + # No oauth_state cookie set, so state validation will fail + response = test_client.get( + "/auth/oauth/github/callback?code=fake_code&state=fake_state", + follow_redirects=False, + ) + assert response.status_code in (302, 307) + assert "/login?error=" in response.headers["location"] + + +def test_oauth_callback_get_token_error_redirects( + test_client: TestClient, + test_config, + mock_oauth_provider, +): + """get_token exception → redirect instead of 500 (regression for #1273).""" + test_config.code.oauth_callback = AsyncMock() + mock_oauth_provider.get_token = AsyncMock(side_effect=Exception("provider down")) + response = test_client.get( + "/auth/oauth/github/callback?code=fake_code&state=valid_state", + cookies={"oauth_state": "valid_state"}, + follow_redirects=False, + ) + assert response.status_code in (302, 307) + assert "/login?error=" in response.headers["location"] + + +def test_oauth_callback_none_user_redirects( + test_client: TestClient, + test_config, + mock_oauth_provider, +): + """oauth_callback returns None → redirect instead of 401 JSON (regression for #1273).""" + test_config.code.oauth_callback = AsyncMock(return_value=None) + response = test_client.get( + "/auth/oauth/github/callback?code=fake_code&state=valid_state", + cookies={"oauth_state": "valid_state"}, + follow_redirects=False, + ) + assert response.status_code in (302, 307) + assert "/login?error=" in response.headers["location"] + + +# --------------------------------------------------------------------------- +# Azure AD hybrid flow redirect tests (regression for #1273) +# --------------------------------------------------------------------------- + + +def test_oauth_azure_hf_callback_missing_code_redirects( + test_client: TestClient, + test_config, + mock_oauth_provider, +): + """Missing code in Azure hybrid flow → redirect instead of 400 JSON (regression for #1273).""" + test_config.code.oauth_callback = AsyncMock() + response = test_client.post( + "/auth/oauth/azure-ad-hybrid/callback", + data={}, + follow_redirects=False, + ) + assert response.status_code in (302, 307) + assert "/login?error=" in response.headers["location"] + + +def test_oauth_azure_hf_callback_get_token_error_redirects( + test_client: TestClient, + test_config, + mock_oauth_provider, +): + """get_token exception in Azure hybrid flow → redirect instead of 500 (regression for #1273).""" + test_config.code.oauth_callback = AsyncMock() + mock_oauth_provider.get_token = AsyncMock(side_effect=Exception("provider down")) + response = test_client.post( + "/auth/oauth/azure-ad-hybrid/callback", + data={"code": "fake_code"}, + follow_redirects=False, + ) + assert response.status_code in (302, 307) + assert "/login?error=" in response.headers["location"] + + +def test_oauth_azure_hf_callback_none_user_redirects( + test_client: TestClient, + test_config, + mock_oauth_provider, +): + """oauth_callback returns None in Azure hybrid flow → redirect (regression for #1273).""" + test_config.code.oauth_callback = AsyncMock(return_value=None) + response = test_client.post( + "/auth/oauth/azure-ad-hybrid/callback", + data={"code": "fake_code"}, + follow_redirects=False, + ) + assert response.status_code in (302, 307) + assert "/login?error=" in response.headers["location"] diff --git a/cypress/e2e/oauth_auth/main.py b/cypress/e2e/oauth_auth/main.py new file mode 100644 index 0000000000..7ecce3db50 --- /dev/null +++ b/cypress/e2e/oauth_auth/main.py @@ -0,0 +1,23 @@ +import os +from typing import Optional + +os.environ["CHAINLIT_AUTH_SECRET"] = "SUPER_SECRET" # nosec B105 +os.environ["OAUTH_GITHUB_CLIENT_ID"] = "fake_client_id" # nosec B105 +os.environ["OAUTH_GITHUB_CLIENT_SECRET"] = "fake_client_secret" # nosec B105 + +import chainlit as cl # noqa: E402 + + +@cl.oauth_callback +def oauth_callback( + provider_id: str, + token: str, + raw_user_data: dict, + default_user: cl.User, +) -> Optional[cl.User]: + return default_user + + +@cl.on_chat_start +async def on_chat_start(): + await cl.Message("Hello").send() diff --git a/cypress/e2e/oauth_auth/spec.cy.ts b/cypress/e2e/oauth_auth/spec.cy.ts new file mode 100644 index 0000000000..5bf5899171 --- /dev/null +++ b/cypress/e2e/oauth_auth/spec.cy.ts @@ -0,0 +1,37 @@ +describe('OAuth Auth Error UX (#1273)', () => { + describe('OAuth callback failure paths redirect instead of returning raw JSON', () => { + it('redirects on provider-returned error param', () => { + cy.request({ + url: '/auth/oauth/github/callback?error=access_denied', + followRedirect: false, + failOnStatusCode: false + }).then((response) => { + expect(response.status).to.be.oneOf([301, 302, 303, 307, 308]); + expect(response.headers['location']).to.include('/login?error='); + }); + }); + + it('redirects on invalid state (no raw JSON 401) — regression for #1273', () => { + cy.request({ + url: '/auth/oauth/github/callback?code=fake_code&state=fake_state', + followRedirect: false, + failOnStatusCode: false + }).then((response) => { + expect(response.status).to.be.oneOf([301, 302, 303, 307, 308]); + expect(response.headers['location']).to.include('/login?error='); + expect(response.body).to.not.include('{"detail"'); + }); + }); + }); + + describe('login page renders friendly OAuth error message', () => { + it('shows a specific message for oauthSignin error', () => { + cy.visit('/login?error=oauthSignin'); + cy.get('[role="alert"]').should( + 'contain', + 'Try signing in with a different account' + ); + cy.get('body').should('not.contain', '{"detail"'); + }); + }); +}); diff --git a/frontend/src/components/LoginForm.tsx b/frontend/src/components/LoginForm.tsx index 4d3c9bfc08..7969712034 100644 --- a/frontend/src/components/LoginForm.tsx +++ b/frontend/src/components/LoginForm.tsx @@ -91,6 +91,7 @@ export function LoginForm({ {errorState && ( {t([ + `auth.login.errors.${errorState}`, `auth.login.errors.${errorState.toLowerCase()}`, `auth.login.errors.default` ])} From 8c1a6625f8131258406816cc82dc428aebb7bc6b Mon Sep 17 00:00:00 2001 From: Mathijs de Bruin Date: Thu, 11 Jun 2026 14:36:05 +0100 Subject: [PATCH 2/5] fix(auth): improve OAuth error messages and redirect status; fix CI (#1273) - Rework `_get_oauth_redirect_error` to accept a `status_code` param (default 302); POST azure-hybrid handler now uses 303 (See Other) so the browser issues a GET to /login instead of re-POSTing. - Map all provider-returned OAuth errors (including access_denied) to the friendly `oauthSignin` key; raw provider code is logged for debugging. - Add `asyncio.CancelledError: raise` guard before the broad `except Exception` in both OAuth callback handlers. - Reword `oauthSignin` across all 23 locale files: "Sign in failed. Please try again, or use a different sign-in method." - Add `role="alert"` to `Alert.tsx` (ARIA + stable Cypress selector). - Fix Cypress `oauth_auth/main.py`: remove unused `# noqa: E402` that caused RUF100 lint failure in CI. - Update `spec.cy.ts`: assert new message text, fix ineffective body assertion (use content-type check), assert provider-error redirects to `error=oauthSignin`. - Tighten `test_server.py` redirect-status assertions to exact codes (302 for GET handler, 303 for POST handler) and check `oauthSignin` key for provider-error case. - Follow-up issue for access_denied-specific UX: #2956. Co-Authored-By: Claude Sonnet 4.6 --- backend/chainlit/server.py | 25 ++++-- backend/chainlit/translations/ar-SA.json | 2 +- backend/chainlit/translations/bn.json | 2 +- backend/chainlit/translations/da-DK.json | 2 +- backend/chainlit/translations/de-DE.json | 2 +- backend/chainlit/translations/el-GR.json | 2 +- backend/chainlit/translations/en-US.json | 2 +- backend/chainlit/translations/es.json | 2 +- backend/chainlit/translations/fr-FR.json | 2 +- backend/chainlit/translations/gu.json | 2 +- backend/chainlit/translations/he-IL.json | 2 +- backend/chainlit/translations/hi.json | 2 +- backend/chainlit/translations/it.json | 2 +- backend/chainlit/translations/ja.json | 2 +- backend/chainlit/translations/kn.json | 2 +- backend/chainlit/translations/ko.json | 2 +- backend/chainlit/translations/ml.json | 2 +- backend/chainlit/translations/mr.json | 2 +- backend/chainlit/translations/nl.json | 2 +- backend/chainlit/translations/pt-PT.json | 108 +++++++++++------------ backend/chainlit/translations/ta.json | 2 +- backend/chainlit/translations/te.json | 2 +- backend/chainlit/translations/zh-CN.json | 2 +- backend/chainlit/translations/zh-TW.json | 2 +- backend/tests/test_server.py | 18 ++-- cypress/e2e/oauth_auth/main.py | 2 +- cypress/e2e/oauth_auth/spec.cy.ts | 10 ++- frontend/src/components/Alert.tsx | 1 + 28 files changed, 112 insertions(+), 96 deletions(-) diff --git a/backend/chainlit/server.py b/backend/chainlit/server.py index f38bf5a3d7..665dea286d 100644 --- a/backend/chainlit/server.py +++ b/backend/chainlit/server.py @@ -491,14 +491,19 @@ def _get_auth_response(access_token: str, redirect_to_callback: bool) -> Respons return JSONResponse(response_dict) -def _get_oauth_redirect_error(request: Request, error: str) -> Response: +def _get_oauth_redirect_error( + request: Request, error: str, status_code: int = 302 +) -> Response: """Get the redirect response for an OAuth error.""" params = urllib.parse.urlencode( { "error": error, } ) - response = RedirectResponse(url=str(request.url_for("login")) + "?" + params) + response = RedirectResponse( + url=str(request.url_for("login")) + "?" + params, + status_code=status_code, + ) return response @@ -665,7 +670,8 @@ async def oauth_callback( ) if error: - return _get_oauth_redirect_error(request, error) + logger.warning("OAuth provider %s returned error: %s", provider_id, error) + return _get_oauth_redirect_error(request, "oauthSignin") if not code or not state: return _get_oauth_redirect_error(request, "oauthSignin") @@ -683,6 +689,8 @@ async def oauth_callback( user = await config.code.oauth_callback( provider_id, token, raw_user_data, default_user ) + except asyncio.CancelledError: + raise except Exception as e: logger.exception("OAuth callback error: %s", e) return _get_oauth_redirect_error(request, "oauthSignin") @@ -722,10 +730,11 @@ async def oauth_azure_hf_callback( ) if error: - return _get_oauth_redirect_error(request, error) + logger.warning("OAuth provider %s returned error: %s", provider_id, error) + return _get_oauth_redirect_error(request, "oauthSignin", status_code=303) if not code: - return _get_oauth_redirect_error(request, "oauthSignin") + return _get_oauth_redirect_error(request, "oauthSignin", status_code=303) url = get_user_facing_url(request.url) try: @@ -734,12 +743,14 @@ async def oauth_azure_hf_callback( user = await config.code.oauth_callback( provider_id, token, raw_user_data, default_user, id_token ) + except asyncio.CancelledError: + raise except Exception as e: logger.exception("OAuth callback error: %s", e) - return _get_oauth_redirect_error(request, "oauthSignin") + return _get_oauth_redirect_error(request, "oauthSignin", status_code=303) if not user: - return _get_oauth_redirect_error(request, "oauthSignin") + return _get_oauth_redirect_error(request, "oauthSignin", status_code=303) response = await _authenticate_user(request, user, redirect_to_callback=True) diff --git a/backend/chainlit/translations/ar-SA.json b/backend/chainlit/translations/ar-SA.json index b98b427d23..3725231cc3 100644 --- a/backend/chainlit/translations/ar-SA.json +++ b/backend/chainlit/translations/ar-SA.json @@ -39,7 +39,7 @@ "errors": { "default": "تعذر تسجيل الدخول", "signin": "حاول تسجيل الدخول بحساب آخر", - "oauthSignin": "حاول تسجيل الدخول بحساب آخر", + "oauthSignin": "فشل تسجيل الدخول. يرجى المحاولة مرة أخرى، أو استخدام طريقة تسجيل دخول مختلفة.", "redirectUriMismatch": "عنوان URI لإعادة التوجيه لا يتطابق مع تكوين تطبيق OAuth", "oauthCallback": "حاول تسجيل الدخول بحساب آخر", "oauthCreateAccount": "حاول تسجيل الدخول بحساب آخر", diff --git a/backend/chainlit/translations/bn.json b/backend/chainlit/translations/bn.json index 432d53bea2..9c9cc686a0 100644 --- a/backend/chainlit/translations/bn.json +++ b/backend/chainlit/translations/bn.json @@ -39,7 +39,7 @@ "errors": { "default": "সাইন ইন করা সম্ভব হচ্ছে না", "signin": "অন্য একটি অ্যাকাউন্ট দিয়ে সাইন ইন করার চেষ্টা করুন", - "oauthSignin": "অন্য একটি অ্যাকাউন্ট দিয়ে সাইন ইন করার চেষ্টা করুন", + "oauthSignin": "সাইন ইন ব্যর্থ হয়েছে। আবার চেষ্টা করুন, অথবা অন্য একটি সাইন ইন পদ্ধতি ব্যবহার করুন।", "redirectUriMismatch": "রিডাইরেক্ট URI ওআথ অ্যাপ কনফিগারেশনের সাথে মিলছে না", "oauthCallback": "অন্য একটি অ্যাকাউন্ট দিয়ে সাইন ইন করার চেষ্টা করুন", "oauthCreateAccount": "অন্য একটি অ্যাকাউন্ট দিয়ে সাইন ইন করার চেষ্টা করুন", diff --git a/backend/chainlit/translations/da-DK.json b/backend/chainlit/translations/da-DK.json index aba214e617..6f967f2415 100644 --- a/backend/chainlit/translations/da-DK.json +++ b/backend/chainlit/translations/da-DK.json @@ -39,7 +39,7 @@ "errors": { "default": "Kunne ikke logge ind", "signin": "Prøv at logge ind med en anden konto", - "oauthSignin": "Prøv at logge ind med en anden konto", + "oauthSignin": "Log ind mislykkedes. Prøv igen, eller brug en anden loginmetode.", "redirectUriMismatch": "Omdirigerings-URI'en matcher ikke oauth-app konfigurationen", "oauthCallback": "Prøv at logge ind med en anden konto", "oauthCreateAccount": "Prøv at logge ind med en anden konto", diff --git a/backend/chainlit/translations/de-DE.json b/backend/chainlit/translations/de-DE.json index db5934b6f1..2a43cc17b2 100644 --- a/backend/chainlit/translations/de-DE.json +++ b/backend/chainlit/translations/de-DE.json @@ -39,7 +39,7 @@ "errors": { "default": "Anmeldung fehlgeschlagen", "signin": "Versuche dich mit einem anderen Konto anzumelden", - "oauthSignin": "Versuche dich mit einem anderen Konto anzumelden", + "oauthSignin": "Anmeldung fehlgeschlagen. Bitte versuche es erneut oder verwende eine andere Anmeldemethode.", "redirectUriMismatch": "Der Redirect-URI stimmt nicht mit der Konfiguration der Oauth-Anwendung überein", "oauthCallback": "Versuche dich mit einem anderen Konto anzumelden", "oauthCreateAccount": "Versuche dich mit einem anderen Konto anzumelden", diff --git a/backend/chainlit/translations/el-GR.json b/backend/chainlit/translations/el-GR.json index 54e12265f3..a0033f500b 100644 --- a/backend/chainlit/translations/el-GR.json +++ b/backend/chainlit/translations/el-GR.json @@ -39,7 +39,7 @@ "errors": { "default": "Δεν είναι δυνατή η σύνδεση", "signin": "Δοκιμάστε να συνδεθείτε με διαφορετικό λογαριασμό", - "oauthSignin": "Δοκιμάστε να συνδεθείτε με διαφορετικό λογαριασμό", + "oauthSignin": "Η σύνδεση απέτυχε. Παρακαλώ δοκιμάστε ξανά ή χρησιμοποιήστε διαφορετική μέθοδο σύνδεσης.", "redirectUriMismatch": "Ο σύνδεσμος ανακατεύθυνσης δεν ταιριάζει με τη ρύθμιση της αυθεντικοποιήσης της εφαρμογής", "oauthCallback": "Δοκιμάστε να συνδεθείτε με διαφορετικό λογαριασμό", "oauthCreateAccount": "Δοκιμάστε να συνδεθείτε με διαφορετικό λογαριασμό", diff --git a/backend/chainlit/translations/en-US.json b/backend/chainlit/translations/en-US.json index 5a62b3c254..f20f6a724d 100644 --- a/backend/chainlit/translations/en-US.json +++ b/backend/chainlit/translations/en-US.json @@ -39,7 +39,7 @@ "errors": { "default": "Unable to sign in", "signin": "Try signing in with a different account", - "oauthSignin": "Try signing in with a different account", + "oauthSignin": "Sign in failed. Please try again, or use a different sign-in method.", "redirectUriMismatch": "The redirect URI is not matching the oauth app configuration", "oauthCallback": "Try signing in with a different account", "oauthCreateAccount": "Try signing in with a different account", diff --git a/backend/chainlit/translations/es.json b/backend/chainlit/translations/es.json index f47a53f7c6..6767ff6432 100644 --- a/backend/chainlit/translations/es.json +++ b/backend/chainlit/translations/es.json @@ -39,7 +39,7 @@ "errors": { "default": "No se pudo iniciar sesión", "signin": "Intenta iniciar sesión con otra cuenta", - "oauthSignin": "Intenta iniciar sesión con otra cuenta", + "oauthSignin": "Error al iniciar sesión. Por favor, inténtalo de nuevo o usa un método de inicio de sesión diferente.", "redirectUriMismatch": "El URI de redirección no coincide con la configuración de la aplicación OAuth", "oauthCallback": "Intenta iniciar sesión con otra cuenta", "oauthCreateAccount": "Intenta iniciar sesión con otra cuenta", diff --git a/backend/chainlit/translations/fr-FR.json b/backend/chainlit/translations/fr-FR.json index 163be03afd..aaa98ded12 100644 --- a/backend/chainlit/translations/fr-FR.json +++ b/backend/chainlit/translations/fr-FR.json @@ -39,7 +39,7 @@ "errors": { "default": "Impossible de se connecter", "signin": "Essayez de vous connecter avec un autre compte", - "oauthSignin": "Essayez de vous connecter avec un autre compte", + "oauthSignin": "La connexion a échoué. Veuillez réessayer ou utiliser un autre mode de connexion.", "redirectUriMismatch": "L'URI de redirection ne correspond pas à la configuration de l'application oauth", "oauthCallback": "Essayez de vous connecter avec un autre compte", "oauthCreateAccount": "Essayez de vous connecter avec un autre compte", diff --git a/backend/chainlit/translations/gu.json b/backend/chainlit/translations/gu.json index 2abb735f99..b133bcf827 100644 --- a/backend/chainlit/translations/gu.json +++ b/backend/chainlit/translations/gu.json @@ -39,7 +39,7 @@ "errors": { "default": "સાઇન ઇન કરી શકાયું નથી", "signin": "અલગ એકાઉન્ટથી સાઇન ઇન કરવાનો પ્રયાસ કરો", - "oauthSignin": "અલગ એકાઉન્ટથી સાઇન ઇન કરવાનો પ્રયાસ કરો", + "oauthSignin": "સાઇન ઇન નિષ્ફળ ગઈ. કૃપા કરીને ફરી પ્રયાસ કરો, અથવા અલગ સાઇન ઇન પદ્ધતિ ઉપયોગ કરો.", "redirectUriMismatch": "રીડાયરેક્ટ URI oauth ઍપ કન્ફિગરેશન સાથે મેળ ખાતો નથી", "oauthCallback": "અલગ એકાઉન્ટથી સાઇન ઇન કરવાનો પ્રયાસ કરો", "oauthCreateAccount": "અલગ એકાઉન્ટથી સાઇન ઇન કરવાનો પ્રયાસ કરો", diff --git a/backend/chainlit/translations/he-IL.json b/backend/chainlit/translations/he-IL.json index b184890121..0a4631ad2b 100644 --- a/backend/chainlit/translations/he-IL.json +++ b/backend/chainlit/translations/he-IL.json @@ -39,7 +39,7 @@ "errors": { "default": "לא ניתן להתחבר", "signin": "נסה להתחבר עם חשבון אחר", - "oauthSignin": "נסה להתחבר עם חשבון אחר", + "oauthSignin": "הכניסה נכשלה. אנא נסה שוב, או השתמש בשיטת כניסה אחרת.", "redirectUriMismatch": "כתובת ההפניה אינה תואמת את תצורת אפליקציית OAuth", "oauthCallback": "נסה להתחבר עם חשבון אחר", "oauthCreateAccount": "נסה להתחבר עם חשבון אחר", diff --git a/backend/chainlit/translations/hi.json b/backend/chainlit/translations/hi.json index 457d70eea6..04e56bd55f 100644 --- a/backend/chainlit/translations/hi.json +++ b/backend/chainlit/translations/hi.json @@ -39,7 +39,7 @@ "errors": { "default": "साइन इन करने में असमर्थ", "signin": "किसी दूसरे खाते से साइन इन करने का प्रयास करें", - "oauthSignin": "किसी दूसरे खाते से साइन इन करने का प्रयास करें", + "oauthSignin": "साइन इन विफल हुआ। कृपया पुनः प्रयास करें, या कोई अन्य साइन इन विधि उपयोग करें।", "redirectUriMismatch": "रीडायरेक्ट URI oauth ऐप कॉन्फ़िगरेशन से मेल नहीं खा रहा", "oauthCallback": "किसी दूसरे खाते से साइन इन करने का प्रयास करें", "oauthCreateAccount": "किसी दूसरे खाते से साइन इन करने का प्रयास करें", diff --git a/backend/chainlit/translations/it.json b/backend/chainlit/translations/it.json index 69021fe630..e5ce813556 100644 --- a/backend/chainlit/translations/it.json +++ b/backend/chainlit/translations/it.json @@ -39,7 +39,7 @@ "errors": { "default": "Impossibile effettuare l'accesso", "signin": "Prova ad accedere con un account diverso", - "oauthSignin": "Prova ad accedere con un account diverso", + "oauthSignin": "Accesso non riuscito. Riprova o utilizza un metodo di accesso diverso.", "redirectUriMismatch": "L'URI di reindirizzamento non corrisponde alla configurazione dell'app OAuth", "oauthCallback": "Prova ad accedere con un account diverso", "oauthCreateAccount": "Prova ad accedere con un account diverso", diff --git a/backend/chainlit/translations/ja.json b/backend/chainlit/translations/ja.json index b1ea49659b..965a09ec04 100644 --- a/backend/chainlit/translations/ja.json +++ b/backend/chainlit/translations/ja.json @@ -39,7 +39,7 @@ "errors": { "default": "サインインできません", "signin": "別のアカウントでサインインしてください", - "oauthSignin": "別のアカウントでサインインしてください", + "oauthSignin": "サインインに失敗しました。もう一度お試しいただくか、別のサインイン方法をお使いください。", "redirectUriMismatch": "リダイレクトURIがOAuthアプリの設定と一致しません", "oauthCallback": "別のアカウントでサインインしてください", "oauthCreateAccount": "別のアカウントでサインインしてください", diff --git a/backend/chainlit/translations/kn.json b/backend/chainlit/translations/kn.json index ef59021765..d5fc2d8380 100644 --- a/backend/chainlit/translations/kn.json +++ b/backend/chainlit/translations/kn.json @@ -39,7 +39,7 @@ "errors": { "default": "ಸೈನ್ ಇನ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ", "signin": "ಬೇರೆ ಖಾತೆಯೊಂದಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ", - "oauthSignin": "ಬೇರೆ ಖಾತೆಯೊಂದಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ", + "oauthSignin": "ಸೈನ್ ಇನ್ ವಿಫಲವಾಗಿದೆ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ, ಅಥವಾ ಬೇರೆ ಸೈನ್ ಇನ್ ವಿಧಾನ ಬಳಸಿ.", "redirectUriMismatch": "ರೀಡೈರೆಕ್ಟ್ URI ಓಥ್ ಅಪ್ಲಿಕೇಶನ್ ಕಾನ್ಫಿಗರೇಶನ್‌ಗೆ ಹೊಂದಿಕೆಯಾಗುತ್ತಿಲ್ಲ", "oauthCallback": "ಬೇರೆ ಖಾತೆಯೊಂದಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ", "oauthCreateAccount": "ಬೇರೆ ಖಾತೆಯೊಂದಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ", diff --git a/backend/chainlit/translations/ko.json b/backend/chainlit/translations/ko.json index f05622faf1..be1dc295a6 100644 --- a/backend/chainlit/translations/ko.json +++ b/backend/chainlit/translations/ko.json @@ -39,7 +39,7 @@ "errors": { "default": "로그인할 수 없습니다", "signin": "다른 계정으로 로그인해보세요", - "oauthSignin": "다른 계정으로 로그인해보세요", + "oauthSignin": "로그인에 실패했습니다. 다시 시도하거나 다른 로그인 방법을 사용해 주세요.", "redirectUriMismatch": "리다이렉트 URI가 OAuth 앱 설정과 일치하지 않습니다", "oauthCallback": "다른 계정으로 로그인해보세요", "oauthCreateAccount": "다른 계정으로 로그인해보세요", diff --git a/backend/chainlit/translations/ml.json b/backend/chainlit/translations/ml.json index 5e01cd402e..f35ac7762c 100644 --- a/backend/chainlit/translations/ml.json +++ b/backend/chainlit/translations/ml.json @@ -39,7 +39,7 @@ "errors": { "default": "സൈൻ ഇൻ ചെയ്യാൻ കഴിയുന്നില്ല", "signin": "മറ്റൊരു അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യാൻ ശ്രമിക്കുക", - "oauthSignin": "മറ്റൊരു അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യാൻ ശ്രമിക്കുക", + "oauthSignin": "സൈൻ ഇൻ പരാജയപ്പെട്ടു. ദയവായി വീണ്ടും ശ്രമിക്കുക, അല്ലെങ്കിൽ മറ്റൊരു സൈൻ ഇൻ രീതി ഉപയോഗിക്കുക.", "redirectUriMismatch": "റീഡയറക്ട് URI oauth ആപ്പ് കോൺഫിഗറേഷനുമായി പൊരുത്തപ്പെടുന്നില്ല", "oauthCallback": "മറ്റൊരു അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യാൻ ശ്രമിക്കുക", "oauthCreateAccount": "മറ്റൊരു അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യാൻ ശ്രമിക്കുക", diff --git a/backend/chainlit/translations/mr.json b/backend/chainlit/translations/mr.json index c559f83cfc..52e83c69c1 100644 --- a/backend/chainlit/translations/mr.json +++ b/backend/chainlit/translations/mr.json @@ -39,7 +39,7 @@ "errors": { "default": "साइन इन करू शकत नाही", "signin": "वेगळ्या खात्याने साइन इन करण्याचा प्रयत्न करा", - "oauthSignin": "वेगळ्या खात्याने साइन इन करण्याचा प्रयत्न करा", + "oauthSignin": "साइन इन अयशस्वी झाले. कृपया पुन्हा प्रयत्न करा, किंवा वेगळी साइन इन पद्धत वापरा.", "redirectUriMismatch": "रीडायरेक्ट URI ओथ अॅप कॉन्फिगरेशनशी जुळत नाही", "oauthCallback": "वेगळ्या खात्याने साइन इन करण्याचा प्रयत्न करा", "oauthCreateAccount": "वेगळ्या खात्याने साइन इन करण्याचा प्रयत्न करा", diff --git a/backend/chainlit/translations/nl.json b/backend/chainlit/translations/nl.json index b4760191a2..c8177cbcca 100644 --- a/backend/chainlit/translations/nl.json +++ b/backend/chainlit/translations/nl.json @@ -39,7 +39,7 @@ "errors": { "default": "Kan niet inloggen", "signin": "Probeer in te loggen met een ander account", - "oauthSignin": "Probeer in te loggen met een ander account", + "oauthSignin": "Inloggen mislukt. Probeer het opnieuw of gebruik een andere aanmeldmethode.", "redirectUriMismatch": "De redirect URI komt niet overeen met de oauth app configuratie", "oauthCallback": "Probeer in te loggen met een ander account", "oauthCreateAccount": "Probeer in te loggen met een ander account", diff --git a/backend/chainlit/translations/pt-PT.json b/backend/chainlit/translations/pt-PT.json index a1f1497059..b01e521b0d 100644 --- a/backend/chainlit/translations/pt-PT.json +++ b/backend/chainlit/translations/pt-PT.json @@ -12,44 +12,44 @@ "loading": "A carregar...", "error": { "default": "Ocorreu um erro", - "serverConnection": "N\u00e3o foi poss\u00edvel estabelecer liga\u00e7\u00e3o ao servidor" + "serverConnection": "Não foi possível estabelecer ligação ao servidor" } } }, "auth": { "login": { - "title": "Inicie sess\u00e3o para aceder \u00e0 aplica\u00e7\u00e3o", + "title": "Inicie sessão para aceder à aplicação", "form": { "email": { "label": "E-mail", - "required": "o e-mail \u00e9 obrigat\u00f3rio", + "required": "o e-mail é obrigatório", "placeholder": "me@example.com" }, "password": { "label": "Palavra-passe", - "required": "a palavra-passe \u00e9 obrigat\u00f3ria" + "required": "a palavra-passe é obrigatória" }, "actions": { - "signin": "Iniciar sess\u00e3o" + "signin": "Iniciar sessão" }, "alternativeText": { "or": "Ou" } }, "errors": { - "default": "N\u00e3o foi poss\u00edvel iniciar sess\u00e3o", - "signin": "Tente iniciar sess\u00e3o com outra conta", - "oauthSignin": "Tente iniciar sess\u00e3o com outra conta", - "redirectUriMismatch": "O URI de redirecionamento n\u00e3o corresponde \u00e0 configura\u00e7\u00e3o da aplica\u00e7\u00e3o OAuth", - "oauthCallback": "Tente iniciar sess\u00e3o com outra conta", - "oauthCreateAccount": "Tente iniciar sess\u00e3o com outra conta", - "emailCreateAccount": "Tente iniciar sess\u00e3o com outra conta", - "callback": "Tente iniciar sess\u00e3o com outra conta", - "oauthAccountNotLinked": "Para confirmar a sua identidade, inicie sess\u00e3o com a mesma conta utilizada anteriormente", - "emailSignin": "N\u00e3o foi poss\u00edvel enviar o e-mail", + "default": "Não foi possível iniciar sessão", + "signin": "Tente iniciar sessão com outra conta", + "oauthSignin": "Falha no início de sessão. Por favor, tente novamente ou utilize um método de início de sessão diferente.", + "redirectUriMismatch": "O URI de redirecionamento não corresponde à configuração da aplicação OAuth", + "oauthCallback": "Tente iniciar sessão com outra conta", + "oauthCreateAccount": "Tente iniciar sessão com outra conta", + "emailCreateAccount": "Tente iniciar sessão com outra conta", + "callback": "Tente iniciar sessão com outra conta", + "oauthAccountNotLinked": "Para confirmar a sua identidade, inicie sessão com a mesma conta utilizada anteriormente", + "emailSignin": "Não foi possível enviar o e-mail", "emailVerify": "Por favor, verifique o seu e-mail. Foi enviada uma nova mensagem", - "credentialsSignin": "Erro ao iniciar sess\u00e3o. Verifique se os dados fornecidos est\u00e3o corretos", - "sessionRequired": "Por favor, inicie sess\u00e3o para aceder a esta p\u00e1gina" + "credentialsSignin": "Erro ao iniciar sessão. Verifique se os dados fornecidos estão corretos", + "sessionRequired": "Por favor, inicie sessão para aceder a esta página" } }, "provider": { @@ -70,18 +70,18 @@ "headline": "Mensagens favoritas", "remove": "Remover favorito", "empty": { - "title": "Ainda n\u00e3o h\u00e1 prompts guardados", - "description": "Comece por enviar um prompt e marc\u00e1-lo com estrela, ou marque com estrela um prompt de conversas anteriores" + "title": "Ainda não há prompts guardados", + "description": "Comece por enviar um prompt e marcá-lo com estrela, ou marque com estrela um prompt de conversas anteriores" } }, "commands": { "button": "Ferramentas", "changeTool": "Alterar ferramenta", - "availableTools": "Ferramentas dispon\u00edveis" + "availableTools": "Ferramentas disponíveis" }, "speech": { - "start": "Iniciar grava\u00e7\u00e3o", - "stop": "Parar grava\u00e7\u00e3o", + "start": "Iniciar gravação", + "stop": "Parar gravação", "connecting": "A ligar" }, "fileUpload": { @@ -104,35 +104,35 @@ }, "actions": { "copy": { - "button": "Copiar para a \u00e1rea de transfer\u00eancia", + "button": "Copiar para a área de transferência", "success": "Copiado!" } }, "feedback": { - "positive": "\u00datil", - "negative": "N\u00e3o \u00fatil", - "edit": "Editar coment\u00e1rio", + "positive": "Útil", + "negative": "Não útil", + "edit": "Editar comentário", "dialog": { - "title": "Adicionar um coment\u00e1rio", - "submit": "Enviar coment\u00e1rio", - "yourFeedback": "O seu coment\u00e1rio..." + "title": "Adicionar um comentário", + "submit": "Enviar comentário", + "yourFeedback": "O seu comentário..." }, "status": { "updating": "A atualizar", - "updated": "Coment\u00e1rio atualizado" + "updated": "Comentário atualizado" } } }, "history": { - "title": "\u00daltimas entradas", - "empty": "Est\u00e1 vazio...", - "show": "Mostrar hist\u00f3rico" + "title": "Últimas entradas", + "empty": "Está vazio...", + "show": "Mostrar histórico" }, "settings": { - "title": "Painel de configura\u00e7\u00f5es", - "customize": "Personalize aqui as configura\u00e7\u00f5es do seu chat" + "title": "Painel de configurações", + "customize": "Personalize aqui as configurações do seu chat" }, - "watermark": "Os modelos de linguagem podem cometer erros. Verifique sempre informa\u00e7\u00f5es importantes." + "watermark": "Os modelos de linguagem podem cometer erros. Verifique sempre informações importantes." }, "threadHistory": { "sidebar": { @@ -144,8 +144,8 @@ "timeframes": { "today": "Hoje", "yesterday": "Ontem", - "previous7days": "\u00daltimos 7 dias", - "previous30days": "\u00daltimos 30 dias" + "previous7days": "Últimos 7 dias", + "previous30days": "Últimos 30 dias" }, "empty": "Nenhuma conversa encontrada", "actions": { @@ -154,7 +154,7 @@ } }, "thread": { - "untitled": "Conversa sem t\u00edtulo", + "untitled": "Conversa sem título", "menu": { "rename": "Renomear", "share": "Partilhar", @@ -162,21 +162,21 @@ }, "actions": { "share": { - "title": "Partilhar liga\u00e7\u00e3o do chat", + "title": "Partilhar ligação do chat", "button": "Partilhar", "status": { - "copied": "Liga\u00e7\u00e3o copiada", - "created": "Liga\u00e7\u00e3o de partilha criada!", + "copied": "Ligação copiada", + "created": "Ligação de partilha criada!", "unshared": "Partilha desativada para esta conversa" }, "error": { - "create": "Erro ao criar liga\u00e7\u00e3o de partilha", + "create": "Erro ao criar ligação de partilha", "unshare": "Erro ao desativar a partilha" } }, "delete": { - "title": "Confirmar elimina\u00e7\u00e3o", - "description": "Ir\u00e1 eliminar a conversa e todos os seus conte\u00fados. Esta a\u00e7\u00e3o n\u00e3o pode ser anulada.", + "title": "Confirmar eliminação", + "description": "Irá eliminar a conversa e todos os seus conteúdos. Esta ação não pode ser anulada.", "success": "Chat eliminado", "inProgress": "A eliminar chat" }, @@ -209,42 +209,42 @@ "button": "Novo chat", "dialog": { "title": "Criar novo chat", - "description": "Isto ir\u00e1 apagar o hist\u00f3rico de chat atual. Tem a certeza de que pretende continuar?", + "description": "Isto irá apagar o histórico de chat atual. Tem a certeza de que pretende continuar?", "tooltip": "Novo chat" } }, "user": { "menu": { - "settings": "Configura\u00e7\u00f5es", + "settings": "Configurações", "settingsKey": "S", "apiKeys": "Chaves API", - "logout": "Terminar sess\u00e3o" + "logout": "Terminar sessão" } } }, "apiKeys": { - "title": "Chaves API necess\u00e1rias", - "description": "Para utilizar esta aplica\u00e7\u00e3o, s\u00e3o necess\u00e1rias as seguintes chaves API. As chaves s\u00e3o guardadas localmente no seu dispositivo.", + "title": "Chaves API necessárias", + "description": "Para utilizar esta aplicação, são necessárias as seguintes chaves API. As chaves são guardadas localmente no seu dispositivo.", "success": { "saved": "Guardado com sucesso" } }, "alerts": { - "info": "Informa\u00e7\u00e3o", + "info": "Informação", "note": "Nota", "tip": "Dica", "important": "Importante", "warning": "Aviso", "caution": "Cuidado", - "debug": "Depura\u00e7\u00e3o", + "debug": "Depuração", "example": "Exemplo", "success": "Sucesso", "help": "Ajuda", "idea": "Ideia", "pending": "Pendente", - "security": "Seguran\u00e7a", + "security": "Segurança", "beta": "Beta", - "best-practice": "Boa pr\u00e1tica" + "best-practice": "Boa prática" }, "components": { "MultiSelectInput": { diff --git a/backend/chainlit/translations/ta.json b/backend/chainlit/translations/ta.json index be051916f7..0701c92adc 100644 --- a/backend/chainlit/translations/ta.json +++ b/backend/chainlit/translations/ta.json @@ -39,7 +39,7 @@ "errors": { "default": "உள்நுழைய முடியவில்லை", "signin": "வேறு கணக்குடன் உள்நுழைய முயற்சிக்கவும்", - "oauthSignin": "வேறு கணக்குடன் உள்நுழைய முயற்சிக்கவும்", + "oauthSignin": "உள்நுழைவு தோல்வியடைந்தது. மீண்டும் முயற்சிக்கவும், அல்லது வேறு உள்நுழைவு முறையைப் பயன்படுத்தவும்.", "redirectUriMismatch": "திசைதிருப்பல் URI ஓஆத் பயன்பாட்டு கட்டமைப்புடன் பொருந்தவில்லை", "oauthCallback": "வேறு கணக்குடன் உள்நுழைய முயற்சிக்கவும்", "oauthCreateAccount": "வேறு கணக்குடன் உள்நுழைய முயற்சிக்கவும்", diff --git a/backend/chainlit/translations/te.json b/backend/chainlit/translations/te.json index 5849a3a1a4..ed83818c89 100644 --- a/backend/chainlit/translations/te.json +++ b/backend/chainlit/translations/te.json @@ -39,7 +39,7 @@ "errors": { "default": "సైన్ ఇన్ చేయలేకపోయాము", "signin": "వేరే ఖాతాతో సైన్ ఇన్ చేయడానికి ప్రయత్నించండి", - "oauthSignin": "వేరే ఖాతాతో సైన్ ఇన్ చేయడానికి ప్రయత్నించండి", + "oauthSignin": "సైన్ ఇన్ విఫలమైంది. దయచేసి మళ్ళీ ప్రయత్నించండి, లేదా వేరే సైన్ ఇన్ పద్ధతిని ఉపయోగించండి.", "redirectUriMismatch": "రీడైరెక్ట్ URI oauth యాప్ కాన్ఫిగరేషన్‌తో సరిపోలడం లేదు", "oauthCallback": "వేరే ఖాతాతో సైన్ ఇన్ చేయడానికి ప్రయత్నించండి", "oauthCreateAccount": "వేరే ఖాతాతో సైన్ ఇన్ చేయడానికి ప్రయత్నించండి", diff --git a/backend/chainlit/translations/zh-CN.json b/backend/chainlit/translations/zh-CN.json index bce16c1149..e8307ab423 100644 --- a/backend/chainlit/translations/zh-CN.json +++ b/backend/chainlit/translations/zh-CN.json @@ -39,7 +39,7 @@ "errors": { "default": "无法登录", "signin": "请尝试使用其他账号登录", - "oauthSignin": "请尝试使用其他账号登录", + "oauthSignin": "登录失败。请重试,或使用其他登录方式。", "redirectUriMismatch": "重定向URI与OAuth应用配置不匹配", "oauthCallback": "请尝试使用其他账号登录", "oauthCreateAccount": "请尝试使用其他账号登录", diff --git a/backend/chainlit/translations/zh-TW.json b/backend/chainlit/translations/zh-TW.json index 4c475b61d1..fa0c62a5df 100644 --- a/backend/chainlit/translations/zh-TW.json +++ b/backend/chainlit/translations/zh-TW.json @@ -39,7 +39,7 @@ "errors": { "default": "無法登入", "signin": "請嘗試使用其它帳號登入", - "oauthSignin": "請嘗試使用其它帳號登入", + "oauthSignin": "登入失敗。請重試,或使用其他登入方式。", "redirectUriMismatch": "重新導向URI與OAuth App設定不相符", "oauthCallback": "請嘗試使用其它帳號登入", "oauthCreateAccount": "請嘗試使用其它帳號登入", diff --git a/backend/tests/test_server.py b/backend/tests/test_server.py index 017a05fe7b..06fc3189b9 100644 --- a/backend/tests/test_server.py +++ b/backend/tests/test_server.py @@ -1185,8 +1185,8 @@ def test_oauth_callback_provider_error_redirects( "/auth/oauth/github/callback?error=access_denied", follow_redirects=False, ) - assert response.status_code in (302, 307) - assert "/login?error=" in response.headers["location"] + assert response.status_code == 302 + assert "error=oauthSignin" in response.headers["location"] def test_oauth_callback_missing_code_redirects( @@ -1200,7 +1200,7 @@ def test_oauth_callback_missing_code_redirects( "/auth/oauth/github/callback", follow_redirects=False, ) - assert response.status_code in (302, 307) + assert response.status_code == 302 assert "/login?error=" in response.headers["location"] @@ -1216,7 +1216,7 @@ def test_oauth_callback_invalid_state_redirects( "/auth/oauth/github/callback?code=fake_code&state=fake_state", follow_redirects=False, ) - assert response.status_code in (302, 307) + assert response.status_code == 302 assert "/login?error=" in response.headers["location"] @@ -1233,7 +1233,7 @@ def test_oauth_callback_get_token_error_redirects( cookies={"oauth_state": "valid_state"}, follow_redirects=False, ) - assert response.status_code in (302, 307) + assert response.status_code == 302 assert "/login?error=" in response.headers["location"] @@ -1249,7 +1249,7 @@ def test_oauth_callback_none_user_redirects( cookies={"oauth_state": "valid_state"}, follow_redirects=False, ) - assert response.status_code in (302, 307) + assert response.status_code == 302 assert "/login?error=" in response.headers["location"] @@ -1270,7 +1270,7 @@ def test_oauth_azure_hf_callback_missing_code_redirects( data={}, follow_redirects=False, ) - assert response.status_code in (302, 307) + assert response.status_code == 303 assert "/login?error=" in response.headers["location"] @@ -1287,7 +1287,7 @@ def test_oauth_azure_hf_callback_get_token_error_redirects( data={"code": "fake_code"}, follow_redirects=False, ) - assert response.status_code in (302, 307) + assert response.status_code == 303 assert "/login?error=" in response.headers["location"] @@ -1303,5 +1303,5 @@ def test_oauth_azure_hf_callback_none_user_redirects( data={"code": "fake_code"}, follow_redirects=False, ) - assert response.status_code in (302, 307) + assert response.status_code == 303 assert "/login?error=" in response.headers["location"] diff --git a/cypress/e2e/oauth_auth/main.py b/cypress/e2e/oauth_auth/main.py index 7ecce3db50..278fbcb451 100644 --- a/cypress/e2e/oauth_auth/main.py +++ b/cypress/e2e/oauth_auth/main.py @@ -5,7 +5,7 @@ os.environ["OAUTH_GITHUB_CLIENT_ID"] = "fake_client_id" # nosec B105 os.environ["OAUTH_GITHUB_CLIENT_SECRET"] = "fake_client_secret" # nosec B105 -import chainlit as cl # noqa: E402 +import chainlit as cl @cl.oauth_callback diff --git a/cypress/e2e/oauth_auth/spec.cy.ts b/cypress/e2e/oauth_auth/spec.cy.ts index 5bf5899171..23beeaa9db 100644 --- a/cypress/e2e/oauth_auth/spec.cy.ts +++ b/cypress/e2e/oauth_auth/spec.cy.ts @@ -7,7 +7,9 @@ describe('OAuth Auth Error UX (#1273)', () => { failOnStatusCode: false }).then((response) => { expect(response.status).to.be.oneOf([301, 302, 303, 307, 308]); - expect(response.headers['location']).to.include('/login?error='); + expect(response.headers['location']).to.include( + '/login?error=oauthSignin' + ); }); }); @@ -19,7 +21,9 @@ describe('OAuth Auth Error UX (#1273)', () => { }).then((response) => { expect(response.status).to.be.oneOf([301, 302, 303, 307, 308]); expect(response.headers['location']).to.include('/login?error='); - expect(response.body).to.not.include('{"detail"'); + expect(response.headers['content-type'] || '').to.not.include( + 'application/json' + ); }); }); }); @@ -29,7 +33,7 @@ describe('OAuth Auth Error UX (#1273)', () => { cy.visit('/login?error=oauthSignin'); cy.get('[role="alert"]').should( 'contain', - 'Try signing in with a different account' + 'Sign in failed. Please try again, or use a different sign-in method.' ); cy.get('body').should('not.contain', '{"detail"'); }); diff --git a/frontend/src/components/Alert.tsx b/frontend/src/components/Alert.tsx index 8eb6e2d2d8..79689ec3e1 100644 --- a/frontend/src/components/Alert.tsx +++ b/frontend/src/components/Alert.tsx @@ -80,6 +80,7 @@ export const Alert: React.FC = ({ return (