From 7a7815feca76dccad034a8a2fb436bf6e7799e32 Mon Sep 17 00:00:00 2001 From: Kendrick Bollens Date: Thu, 7 May 2026 20:06:26 +0200 Subject: [PATCH] VERIFY.md, attachSignature-Fix, Sync-Hashes, Scope-Bug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - VERIFY.md: Regressions-Checkliste mit 30 Prüfpunkten - Fix: attachSignature: false beim Signatur-Update (deaktiviert alte Datei-Signatur) - Fix: Sig-Hashes werden beim Init + Background-Sync geschrieben (kein grau mehr) - Fix: Scope-Badge Vergleich über normalisierte Scopes (folderToScope) - Fix: storage.onChanged refreshed auch Signaturen-Indicator --- VERIFY.md | 48 +++++++++++++++++++++++++ lib/gitea-sync.js | 16 ++++++++- templates-reply-hotel.xpi | Bin 430038 -> 430163 bytes templates_options/templates_options.js | 22 +++++++++--- 4 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 VERIFY.md diff --git a/VERIFY.md b/VERIFY.md new file mode 100644 index 0000000..4c15892 --- /dev/null +++ b/VERIFY.md @@ -0,0 +1,48 @@ +# Verifizierungs-Checkliste + +Nach Thunderbird-Updates, Plugin-Änderungen oder Deployments diese Punkte prüfen. + +## Vorlagen — Sync & Anzeige +- [ ] Pull überschreibt lokale Vorlagen nicht (Merge statt Replace) — importierte Vorlagen dürfen nach Sync nicht verschwinden +- [ ] Vorlagen mit Leerzeichen im Titel werden korrekt erstellt, gesynct und angezeigt (kein Duplikat) +- [ ] Scope-Badge (Persönlich/Abteilung/Alle) zeigt den richtigen Wert — Abteilungsvorlagen dürfen nicht als "Privat" erscheinen +- [ ] Scope-Badge umschalten funktioniert (Warnung bei Downgrade, altes File wird gelöscht, neues wird gepusht) +- [ ] Sync-Dots sind grün nach Pull (nicht grau/unknown) — Hashes müssen korrekt geschrieben werden +- [ ] Background SHA-Check alle 5s läuft, voller Pull nur bei Änderung +- [ ] UI refreshed automatisch wenn Background-Sync neue Templates pullt + +## Signaturen +- [ ] Signaturen-Tab lädt beim Öffnen automatisch die erste Identität + deren Signatur +- [ ] Kein "Bitte wählen" Placeholder im Identity-Dropdown +- [ ] Signatur-Sync-Status ist grün beim Öffnen (nicht grau) +- [ ] `attachSignature: false` wird gesetzt — alte Datei-basierte Signaturen werden deaktiviert +- [ ] Footer (Banner) lädt korrekt als eingebettete data-URI, nicht als Datei-Referenz +- [ ] Signatur-Quelle "= andere E-Mail" funktioniert (Kopie von anderer Identität) + +## Settings / Verbindung +- [ ] E-Mail ist ein Dropdown mit TB-Identitäten (kein Freitext) +- [ ] Token-Feld hat Show/Hide Toggle +- [ ] `defaults.local.json` wird beim ersten Start geladen (wenn in XPI vorhanden) +- [ ] Ohne `defaults.local.json` funktioniert Plugin normal (manuell konfigurieren) +- [ ] Auto-Detection via `_config/abteilungen.json` erkennt Abteilung + E-Mail +- [ ] Abteilungsname wird im Scope-Badge und Editor-Dropdown angezeigt (nicht generisch "Abteilung") + +## Popup (Compose-Fenster) +- [ ] Vorlagen-Popup öffnet, zeigt alle Vorlagen +- [ ] Template-Insertion funktioniert (HTML wird korrekt eingefügt) +- [ ] Prefix-Dropdown ("Textbaustein voranstellen") funktioniert + +## UX-Elemente +- [ ] Toast-Benachrichtigungen erscheinen bei Sync/Push/Pull/Fehler +- [ ] Spinner bei Sync-Operationen sichtbar +- [ ] Custom Delete-Modal statt browser confirm() +- [ ] Offline-Banner erscheint bei fehlender Verbindung +- [ ] Collapsible-Sections sind visuell klickbar (Hintergrund + Hover) +- [ ] Template-Name Inline-Validierung (leer + Duplikat) +- [ ] Checkbox-Klick auf Template-Name toggelt Checkbox + +## API / Gitea +- [ ] `toFilename()` behält Leerzeichen und Groß-/Kleinschreibung +- [ ] `_benutzer/`, `_config/` werden aus Department-Liste gefiltert +- [ ] Persönliche Vorlagen syncen in `_benutzer/{email}/` +- [ ] `checkRemoteShas()` inkludiert persönlichen Ordner diff --git a/lib/gitea-sync.js b/lib/gitea-sync.js index 53c5288..a346d99 100644 --- a/lib/gitea-sync.js +++ b/lib/gitea-sync.js @@ -544,7 +544,8 @@ class SyncManager { await browser.identities.update(identity.id, { signature: fullSig, - signatureIsPlainText: false + signatureIsPlainText: false, + attachSignature: false }); updated++; } @@ -784,6 +785,19 @@ async function updateSyncHashes() { for (const t of templates) { data.tpl[t.id] = simpleHashBg(t.content || ''); } + + // Also update signature hashes from Thunderbird identities + try { + const accounts = await browser.accounts.list(); + data.sig = data.sig || {}; + for (const account of accounts) { + const identities = await browser.identities.list(account.id); + for (const identity of identities) { + data.sig[identity.email.toLowerCase()] = simpleHashBg(identity.signature || ''); + } + } + } catch (_) {} + await browser.storage.local.set({ [HASH_STORAGE_KEY_BG]: data }); } diff --git a/templates-reply-hotel.xpi b/templates-reply-hotel.xpi index 67c21da28fbe0c2ccd0f5cba9af0b09a13fdd050..309220489bc5fddd7719ee028554f65d4b3abbe9 100644 GIT binary patch delta 14325 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 H|Hb}4)bx}S delta 14276 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 YyH}I}hxpGg5&k{f;6OkJzyA~dKfLXO$p8QV diff --git a/templates_options/templates_options.js b/templates_options/templates_options.js index 6c4399e..6456c4c 100644 --- a/templates_options/templates_options.js +++ b/templates_options/templates_options.js @@ -1193,7 +1193,8 @@ document.getElementById('sig-save-button').addEventListener('click', async () => await browser.identities.update(identityId, { signature: fullSignature, - signatureIsPlainText: false + signatureIsPlainText: false, + attachSignature: false }); if (identity) identity.signature = fullSignature; @@ -1674,17 +1675,30 @@ window.addEventListener('load', async () => { loadSyncConfig(); await loadIdentities(); + // Always init sig hashes from current identities + if (allIdentities.length > 0) { + for (const id of allIdentities) { + sigSyncedHashes[id.email.toLowerCase()] = simpleHash(id.signature || ''); + } + saveSyncHashes(); + } + updateSigSyncIndicator(); + checkForServerUpdates(); setInterval(checkForServerUpdates, 30000); - // Auto-refresh UI when background sync updates hashes (fires after templates + hashes are both written) + // Auto-refresh UI when background sync updates storage + let refreshing = false; browser.storage.onChanged.addListener(async (changes, area) => { - if (area !== 'local') return; - if (changes[HASH_STORAGE_KEY]) { + if (area !== 'local' || refreshing) return; + if (changes[HASH_STORAGE_KEY] || changes[TEMPLATE_STORAGE_KEY]) { + refreshing = true; await loadSyncHashes(); const templates = await getTemplates(); renderTemplates(templates); updateTplSyncIndicator(); + updateSigSyncIndicator(); + refreshing = false; } }); });