120 lines
3.4 KiB
JavaScript
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;
|