Skip to content

Releases: RainerNeu1012/itdatex-mailguard

MailGuard 0.9.0 — Windows Desktop-Client Companion

Choose a tag to compare

@RainerNeu1012 RainerNeu1012 released this 09 Jul 16:58

Companion-Release zur ersten Version des MailGuard Windows-Clients
(itdatex-mailguard-desktop v0.1.0).
Alle Änderungen sind Backend- und Portal-Voraussetzungen, damit derselbe
Portal-Bundle-Code in einer nativen Tauri-Shell laufen kann.

Neue Endpoints & Persistenz

  • GET /me/notifications (since_id/unread_only), GET /me/notifications/unread-count, POST /me/notifications/mark-seen
  • Neue Tabelle mg_notifications. Server persistiert jetzt jedes User-relevante Ereignis (Phishing erkannt, Auto-Quarantäne, Undo-Ablauf, Newsletter-Bounce). FCM-Push bleibt unverändert und läuft parallel.

Portal-UI

  • 🔔-Bell im Header mit Unread-Badge und Dropdown der letzten zehn Ereignisse.
  • Dashboard-Card „🖥 Desktop-Client" mit Autostart-Toggle — nur sichtbar wenn im Windows-Client geladen.
  • Poll läuft 60 s aktiv / 5 min im Hintergrund. Kein Service-Worker, keine Web-Push-Infrastruktur nötig.

Auth für externe Clients

  • Neuer authProvider-Hook in api.js. Wenn gesetzt, holt die Portal-SPA den Bearer-Token dort (Windows-Client: aus dem Credential Manager) statt aus localStorage. 401 triggert transparenten /mobile/refresh + Retry. Web + Mobile unverändert.
  • Push-Plattform-Enum erweitert um windows/macos/linux.
  • CORS-Allowlist um tauri://localhost und https://tauri.localhost erweitert.

Migration

  • DB-Schema-Bump 15 → 16. dbDelta ist idempotent, mg_notifications wird beim nächsten migrate_db angelegt (indexiert auf (customer_id, read_at, id) und (customer_id, created_at)).
  • Keine Änderung an bestehenden Tabellen, kein Datenverlust-Risiko.

Bugfixes

  • Router mappt /index.html jetzt auf home statt „not-found" (Tauri-Shell öffnet die App mit dieser URL).

Vollständige Details siehe CHANGELOG.md.

MailGuard 0.8.9 — Newsletter-Abmeldung Robustness + Sender vernichten

Choose a tag to compare

@RainerNeu1012 RainerNeu1012 released this 09 Jul 17:07

Fokus dieses Release: Newsletter-Abmeldung ist deutlich verlässlicher
und der neue „Sender vernichten"-Flow entfernt einen Absender
komplett aus dem Postfach in einem Klick.

Neu

  • „Sender vernichten" — kombinierter Ein-Klick-Flow: best-effort
    Abmeldung + Blacklist-Regel + IMAP-EXPUNGE aller bestehender Mails.
    Kein Papierkorb, kein Undo. Sichtbar als roter Button auf der
    Newsletter-Seite und in der gruppierten Inbox-Ansicht. Type-in-
    Bestätigung (VERNICHTEN eintippen) sowohl im Frontend als auch am
    REST-Endpoint gegen Muscle-Memory-Klicks.
  • Auto-DSN-Poll für mailto-Abmeldungen. Neuer WP-Cron
    itdatex_mailguard_unsub_poll (alle 10 Min.) verfolgt den Bounce-
    Status offener mailto-Abmeldungen der letzten 48 h automatisch.
    Bounces landen ohne User-Klick in Historie + Notify-Hook. Schedule
    wird beim plugins_loaded selbst-heilend nachgezogen, kein DB-Bump.
  • Neue Public-API: UnsubService::execute_for_sender,
    UnsubService::eradicate_sender, Subscriptions::messages_for_sender,
    PurgeService::block_sender, REST POST /subscriptions/eradicate.

