Analytics: Heatmap-Endpunkt nachgeschaerft

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-01 09:59:48 +00:00
1 parent 28c7a90d8b
commit add7fa4add
4 files changed
+97 -13

No files matched your search

+36
View File
@@ -100,3 +100,39 @@ test('/a/heat nur auf dem öffentlichen Listener', async () => {
assert.equal(r.status, 404);
server.close();
});
test('403 bei ausgeschalteter Website (active = 0), mit CORS für die eigene Domain', async () => {
const s = await setup();
s.db.prepare('UPDATE sites SET active = 0 WHERE siteKey = ?').run(KEY);
const r = await s.get(tok(), { Origin: 'https://kunde.de' });
assert.equal(r.status, 403);
assert.equal(r.headers.get('access-control-allow-origin'), 'https://kunde.de');
s.close();
});
test('403 mit CORS-Kopf, wenn die Website bekannt ist (abgelaufen, aus); sonst ohne', async () => {
const s = await setup();
const origin = { Origin: 'https://www.kunde.de' };
const abgelaufen = await s.get(tok({ exp: exp(-1) }), origin);
assert.equal(abgelaufen.status, 403);
assert.equal(abgelaufen.headers.get('access-control-allow-origin'), 'https://www.kunde.de');
// fremder Origin, falsche Signatur, unbekannte Website: kein CORS-Kopf
assert.equal((await s.get(tok({ exp: exp(-1) }), { Origin: 'https://evil.example' })).headers.get('access-control-allow-origin'), null);
assert.equal((await s.get(tok({}, 'anderes-secret'), origin)).headers.get('access-control-allow-origin'), null);
assert.equal((await s.get(tok({ siteKey: 'nichtvorhanden0123456' }), origin)).headers.get('access-control-allow-origin'), null);
assert.equal((await s.get('abc', origin)).headers.get('access-control-allow-origin'), null);
s.close();
});
test('OPTIONS-Preflight: CORS-Köpfe nur für erlaubte Origins bekannter Websites', async () => {
const s = await setup();
const pre = (token, origin) => fetch(`${s.base}/a/heat?token=${encodeURIComponent(token)}`, { method: 'OPTIONS', headers: { Origin: origin, 'Access-Control-Request-Method': 'GET' } });
const ok = await pre(tok(), 'https://kunde.de');
assert.equal(ok.status, 204);
assert.equal(ok.headers.get('access-control-allow-origin'), 'https://kunde.de');
assert.match(ok.headers.get('access-control-allow-methods'), /GET/);
assert.equal((await pre(tok({ exp: exp(-1) }), 'https://kunde.de')).headers.get('access-control-allow-origin'), 'https://kunde.de');
assert.equal((await pre(tok(), 'https://evil.example')).headers.get('access-control-allow-origin'), null);
assert.equal((await pre('abc', 'https://kunde.de')).headers.get('access-control-allow-origin'), null);
s.close();
});