diff --git a/Sources/Packages/Sources/SecretKit/Erasers/AnySecretStore.swift b/Sources/Packages/Sources/SecretKit/Erasers/AnySecretStore.swift index 9e94618..08123a1 100644 --- a/Sources/Packages/Sources/SecretKit/Erasers/AnySecretStore.swift +++ b/Sources/Packages/Sources/SecretKit/Erasers/AnySecretStore.swift @@ -61,13 +61,13 @@ open class AnySecretStore: SecretStore, @unchecked Sendable { public final class AnySecretStoreModifiable: AnySecretStore, SecretStoreModifiable, @unchecked Sendable { - private let _create: @Sendable (String, Attributes) async throws -> SecretType + private let _create: @Sendable (String, Attributes) async throws -> AnySecret private let _delete: @Sendable (AnySecret) async throws -> Void private let _update: @Sendable (AnySecret, String, Attributes) async throws -> Void private let _supportedKeyTypes: @Sendable () -> [KeyType] public init(_ secretStore: SecretStoreType) where SecretStoreType: SecretStoreModifiable { - _create = { try await secretStore.create(name: $0, attributes: $1) as! SecretType } + _create = { AnySecret(try await secretStore.create(name: $0, attributes: $1)) } _delete = { try await secretStore.delete(secret: $0.base as! SecretStoreType.SecretType) } _update = { try await secretStore.update(secret: $0.base as! SecretStoreType.SecretType, name: $1, attributes: $2) } _supportedKeyTypes = { secretStore.supportedKeyTypes } diff --git a/Sources/Packages/Sources/SecureEnclaveSecretKit/SecureEnclaveStore.swift b/Sources/Packages/Sources/SecureEnclaveSecretKit/SecureEnclaveStore.swift index b94dc5e..737ac5d 100644 --- a/Sources/Packages/Sources/SecureEnclaveSecretKit/SecureEnclaveStore.swift +++ b/Sources/Packages/Sources/SecureEnclaveSecretKit/SecureEnclaveStore.swift @@ -23,7 +23,11 @@ extension SecureEnclave { @MainActor public init() { loadSecrets() Task { - for await _ in DistributedNotificationCenter.default().notifications(named: .secretStoreUpdated) { + for await note in DistributedNotificationCenter.default().notifications(named: .secretStoreUpdated) { + guard Constants.notificationToken != (note.object as? String) else { + // Don't reload if we're the ones triggering this by reloading. + return + } reloadSecrets() } } @@ -93,7 +97,13 @@ extension SecureEnclave { } @MainActor public func reloadSecrets() { - reloadSecretsInternal(notifyAgent: false) + let before = secrets + secrets.removeAll() + loadSecrets() + if secrets != before { + NotificationCenter.default.post(name: .secretStoreReloaded, object: self) + DistributedNotificationCenter.default().postNotificationName(.secretStoreUpdated, object: Constants.notificationToken, deliverImmediately: true) + } } // MARK: SecretStoreModifiable @@ -194,18 +204,6 @@ extension SecureEnclave { extension SecureEnclave.Store { - @MainActor private func reloadSecretsInternal(notifyAgent: Bool = true) { - let before = secrets - secrets.removeAll() - loadSecrets() - if secrets != before { - NotificationCenter.default.post(name: .secretStoreReloaded, object: self) - if notifyAgent { - DistributedNotificationCenter.default().postNotificationName(.secretStoreUpdated, object: nil, deliverImmediately: true) - } - } - } - /// Loads all secrets from the store. @MainActor private func loadSecrets() { let queryAttributes = KeychainDictionary([ @@ -286,6 +284,7 @@ extension SecureEnclave.Store { enum Constants { static let keyClass = kSecClassGenericPassword as String static let keyTag = Data("com.maxgoedjen.secretive.secureenclave.key".utf8) + static let notificationToken = UUID().uuidString } struct UnsupportedAlgorithmError: Error {} diff --git a/Sources/Secretive/Preview Content/PreviewStore.swift b/Sources/Secretive/Preview Content/PreviewStore.swift index 8897023..8c65f80 100644 --- a/Sources/Secretive/Preview Content/PreviewStore.swift +++ b/Sources/Secretive/Preview Content/PreviewStore.swift @@ -96,7 +96,8 @@ extension Preview { } - func create(name: String, attributes: Attributes) throws { + func create(name: String, attributes: Attributes) throws -> Secret { + fatalError() } func delete(secret: Preview.Secret) throws {