Bearbeitung hinter ein Passwort legen, Ansehen für das Team freigeben
Mit EDIT_PASSWORD sehen Besucher nur den Kalender: keine E-Mails, Notizen, Abwesenheiten oder Nextcloud-Details, keine schreibenden Aktionen. Anmelden in der Kopfzeile setzt ein signiertes Cookie für 30 Tage; nach fünf Fehlversuchen wartet der Server eine Minute. Ohne EDIT_PASSWORD bleibt alles offen wie bisher. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
9ed59bcf56
commit
33a8adef0e
8 files changed
+288
-13
No files matched your search
@@ -0,0 +1,51 @@
|
||||
import { test } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { createAuth, readCookie, cookieHeader, COOKIE_NAME } from '../server/auth.js';
|
||||
|
||||
test('ohne Passwort ist der Schutz aus', () => {
|
||||
const a = createAuth({ password: '', secret: 's' });
|
||||
assert.equal(a.enabled, false);
|
||||
assert.equal(a.checkPassword(''), false);
|
||||
});
|
||||
|
||||
test('Passwortprüfung und signierte Token', () => {
|
||||
let t = 1_000_000;
|
||||
const a = createAuth({ password: 'geheim', secret: 'schluessel', now: () => t });
|
||||
assert.ok(a.enabled);
|
||||
assert.ok(a.checkPassword('geheim'));
|
||||
assert.ok(!a.checkPassword('Geheim'));
|
||||
assert.ok(!a.checkPassword(undefined));
|
||||
const token = a.issue();
|
||||
assert.ok(a.verify(token));
|
||||
assert.ok(!a.verify(token + 'x'), 'manipulierte Signatur');
|
||||
assert.ok(!a.verify('123.abc'));
|
||||
assert.ok(!a.verify(''));
|
||||
const other = createAuth({ password: 'geheim', secret: 'anderer', now: () => t });
|
||||
assert.ok(!other.verify(token), 'anderer Schlüssel');
|
||||
t += a.ttlMs + 1;
|
||||
assert.ok(!a.verify(token), 'abgelaufen');
|
||||
});
|
||||
|
||||
test('Bremse nach fünf Fehlversuchen', () => {
|
||||
let t = 0;
|
||||
const a = createAuth({ password: 'x', secret: 's', now: () => t });
|
||||
for (let i = 0; i < 4; i += 1) a.noteFailure('1.2.3.4');
|
||||
assert.equal(a.blockedFor('1.2.3.4'), 0);
|
||||
a.noteFailure('1.2.3.4');
|
||||
assert.ok(a.blockedFor('1.2.3.4') > 0);
|
||||
assert.equal(a.blockedFor('5.6.7.8'), 0);
|
||||
t += 61_000;
|
||||
assert.equal(a.blockedFor('1.2.3.4'), 0);
|
||||
a.noteFailure('1.2.3.4');
|
||||
a.noteSuccess('1.2.3.4');
|
||||
assert.equal(a.blockedFor('1.2.3.4'), 0);
|
||||
});
|
||||
|
||||
test('Cookie lesen und schreiben', () => {
|
||||
const header = cookieHeader('abc.def', { secure: true });
|
||||
assert.ok(header.startsWith(`${COOKIE_NAME}=abc.def; Path=/; HttpOnly; SameSite=Lax; Max-Age=`));
|
||||
assert.ok(header.endsWith('; Secure'));
|
||||
assert.equal(readCookie(`foo=1; ${COOKIE_NAME}=abc.def; bar=2`), 'abc.def');
|
||||
assert.equal(readCookie('foo=1'), null);
|
||||
assert.equal(readCookie(undefined), null);
|
||||
});
|
||||
Reference in new issue
Block a user