Files
2026-10-19 18:05:51 +00:00

45 lines
2.7 KiB
PHP

<?php
declare(strict_types=1);
/**
* Prüft die Signatur-Auswahl bei Antworten (resolve_reply_signature): eigene, Abteilung, keine, Standardverhalten
* mit Ersatz sowie die Bereinigung gefährlicher Inhalte.
*/
putenv('DESKHUB_SQLITE_PATH=:memory:');
require_once dirname(__DIR__) . '/includes/bootstrap.php';
$failures = [];
$check = function (bool $ok, string $what) use (&$failures): void {
if (!$ok) $failures[] = $what;
};
$pdo = get_db();
$deptId = (int) $pdo->query('SELECT id FROM departments ORDER BY id LIMIT 1')->fetchColumn();
$pdo->prepare('UPDATE departments SET signature = ? WHERE id = ?')->execute(['<p>Abteilung: Support-Team</p>', $deptId]);
$other = $pdo->exec("INSERT INTO departments (name, email, is_default) VALUES ('Ohne Signatur', 'o@example.org', 0)");
$otherId = (int) $pdo->lastInsertId();
$withOwn = ['signature' => '<p>Eigene: Max Muster</p>'];
$noOwn = ['signature' => ''];
$check(str_contains(resolve_reply_signature($pdo, $withOwn, $deptId, 'own'), 'Eigene: Max Muster'), '"own" liefert die eigene Signatur');
$check(str_contains(resolve_reply_signature($pdo, $withOwn, $deptId, 'dept'), 'Abteilung: Support-Team'), '"dept" liefert die Signatur der Abteilung');
$check(resolve_reply_signature($pdo, $withOwn, $deptId, 'none') === '', '"none" liefert keine Signatur');
$check(str_contains(resolve_reply_signature($pdo, $withOwn, $deptId, null), 'Eigene: Max Muster'), 'ohne Angabe gilt die eigene Signatur (bisheriges Verhalten)');
$check(str_contains(resolve_reply_signature($pdo, $noOwn, $deptId, null), 'Abteilung: Support-Team'), 'ohne Angabe und ohne eigene Signatur gilt die der Abteilung');
$check(str_contains(resolve_reply_signature($pdo, $noOwn, $deptId, 'bunt'), 'Abteilung: Support-Team'), 'unbekannter Wert verhält sich wie "ohne Angabe"');
$check(resolve_reply_signature($pdo, $noOwn, $deptId, 'own') === '', '"own" ohne eigene Signatur liefert nichts (kein heimlicher Ersatz)');
$check(resolve_reply_signature($pdo, $withOwn, $otherId, 'dept') === '', '"dept" bei Abteilung ohne Signatur liefert nichts');
$check(resolve_reply_signature($pdo, $noOwn, $otherId, null) === '', 'weder eigene noch Abteilungs-Signatur: leer');
// Gefährliches in einer gespeicherten Signatur wird beim Anhängen bereinigt
$evil = ['signature' => '<p>Hallo</p><script>alert(1)</script><img src=x onerror=alert(2)>'];
$out = resolve_reply_signature($pdo, $evil, $deptId, 'own');
$check(str_contains($out, 'Hallo') && !str_contains($out, '<script') && !preg_match('/onerror\s*=\s*alert/i', str_replace('&quot;', '"', preg_replace('/<img[^>]*>/', '', $out))), 'gefährliche Inhalte werden beim Anhängen entfernt: ' . $out);
if ($failures) {
fwrite(STDERR, "FEHLER:\n- " . implode("\n- ", $failures) . "\n");
exit(1);
}
echo "Reply signature checks passed.\n";