From 926f89a23b6899febc17f79269c5133201a8463d Mon Sep 17 00:00:00 2001 From: ChK Date: Thu, 5 Feb 2026 17:28:20 +0100 Subject: [PATCH] VibeCode umgeschrieben --- public/app.js | 141 +++++++++++++++++++++++++++----------------------- 1 file changed, 76 insertions(+), 65 deletions(-) diff --git a/public/app.js b/public/app.js index b19b852..f1f8bb4 100755 --- a/public/app.js +++ b/public/app.js @@ -1,10 +1,10 @@ -// ==== app.js ==== +// ==== FRONTEND app.js ==== // Service-Liste const services = [ { id: "abc", name: "Control GamePad", url: "https://abc.server.schooltech.ch/" }, - { id: "xyz", name: "Guacamole", url: "https://xyz.server.schooltech.ch/" }, - { id: "portainer", name: "Portainer", url: "https://portainer.server.schooltech.ch/"} + { id: "xyz", name: "Guacamole", url: "https://xyz.server.schooltech.ch/" }, + { id: "portainer", name: "Portainer", url: "https://portainer.server.schooltech.ch/" } ]; // DOM-Elemente @@ -20,12 +20,46 @@ const passwordInput = document.getElementById("password"); let loggedIn = false; -// === Login Modal anzeigen === -loginBtn.onclick = () => { - loginModal.style.display = "block"; -}; +// =========================== +// Login anzeigen +// =========================== +function switchToLogin() { + loginBtn.textContent = "Login"; + loginBtn.onclick = () => { + loginModal.style.display = "block"; + }; +} -// === Login-Logik als wiederverwendbare Funktion === +// =========================== +// Logout anzeigen +// =========================== +function switchToLogout() { + loginBtn.textContent = "Logout"; + loginBtn.onclick = async () => { + try { + await fetch("/api/logout", { method: "POST" }); + } catch (e) { + console.warn("Logout request failed:", e); + } + performLocalLogout(); + }; +} + +// =========================== +// Lokales Logout +// =========================== +function performLocalLogout() { + loggedIn = false; + iframe.src = ""; + iframe.style.display = "none"; + nav.innerHTML = ""; + loginModal.style.display = "block"; + switchToLogin(); +} + +// =========================== +// Login-Logik +// =========================== async function doLogin() { const user = usernameInput.value; const pass = passwordInput.value; @@ -42,7 +76,7 @@ async function doLogin() { loginModal.style.display = "none"; loginMsg.textContent = ""; setupServiceButtons(); - switchToLogout(); // Button-Text/Handler anpassen (siehe weiter unten) + switchToLogout(); } else { loginMsg.textContent = "Login fehlgeschlagen"; } @@ -53,7 +87,7 @@ async function doLogin() { loginSubmit.onclick = doLogin; -// Enter / Return auf Passwort- und Benutzerfeld auslösen Login +// Enter-Taste Login [usernameInput, passwordInput].forEach(input => { input.addEventListener('keydown', (e) => { if (e.key === 'Enter') { @@ -63,80 +97,57 @@ loginSubmit.onclick = doLogin; }); }); -// === Service Buttons dynamisch erstellen === +// =========================== +// Buttons erzeugen +// =========================== function setupServiceButtons() { - nav.innerHTML = ""; // clear + nav.innerHTML = ""; services.forEach(svc => { const btn = document.createElement("button"); btn.textContent = svc.name; btn.onclick = async () => { - console.log('Button clicked, opening', svc.id); - try{ + try { await fetch('/api/event', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ event: 'open', service: svc.id, url: svc.url }) + body: JSON.stringify({ + event: 'open', + service: svc.id, + url: svc.url + }) }); - }catch(e){ console.error('Event log failed', e); } + } catch(e) { + console.error('Event log failed', e); + } openService(svc); }; nav.appendChild(btn); }); } -// === Service in iFrame öffnen === +// =========================== +// Service öffnen +// =========================== function openService(svc) { iframe.src = svc.url; iframe.style.display = "block"; window.scrollTo(0,0); } -// Optional: Logout-Funktion -function logout() { - loggedIn = false; - iframe.src = ""; - iframe.style.display = "none"; - nav.innerHTML = ""; - loginModal.style.display = "block"; -} - -// Setzt Login-Button so, dass er Logout macht -function switchToLogout() { - loginBtn.textContent = "Logout"; - loginBtn.onclick = async () => { - // Option: serverseitiges Logout anstoßen (löscht Cookie / Session) - try { - await fetch("/api/logout", { method: "POST" }); - } catch (e) { - console.warn("Logout request failed:", e); +// =========================== +// Session Status beim Laden prüfen +// =========================== +(async function checkStatus() { + try { + const r = await fetch('/api/status'); + if (r.ok) { + loggedIn = true; + setupServiceButtons(); + switchToLogout(); + } else { + switchToLogin(); } - performLocalLogout(); - }; -} - -// Setzt Login-Button zurück auf Login (zeigt Modal) -function switchToLogin() { - loginBtn.textContent = "Login"; - loginBtn.onclick = () => { loginModal.style.display = "block"; }; -} - -// Lokale UI-Aufräumarbeiten bei Logout -function performLocalLogout() { - loggedIn = false; - iframe.src = ""; - iframe.style.display = "none"; - nav.innerHTML = ""; - loginModal.style.display = "block"; - switchToLogin(); -} - -// Setzen des Cookies für die Sitzung -function setSessionCookie(res, user) { - res.cookie("SESSIONID", "session-"+user, { - httpOnly: true, - secure: true, // zwingend bei SameSite=None - domain: ".server.schooltech.ch", - sameSite: "None", - path: "/" - }); -} \ No newline at end of file + } catch (e) { + switchToLogin(); + } +})();