const express = require("express"); const router = express.Router(); const mysql = require("mysql2/promise"); // ✅ nutzt deinen bestehenden config-manager (NICHT utils/config!) const { configExists, loadConfig, saveConfig } = require("../config-manager"); // ✅ DB + Session Reset (wie in deiner app.js) const db = require("../db"); const { resetSessionStore } = require("../config/session"); /** * Setup ist immer erreichbar – auch wenn config.enc schon existiert. * So kann die DB-Verbindung jederzeit korrigiert werden. * Schutz: Nur wenn DB bereits erreichbar ist UND User eingeloggt ist → blockieren. */ function blockIfInstalled(req, res, next) { // Immer durchlassen – Setup muss auch zur Korrektur nutzbar sein next(); } /** * Setup Form anzeigen – vorhandene Werte aus config.enc als Defaults laden */ router.get("/", blockIfInstalled, (req, res) => { // Bestehende Config als Vorausfüllung laden (Passwort bleibt leer) let existing = {}; try { if (configExists()) { const cfg = loadConfig(); existing = cfg?.db || {}; } } catch (e) { existing = {}; } return res.render("setup/index", { title: configExists() ? "DB-Verbindung ändern" : "Erstinstallation", isUpdate: configExists(), defaults: { host: existing.host || "85.215.63.122", port: existing.port || 3306, user: existing.user || "", password: "", // Passwort aus Sicherheitsgründen nie vorausfüllen name: existing.name || "", }, }); }); /** * Passwort auflösen: wenn leer → altes Passwort aus config.enc nehmen */ function resolvePassword(inputPassword) { if (inputPassword && inputPassword.trim() !== "") { return inputPassword; } // Passwort-Feld leer → altes Passwort aus bestehender Config beibehalten try { if (configExists()) { const old = loadConfig(); return old?.db?.password || ""; } } catch (e) { /* ignore */ } return ""; } /** * ✅ Verbindung testen (AJAX) */ router.post("/test", blockIfInstalled, async (req, res) => { try { const { host, port, user, name } = req.body; const password = resolvePassword(req.body.password); if (!host || !user || !name) { return res.status(400).json({ ok: false, message: "Bitte Host, Benutzer und Datenbankname ausfüllen.", }); } const connection = await mysql.createConnection({ host: host.trim(), port: Number(port || 3306), user: user.trim(), password, database: name.trim(), connectTimeout: 6000, }); await connection.query("SELECT 1"); await connection.end(); return res.json({ ok: true, message: "✅ Verbindung erfolgreich!" }); } catch (err) { return res.status(500).json({ ok: false, message: "❌ Verbindung fehlgeschlagen: " + err.message, }); } }); /** * ✅ Setup speichern (DB Daten in config.enc) */ router.post("/", blockIfInstalled, async (req, res) => { try { const { host, port, user, name } = req.body; // Passwort: leer = altes Passwort beibehalten const password = resolvePassword(req.body.password); if (!host || !user || !name) { req.session.flash = req.session.flash || []; req.session.flash.push({ type: "danger", message: "❌ Bitte Host, Benutzer und Datenbankname ausfüllen.", }); return res.redirect("/setup"); } // ✅ Verbindung testen bevor speichern let connection; try { connection = await mysql.createConnection({ host: host.trim(), port: Number(port || 3306), user: user.trim(), password, database: name.trim(), connectTimeout: 6000, }); await connection.query("SELECT 1"); await connection.end(); } catch (connErr) { req.session.flash = req.session.flash || []; req.session.flash.push({ type: "danger", message: "❌ DB-Verbindung fehlgeschlagen: " + connErr.message, }); return res.redirect("/setup"); } // ✅ In config.enc speichern saveConfig({ db: { host: host.trim(), port: Number(port || 3306), user: user.trim(), password, name: name.trim(), }, }); // ✅ DB Pool neu initialisieren (neue Config sofort aktiv) if (typeof db.resetPool === "function") { db.resetPool(); } // ✅ Session Store neu initialisieren resetSessionStore(); req.session.flash = req.session.flash || []; req.session.flash.push({ type: "success", message: "✅ DB-Verbindung gespeichert. Du kannst dich jetzt einloggen.", }); return res.redirect("/login"); } catch (err) { req.session.flash = req.session.flash || []; req.session.flash.push({ type: "danger", message: "❌ Setup fehlgeschlagen: " + err.message, }); return res.redirect("/setup"); } }); module.exports = router;