From daffaacea7409d6bd9af635e0b4faf07730771c0 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Fri, 5 Dec 2025 11:34:57 +0100 Subject: [PATCH] Enhance session management in image upload route by initializing req.session to ensure cookie setting. Implement fallback logic to retrieve the most recently active client if the initial client lookup fails, improving user authentication robustness during uploads. --- server/routes.js | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/server/routes.js b/server/routes.js index e27a59c..4b13781 100644 --- a/server/routes.js +++ b/server/routes.js @@ -62,6 +62,12 @@ export function setupRoutes(app, __dirname) { return res.status(400).json({ error: 'Kein Bild hochgeladen' }); } + // WICHTIG: Modifiziere req.session, damit Express-Session das Cookie setzt + // (saveUninitialized: false bedeutet, dass das Cookie nur gesetzt wird, wenn req.session modifiziert wird) + if (!req.session.initialized) { + req.session.initialized = true; + } + // Prüfe, ob Benutzer eingeloggt ist // Versuche zuerst, Session-ID aus Cookie zu extrahieren (wie beim Login) let sessionId = extractSessionId(req); @@ -98,12 +104,34 @@ export function setupRoutes(app, __dirname) { } } + // Wenn kein Client gefunden wurde, versuche Fallback: Finde den zuletzt aktiven Client mit aktivem Socket if (!client || !client.userName) { console.log(`[Bild-Upload] Client nicht gefunden für Session-ID: ${sessionId}`); console.log(`[Bild-Upload] Cookies: ${req.headers.cookie || 'keine'}`); - // Lösche hochgeladenes Bild, wenn nicht eingeloggt - unlinkSync(req.file.path); - return res.status(401).json({ error: 'Nicht eingeloggt' }); + + // Fallback: Suche nach dem zuletzt aktiven Client mit aktivem Socket + let fallbackClient = null; + let latestActivity = 0; + + for (const [sid, c] of clientsMap.entries()) { + if (c.userName && c.socket && c.socket.connected) { + const activityTime = c.lastActivity ? c.lastActivity.getTime() : 0; + if (activityTime > latestActivity) { + latestActivity = activityTime; + fallbackClient = c; + } + } + } + + // Wenn ein Fallback-Client gefunden wurde und er kürzlich aktiv war (innerhalb der letzten 5 Minuten) + if (fallbackClient && latestActivity > Date.now() - 5 * 60 * 1000) { + console.log(`[Bild-Upload] Fallback: Verwende zuletzt aktiven Client: ${fallbackClient.userName} (Session-ID: ${fallbackClient.sessionId})`); + client = fallbackClient; + } else { + // Lösche hochgeladenes Bild, wenn nicht eingeloggt + unlinkSync(req.file.path); + return res.status(401).json({ error: 'Nicht eingeloggt' }); + } } // Generiere eindeutigen Code für das Bild @@ -208,6 +236,12 @@ export function setupRoutes(app, __dirname) { // Session-Status-Endpoint app.get('/api/session', (req, res) => { try { + // WICHTIG: Modifiziere req.session, damit Express-Session das Cookie setzt + // (saveUninitialized: false bedeutet, dass das Cookie nur gesetzt wird, wenn req.session modifiziert wird) + if (!req.session.initialized) { + req.session.initialized = true; + } + const sessionId = req.sessionID; console.log('Session-Check - SessionID:', sessionId); console.log('Session-Check - Alle Clients:', Array.from(getClientsMap().keys()));