From 2bcb625c1151aaeeafae1721be7300d451802b6b Mon Sep 17 00:00:00 2001 From: root Date: Sun, 11 Oct 2026 18:23:32 +0000 Subject: [PATCH] Links in chrome.storage.local statt storage.sync (v1.2.0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bestehende Daten werden einmalig aus storage.sync übernommen. Co-Authored-By: Claude Sonnet 5.5 --- README.md | 5 +++-- manifest.json | 2 +- sync.js | 19 ++++++++++++++++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 689e973..0117683 100644 --- a/README.md +++ b/README.md @@ -67,13 +67,13 @@ Dateiformat (`lablinks.json`): - **HTTP nur im LAN**: Unverschlüsseltes `http://` (Basic-Auth!) ist nur für lokale Adressen erlaubt (`localhost`, private IP-Bereiche, `*.local`, `*.lan`, Hostnamen ohne Punkt) und zeigt eine Warnung. Zugangsdaten in der URL werden abgelehnt. - **Strikte CSP**: `script-src 'self'; object-src 'none'; base-uri 'none'`, keine Inline-Skripte, keine externen Ressourcen. -- **Zugangsdaten** liegen in `chrome.storage.local` (nicht im Google-Sync), aber **unverschlüsselt** auf der Festplatte des Browser-Profils. +- **Zugangsdaten** liegen in `chrome.storage.local` (nicht im Google-Sync, ebenso wie die Links), aber **unverschlüsselt** auf der Festplatte des Browser-Profils. Wer Zugriff auf dein Profil hat, kann sie auslesen. Nutze deshalb immer ein widerrufbares **App-Passwort** mit dem Nutzer, der nur diesen Ordner braucht. - Selbstsignierte Zertifikate lehnt Chrome ab; nutze ein vertrauenswürdiges Zertifikat (z. B. Let's Encrypt) oder importiere deine CA ins System. ## Bekannte Grenzen -- Links liegen in `chrome.storage.sync` (Chrome-Limit ≈ 8 KB pro Eintrag, grob 50 Links). Bei mehr Links wäre ein Wechsel auf `storage.local` nötig. +- Links liegen nur lokal (`chrome.storage.local`, ca. 10 MB Limit, Erweiterung begrenzt auf 500 Links). Geräteübergreifend geht es ausschließlich über den WebDAV-Sync; ohne ihn bleiben die Links auf diesem Browser-Profil. - Kein Online-Status pro Link, keine Gruppen. - Sync läuft nur, wenn das Popup geöffnet wird (kein Hintergrundprozess). @@ -89,6 +89,7 @@ Dateiformat (`lablinks.json`): ## Versionen +- **1.2.0** – Links liegen jetzt in `storage.local` (kein 8-KB-Limit mehr); bestehende Daten werden automatisch übernommen - **1.1.1** – Sicherheits-Härtung (URL-Schema, Validierung, HTTP-Regel, CSP, UUID-IDs) - **1.1.0** – WebDAV-/Nextcloud-Sync - **1.0.0** – Erste Version diff --git a/manifest.json b/manifest.json index d160b03..611cd9a 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "LabLinks", - "version": "1.1.1", + "version": "1.2.0", "description": "Retro-Launcher für deine HomeLab WebUIs.", "permissions": ["storage"], "optional_host_permissions": ["https://*/*", "http://*/*"], diff --git a/sync.js b/sync.js index 355d401..e493128 100644 --- a/sync.js +++ b/sync.js @@ -1,5 +1,5 @@ // WebDAV-/Nextcloud-Sync. Gemeinsam genutzt von Popup und Einstellungsseite. -// Lokale Daten: chrome.storage.sync {links, deleted, modified} +// Lokale Daten: chrome.storage.local {links, deleted, modified} // Zugangsdaten: chrome.storage.local {webdav: {url, user, pass}} (nie über Google synchronisiert) const LabSync = (() => { const FILE = "lablinks.json"; @@ -67,12 +67,25 @@ const LabSync = (() => { const setConfig = (cfg) => cfg ? chrome.storage.local.set({ webdav: cfg }) : chrome.storage.local.remove("webdav"); + const KEYS = ["links", "deleted", "modified"]; + + // Bis v1.1.1 lagen die Daten in chrome.storage.sync (Limit ~8 KB) -> einmalig übernehmen. + async function migrateFromSyncStorage() { + const old = await chrome.storage.sync.get(KEYS); + if (old.links) await chrome.storage.local.set(old); + await chrome.storage.sync.remove(KEYS); + } + async function readLocal() { - const d = await chrome.storage.sync.get(["links", "deleted", "modified"]); + let d = await chrome.storage.local.get(KEYS); + if (!d.links) { + await migrateFromSyncStorage(); + d = await chrome.storage.local.get(KEYS); + } return cleanState(d); } const writeLocal = (s) => - chrome.storage.sync.set({ links: s.links, deleted: s.deleted, modified: s.modified }); + chrome.storage.local.set({ links: s.links, deleted: s.deleted, modified: s.modified }); const baseUrl = (cfg) => cfg.url.trim().replace(/\/+$/, ""); const fileUrl = (cfg) => baseUrl(cfg) + "/" + FILE;