mana-swift-core/Sources/ManaCore/Auth/SharedKeychainGroup.swift
Till JS 573c93c104 fix(auth): ManaSharedKeychainGroup mit explizitem Team-ID-Prefix
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.<app>" 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) <noreply@anthropic.com>
2026-05-18 22:09:45 +02:00

41 lines
1.7 KiB
Swift

import Foundation
/// Kanonische Cross-App-Keychain-Group für alle nativen mana-e.V.-Apps.
///
/// Apps, die diese Group im `keychain-access-groups` Entitlement haben
/// und denselben String als `ManaAppConfig.keychainAccessGroup`
/// liefern, teilen ihre Auth-Tokens auf demselben Device. Ein Login in
/// einer App bedeutet damit: alle anderen mana-Apps starten direkt im
/// `.signedIn`-Status.
///
/// **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).
///
/// 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.
public func manaSharedKeychainAccessGroup() -> String {
ManaSharedKeychainGroup
}