- 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>
74 lines
2.2 KiB
JavaScript
74 lines
2.2 KiB
JavaScript
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();
|