diff --git a/CHANGELOG.md b/CHANGELOG.md index c265fbf..e8c6805 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,12 @@ Version numbers follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html - **`update_gdpr.sh`** — standalone CLI/cron equivalent of the GUI update: fetch + fast-forward-only merge with auto-stash of local hotfixes, dependency reinstall only when `requirements.txt` changed, and a `systemctl restart` if a `gdprscanner.service` unit exists (override with `GDPR_SERVICE`). `./update_gdpr.sh --check` reports pending commits without changing anything; safe to run from cron (quiet no-op when already up to date). +### Fixed + +- **Delta token status hid the source count** — the "Tokens saved" line under the Δ Delta scan toggle always showed the bare translation ("Tokens gemt") because the source count only existed in the JS fallback string, which is ignored whenever the lang key exists. The translations now carry a `{n}` placeholder ("Tokens gemt for {n} kilde(r)") substituted in `checkDeltaStatus()`, and the row gained a "?" hint bubble explaining what the saved change-tokens do and that "Clear tokens" forces the next scan to be a full scan. + +- **Stale data-file paths in README** — delta tokens were documented as `~/.gdpr_scanner_delta.json` and the SMTP password/Fernet key as `~/.gdpr_scanner_smtp.json` / `~/.gdpr_scanner_machine_id`; the actual locations have long been `~/.gdprscanner/delta.json`, `~/.gdprscanner/smtp.json`, and `~/.gdprscanner/machine_id`. + --- ## [1.7.0] — 2026-06-10 diff --git a/README.md b/README.md index e4ea1e4..21c9cf5 100644 --- a/README.md +++ b/README.md @@ -227,7 +227,7 @@ Configure email delivery in **Settings → Email report**. Click **Save** to sto | SMTP host | e.g. `smtp.office365.com`, `smtp.gmail.com` | | Port | `587` for STARTTLS (default), `465` for SMTPS/SSL | | Username | SMTP login — usually your sender email address | -| Password | Saved to `~/.gdpr_scanner_smtp.json` (permissions 600). Encrypted at rest using Fernet — key in `~/.gdpr_scanner_machine_id` (chmod 0o600, never share) | +| Password | Saved to `~/.gdprscanner/smtp.json` (permissions 600). Encrypted at rest using Fernet — key in `~/.gdprscanner/machine_id` (chmod 0o600, never share) | | Graph API | When connected to M365, email is sent via `/me/sendMail` (delegated) or `/users/{sender}/sendMail` (app mode) — no SMTP password needed. Requires `Mail.Send` Graph permission with admin consent. | | From address | Sender address (defaults to username if blank) | | STARTTLS | Enable STARTTLS on port 587 (recommended) | @@ -273,7 +273,7 @@ Delta scan uses the Microsoft Graph `/delta` API (M365) and the Google Drive **C 1. Run one **full scan** first (Delta checkbox off) — this establishes baseline delta tokens 2. Tick **Δ Delta scan** and run again — only items added, modified, or deleted since the previous scan are fetched and CPR-scanned -3. Delta tokens are saved automatically to `~/.gdpr_scanner_delta.json` after each successful scan +3. Delta tokens are saved automatically to `~/.gdprscanner/delta.json` after each successful scan 4. To force a full rescan, click **Clear tokens** under the checkbox (or delete the file) Delta tokens are stored **per-source**: diff --git a/lang/da.json b/lang/da.json index 5f9e6da..c3b80bb 100644 --- a/lang/da.json +++ b/lang/da.json @@ -348,8 +348,9 @@ "m365_resuming": "Genoptager — springer allerede skannede elementer over…", "m365_opt_delta": "Delta-scanning", "m365_opt_delta_hint": "Kun ændrede elementer (efter første fulde scanning)", - "m365_delta_tokens_saved": "Tokens gemt", + "m365_delta_tokens_saved": "Tokens gemt for {n} kilde(r)", "m365_delta_clear": "Ryd tokens", + "m365_delta_tokens_hint": "Gemte ændringstokens gør, at delta-scanninger kun henter elementer ændret siden sidste scanning. Ryd tokens tvinger næste scanning til at være en fuld scanning.", "m365_delta_cleared": "Delta-tokens ryddet — næste scanning bliver fuld scanning.", "m365_delta_mode": "Delta-tilstand — henter kun ændrede elementer…", "m365_smtp_title": "✉ Send rapport", diff --git a/lang/de.json b/lang/de.json index 5c3881c..9daea0e 100644 --- a/lang/de.json +++ b/lang/de.json @@ -348,8 +348,9 @@ "m365_resuming": "Fortsetzen — bereits gescannte Elemente werden übersprungen…", "m365_opt_delta": "Delta-Scan", "m365_opt_delta_hint": "Nur geänderte Elemente (nach erstem Vollscan)", - "m365_delta_tokens_saved": "Tokens gespeichert", + "m365_delta_tokens_saved": "Tokens für {n} Quelle(n) gespeichert", "m365_delta_clear": "Tokens löschen", + "m365_delta_tokens_hint": "Gespeicherte Änderungstokens lassen Delta-Scans nur Elemente abrufen, die seit dem letzten Scan geändert wurden. Tokens löschen erzwingt beim nächsten Scan einen Vollscan.", "m365_delta_cleared": "Delta-Tokens gelöscht — nächster Scan wird ein Vollscan.", "m365_delta_mode": "Delta-Modus — nur geänderte Elemente werden abgerufen…", "m365_smtp_title": "✉ Bericht senden", diff --git a/lang/en.json b/lang/en.json index f34789c..42b72e7 100644 --- a/lang/en.json +++ b/lang/en.json @@ -348,8 +348,9 @@ "m365_resuming": "Resuming — skipping already-scanned items…", "m365_opt_delta": "Delta scan", "m365_opt_delta_hint": "Changed items only (after first full scan)", - "m365_delta_tokens_saved": "Tokens saved", + "m365_delta_tokens_saved": "Tokens saved for {n} source(s)", "m365_delta_clear": "Clear tokens", + "m365_delta_tokens_hint": "Saved change-tokens let delta scans fetch only items modified since the last scan. Clear tokens forces the next scan to be a full scan.", "m365_delta_cleared": "Delta tokens cleared — next scan will be a full scan.", "m365_delta_mode": "Delta mode — fetching changed items only…", "m365_smtp_title": "✉ Email report", diff --git a/static/js/scan.js b/static/js/scan.js index 09bcc81..329b70d 100644 --- a/static/js/scan.js +++ b/static/js/scan.js @@ -188,8 +188,7 @@ async function checkDeltaStatus() { const row = document.getElementById('deltaStatusRow'); const txt = document.getElementById('deltaStatusText'); if (d.exists) { - const src = d.count === 1 ? '1 source' : `${d.count} sources`; - txt.textContent = t('m365_delta_tokens_saved', `Tokens saved for ${src}`); + txt.textContent = t('m365_delta_tokens_saved', 'Tokens saved for {n} source(s)').replace('{n}', d.count); row.style.display = 'flex'; row.style.alignItems = 'center'; } else { diff --git a/templates/index.html b/templates/index.html index 79d74c6..bb72bf5 100644 --- a/templates/index.html +++ b/templates/index.html @@ -110,6 +110,7 @@ document.addEventListener('DOMContentLoaded', applyI18n);