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.

This commit is contained in:
Torsten Schulz (local)
2025-12-05 11:34:57 +01:00
parent c998e32825
commit daffaacea7

View File

@@ -62,6 +62,12 @@ export function setupRoutes(app, __dirname) {
return res.status(400).json({ error: 'Kein Bild hochgeladen' }); 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 // Prüfe, ob Benutzer eingeloggt ist
// Versuche zuerst, Session-ID aus Cookie zu extrahieren (wie beim Login) // Versuche zuerst, Session-ID aus Cookie zu extrahieren (wie beim Login)
let sessionId = extractSessionId(req); let sessionId = extractSessionId(req);
@@ -98,13 +104,35 @@ export function setupRoutes(app, __dirname) {
} }
} }
// Wenn kein Client gefunden wurde, versuche Fallback: Finde den zuletzt aktiven Client mit aktivem Socket
if (!client || !client.userName) { if (!client || !client.userName) {
console.log(`[Bild-Upload] Client nicht gefunden für Session-ID: ${sessionId}`); console.log(`[Bild-Upload] Client nicht gefunden für Session-ID: ${sessionId}`);
console.log(`[Bild-Upload] Cookies: ${req.headers.cookie || 'keine'}`); console.log(`[Bild-Upload] Cookies: ${req.headers.cookie || 'keine'}`);
// 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 // Lösche hochgeladenes Bild, wenn nicht eingeloggt
unlinkSync(req.file.path); unlinkSync(req.file.path);
return res.status(401).json({ error: 'Nicht eingeloggt' }); return res.status(401).json({ error: 'Nicht eingeloggt' });
} }
}
// Generiere eindeutigen Code für das Bild // Generiere eindeutigen Code für das Bild
const code = req.file.filename.split('.')[0]; const code = req.file.filename.split('.')[0];
@@ -208,6 +236,12 @@ export function setupRoutes(app, __dirname) {
// Session-Status-Endpoint // Session-Status-Endpoint
app.get('/api/session', (req, res) => { app.get('/api/session', (req, res) => {
try { 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; const sessionId = req.sessionID;
console.log('Session-Check - SessionID:', sessionId); console.log('Session-Check - SessionID:', sessionId);
console.log('Session-Check - Alle Clients:', Array.from(getClientsMap().keys())); console.log('Session-Check - Alle Clients:', Array.from(getClientsMap().keys()));