dok/routes/login.route.js
2026-04-07 15:06:47 +01:00

120 lines
3.4 KiB
JavaScript

const express = require("express");
const router = express.Router();
const db = require("../database/database");
const bcrypt = require("bcrypt");
const crypto = require("crypto");
/* ================================
Login verarbeiten
================================ */
router.post("/", async (req, res) => {
const { username, password } = req.body;
try {
/* Server laden (für index.ejs) */
const [servers] = await db.query("SELECT * FROM servers");
/* User laden */
const [rows] = await db.query(
"SELECT * FROM accounts WHERE username = ? AND verified = 1",
[username],
);
if (rows.length === 0) {
return res.render("index", {
error: "Login fehlgeschlagen",
servers,
extraServers: [], // ← das fehlte
});
}
const user = rows[0];
/* Passwort prüfen */
const passwordMatch = await bcrypt.compare(password, user.password);
if (!passwordMatch) {
return res.render("index", {
error: "Login fehlgeschlagen",
servers,
extraServers: [], // ← das fehlte
});
}
/* ================================
Prüfen ob User bereits eingeloggt
(aktive Session mit passendem Token)
================================= */
if (user.session_token) {
// Prüfen ob wirklich eine aktive Session existiert
// durch Vergleich mit dem gespeicherten Token.
// Gibt es noch eine aktive Session → Login blockieren.
// Nach Server-Absturz ist session_token zwar gesetzt,
// aber keine gültige Session mehr vorhanden →
// Token wird einfach überschrieben (alter Login wird gekickt).
const hasActiveSession = req.sessionStore?.sessions
? await new Promise((resolve) => {
req.sessionStore.all((err, sessions) => {
if (err || !sessions) return resolve(false);
const active = Object.values(sessions).some((s) => {
try {
const parsed = typeof s === "string" ? JSON.parse(s) : s;
return parsed?.user?.token === user.session_token;
} catch { return false; }
});
resolve(active);
});
})
: false;
if (hasActiveSession) {
return res.render("index", {
error: "Dieser Account ist bereits eingeloggt. Bitte zuerst ausloggen.",
servers,
extraServers: [],
});
}
}
/* ================================
Session Token erstellen
================================= */
const sessionToken = crypto.randomBytes(64).toString("hex");
/* Token in DB speichern (überschreibt alten Login) */
await db.query("UPDATE accounts SET session_token = ? WHERE id = ?", [
sessionToken,
user.id,
]);
/* ================================
Session speichern
================================== */
req.session.user = {
id: user.id,
username: user.username,
token: sessionToken,
};
/* ================================
Weiterleitung
================================= */
if (!user.ingame_name) {
return res.redirect("/create-character");
}
return res.redirect("/launcher");
} catch (error) {
console.error("Login Fehler:", error);
res.status(500).send("Serverfehler beim Login");
}
});
module.exports = router;