From 573c93c104acffb7debb85c85a78591670c16422 Mon Sep 17 00:00:00 2001 From: Till JS Date: Mon, 18 May 2026 22:09:45 +0200 Subject: [PATCH] fix(auth): ManaSharedKeychainGroup mit explizitem Team-ID-Prefix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: Sec-Framework gibt -34018 (errSecMissingEntitlement) beim ersten Keychain-Write — auf iPhone UND Mac, in werdrobe + nutriphi + vermutlich allen 12 Apps mit der heutigen Migration. Root-Cause: Apple's `Security.framework` macht einen exakten String-Match zwischen `kSecAttrAccessGroup` (was Swift übergibt) und dem `keychain-access-groups`-Entitlement des Bundles (das `$(AppIdentifierPrefix)` zur Build-Zeit auf den Team-Prefix expandiert). - Bundle-Entitlement: "QP3GLU8PH3.ev.mana.session" (mit Prefix) - Swift-Code: "ev.mana.session" (ohne Prefix) - → no match → -34018 Vor meiner Migration hatten die Apps explizit "QP3GLU8PH3. ev.mana." als String (mit Prefix), beobachtbar im alten herbatrium/wordeck/nutriphi-AppConfig. Mein Migrations-Skript hat das Prefix wegrationalisiert ohne zu prüfen. Fix: `ManaSharedKeychainGroup` = "QP3GLU8PH3.ev.mana.session" hardcoded. Plus `ManaSharedKeychainGroupSuffix` = "ev.mana.session" für Konstantanbedarf in Entitlement-Files (wo $(AppIdentifierPrefix) zur Build-Zeit vorgestellt wird). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../ManaCore/Auth/SharedKeychainGroup.swift | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/Sources/ManaCore/Auth/SharedKeychainGroup.swift b/Sources/ManaCore/Auth/SharedKeychainGroup.swift index 7bec138..709cf47 100644 --- a/Sources/ManaCore/Auth/SharedKeychainGroup.swift +++ b/Sources/ManaCore/Auth/SharedKeychainGroup.swift @@ -8,29 +8,34 @@ import Foundation /// einer App bedeutet damit: alle anderen mana-Apps starten direkt im /// `.signedIn`-Status. /// -/// Wird der Wert geändert, müssen ALLE Apps in dieser Liste: -/// - `project.yml` `keychain-access-groups` Entitlement aktualisieren -/// - `AppConfig.keychainAccessGroup` aktualisieren -/// - **plus** Apple-Dev-Portal-Capability "Keychain Sharing" mit -/// dem neuen Group-Namen aktivieren (sonst OSStatus -34018 -/// errSecMissingEntitlement beim ersten Token-Write) +/// **Mit Team-ID-Prefix `QP3GLU8PH3.`:** Apple's `Security.framework` +/// macht einen exakten String-Match zwischen `kSecAttrAccessGroup` +/// (was Swift hier übergibt) und dem `keychain-access-groups`- +/// Entitlement des Bundles (das `$(AppIdentifierPrefix)` zur Build- +/// Zeit auf den Team-Prefix expandiert). Ohne Prefix in der Konstante +/// matched Sec-Framework nicht und gibt `errSecMissingEntitlement` +/// (OSStatus -34018) zurück — beobachtet 2026-05-18 auf werdrobe + +/// nutriphi (iPhone + Mac). /// -/// Apps, die Cross-App-SSO **nicht** wollen (z.B. wenn der Login -/// bewusst getrennt bleiben soll), setzen `keychainAccessGroup: nil` -/// und tragen kein `keychain-access-groups` Entitlement. -public let ManaSharedKeychainGroup = "ev.mana.session" +/// Pendant zum entitlement-Eintrag in `project.yml`: +/// ``` +/// keychain-access-groups: +/// - $(AppIdentifierPrefix)ev.mana.session +/// ``` +/// +/// Apps, die Cross-App-SSO **nicht** wollen, setzen +/// `keychainAccessGroup: nil` und tragen kein +/// `keychain-access-groups` Entitlement. +public let ManaSharedKeychainGroup = "QP3GLU8PH3.ev.mana.session" + +/// Suffix-Variante ohne Team-Prefix — für Konstanten-Bedarf in +/// Entitlement-Files, wo `$(AppIdentifierPrefix)` zur Build-Zeit +/// vorgestellt wird. +public let ManaSharedKeychainGroupSuffix = "ev.mana.session" /// Convenience-Hilfe für SwiftUI-Apps: liefert den Wert, den /// `ManaAppConfig.keychainAccessGroup` bekommen muss, damit Cross-App- -/// SSO greift. iOS resolved den String automatisch über die -/// Team-ID des installierten Profiles — `$(AppIdentifierPrefix)` muss -/// im Entitlement-File stehen, im Code reicht der bloße Name. -/// -/// Pendant zum entitlement-Eintrag: -/// ``` -/// keychain-access-groups: -/// - $(AppIdentifierPrefix)ev.mana.session -/// ``` +/// SSO greift. public func manaSharedKeychainAccessGroup() -> String { ManaSharedKeychainGroup }