113 lines
3.4 KiB
JavaScript
Executable File
113 lines
3.4 KiB
JavaScript
Executable File
// ==== 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/"}
|
|
];
|
|
|
|
// DOM-Elemente
|
|
const iframe = document.getElementById("service-frame");
|
|
const loginModal = document.getElementById("login-modal");
|
|
const loginBtn = document.getElementById("login-btn");
|
|
const loginSubmit = document.getElementById("login-submit");
|
|
const loginMsg = document.getElementById("login-msg");
|
|
const nav = document.getElementById("services");
|
|
|
|
const usernameInput = document.getElementById("username");
|
|
const passwordInput = document.getElementById("password");
|
|
|
|
let loggedIn = false;
|
|
|
|
// === Login Modal anzeigen ===
|
|
loginBtn.onclick = () => {
|
|
loginModal.style.display = "block";
|
|
};
|
|
|
|
// === Login-Logik als wiederverwendbare Funktion ===
|
|
async function doLogin() {
|
|
const user = usernameInput.value;
|
|
const pass = passwordInput.value;
|
|
|
|
try {
|
|
const res = await fetch("/api/login", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({ user, pass })
|
|
});
|
|
|
|
if (res.ok) {
|
|
loggedIn = true;
|
|
loginModal.style.display = "none";
|
|
loginMsg.textContent = "";
|
|
setupServiceButtons();
|
|
switchToLogout(); // Button-Text/Handler anpassen (siehe weiter unten)
|
|
} else {
|
|
loginMsg.textContent = "Login fehlgeschlagen";
|
|
}
|
|
} catch (e) {
|
|
loginMsg.textContent = "Fehler: " + e.message;
|
|
}
|
|
}
|
|
|
|
loginSubmit.onclick = doLogin;
|
|
|
|
// Enter / Return auf Passwort- und Benutzerfeld auslösen Login
|
|
[usernameInput, passwordInput].forEach(input => {
|
|
input.addEventListener('keydown', (e) => {
|
|
if (e.key === 'Enter') {
|
|
e.preventDefault();
|
|
doLogin();
|
|
}
|
|
});
|
|
});
|
|
|
|
// === Service Buttons dynamisch erstellen ===
|
|
function setupServiceButtons() {
|
|
nav.innerHTML = ""; // clear
|
|
services.forEach(svc => {
|
|
const btn = document.createElement("button");
|
|
btn.textContent = svc.name;
|
|
btn.onclick = async () => {
|
|
console.log('Button clicked, opening', svc.id);
|
|
try{
|
|
await fetch('/api/event', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ event: 'open', service: svc.id, url: svc.url })
|
|
});
|
|
}catch(e){ console.error('Event log failed', e); }
|
|
openService(svc);
|
|
};
|
|
nav.appendChild(btn);
|
|
});
|
|
}
|
|
|
|
// === Service in iFrame ö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";
|
|
}
|
|
|
|
// 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: "/"
|
|
});
|
|
}
|