feat: complete TASK-WP2-06 generation terminal states
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
import type BetterSqlite3 from "better-sqlite3";
|
||||
|
||||
const auditRefPattern = /^[A-Za-z0-9][A-Za-z0-9_.:-]{0,159}$/;
|
||||
const safeStringPattern = /^[A-Za-z0-9_.:@-]{1,160}$/;
|
||||
const forbiddenKeys = new Set([
|
||||
"absolute_path", "api_key", "body", "code_hmac", "content", "credential", "email", "image",
|
||||
"image_content", "password", "path", "prompt", "secret", "session_token", "verification_code", "whitelist",
|
||||
]);
|
||||
const forbiddenKeyFragments = ["content", "credential", "email", "image", "password", "path", "prompt", "secret", "token"];
|
||||
|
||||
function safeSummaryValue(value: unknown, depth: number): boolean {
|
||||
if (depth > 3) return false;
|
||||
if (value === null || typeof value === "boolean") return true;
|
||||
if (typeof value === "number") return Number.isSafeInteger(value);
|
||||
if (typeof value === "string") return safeStringPattern.test(value) && !value.includes("@");
|
||||
if (Array.isArray(value)) return value.length <= 20 && value.every((entry) => safeSummaryValue(entry, depth + 1));
|
||||
if (!value || typeof value !== "object") return false;
|
||||
const entries = Object.entries(value);
|
||||
return entries.length <= 32 && entries.every(([key, entry]) => (
|
||||
auditRefPattern.test(key)
|
||||
&& !forbiddenKeys.has(key.toLowerCase())
|
||||
&& !forbiddenKeyFragments.some((fragment) => key.toLowerCase().includes(fragment))
|
||||
&& safeSummaryValue(entry, depth + 1)
|
||||
));
|
||||
}
|
||||
|
||||
export function configureWorkerDatabase(database: BetterSqlite3.Database) {
|
||||
database.pragma("journal_mode = WAL");
|
||||
database.pragma("foreign_keys = ON");
|
||||
database.pragma("synchronous = FULL");
|
||||
database.pragma("busy_timeout = 5000");
|
||||
database.function("dada_audit_ref_is_safe", { deterministic: true }, (value: unknown) => (
|
||||
typeof value === "string" && auditRefPattern.test(value) ? 1 : 0
|
||||
));
|
||||
database.function("dada_audit_summary_is_safe", { deterministic: true }, (value: unknown) => {
|
||||
if (typeof value !== "string" || Buffer.byteLength(value, "utf8") > 2_048) return 0;
|
||||
try {
|
||||
return safeSummaryValue(JSON.parse(value), 0) ? 1 : 0;
|
||||
} catch {
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
database.function("dada_allow_retention_purge", { deterministic: false }, () => 0);
|
||||
database.function("dada_retention_purge_now", { deterministic: false }, () => 0);
|
||||
database.function("dada_allow_privacy_purge", { deterministic: false }, () => 0);
|
||||
database.function("dada_privacy_purge_subject", { deterministic: false }, () => "");
|
||||
}
|
||||
Reference in New Issue
Block a user