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:
@@ -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,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) {
|
||||
console.log(`[Bild-Upload] Client nicht gefunden für Session-ID: ${sessionId}`);
|
||||
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
|
||||
unlinkSync(req.file.path);
|
||||
return res.status(401).json({ error: 'Nicht eingeloggt' });
|
||||
}
|
||||
}
|
||||
|
||||
// Generiere eindeutigen Code für das Bild
|
||||
const code = req.file.filename.split('.')[0];
|
||||
@@ -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()));
|
||||
|
||||
Reference in New Issue
Block a user