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' });
|
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,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) {
|
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'}`);
|
||||||
// Lösche hochgeladenes Bild, wenn nicht eingeloggt
|
|
||||||
unlinkSync(req.file.path);
|
// Fallback: Suche nach dem zuletzt aktiven Client mit aktivem Socket
|
||||||
return res.status(401).json({ error: 'Nicht eingeloggt' });
|
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
|
// Generiere eindeutigen Code für das Bild
|
||||||
@@ -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()));
|
||||||
|
|||||||
Reference in New Issue
Block a user