45 lines
2.7 KiB
PHP
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('"', '"', 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";
|