import { strict as assert } from "node:assert";
import { readFileSync } from "node:fs";
import { describe, it } from "node:test";
import { activityNodes, sanitizeActivityMessage } from "../src/lib/activity";
import { clearLoginFailures, isLoginBlocked, recordLoginFailure } from "../src/lib/login-throttle";
import { decryptSecret, encryptSecret, tryDecryptSecret } from "../src/lib/crypto";
process.env.SOCIAL_TOKEN_KEY ??= "cle-de-test-suffisamment-longue-pour-scrypt";
/** Rend les nœuds React en texte brut, pour vérifier ce qui atteint le DOM. */
function renderToText(message: string): string {
const nodes = activityNodes(message);
const flat = Array.isArray(nodes) ? nodes : [nodes];
return JSON.stringify(flat);
}
describe("Journal d'activité — XSS stocké", () => {
// Ces messages agrègent des saisies de tiers, dont le formulaire de contact
// public : ils étaient rendus en HTML brut sur le tableau de bord admin.
const payloads = [
``,
``,
`x`,
`