🛠 1️⃣ Was wurde erfolgreich ausgelagert?
✔ cryptoUtils.ts → Enthält generateKeyAndIV und generateTokencryptoUtils
✔ useAdminAuth.ts → Enthält decryptToken, useEffect für Login-Status und logoutAdminuseAdminAuth
✔ useSystemSettings.ts → Verwaltet Redux-Daten und setzt formValuesuseSystemSettings
✔ handleAdminLogin.ts → Enthält handleAdminLogin, um die Login-Logik auszulagernhandleAdminLogin
✔ handleClearDatabase.ts → Handhabt das Löschen der DatenbankhandleClearDatabase
✔ handleReboot.ts → Handhabt den Reboot des CPLhandleReboot
✔ handleSetDateTime.ts → Setzt Datum und Uhrzeit für das SystemhandleSetDateTime
✔ handleSubmit.ts → Verarbeitet Änderungen und sendet sie an den ServerhandleSubmit
✔ users.ts → Enthält die USERS-Konfiguration für den Adminusers
🚀 Das bedeutet:
SettingsModal.tsx ist jetzt nur noch für die UI zuständig.
Alle Geschäftslogik (State, API-Aufrufe, Funktionen) wurde sauber in separate Dateien ausgelagert.
Der Code ist jetzt wartungsfreundlicher und wiederverwendbarer.
This commit is contained in:
@@ -13,20 +13,14 @@ import CryptoJS from "crypto-js";
|
|||||||
import { useAdminAuth } from "./hooks/useAdminAuth";
|
import { useAdminAuth } from "./hooks/useAdminAuth";
|
||||||
import { useSystemSettings } from "./hooks/useSystemSettings";
|
import { useSystemSettings } from "./hooks/useSystemSettings";
|
||||||
import { generateKeyAndIV, generateToken } from "./utils/cryptoUtils";
|
import { generateKeyAndIV, generateToken } from "./utils/cryptoUtils";
|
||||||
|
import USERS from "./config/users";
|
||||||
|
import handleAdminLogin from "./handlers/handleAdminLogin";
|
||||||
|
|
||||||
ReactModal.setAppElement("#__next");
|
ReactModal.setAppElement("#__next");
|
||||||
|
|
||||||
const USERS = {
|
|
||||||
Admin: {
|
|
||||||
username: "admin",
|
|
||||||
// Gehashte Version von "admin" mit bcrypt
|
|
||||||
password: "$2a$10$xpq/.tcOJN/LXfzdCcCVrenlBh2nRlM1R1ISY7dd1q2qGWC9Fyd2G",
|
|
||||||
role: "Admin",
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
function SettingModal({ showModal, onClose }) {
|
function SettingModal({ showModal, onClose }) {
|
||||||
const { isAdminLoggedIn, setAdminLoggedIn } = useAdminAuth(showModal);
|
const { isAdminLoggedIn, logoutAdmin } = useAdminAuth(showModal);
|
||||||
|
|
||||||
const { formValues, setFormValues } = useSystemSettings(showModal);
|
const { formValues, setFormValues } = useSystemSettings(showModal);
|
||||||
|
|
||||||
const [username, setUsername] = useState("");
|
const [username, setUsername] = useState("");
|
||||||
@@ -34,24 +28,6 @@ function SettingModal({ showModal, onClose }) {
|
|||||||
const [error, setError] = useState("");
|
const [error, setError] = useState("");
|
||||||
const [showLoginForm, setShowLoginForm] = useState(false);
|
const [showLoginForm, setShowLoginForm] = useState(false);
|
||||||
|
|
||||||
function handleAdminLogin(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
const user = USERS.Admin;
|
|
||||||
bcrypt.compare(password, user.password, (err, isMatch) => {
|
|
||||||
if (isMatch) {
|
|
||||||
const token = generateToken(user);
|
|
||||||
sessionStorage.setItem("token", token);
|
|
||||||
localStorage.setItem("isAdminLoggedIn", "true");
|
|
||||||
setShowLoginForm(false);
|
|
||||||
onClose();
|
|
||||||
} else {
|
|
||||||
setError(
|
|
||||||
"Login fehlgeschlagen. Bitte überprüfen Sie Benutzername und Passwort."
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const deviceName_Redux = useSelector(
|
const deviceName_Redux = useSelector(
|
||||||
(state: RootState) => state.systemSettings.deviceName
|
(state: RootState) => state.systemSettings.deviceName
|
||||||
);
|
);
|
||||||
@@ -108,10 +84,6 @@ function SettingModal({ showModal, onClose }) {
|
|||||||
ntpTimezone,
|
ntpTimezone,
|
||||||
active,
|
active,
|
||||||
};
|
};
|
||||||
const handleAdminLogout = () => {
|
|
||||||
sessionStorage.removeItem("token"); // Token aus sessionStorage entfernen
|
|
||||||
localStorage.setItem("isAdminLoggedIn", "false"); // Admin-Status im localStorage setzen
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
10
components/header/settingsModal/config/users.ts
Normal file
10
components/header/settingsModal/config/users.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// components/header/settingsModal/config/users.ts
|
||||||
|
const USERS = {
|
||||||
|
Admin: {
|
||||||
|
username: "admin",
|
||||||
|
password: "$2a$10$xpq/.tcOJN/LXfzdCcCVrenlBh2nRlM1R1ISY7dd1q2qGWC9Fyd2G", // Gehashte Version von "admin"
|
||||||
|
role: "Admin",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default USERS;
|
||||||
27
components/header/settingsModal/handlers/handleAdminLogin.ts
Normal file
27
components/header/settingsModal/handlers/handleAdminLogin.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
// components/header/settingsModal/handlers/handleAdminLogin.ts
|
||||||
|
import bcrypt from "bcryptjs";
|
||||||
|
import { generateToken } from "../utils/cryptoUtils";
|
||||||
|
import USERS from "../config/users";
|
||||||
|
|
||||||
|
const handleAdminLogin = (
|
||||||
|
username: string,
|
||||||
|
password: string,
|
||||||
|
onSuccess: () => void,
|
||||||
|
onError: (errorMsg: string) => void
|
||||||
|
) => {
|
||||||
|
const user = USERS.Admin;
|
||||||
|
bcrypt.compare(password, user.password, (err, isMatch) => {
|
||||||
|
if (isMatch) {
|
||||||
|
const token = generateToken(user);
|
||||||
|
sessionStorage.setItem("token", token);
|
||||||
|
localStorage.setItem("isAdminLoggedIn", "true");
|
||||||
|
onSuccess();
|
||||||
|
} else {
|
||||||
|
onError(
|
||||||
|
"Login fehlgeschlagen. Bitte überprüfen Sie Benutzername und Passwort."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export default handleAdminLogin;
|
||||||
@@ -20,6 +20,12 @@ function decryptToken(encryptedToken: string) {
|
|||||||
export function useAdminAuth(showModal: boolean) {
|
export function useAdminAuth(showModal: boolean) {
|
||||||
const [isAdminLoggedIn, setAdminLoggedIn] = useState(false);
|
const [isAdminLoggedIn, setAdminLoggedIn] = useState(false);
|
||||||
|
|
||||||
|
function logoutAdmin() {
|
||||||
|
sessionStorage.removeItem("token");
|
||||||
|
localStorage.setItem("isAdminLoggedIn", "false");
|
||||||
|
setAdminLoggedIn(false);
|
||||||
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (showModal) {
|
if (showModal) {
|
||||||
const token = sessionStorage.getItem("token");
|
const token = sessionStorage.getItem("token");
|
||||||
@@ -29,16 +35,15 @@ export function useAdminAuth(showModal: boolean) {
|
|||||||
if (Date.now() < exp) {
|
if (Date.now() < exp) {
|
||||||
setAdminLoggedIn(true);
|
setAdminLoggedIn(true);
|
||||||
} else {
|
} else {
|
||||||
sessionStorage.removeItem("token");
|
logoutAdmin();
|
||||||
setAdminLoggedIn(false);
|
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Token-Entschlüsselung fehlgeschlagen:", error);
|
console.error("Token-Entschlüsselung fehlgeschlagen:", error);
|
||||||
setAdminLoggedIn(false);
|
logoutAdmin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, [showModal]);
|
}, [showModal]);
|
||||||
|
|
||||||
return { isAdminLoggedIn, setAdminLoggedIn };
|
return { isAdminLoggedIn, logoutAdmin };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,5 +6,5 @@
|
|||||||
2: Patch oder Hotfix (Bugfixes oder kleine Änderungen).
|
2: Patch oder Hotfix (Bugfixes oder kleine Änderungen).
|
||||||
|
|
||||||
*/
|
*/
|
||||||
const webVersion = "1.6.97";
|
const webVersion = "1.6.98";
|
||||||
export default webVersion;
|
export default webVersion;
|
||||||
|
|||||||
Reference in New Issue
Block a user