182 lines
4.8 KiB
JavaScript
182 lines
4.8 KiB
JavaScript
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;
|