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:
co-authored by
Claude Sonnet 5.5
parent
a04aaae859
commit
2bcb625c11
@@ -67,13 +67,13 @@ Dateiformat (`lablinks.json`):
|
|||||||
- **HTTP nur im LAN**: Unverschlüsseltes `http://` (Basic-Auth!) ist nur für lokale Adressen erlaubt
|
- **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.
|
(`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.
|
- **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.
|
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.
|
- Selbstsignierte Zertifikate lehnt Chrome ab; nutze ein vertrauenswürdiges Zertifikat (z. B. Let's Encrypt) oder importiere deine CA ins System.
|
||||||
|
|
||||||
## Bekannte Grenzen
|
## 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.
|
- Kein Online-Status pro Link, keine Gruppen.
|
||||||
- Sync läuft nur, wenn das Popup geöffnet wird (kein Hintergrundprozess).
|
- Sync läuft nur, wenn das Popup geöffnet wird (kein Hintergrundprozess).
|
||||||
|
|
||||||
@@ -89,6 +89,7 @@ Dateiformat (`lablinks.json`):
|
|||||||
|
|
||||||
## Versionen
|
## 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.1** – Sicherheits-Härtung (URL-Schema, Validierung, HTTP-Regel, CSP, UUID-IDs)
|
||||||
- **1.1.0** – WebDAV-/Nextcloud-Sync
|
- **1.1.0** – WebDAV-/Nextcloud-Sync
|
||||||
- **1.0.0** – Erste Version
|
- **1.0.0** – Erste Version
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"manifest_version": 3,
|
"manifest_version": 3,
|
||||||
"name": "LabLinks",
|
"name": "LabLinks",
|
||||||
"version": "1.1.1",
|
"version": "1.2.0",
|
||||||
"description": "Retro-Launcher für deine HomeLab WebUIs.",
|
"description": "Retro-Launcher für deine HomeLab WebUIs.",
|
||||||
"permissions": ["storage"],
|
"permissions": ["storage"],
|
||||||
"optional_host_permissions": ["https://*/*", "http://*/*"],
|
"optional_host_permissions": ["https://*/*", "http://*/*"],
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// WebDAV-/Nextcloud-Sync. Gemeinsam genutzt von Popup und Einstellungsseite.
|
// 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)
|
// Zugangsdaten: chrome.storage.local {webdav: {url, user, pass}} (nie über Google synchronisiert)
|
||||||
const LabSync = (() => {
|
const LabSync = (() => {
|
||||||
const FILE = "lablinks.json";
|
const FILE = "lablinks.json";
|
||||||
@@ -67,12 +67,25 @@ const LabSync = (() => {
|
|||||||
const setConfig = (cfg) =>
|
const setConfig = (cfg) =>
|
||||||
cfg ? chrome.storage.local.set({ webdav: cfg }) : chrome.storage.local.remove("webdav");
|
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() {
|
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);
|
return cleanState(d);
|
||||||
}
|
}
|
||||||
const writeLocal = (s) =>
|
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 baseUrl = (cfg) => cfg.url.trim().replace(/\/+$/, "");
|
||||||
const fileUrl = (cfg) => baseUrl(cfg) + "/" + FILE;
|
const fileUrl = (cfg) => baseUrl(cfg) + "/" + FILE;
|
||||||
|
|||||||
Reference in New Issue
Block a user