// HOST-Kundenkonten: Passwort-Hashing + JWT-Ausstellung/-Prüfung. // (Das sind die Konten auf der RAPPORT-HOST-Plattform — NICHT die Endnutzer // in den einzelnen Rapport-Instanzen.) import bcrypt from "bcryptjs"; import jwt from "jsonwebtoken"; import { env } from "./env.js"; import { one, query } from "./db.js"; export async function hashPassword(plain) { return bcrypt.hash(plain, 10); } export async function verifyPassword(plain, hash) { return bcrypt.compare(plain, hash); } export function signToken(account) { return jwt.sign( { sub: account.id, email: account.email, is_admin: !!account.is_admin }, env.jwtSecret, { expiresIn: "7d" } ); } // Promotet das Konto zum Admin, wenn die E-Mail ADMIN_EMAIL entspricht. // Wird bei Register/Login aufgerufen, damit dein Konto ohne manuellen DB-Eingriff // Admin wird. Gibt das (ggf. aktualisierte) is_admin zurück. export async function ensureAdminFlag(account) { const shouldBeAdmin = env.adminEmail && account.email.toLowerCase() === env.adminEmail; if (shouldBeAdmin && !account.is_admin) { await query("update accounts set is_admin = true where id = $1", [account.id]); return true; } return !!account.is_admin; } // Express-Middleware: setzt req.account aus dem Bearer-Token oder 401. export function requireAuth(req, res, next) { const header = req.headers.authorization || ""; const token = header.startsWith("Bearer ") ? header.slice(7) : null; if (!token) return res.status(401).json({ error: "Nicht angemeldet." }); try { const payload = jwt.verify(token, env.jwtSecret); req.account = { id: payload.sub, email: payload.email, is_admin: !!payload.is_admin }; next(); } catch { res.status(401).json({ error: "Session ungültig oder abgelaufen." }); } } // Wie requireAuth, aber verlangt Admin. Prüft die DB (autoritativ — nicht nur // das Token), damit ein entzogenes Admin-Recht sofort greift. export function requireAdmin(req, res, next) { requireAuth(req, res, async () => { const row = await one("select is_admin from accounts where id = $1", [req.account.id]); if (!row || !row.is_admin) return res.status(403).json({ error: "Kein Admin-Zugriff." }); req.account.is_admin = true; next(); }); }