Persist Sessions

This commit is contained in:
Josef 2025-11-15 21:18:53 +01:00
parent cd99027e70
commit c1e65a2594
5 changed files with 94 additions and 1 deletions

View File

@ -1,5 +1,22 @@
import { Token } from "./Token";
export class Session
{
userID:string;
token:string;
}
export class SerializedSession extends Token
{
userID:string;
static create( token:Token, userID:string )
{
let s = new SerializedSession();
s.expires = token.expires;
s.hashedIP = token.hashedIP;
s.id = token.id;
s.userID = userID;
return s;
}
}

View File

@ -11,7 +11,7 @@ import { EmailService as EmailService } from "./email/EmailService";
import { TokenDB } from "./TokenDB";
import { UserManagementServerSettings } from "./UserManagementServerSettings";
import { RJLog } from "../log/RJLog";
import { Session } from "./Session";
import { SerializedSession, Session } from "./Session";
import { Role } from "./permissions/Role";
import { RolesData } from "./permissions/RolesData";
import { Files } from "../files/Files";
@ -28,6 +28,7 @@ import { Task } from "./scheduler/Task";
import { UserApp } from "./apps/UserApp";
import { UserAppFactory } from "./apps/UserAppFactory";
import { iTaskScheduler } from "./scheduler/iTaskScheduler";
import { Token } from "./Token";
export class UserManagementServer
{
@ -49,6 +50,71 @@ export class UserManagementServer
_sessions:Map<string,Session> = new Map<string,Session>();
_roles = new Map<string,Role>();
getSessionData():SerializedSession[]
{
let sessionData:SerializedSession[] = [];
for ( let idsession of this._sessions )
{
let session = idsession[ 1 ];
let token = this.tokenDB._tokens.get( session.token );
let userID = session.userID;
let serializedSession = SerializedSession.create( token, userID );
sessionData.push( serializedSession );
}
return sessionData;
}
async saveSessionData():Promise<void>
{
if ( ! this._settings.persistSessions )
{
return Promise.resolve();
}
let sessionData = this.getSessionData();
await Files.saveJSON( this._settings.sessionsPath, sessionData );
return Promise.resolve();
}
async loadSessionData():Promise<void>
{
if ( ! this._settings.persistSessions )
{
return Promise.resolve();
}
let sessionsExist = await Files.exists( this._settings.sessionsPath );
if ( ! sessionsExist )
{
return;
}
let sessionData = await Files.loadJSON<SerializedSession[]>( this._settings.sessionsPath );
sessionData.forEach(
( sd )=>
{
let token = new Token();
token.id = sd.id;
token.hashedIP = sd.hashedIP;
token.expires = sd.expires;
this._tokenDB._tokens.set( token.id, token );
let session = new Session();
session.userID = sd.userID;
session.token = sd.id;
this._sessions.set( session.token, session );
}
);
}
_handlers:RequestHandler[] = [];
_settings:UserManagementServerSettings;
@ -278,5 +344,8 @@ export class UserManagementServer
}
await this._scheduler.update();
await this.loadSessionData();
}
}

View File

@ -11,11 +11,13 @@ export class UserManagementServerSettings
httpsKeyPath:string;
httpsCertPath:string;
emailKey:string;
persistSessions:boolean = true;
// Paths
rootPath:string;
userDBPath:string;
rolesPath:string;
sessionsPath:string;
// Apps
appsPath:string;

View File

@ -53,6 +53,8 @@ export class LoginHandler extends RequestHandler
await this.userDB.save();
await this.ums.saveSessionData();
return this.sendDataInfo( "Login successfull", { token: session.token } );
}

View File

@ -25,6 +25,9 @@ export class LogoutHandler extends RequestHandler
this._ums._sessions.delete( tokenID );
this._ums.tokenDB._tokens.delete( tokenID );
await this.userDB.save();
await this.ums.saveSessionData();
return this.sendInfo( "Logout successfull" );
}