feat: Security CSRF Fix, Logout optimierung, Footer Anpassung, Rechtstexteanpassung
Docker Image bauen und veroeffentlichen / build-and-push (push) Failing after 1m33s
Docker Image bauen und veroeffentlichen / build-and-push (push) Failing after 1m33s
This commit is contained in:
1 parent
0753a3bc8a
commit
4d3100e9ba
28 files changed
+802
-121
No files matched your search
@@ -2,7 +2,7 @@
|
||||
|
||||
import { redirect } from "next/navigation";
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import { createSession, getCurrentCustomer, verifyPassword, destroySession } from "@/lib/auth";
|
||||
import { getCurrentCustomer, verifyPassword, destroySession } from "@/lib/auth";
|
||||
import { rateLimit, getClientIp } from "@/lib/rate-limit";
|
||||
import { sendMail } from "@/lib/mail";
|
||||
import { securityAlertEmail } from "@/lib/email-templates";
|
||||
@@ -50,16 +50,22 @@ export async function deleteOwnAccountAction(formData: FormData): Promise<void>
|
||||
redirect("/konto?message=" + encodeURIComponent("Dein Konto wurde endgültig gelöscht."));
|
||||
}
|
||||
|
||||
/** Widerruft alle bestehenden Sessions (auch andere Geraete) und meldet nur das aktuelle Tab neu an. */
|
||||
/**
|
||||
* Widerruft alle bestehenden Sessions — auch das aktuell genutzte Geraet.
|
||||
* Bewusst KEIN Re-Login des aktuellen Tabs mehr (fruehere Variante): "alle
|
||||
* Geraete abmelden" muss auch die eigene, gerade aktive Sitzung beenden,
|
||||
* sonst waere ein gestohlenes/kompromittiertes aktuelles Session-Cookie von
|
||||
* dieser Aktion gar nicht betroffen.
|
||||
*/
|
||||
export async function logoutAllDevicesAction(): Promise<void> {
|
||||
const customer = await getCurrentCustomer();
|
||||
if (!customer) fail("/konto", "Bitte melde dich an.");
|
||||
|
||||
const updated = await prisma.customer.update({
|
||||
await prisma.customer.update({
|
||||
where: { id: customer.id },
|
||||
data: { sessionVersion: { increment: 1 } },
|
||||
});
|
||||
|
||||
await createSession(updated.id, updated.role, updated.sessionVersion);
|
||||
redirect("/konto?message=" + encodeURIComponent("Alle anderen Geräte wurden abgemeldet."));
|
||||
await destroySession();
|
||||
redirect("/konto?message=" + encodeURIComponent("Alle Geräte wurden abgemeldet. Bitte melde dich erneut an."));
|
||||
}
|
||||
@@ -80,6 +80,35 @@ export default async function KontoPage(props: PageProps<"/konto">) {
|
||||
<Button type="submit">{t.account.register}</Button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div className="mt-10 flex items-center gap-4 text-xs text-ink/50">
|
||||
<span className="h-px flex-1 bg-ink/10" />
|
||||
{t.account.ssoDivider}
|
||||
<span className="h-px flex-1 bg-ink/10" />
|
||||
</div>
|
||||
<div className="mt-6">
|
||||
{/*
|
||||
Bewusst ein einfaches <a> statt LinkButton/next/link: der Klick
|
||||
muss eine ECHTE Browser-Top-Level-Navigation ausloesen, die dem
|
||||
302-Redirect dieser Route bis zu login.microsoftonline.com
|
||||
folgt. Next.js' <Link> navigiert clientseitig per fetch() —
|
||||
dieser Cross-Origin-Redirect-Sprung wuerde dann von der
|
||||
connect-src-CSP in proxy.ts blockiert (die nur "self" u.ae.
|
||||
erlaubt), waehrend eine echte Top-Level-Navigation von CSP
|
||||
connect-src gar nicht erst betroffen ist.
|
||||
Bewusst immer sichtbar, auch ohne konfiguriertes SSO (siehe
|
||||
.env.example, ENTRA_*) — der Link fuehrt in dem Fall zu einer
|
||||
klaren Fehlermeldung auf dieser Seite statt eines defekten
|
||||
Buttons (src/app/api/auth/entra/login/route.ts prueft die
|
||||
Konfiguration server-seitig, bevor irgendetwas passiert).
|
||||
*/}
|
||||
<a
|
||||
href="/api/auth/entra/login"
|
||||
className="inline-flex items-center justify-center gap-2 px-7 py-3 text-sm tracking-wide-caps transition-[color,background-color,border-color,transform] duration-300 active:scale-[0.97] bg-transparent text-forest border border-forest hover:bg-forest hover:text-cream"
|
||||
>
|
||||
{t.account.ssoButton}
|
||||
</a>
|
||||
</div>
|
||||
</Container>
|
||||
</div>
|
||||
);
|
||||
|
||||
Reference in new issue
Block a user