From c1e65a259473d323fe99c48f498b95d98f716bf5 Mon Sep 17 00:00:00 2001 From: Josef Date: Sat, 15 Nov 2025 21:18:53 +0100 Subject: [PATCH] Persist Sessions --- node/users/Session.ts | 17 ++++++ node/users/UserManagementServer.ts | 71 +++++++++++++++++++++- node/users/UserManagementServerSettings.ts | 2 + node/users/handlers/_/login.ts | 2 + node/users/handlers/_/logout.ts | 3 + 5 files changed, 94 insertions(+), 1 deletion(-) diff --git a/node/users/Session.ts b/node/users/Session.ts index bda0ba0..bcdaa25 100644 --- a/node/users/Session.ts +++ b/node/users/Session.ts @@ -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; + } } \ No newline at end of file diff --git a/node/users/UserManagementServer.ts b/node/users/UserManagementServer.ts index abc6944..67f5365 100644 --- a/node/users/UserManagementServer.ts +++ b/node/users/UserManagementServer.ts @@ -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 = new Map(); _roles = new Map(); + 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 + { + if ( ! this._settings.persistSessions ) + { + return Promise.resolve(); + } + + let sessionData = this.getSessionData(); + await Files.saveJSON( this._settings.sessionsPath, sessionData ); + return Promise.resolve(); + } + + async loadSessionData():Promise + { + if ( ! this._settings.persistSessions ) + { + return Promise.resolve(); + } + + let sessionsExist = await Files.exists( this._settings.sessionsPath ); + + if ( ! sessionsExist ) + { + return; + } + + let sessionData = await Files.loadJSON( 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(); + } } \ No newline at end of file diff --git a/node/users/UserManagementServerSettings.ts b/node/users/UserManagementServerSettings.ts index 4ce6f91..a91d0ff 100644 --- a/node/users/UserManagementServerSettings.ts +++ b/node/users/UserManagementServerSettings.ts @@ -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; diff --git a/node/users/handlers/_/login.ts b/node/users/handlers/_/login.ts index eaeaae5..3515bec 100644 --- a/node/users/handlers/_/login.ts +++ b/node/users/handlers/_/login.ts @@ -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 } ); } diff --git a/node/users/handlers/_/logout.ts b/node/users/handlers/_/logout.ts index 6458f53..f187df7 100644 --- a/node/users/handlers/_/logout.ts +++ b/node/users/handlers/_/logout.ts @@ -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" ); }