spb/datacenterindex
Public
HTML 53.9%
TypeScript 44.5%
JavaScript 0.6%
SQL 0.5%
1"use server";23import { cookies } from "next/headers";4import { redirect } from "next/navigation";5import { ADMIN_COOKIE, ADMIN_COOKIE_MAX_AGE, verifyAdminToken } from "@/lib/admin-api";67export interface LoginState {8 error?: string;9}1011function safeNext(v: unknown): string {12 if (typeof v !== "string") return "/admin";13 // only same-origin admin paths, no protocol-relative tricks14 if (!v.startsWith("/admin") || v.startsWith("//") || v.includes("\\")) return "/admin";15 if (v.startsWith("/admin/login") || v.startsWith("/admin/logout") || v.startsWith("/admin/api")) return "/admin";16 return v;17}1819export async function loginAction(_prev: LoginState, formData: FormData): Promise<LoginState> {20 const token = String(formData.get("token") ?? "").trim();21 if (!token) return { error: "Enter the admin token." };22 const res = await verifyAdminToken(token);23 if (!res.ok) return { error: res.error ?? "Invalid token" };24 const jar = await cookies();25 jar.set(ADMIN_COOKIE, token, {26 httpOnly: true,27 sameSite: "lax",28 secure: process.env.NODE_ENV === "production",29 path: "/admin",30 maxAge: ADMIN_COOKIE_MAX_AGE,31 });32 redirect(safeNext(formData.get("next")));33}34