import * as plugins from '../plugins.js'; import { LoginSessionManager } from './classes.loginsessionmanager.js'; @plugins.smartdata.Manager() export class EmailActionToken extends plugins.smartdata.SmartDataDbDoc< EmailActionToken, plugins.idpInterfaces.data.IEmailActionToken, LoginSessionManager > { public static hashToken(tokenArg: string) { return plugins.smarthash.sha256FromStringSync(tokenArg); } public static createOpaqueToken(actionArg: plugins.idpInterfaces.data.TEmailActionTokenAction) { return `${actionArg}_${plugins.crypto.randomBytes(32).toString('base64url')}`; } @plugins.smartdata.unI() public id: string; @plugins.smartdata.svDb() public data: plugins.idpInterfaces.data.IEmailActionToken['data'] = { email: '', action: 'emailLogin', tokenHash: '', validUntil: 0, createdAt: 0, }; public isExpired() { return this.data.validUntil < Date.now(); } public matchesToken(tokenArg: string) { return this.data.tokenHash === EmailActionToken.hashToken(tokenArg); } public async consume(tokenArg: string) { if (this.isExpired() || !this.matchesToken(tokenArg)) { if (this.isExpired()) { await this.delete(); } return false; } await this.delete(); return true; } }