SPB Git forge
38commits 1branches 0releases
338.7 MBsize
maindefault branch
yesterdaylast push
HTML 53.9% TypeScript 44.5% JavaScript 0.6% SQL 0.5%
1.2 KB · 34 lines typescript
Raw Blame History
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