# LabLinks Schlanke Chrome-Erweiterung (Manifest V3) im Retro-Terminal-Look, um die WebUIs deines HomeLabs (Proxmox, Nextcloud, Router, NAS …) per Popup zu öffnen – optional per WebDAV/Nextcloud über mehrere Geräte synchronisiert. ## Funktionen - **Popup-Launcher** mit Suche (Enter öffnet den ersten Treffer) - **Links verwalten**: Name, URL und Emoji-Icon anlegen, bearbeiten, löschen, umsortieren - **Export / Import** als JSON - **WebDAV-/Nextcloud-Sync** (siehe unten) - **Tastenkürzel** zum Öffnen des Popups - Keine Tracker, keine externen Schriften oder Skripte, keine Abhängigkeiten ## Installation 1. Repository klonen oder als ZIP laden und entpacken. Achtung: Beim ZIP-Download steckt der Inhalt oft in einem verschachtelten Ordner. Wähle den Ordner, in dem direkt `manifest.json` liegt. 2. In Chrome `chrome://extensions` öffnen und den **Entwicklermodus** aktivieren. 3. **Entpackte Erweiterung laden** → Ordner auswählen. 4. Icon in der Toolbar anpinnen. Nach einem Update (`git pull`) die Erweiterung in `chrome://extensions` neu laden. ## Tastenkürzel Vorschlag: **Alt+Shift+L**. Chrome übernimmt Vorschläge nur bei der Erstinstallation und nur, wenn sie frei sind. Eigene Kombination setzen unter `chrome://extensions/shortcuts` → LabLinks → „LabLinks öffnen“. ## Sync mit Nextcloud / WebDAV 1. In Nextcloud ein **App-Passwort** erstellen (Einstellungen → Sicherheit). Nicht das normale Passwort verwenden. 2. Im Popup **[⚙]** klicken und eintragen: - **WebDAV-Ordner**, z. B. `https://cloud.example.com/remote.php/dav/files/NUTZER/LabLinks` (wird bei Bedarf angelegt; die Daten liegen darin als `lablinks.json`) - **Benutzer** und **App-Passwort** 3. **[SPEICHERN & TESTEN]** – Chrome fragt einmal nach Zugriff auf genau diesen Server. Funktionsweise: - Sync beim Öffnen des Popups und nach jeder Änderung; **[⟳]** im Popup startet ihn manuell (grün = ok, rot = Fehler, Tooltip zeigt die Meldung, blinkend = läuft). - Zusammenführung pro Eintrag: der neuere Zeitstempel gewinnt. Löschungen werden als Tombstones (60 Tage) übertragen, damit gelöschte Links auf anderen Geräten nicht wieder auftauchen. Die Reihenfolge übernimmt das zuletzt geänderte Gerät. - Schreibkonflikte werden per ETag erkannt, danach wird erneut abgeglichen. - **[TRENNEN]** entfernt Zugangsdaten und Server-Berechtigung; lokale Links bleiben. - Funktioniert mit jedem WebDAV-Server, nicht nur mit Nextcloud. Dateiformat (`lablinks.json`): ```json { "version": 1, "links": [{ "id": "…", "name": "Proxmox", "url": "https://pve:8006/", "icon": "🖥", "updated": 1760000000000 }], "deleted": [{ "id": "…", "updated": 1760000000000 }], "modified": 1760000000000 } ``` ## Sicherheit - **Nur http(s)-Links**: `javascript:`, `data:`, `file:`, `chrome:` u. Ä. werden beim Anlegen, Import und Sync verworfen. - **Remote-Daten gelten als nicht vertrauenswürdig**: Typen, Längen (Name 80, URL 2048, Icon 2 Zeichen), Anzahl (500 Links), Dateigröße (1 MB) und Zeitstempel (max. 1 Tag in der Zukunft) werden geprüft; Anzeige nur per `textContent`. - **Minimale Rechte**: Nur `storage`. Der Serverzugriff wird als *optionale* Berechtigung nur für den eingetragenen Host angefragt und beim Trennen oder Serverwechsel wieder entzogen. - **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. 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. - Kein Online-Status pro Link, keine Gruppen. - Sync läuft nur, wenn das Popup geöffnet wird (kein Hintergrundprozess). ## Projektstruktur | Datei | Zweck | | --- | --- | | `manifest.json` | Manifest V3, Rechte, Shortcut, CSP | | `popup.html/.css/.js` | Popup: Liste, Suche, Bearbeiten | | `options.html/.css/.js` | Sync-Einstellungen | | `sync.js` | WebDAV-Client, Merge, Validierung (von Popup und Einstellungen genutzt) | | `icons/` | Toolbar-Icons | ## Versionen - **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