102 lines
2.6 KiB
TypeScript
102 lines
2.6 KiB
TypeScript
import { test } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import {
|
|
accountActionInput,
|
|
accountAppealInput,
|
|
accountAppealReviewInput,
|
|
restrictionPageAllowed,
|
|
} from "../shared/account-controls";
|
|
|
|
test("account controls reject forged identity, role, status and unknown actions", () => {
|
|
const reason = "A detailed reason for restricting this account.";
|
|
for (const action of ["deactivate", "ban", "restore", "delete"])
|
|
assert.equal(
|
|
accountActionInput.safeParse({ action, reason }).success,
|
|
true,
|
|
);
|
|
for (const extra of [
|
|
{ owner_id: "someone" },
|
|
{ role: "admin" },
|
|
{ status: "active" },
|
|
])
|
|
assert.equal(
|
|
accountActionInput.safeParse({ action: "ban", reason, ...extra }).success,
|
|
false,
|
|
);
|
|
for (const action of ["promote", "prepare_delete", "approve"])
|
|
assert.equal(
|
|
accountActionInput.safeParse({ action, reason }).success,
|
|
false,
|
|
);
|
|
for (const reason of ["short", " ".repeat(20), "x".repeat(2001)])
|
|
assert.equal(
|
|
accountActionInput.safeParse({ action: "ban", reason }).success,
|
|
false,
|
|
);
|
|
assert.equal(
|
|
accountActionInput.safeParse({
|
|
action: "delete",
|
|
reason,
|
|
confirmation: "wrong-id",
|
|
}).success,
|
|
false,
|
|
);
|
|
});
|
|
|
|
test("appeals cannot choose their owner, ban version, reviewer or outcome", () => {
|
|
const reason = "Please review the circumstances of this ban.";
|
|
assert.equal(
|
|
accountAppealInput.parse({ reason: " " + reason + " " }).reason,
|
|
reason,
|
|
);
|
|
for (const extra of [
|
|
{ owner_id: "other" },
|
|
{ status_version: 99 },
|
|
{ state: "approved" },
|
|
])
|
|
assert.equal(
|
|
accountAppealInput.safeParse({ reason, ...extra }).success,
|
|
false,
|
|
);
|
|
assert.equal(
|
|
accountAppealReviewInput.safeParse({ reason, decision: "approve" }).success,
|
|
true,
|
|
);
|
|
assert.equal(
|
|
accountAppealReviewInput.safeParse({ reason, decision: "reject" }).success,
|
|
true,
|
|
);
|
|
assert.equal(
|
|
accountAppealReviewInput.safeParse({
|
|
reason,
|
|
decision: "restore",
|
|
reviewer_id: "admin",
|
|
}).success,
|
|
false,
|
|
);
|
|
});
|
|
|
|
test("restricted page allowlist cannot admit game, dashboard or staff pages via prefixes", () => {
|
|
for (const path of [
|
|
"/ban/appeal",
|
|
"/settings",
|
|
"/docs",
|
|
"/log-in",
|
|
"/auth/callback",
|
|
"/auth/reset-password",
|
|
])
|
|
assert.equal(restrictionPageAllowed(path), true, path);
|
|
for (const path of [
|
|
"/",
|
|
"/moderation",
|
|
"/dashboard",
|
|
"/servers",
|
|
"/dev/api",
|
|
"/ban/appeal/other",
|
|
"/docs/../moderation",
|
|
"/auth/admin",
|
|
"/auth/callback/other",
|
|
])
|
|
assert.equal(restrictionPageAllowed(path), false, path);
|
|
});
|