79 lines
2.0 KiB
JavaScript
79 lines
2.0 KiB
JavaScript
// Generated, do not edit. sha256:267314982d9469bd348aa537982dfb5f7b94157d526aea6cbeeb8cefdfe06595
|
|||
|
|
import { randomBytes } from 'node:crypto';
|
||
|
|
import { CONFIG } from '../shared/config.js';
|
||
|
|
|
||
|
|
const nieuwToken = () => randomBytes(32).toString('hex');
|
||
|
|
|
||
|
|
export function createSessionStore({ ttlMs = CONFIG.AUTH.SESSION_TTL_MS, now = Date.now } = {}) {
|
||
|
|
const sessies = new Map();
|
||
|
|
|
||
|
|
const verlopen = (aangemaakt) => now() - aangemaakt >= ttlMs;
|
||
|
|
|
||
|
|
return {
|
||
|
|
create() {
|
||
|
|
for (const [token, aangemaakt] of sessies) if (verlopen(aangemaakt)) sessies.delete(token);
|
||
|
|
const token = nieuwToken();
|
||
|
|
sessies.set(token, now());
|
||
|
|
return token;
|
||
|
|
},
|
||
|
|
|
||
|
|
isValid(token) {
|
||
|
|
if (typeof token !== 'string' || !token) return false;
|
||
|
|
const aangemaakt = sessies.get(token);
|
||
|
|
if (aangemaakt === undefined) return false;
|
||
|
|
if (verlopen(aangemaakt)) { sessies.delete(token); return false; }
|
||
|
|
return true;
|
||
|
|
},
|
||
|
|
|
||
|
|
drop(token) {
|
||
|
|
return sessies.delete(token);
|
||
|
|
},
|
||
|
|
|
||
|
|
size() {
|
||
|
|
return sessies.size;
|
||
|
|
},
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
export function createAttemptLimiter({
|
||
|
|
free = CONFIG.AUTH.LOGIN_ATTEMPTS.FREE,
|
||
|
|
baseLockMs = CONFIG.AUTH.LOGIN_ATTEMPTS.BASE_LOCK_MS,
|
||
|
|
maxLockMs = CONFIG.AUTH.LOGIN_ATTEMPTS.MAX_LOCK_MS,
|
||
|
|
now = Date.now,
|
||
|
|
} = {}) {
|
||
|
|
const pogingen = new Map();
|
||
|
|
|
||
|
|
const wachttijd = (missers) => {
|
||
|
|
if (missers <= free) return 0;
|
||
|
|
return Math.min(maxLockMs, baseLockMs * 2 ** (missers - free - 1));
|
||
|
|
};
|
||
|
|
|
||
|
|
return {
|
||
|
|
retryAfterMs(adres) {
|
||
|
|
const staat = pogingen.get(adres);
|
||
|
|
if (!staat) return 0;
|
||
|
|
const over = staat.laatste + wachttijd(staat.missers) - now();
|
||
|
|
if (over <= 0) {
|
||
|
|
if (over < -maxLockMs) pogingen.delete(adres);
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
return over;
|
||
|
|
},
|
||
|
|
|
||
|
|
fail(adres) {
|
||
|
|
const staat = pogingen.get(adres) || { missers: 0, laatste: 0 };
|
||
|
|
staat.missers += 1;
|
||
|
|
staat.laatste = now();
|
||
|
|
pogingen.set(adres, staat);
|
||
|
|
return wachttijd(staat.missers);
|
||
|
|
},
|
||
|
|
|
||
|
|
succeed(adres) {
|
||
|
|
pogingen.delete(adres);
|
||
|
|
},
|
||
|
|
|
||
|
|
size() {
|
||
|
|
return pogingen.size;
|
||
|
|
},
|
||
|
|
};
|
||
|
|
}
|