library-ts/node/users/TokenDB.ts

69 lines
1.8 KiB
TypeScript
Raw Normal View History

2025-11-10 17:41:48 +00:00
import { DateHelper } from "../../browser/date/DateHelper";
import { DateMath } from "../../browser/date/DateMath";
import { ISOTimeStamp } from "../../browser/date/ISOTimeStamp";
2025-11-24 14:25:10 +00:00
import { Message } from "../../browser/messages/Message";
2025-11-10 17:41:48 +00:00
import { CryptIO } from "../crypt/CryptIO";
import { Token } from "./Token";
import { UserManagementServer } from "./UserManagementServer";
export class TokenDB
{
static _defaultExpirationDurationMinutes = 20;
_ums:UserManagementServer;
_tokens = new Map<string,Token>();
constructor( ums:UserManagementServer )
{
this._ums = ums;
}
async update()
{
}
async create( ip:string, expireDurationInMinutes:number = -1 ):Promise<Token>
{
expireDurationInMinutes = expireDurationInMinutes == -1 ? TokenDB._defaultExpirationDurationMinutes : expireDurationInMinutes;
let token = new Token();
token.id = CryptIO.createUUID();
2025-11-24 14:25:10 +00:00
token.renewalToken = CryptIO.createUUID();
2025-11-10 17:41:48 +00:00
token.hashedIP = await CryptIO.hash( ip );
token.expires = ISOTimeStamp.fromDate( DateMath.fromNowAddMinutes( expireDurationInMinutes ) );
this._tokens.set( token.id, token );
return Promise.resolve( token );
}
2025-11-24 14:25:10 +00:00
async validate( token:Token, ip:string, debugMesssges:Message[] = undefined ):Promise<boolean>
2025-11-10 17:41:48 +00:00
{
if ( this._tokens.get( token.id ) != token )
{
2025-11-24 14:25:10 +00:00
debugMesssges?.push( Message.Error( "Token doesn't exist" ) );
2025-11-10 17:41:48 +00:00
return Promise.resolve( false );
}
if ( DateMath.isExpired( ISOTimeStamp.toDate( token.expires ) ) )
{
2025-11-24 14:25:10 +00:00
debugMesssges?.push( Message.Error( "Token is out of date" ) );
2025-11-10 17:41:48 +00:00
return Promise.resolve( false );
}
let isVerified = await CryptIO.verifyHash( ip, token.hashedIP );
if ( isVerified )
{
return true;
}
2025-11-24 14:25:10 +00:00
debugMesssges?.push( Message.Error( "Ip mismatch" ) );
2025-11-10 17:41:48 +00:00
return Promise.resolve( false );
}
}