Files
rootandClaude Sonnet 5.5 a04aaae859 Sicherheits-Härtung (v1.1.1) und aktuelle README
- nur http(s)-Links, Validierung/Limits für Remote-, Storage- und Importdaten
- HTTP-Sync nur im lokalen Netz, keine Zugangsdaten in der URL
- Berechtigung bei Serverwechsel entziehen, explizite CSP, UUID-IDs

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-11 18:22:26 +00:00

74 lines
2.2 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const $ = (id) => document.getElementById(id);
function status(text, kind = "") {
$("status").textContent = text;
$("status").className = kind;
}
function showConnected(on) {
$("now").hidden = !on;
$("off").hidden = !on;
}
async function init() {
const cfg = await LabSync.getConfig();
if (cfg) {
$("url").value = cfg.url;
$("user").value = cfg.user;
$("pass").value = cfg.pass;
showConnected(true);
}
}
async function runSync() {
status("> synchronisiere …");
try {
const r = await LabSync.sync();
status(`> OK – ${r.links} Links abgeglichen.`, "ok");
} catch (e) {
status("> FEHLER: " + e.message, "err");
}
}
$("cfg").addEventListener("submit", async (e) => {
e.preventDefault();
const cfg = { url: $("url").value.trim(), user: $("user").value.trim(), pass: $("pass").value };
let check;
try { check = LabSync.checkServerUrl(cfg.url); } catch (err) { return status("> FEHLER: " + err.message + ".", "err"); }
const origin = check.origin + "/*";
// Muss direkt aus dem Klick heraus aufgerufen werden (Nutzergeste).
const granted = await chrome.permissions.request({ origins: [origin] });
if (!granted) return status("> FEHLER: Zugriff auf den Server wurde nicht erlaubt.", "err");
// Berechtigung für einen früher genutzten, anderen Server wieder entziehen
const old = await LabSync.getConfig();
if (old?.url) {
try {
const oldOrigin = new URL(old.url).origin + "/*";
if (oldOrigin !== origin) await chrome.permissions.remove({ origins: [oldOrigin] });
} catch {}
}
await LabSync.setConfig(cfg);
showConnected(true);
await runSync();
if (check.insecure) status($("status").textContent + " (Achtung: HTTP ohne Verschlüsselung – Passwort geht im Klartext durchs Netz.)", $("status").className);
});
$("now").addEventListener("click", runSync);
$("off").addEventListener("click", async () => {
const cfg = await LabSync.getConfig();
await LabSync.setConfig(null);
if (cfg) {
try { await chrome.permissions.remove({ origins: [new URL(cfg.url).origin + "/*"] }); } catch {}
}
for (const id of ["url", "user", "pass"]) $(id).value = "";
showConnected(false);
status("> Sync getrennt. Lokale Links bleiben erhalten.");
});
init();