Links in chrome.storage.local statt storage.sync (v1.2.0)

Bestehende Daten werden einmalig aus storage.sync übernommen.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
root
2026-10-11 18:23:32 +00:00
co-authored by Claude Sonnet 5.5
parent a04aaae859
commit 2bcb625c11
3 changed files with 20 additions and 6 deletions
+3 -2
View File
@@ -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
+1 -1
View File
@@ -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://*/*"],
+16 -3
View File
@@ -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;