refactor: bot suggestions

This commit is contained in:
Stavros
2025-05-14 20:43:18 +03:00
parent b12d0655d4
commit ada21776bc
8 changed files with 33 additions and 27 deletions

View File

@@ -6,9 +6,13 @@ export const Layout = ({ children }: { children: React.ReactNode }) => {
return ( return (
<div <div
className={`flex flex-col justify-center items-center min-h-svh bg-[url(${backgroundImage})] bg-cover`} className="relative flex flex-col justify-center items-center min-h-svh"
style={{
backgroundImage: `url(${backgroundImage})`,
backgroundSize: "cover",
backgroundPosition: "center",
}}
> >
<img></img>
<LanguageSelector /> <LanguageSelector />
{children} {children}
</div> </div>

View File

@@ -40,7 +40,7 @@
"totpSubtitle": "Please enter the code from your authenticator app.", "totpSubtitle": "Please enter the code from your authenticator app.",
"unauthorizedTitle": "Unauthorized", "unauthorizedTitle": "Unauthorized",
"unauthorizedResourceSubtitle": "The user with username <code>{{username}}</code> is not authorized to access the resource <code>{{resource}}</code>.", "unauthorizedResourceSubtitle": "The user with username <code>{{username}}</code> is not authorized to access the resource <code>{{resource}}</code>.",
"unaothorizedLoginSubtitle": "The user with username <code>{{username}}</code> is not authorized to login.", "unauthorizedLoginSubtitle": "The user with username <code>{{username}}</code> is not authorized to login.",
"unauthorizedGroupsSubtitle": "The user with username <code>{{username}}</code> is not in the groups required by the resource <code>{{resource}}</code>.", "unauthorizedGroupsSubtitle": "The user with username <code>{{username}}</code> is not in the groups required by the resource <code>{{resource}}</code>.",
"unauthorizedButton": "Try again", "unauthorizedButton": "Try again",
"untrustedRedirectTitle": "Untrusted redirect", "untrustedRedirectTitle": "Untrusted redirect",

View File

@@ -40,7 +40,7 @@
"totpSubtitle": "Please enter the code from your authenticator app.", "totpSubtitle": "Please enter the code from your authenticator app.",
"unauthorizedTitle": "Unauthorized", "unauthorizedTitle": "Unauthorized",
"unauthorizedResourceSubtitle": "The user with username <code>{{username}}</code> is not authorized to access the resource <code>{{resource}}</code>.", "unauthorizedResourceSubtitle": "The user with username <code>{{username}}</code> is not authorized to access the resource <code>{{resource}}</code>.",
"unaothorizedLoginSubtitle": "The user with username <code>{{username}}</code> is not authorized to login.", "unauthorizedLoginSubtitle": "The user with username <code>{{username}}</code> is not authorized to login.",
"unauthorizedGroupsSubtitle": "The user with username <code>{{username}}</code> is not in the groups required by the resource <code>{{resource}}</code>.", "unauthorizedGroupsSubtitle": "The user with username <code>{{username}}</code> is not in the groups required by the resource <code>{{resource}}</code>.",
"unauthorizedButton": "Try again", "unauthorizedButton": "Try again",
"untrustedRedirectTitle": "Untrusted redirect", "untrustedRedirectTitle": "Untrusted redirect",

View File

@@ -10,12 +10,13 @@ import { useAppContext } from "@/context/app-context";
import { useUserContext } from "@/context/user-context"; import { useUserContext } from "@/context/user-context";
import { isValidUrl } from "@/lib/utils"; import { isValidUrl } from "@/lib/utils";
import { Trans, useTranslation } from "react-i18next"; import { Trans, useTranslation } from "react-i18next";
import { Navigate, useNavigate } from "react-router"; import { Navigate, useLocation, useNavigate } from "react-router";
import DOMPurify from "dompurify"; import DOMPurify from "dompurify";
export const ContinuePage = () => { export const ContinuePage = () => {
const params = new URLSearchParams(window.location.search); const { search } = useLocation();
const redirectURI = params.get("redirect_uri"); const searchParams = new URLSearchParams(search);
const redirectURI = searchParams.get("redirect_uri");
const { isLoggedIn } = useUserContext(); const { isLoggedIn } = useUserContext();
const { domain, disableContinue } = useAppContext(); const { domain, disableContinue } = useAppContext();
@@ -41,7 +42,7 @@ export const ContinuePage = () => {
const url = new URL(redirectURI); const url = new URL(redirectURI);
if (!url.hostname.includes(domain)) { if (!(url.hostname == domain) || !url.hostname.endsWith(`.${domain}`)) {
return ( return (
<Card className="min-w-xs sm:min-w-sm"> <Card className="min-w-xs sm:min-w-sm">
<CardHeader> <CardHeader>

View File

@@ -19,11 +19,12 @@ import { useMutation } from "@tanstack/react-query";
import axios from "axios"; import axios from "axios";
import { useEffect } from "react"; import { useEffect } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Navigate } from "react-router"; import { Navigate, useLocation } from "react-router";
import { toast } from "sonner"; import { toast } from "sonner";
export const LoginPage = () => { export const LoginPage = () => {
const searchParams = new URLSearchParams(window.location.search); const { search } = useLocation();
const searchParams = new URLSearchParams(search);
const redirectUri = searchParams.get("redirect_uri"); const redirectUri = searchParams.get("redirect_uri");
const { isLoggedIn } = useUserContext(); const { isLoggedIn } = useUserContext();
@@ -65,7 +66,9 @@ export const LoginPage = () => {
mutationKey: ["login"], mutationKey: ["login"],
onSuccess: (data) => { onSuccess: (data) => {
if (data.data.totpPending) { if (data.data.totpPending) {
window.location.replace(`/totp?redirect_uri=${redirectUri}`); window.location.replace(
`/totp?redirect_uri=${encodeURIComponent(redirectUri ?? "")}`,
);
return; return;
} }
@@ -74,7 +77,9 @@ export const LoginPage = () => {
}); });
setTimeout(() => { setTimeout(() => {
window.location.replace(`/continue?redirect_uri=${redirectUri}`); window.location.replace(
`/continue?redirect_uri=${encodeURIComponent(redirectUri ?? "")}`,
);
}, 500); }, 500);
}, },
onError: (error: Error) => { onError: (error: Error) => {
@@ -94,14 +99,6 @@ export const LoginPage = () => {
} }
}); });
useEffect(() => {
if (isMounted()) {
if (oauthConfigured && configuredProviders.includes(oauthAutoRedirect)) {
oauthMutation.mutate(oauthAutoRedirect);
}
}
}, []);
return ( return (
<Card className="min-w-xs sm:min-w-sm"> <Card className="min-w-xs sm:min-w-sm">
<CardHeader> <CardHeader>

View File

@@ -13,11 +13,12 @@ import { useMutation } from "@tanstack/react-query";
import axios from "axios"; import axios from "axios";
import { useId } from "react"; import { useId } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useNavigate } from "react-router"; import { useLocation, useNavigate } from "react-router";
import { toast } from "sonner"; import { toast } from "sonner";
export const TotpPage = () => { export const TotpPage = () => {
const searchParams = new URLSearchParams(window.location.search); const { search } = useLocation();
const searchParams = new URLSearchParams(search);
const redirectUri = searchParams.get("redirect_uri"); const redirectUri = searchParams.get("redirect_uri");
const { t } = useTranslation(); const { t } = useTranslation();
@@ -33,7 +34,9 @@ export const TotpPage = () => {
}); });
setTimeout(() => { setTimeout(() => {
navigate(`/continue?redirect_uri=${redirectUri}`); navigate(
`/continue?redirect_uri=${encodeURIComponent(redirectUri ?? "")}`,
);
}, 500); }, 500);
}, },
onError: () => { onError: () => {

View File

@@ -7,10 +7,11 @@ import {
CardTitle, CardTitle,
} from "@/components/ui/card"; } from "@/components/ui/card";
import { Trans, useTranslation } from "react-i18next"; import { Trans, useTranslation } from "react-i18next";
import { Navigate, useNavigate } from "react-router"; import { Navigate, useLocation, useNavigate } from "react-router";
export const UnauthorizedPage = () => { export const UnauthorizedPage = () => {
const searchParams = new URLSearchParams(window.location.search); const { search } = useLocation();
const searchParams = new URLSearchParams(search);
const username = searchParams.get("username"); const username = searchParams.get("username");
const resource = searchParams.get("resource"); const resource = searchParams.get("resource");
const groupErr = searchParams.get("groupErr"); const groupErr = searchParams.get("groupErr");
@@ -23,7 +24,7 @@ export const UnauthorizedPage = () => {
const navigate = useNavigate(); const navigate = useNavigate();
let i18nKey = "unaothorizedLoginSubtitle"; let i18nKey = "unauthorizedLoginSubtitle";
if (resource) { if (resource) {
i18nKey = "unauthorizedResourceSubtitle"; i18nKey = "unauthorizedResourceSubtitle";

View File

@@ -225,7 +225,7 @@ func (h *Handlers) AuthHandler(c *gin.Context) {
} }
// We are using caddy/traefik so redirect // We are using caddy/traefik so redirect
c.Redirect(http.StatusTemporaryRedirect, fmt.Sprintf("%s/unauthorized?%s", h.Config.AppURL, queries.Encode())) c.Redirect(http.StatusPermanentRedirect, fmt.Sprintf("%s/unauthorized?%s", h.Config.AppURL, queries.Encode()))
return return
} }
} }