Harden campaign import handling

This commit is contained in:
2026-07-11 18:37:51 +02:00
parent 30b43913e8
commit 3f0b14a726
4 changed files with 95 additions and 24 deletions

View File

@@ -21,6 +21,10 @@ export function asArray(value: unknown): unknown[] {
return Array.isArray(value) ? value : [];
}
export function isSafeObjectPathSegment(segment: string): boolean {
return segment !== "__proto__" && segment !== "prototype" && segment !== "constructor";
}
export function getCampaignJson(version: CampaignVersionDetail | null): Record<string, unknown> {
return version?.raw_json ?? version?.campaign_json ?? {};
}
@@ -179,10 +183,11 @@ export function getString(record: Record<string, unknown>, key: string, fallback
}
export function getNestedString(record: Record<string, unknown>, path: string[], fallback = "—"): string {
if (!path.every(isSafeObjectPathSegment)) return fallback;
let current: unknown = record;
for (const part of path) {
if (!isRecord(current)) return fallback;
current = current[part];
current = Object.getOwnPropertyDescriptor(current, part)?.value;
}
if (typeof current === "string" && current.trim()) return current;
if (typeof current === "number" || typeof current === "boolean") return String(current);