Verbessert

  • Antiphish\Client retryt transiente Fehler (HTTP 429, 5xx, Netz-/
    Timeout-Fehler) genau einmal mit 400 ms Backoff. mailto-execute
    bleibt bewusst ohne Retry — sonst gingen doppelte Abmelde-Mails raus.
  • Idempotenz-Guard: schon erfolgreich abgemeldete Mails hitten die
    API nicht mehr erneut. Doppelklick-Race per Transient-Lock (60 s,
    per Kunde+Message) abgesichert — verhindert duplizierte
    mg_unsubs-Zeilen.
  • Bulk-Abmeldung mit Fallback: fällt bei toten/fehlenden Endpoints
    auf bis zu 5 ältere Absender-Mails zurück, statt sofort aufzugeben.
    Ältere Kampagnen haben häufiger noch gültige Tokens.
  • Klare REST-Statuscodes: already/ok/needs_manual/
    endpoints_dead → 200, not_found → 404, in_progress (Lock) →
    409, no_options → 422, sonst 502. UI kann echte Backend-Ausfälle
    von „Provider spielt nicht mit" unterscheiden.
  • Portal-UI zeigt konkrete Fehlerursachen (attempts[]/detail)
    statt „Status: unbekannt". Der endpoints_dead-Zweig ist jetzt auch
    auf der Newsletter-Seite verfügbar (nicht mehr nur in Inbox).

Migration

  • Keine DB-Änderung. Kein Datenverlust-Risiko.

Vollständige Details siehe CHANGELOG.md.

v0.8.8 — Manual plan assignment + force-verify email

Choose a tag to compare

@RainerNeu1012 RainerNeu1012 released this 06 Jul 12:34

[0.8.8] – 2026-07-06

Added

  • Manuelle Plan-Freischaltung in der WP-Admin-Endkundenliste. Neue
    Row-Action „Plan" öffnet einen Editor, in dem der Site-Owner einem
    Kunden einen Plan (free/solo/plus/pro/test) und ein optionales
    Ablaufdatum (plan_grace_until) ohne Stripe zuweisen kann — für
    Comp-Konten, Rechnungskunden oder Fixes nach verpassten Webhooks.
  • 1-Klick „E-Mail verifizieren" in der Endkundenliste, sichtbar
    nur bei noch nicht verifizierten Konten. Setzt email_verified=1
    und status=active.
  • Neue Plan-Spalte in der Endkundenliste zeigt Slug + Grace-Datum.
  • Public API: Customer\Account::set_plan_manual(int $id, array $plan, ?int $grace_ts).
    Respektiert den bestehenden cloud_consent_at — ohne Consent bleibt
    llm_enabled off, selbst wenn der Plan es erlauben würde
    (identische Guard-Logik wie im Stripe-Webhook).

Warnhinweis in der UI

  • Wenn ein Kunde bereits ein Stripe-Abo hat (stripe_subscription_id
    gesetzt), warnt der Plan-Editor, dass die manuelle Zuweisung beim
    nächsten Webhook wieder überschrieben wird.

📖 Full changelog: https://github.com/RainerNeu1012/itdatex-mailguard/blob/master/CHANGELOG.md

v0.8.7 — Portal fixes + Web-Session revocation + Mobile-App track

Choose a tag to compare

@RainerNeu1012 RainerNeu1012 released this 06 Jul 12:20

📖 Full changelog: https://github.com/RainerNeu1012/itdatex-mailguard/blob/master/CHANGELOG.md

Release v0.8.7

Bugfix follow-up to 0.8.6, plus everything 0.8.6 shipped
(there was no v0.8.6 tag, so this covers both).

Portal / Devices page

  • fix: register 'devices' in router.js so the Geräte header button
    actually routes to the page (was hitting not-found)
  • fix: self-revoke redirect now uses portalUrl('login') — was
    resolving relative and landing on /portal/devices/login

Web-session revocation (0.8.6)

  • New mg_web_sessions table tracks cookie sessions per JTI, UA, IP.
  • Token::verify_session checks a wp_options JTI blacklist; auto-
    prunes expired entries at each revoke.
  • Session::start inserts a tracking row, ::destroy revokes it.
  • REST GET/DELETE /me/web-sessions.
  • Devices.jsx shows Browser-Sessions with 'this browser' badge,
    cross-revoke and self-revoke both wired end-to-end.

Mobile-app track (0.8.6)

  • Long-lived Bearer tokens with refresh rotation (Customer\ApiToken
    • mg_api_tokens).
  • CORS allowlist scoped to the plugin REST namespace (Rest\Cors).
  • FCM v1 push provider (Notify\PushService/Device/Hooks +
    mg_push_devices). Silent no-op until the FCM service-account JSON
    is entered in admin settings.
  • Notify hooks fire on dangerous verdict, auto-quarantine, undo
    expiry (daily cron), and unsub bounce.
  • IMAP folder auto-sync per pull.

Purge fix (0.8.4)

  • Bulk-delete on grouped-by-sender no longer times out (batched
    connection + move-to-quarantine + safe expunge).
  • Legacy quarantine actions with target_uid=0 and no Message-ID
    now soft-purge instead of hard-failing on HTTP 502.

Schema bumped to v14 (dbDelta idempotent).