3-Phasen-Wizard für 2FA-Enrollment + Single-Step-Sheet für Disable. Setzt mana-swift-core ≥ 1.4.0 voraus. ManaTwoFactorEnrollView: 1. Passwort-Re-Auth → server liefert otpauth-URI + Backup-Codes 2. QR-Code-Display (CoreImage.CIFilter.qrCodeGenerator) + 6-stellige Test-Code-Eingabe 3. Backup-Codes-Liste mit Copy-to-Clipboard ManaTwoFactorDisableView: - Re-Auth via Passwort, destructive-Button, .done-Konfirmation 5 neue Tests, 44/44 grün. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5.4 KiB
Changelog
Alle Änderungen werden hier dokumentiert. Format orientiert an Keep a Changelog, Versionierung nach Semver.
[Unreleased]
[0.4.0] — 2026-05-14
Minor — 2FA-Enrollment-UI (Mini-Sprint B). Setzt mana-swift-core ≥ 1.4.0 voraus.
Neu
ManaTwoFactorEnrollView+TwoFactorEnrollmentViewModel— 3-Phasen-Wizard:- Passwort eingeben (Re-Auth)
- QR-Code (via
CoreImage.CIFilter.qrCodeGenerator, plattform- unabhängig auf iOS+macOS) scannen + 6-stelligen Test-Code eingeben - Backup-Codes anzeigen + Copy-to-Clipboard
ManaTwoFactorDisableView— Single-Step-Sheet, Re-Auth via Passwort + destruktiver Bestätigungs-Button.
Tests
- 5 neue Tests für Enroll-VM (Success, falsches PW, canSubmitVerify 6-Ziffern-Guard, confirmVerify Phase-Wechsel, backupCodes-Accessor).
- 44/44 grün.
[0.3.0] — 2026-05-14
Minor — ManaTwoFactorChallengeView für 2FA-Login. Setzt
mana-swift-core ≥ 1.3.0 voraus (Status .twoFactorRequired).
Neu
ManaTwoFactorChallengeView+TwoFactorChallengeViewModel— 6-stelliger TOTP-Code-Input (Number-Pad auf iOS), Fallback auf Backup-Codes via Toggle, "Abbrechen" routet viaauth.signOut(keepGuestMode:)zurück zum Login.LoginViewModel.Status.twoFactorRequired(email:)als neuer Case.ManaLoginViewschaltet bei.twoFactorRequiredautomatisch aufManaTwoFactorChallengeViewum (analog zu.emailNotVerified).
Tests
- 6 neue Tests für
TwoFactorChallengeViewModel: canSubmit-Guards (TOTP 6 Ziffern, Backup beliebig), toggleMode-State-Reset, submit bei Erfolg/Fehler, Backup-Code-Routing. - 39/39 grün.
[0.2.0] — 2026-05-13
Minor — Action-Level-Gate für Apps mit Guest-/Login-optional-Modus.
Komplett additiv; braucht mana-swift-core ≥ 1.2.0.
ManaAuthUI — neu: ManaAuthGate
ManaAuthGate—@Observable-State-Maschine, die eine Aktion erst laufen lässt, wenn der User eingeloggt ist. Wenn nicht, wird das Sign-In-Sheet aufgeklappt und die Aktion gemerkt; nach erfolgreichem Sign-In läuft sie automatisch.- Zwei
require-Overloads: synchron (() -> Void) und async (() async -> Void). Konsumenten schreibengate.require { ... }ohne sich um das Gate-Lifecycle zu kümmern. ManaAuthGateModifier/View.manaAuthGate(_:signIn:)— hängt das Sign-In-Sheet an einen Root-View und beobachtetauth.status. Wechsel auf.signedInschließt das Sheet und löst die Pending- Aktion aus; manuelles Dismiss verwirft die Pending-Aktion.lastReasonals optionaler Telemetrie-Hint prorequire-Call.
Konvention
Native-Apps sollen mana-swift-core v1.2.0 + Guest-Mode + diesen Gate
als Standardweg nutzen. Pattern für Cards/Manaspur/Memoro:
- Beim App-Start:
bootstrap(), dann bei.signedOut→enterGuestMode(). - Root-View zeigt immer App-Inhalte; nie eine Vollbild-Login-Wall.
- Aktionen, die einen Account brauchen, werden in
gate.require { ... }gewrappt — Login wird zur Inline-Eskalation statt zum App-Block.
Memoro hat dieses Muster informell schon umgesetzt (ContentView ohne Hard-Gate). Cards + Manaspur ziehen mit ihren nächsten Releases nach.
Tests
- 7 neue Tests für
ManaAuthGate: sofortiger Run bei.signedIn, Defer bei.signedOut/.guest,resolvePendingnach Sign-In,cancelPending,lastReason-Tracking.
[0.1.0] — 2026-05-13
Phase 2 aus dem Native-Auth-Vollausbau-Plan (Option A, siehe
../mana/docs/MANA_SWIFT.md). Entstanden weil drei Apps fast-byte-
identische LoginView.swift-Dateien hatten und Sign-Up/Forgot-PW
komplett fehlten.
ManaAuthUI (neu)
ManaBrandConfig— App-injiziertes Bündel aus appName, tagline, primary/surface/background/error-Colors. Apps liefern hier ihr Theme (z.B. forest für Cards/Manaspur, default-mana für Memoro).- Base-Components:
ManaAuthScaffold,ManaPrimaryButton,ManaTextField,ManaSecureField— geteilte Bausteine, alle brand-aware. ManaLoginView+LoginViewModel— Email/PW-Login mit Sign-Up- und Forgot-PW-Buttons. Bei.emailNotVerifiedautomatisch insManaEmailVerifyGateViewumgeleitet (Resend-Mail-Button).ManaSignUpView+SignUpViewModel— Registrierung mit Email/Name/Passwort. Nach Submit: Bestätigungs-Mail-Hinweis-Screen.ManaEmailVerifyGateView— wenn Login.emailNotVerifiedwarf, bietet "Bestätigungs-Mail erneut senden".ManaForgotPasswordView+ForgotPasswordViewModel— Reset-Mail anfordern. Server antwortet immer 200 (keine User-Enumeration), UI meldet generisch.ManaResetPasswordView+ResetPasswordViewModel— neues Passwort setzen mit Token aus Reset-Mail. Wird aus dem Universal-Link-Handler der App aufgerufen.ManaChangeEmailView,ManaChangePasswordView,ManaDeleteAccountView— Account-Bausteine für die AccountView der App.ManaDeleteAccountViewist App-Store-Pflicht (Guideline 5.1.1(v)) für jede App mit Account-Erstellung.
Tests
- ViewModel-Tests via URLProtocol-Mock für jeden Auth-Flow.
- Brand-Config-Defaults.
Bekannte Einschränkungen
ManaChangeEmailView/ManaChangePasswordView/ManaDeleteAccountViewfunktionieren erst nach Phase-3-Server-PR (Bearer-Plugin inmana-auth). UI ist fertig, Wire ist fertig, Server muss nachziehen.- 2FA, Magic-Link, Passkey-Flows nicht enthalten. Folgen in v0.2.0 zusammen mit ManaCore v1.2.0 und dem Server-PR.