diff --git a/README.md b/README.md index 925d1c0..fcf4e46 100644 --- a/README.md +++ b/README.md @@ -74,11 +74,15 @@ Gegen den **Test-Schrank `LL_TEST_BELEGE`** ablegen, dann per DocuWare-MCP gegen - Anhänge erscheinen als eigene Dokumente - Aufräumen: `docuware_delete_document` (nur im Test-Schrank!) -## Verteilung & automatische Updates (eigenes Gitea, nicht öffentlich) +## Verteilung & automatische Updates (eigenes Gitea) -Das Add-on wird **nicht** öffentlich auf addons.thunderbird.net gelistet, sondern -über AMO als **„Selbstständig" (self-distribution)** signiert und über dein eigenes -Gitea verteilt + aktualisiert. +Das Add-on wird **nicht** auf addons.thunderbird.net gelistet, sondern als **unsigniertes +XPI** über dein eigenes Gitea verteilt + aktualisiert. + +> **Kein Signieren nötig.** Thunderbird verlangt für self-distributed Add-ons keine +> Mozilla-Signatur, und addons.thunderbird.net (ATN) zeichnet Thunderbird-Add-ons ohnehin +> nicht gegen (jede hochgeladene Version bleibt `signed=false`, `web-ext sign` schlägt mit +> „no signed files were found" fehl). Wir bauen das XPI also lokal und verteilen es direkt. > Im XPI und in `updates.json` stehen **keine** Zugangsdaten. Das DocuWare-Passwort > wird ohnehin nirgends gespeichert (nur Sitzungs-Token im Speicher) und nie mitverteilt. @@ -87,21 +91,34 @@ Gitea verteilt + aktualisiert. 1. In `manifest.json` → `applications.gecko.update_url` die Domain `GITEA.EXAMPLE.DE` durch deine (HTTPS-)Gitea-Adresse ersetzen. **HTTPS ist Pflicht** (TB lehnt HTTP ab). -2. `updates.json` ebenfalls auf deine Gitea-URLs anpassen und in dein Repo committen - (erreichbar unter der `update_url`, z.B. via *raw*-Link auf `main`). +2. `updates.json` ebenfalls auf deine Gitea-URLs anpassen und in dein Repo committen. +3. ⚠️ **`update_url` und Release-Assets müssen ANONYM (ohne Login) erreichbar sein** — + sonst bekommt Thunderbird beim Update-Check nur die Login-Seite und aktualisiert nie. + Bei Gitea: Repo öffentlich **und** instanzweit `REQUIRE_SIGNIN_VIEW = false` (in + `app.ini`, Abschnitt `[service]`). -**Bei jedem neuen Release:** +**Bei jedem neuen Release** – am einfachsten mit `scripts/release.sh` (baut sauberes XPI, +patcht `updates.json`, committet/pusht, legt Gitea-Release an + lädt das Asset hoch): -1. `version` in `manifest.json` erhöhen (z.B. `0.8.0` → `0.8.1`). -2. XPI bauen (`manifest.json` muss im Archiv-Wurzelverzeichnis liegen). -3. XPI bei AMO hochladen → **„Selbstständig"** wählen → **signiertes** XPI herunterladen. -4. Signiertes XPI als Release-Anhang in Gitea hochladen (passend zum `update_link`). -5. In `updates.json` einen neuen Eintrag mit `version` + `update_link` ergänzen, - committen/pushen. +```bash +scripts/release.sh 0.10.2 # Version setzen + alles erledigen +``` + +Manuell wären das die Schritte: `version` in `manifest.json` erhöhen → sauberes XPI bauen +(`manifest.json` im Archiv-Wurzelverzeichnis; `scripts/`, `docs/`, `.env` **nicht** mit +einpacken) → XPI als Release-Anhang in Gitea hochladen → Eintrag (`version` + `update_link`) +in `updates.json` ergänzen, committen/pushen. Thunderbird prüft die `update_url` periodisch und aktualisiert automatisch auf die neueste dort gelistete Version. +**Nach dem Release verifizieren** (anonym, genau wie Thunderbird): + +```bash +curl -L .../raw/branch/main/updates.json # muss JSON liefern, nicht die Login-Seite +curl -sI -L .../releases/download/vX/...xpi # Content-Type: application/octet-stream +``` + ## Bekannte Grenzen / nächste Schritte - **PDF** ist v1 ein einfaches Text-PDF (Kopf + Klartext-Body) ohne HTML-Layout/Bilder. diff --git a/scripts/release.sh b/scripts/release.sh index 3b218ca..fc87c68 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -1,29 +1,36 @@ #!/usr/bin/env bash # -# release.sh – signiert die Extension bei addons.thunderbird.net (Kanal "unlisted", -# also signiert ABER nicht öffentlich gelistet), lädt das signierte XPI als -# Gitea-Release hoch und trägt es in updates.json fürs Auto-Update ein. +# release.sh – baut ein sauberes XPI, lädt es als Gitea-Release hoch und trägt es +# in updates.json fürs Auto-Update ein. # -# Benötigt: bash, node, npx, curl, git. web-ext wird genutzt, wenn global -# installiert; sonst automatisch via "npx web-ext" (kein globales Install nötig). +# KEIN Signieren: Thunderbird verlangt für self-distributed Add-ons keine +# Mozilla-Signatur, und addons.thunderbird.net (ATN) zeichnet Thunderbird-Add-ons +# ohnehin nicht gegen (jede Version bleibt `signed=false`; "web-ext sign" scheitert +# mit "no signed files were found"). Wir verteilen also das unsignierte XPI direkt +# über Gitea – genau wie schon 0.8.0, das nie bei ATN war. +# +# WICHTIG fürs Auto-Update: update_url und Release-Asset müssen ANONYM (ohne Login) +# erreichbar sein. Bei Gitea heißt das: Repo öffentlich UND instanzweit +# REQUIRE_SIGNIN_VIEW=false (in app.ini). Sonst bekommt Thunderbird beim Update-Check +# nur die Login-Seite und aktualisiert nie. +# +# Benötigt: bash, node, curl, git. Zum Bauen zusätzlich npx (web-ext); im --xpi-Modus +# nicht nötig. # # Secrets kommen aus der Umgebung bzw. aus scripts/.env (gitignored, NIE committen): -# ATN_API_KEY – API-Schlüssel von addons.thunderbird.net (Entwicklerbereich) -# ATN_API_SECRET – zugehöriges Secret # GITEA_TOKEN – Gitea Personal Access Token (Scope: write:repository) # Optionale Overrides (sonst aus dem git-Remote "origin" abgeleitet): # GITEA_BASE, GITEA_OWNER, GITEA_REPO, REPO_DIR # # Aufruf: -# scripts/release.sh # signiert via ATN, nutzt Version aus manifest.json -# scripts/release.sh 0.9.0 # setzt zuerst diese Version, dann signieren -# scripts/release.sh --xpi # bereits signiertes XPI veröffentlichen +# scripts/release.sh # baut sauberes XPI, Version aus manifest.json +# scripts/release.sh 0.9.0 # setzt zuerst diese Version, dann bauen +# scripts/release.sh --xpi # fertiges XPI/ZIP veröffentlichen (kein Build) # scripts/release.sh --xpi 0.9.0 # -# Hinweis ATN: addons.thunderbird.net gibt das signierte XPI nicht zuverlässig über -# die API zurück. In der Praxis: einmal mit dem Skript hochladen (legt die Version an), -# das signierte XPI aus dem ATN-Entwicklerbereich herunterladen, dann mit --xpi -# veröffentlichen. Der --xpi-Modus überspringt das Signieren komplett. +# Verifikation nach jedem Release (anonym, wie Thunderbird): +# curl -L .../raw/branch/main/updates.json → muss JSON liefern, nicht die Login-Seite +# curl -L .../releases/download/vX/...xpi → Content-Type application/octet-stream # set -euo pipefail @@ -57,13 +64,10 @@ need node; need curl; need git [ -f "$UPDATES" ] || die "updates.json nicht gefunden ($UPDATES)." : "${GITEA_TOKEN:?GITEA_TOKEN fehlt (scripts/.env oder Umgebung)}" if [ -z "$PRESIGNED" ]; then - # web-ext: ATN nutzt die Signing-API v4. Das geht nur mit web-ext 7.x – ab 8.x - # spricht web-ext ausschließlich die AMO-v5-API und ATN antwortet mit 404. - # Daher fest auf 7.x via npx (kein globales Install nötig); per WEBEXT_CMD überschreibbar. + # Sauberes Paket wird mit "web-ext build" erzeugt (kein Signieren, daher + # versionsunabhängig). Per WEBEXT_CMD überschreibbar. need npx - WEBEXT="${WEBEXT_CMD:-npx --yes web-ext@^7}" - : "${ATN_API_KEY:?ATN_API_KEY fehlt (scripts/.env oder Umgebung)}" - : "${ATN_API_SECRET:?ATN_API_SECRET fehlt}" + WEBEXT="${WEBEXT_CMD:-npx --yes web-ext}" fi # --- Version setzen / lesen --------------------------------------------------- @@ -100,26 +104,25 @@ echo "Release $VERSION (Add-on $ADDON_ID)" echo " Gitea : $GITEA_BASE/$GITEA_OWNER/$GITEA_REPO (Branch $BRANCH)" echo " Asset : $UPDATE_LINK" -# --- 1) XPI besorgen: entweder bereits signiert (--xpi) oder via ATN signieren -- +# --- 1) XPI besorgen: fertiges Paket (--xpi) oder sauber selbst bauen ----------- mkdir -p "$ARTIFACTS" if [ -n "$PRESIGNED" ]; then - echo "→ Nutze vorsigniertes XPI: $PRESIGNED" + echo "→ Nutze fertiges Paket: $PRESIGNED" cp -f "$PRESIGNED" "$ARTIFACTS/$XPI_NAME" else - echo "→ Signiere bei addons.thunderbird.net (unlisted) …" - rm -f "$ARTIFACTS"/*.xpi 2>/dev/null || true - $WEBEXT sign \ - --channel=unlisted \ - --api-url-prefix="https://addons.thunderbird.net/api/v4" \ - --api-key="$ATN_API_KEY" \ - --api-secret="$ATN_API_SECRET" \ + echo "→ Baue sauberes XPI (web-ext build) …" + rm -f "$ARTIFACTS"/*.zip "$ARTIFACTS"/*.xpi 2>/dev/null || true + # --ignore-files hält Secrets/Build-Kram raus: scripts/ (mit .env!), docs/, + # web-ext-artifacts/, *.md, *.xpi, git-Kram und updates.json (gehört NICHT ins XPI). + $WEBEXT build \ --source-dir="$REPO_DIR" \ --artifacts-dir="$ARTIFACTS" \ + --overwrite-dest \ --ignore-files "web-ext-artifacts/**" "scripts/**" "docs/**" "*.md" "*.xpi" \ - ".git/**" ".gitignore" "*.env" ".env" - SIGNED="$(ls -t "$ARTIFACTS"/*.xpi 2>/dev/null | head -1)" - [ -n "${SIGNED:-}" ] && [ -f "$SIGNED" ] || die "Kein signiertes XPI in $ARTIFACTS gefunden." - cp -f "$SIGNED" "$ARTIFACTS/$XPI_NAME" + ".git/**" ".gitignore" "*.env" ".env" "updates.json" + BUILT="$(ls -t "$ARTIFACTS"/*.zip 2>/dev/null | head -1)" + [ -n "${BUILT:-}" ] && [ -f "$BUILT" ] || die "Kein Paket in $ARTIFACTS gebaut." + cp -f "$BUILT" "$ARTIFACTS/$XPI_NAME" fi echo "✓ XPI bereit: $ARTIFACTS/$XPI_NAME"