SPB Git forge
7commits 1branches 0releases
229.0 KBsize
maindefault branch
12 days agolast push
TypeScript 91.8% HTML 3.2% JavaScript 3% SQL 1.4% CSS 0.7%
1.3 KB · 37 lines typescript
Raw Blame History
1import { createHmac, timingSafeEqual } from "node:crypto";23/**4 * Passcode gate. The console is public on the Internet (www.socialcrawl.co) and can launch browsers5 * on a cluster node, so every page and API call requires a signed cookie obtained with SRC_DASHBOARD_PASSCODE.6 */7export const COOKIE = "src_access";8const SECRET = process.env.SRC_DASHBOARD_SECRET ?? process.env.SRC_API_TOKEN ?? "dev-secret";9const PASSCODE = process.env.SRC_DASHBOARD_PASSCODE ?? "";1011export function gateEnabled(): boolean {12  return PASSCODE.length > 0;13}1415export function checkPasscode(input: string): boolean {16  if (!PASSCODE) return true;17  const a = Buffer.from(input);18  const b = Buffer.from(PASSCODE);19  return a.length === b.length && timingSafeEqual(a, b);20}2122export function makeToken(): string {23  const exp = Date.now() + 30 * 24 * 3600 * 1000;24  const body = `${exp}`;25  return `${body}.${createHmac("sha256", SECRET).update(body).digest("hex")}`;26}2728export function verifyToken(token: string | undefined): boolean {29  if (!PASSCODE) return true;30  if (!token) return false;31  const [body, sig] = token.split(".");32  if (!body || !sig) return false;33  const expect = createHmac("sha256", SECRET).update(body).digest("hex");34  if (expect.length !== sig.length || !timingSafeEqual(Buffer.from(expect), Buffer.from(sig))) return false;35  return Number(body) > Date.now();36}37