diff --git a/SecretKit/Secret.swift b/SecretKit/Secret.swift index a4c40b5..1d4fe0a 100644 --- a/SecretKit/Secret.swift +++ b/SecretKit/Secret.swift @@ -1,6 +1,35 @@ -public protocol Secret: Identifiable, Hashable { +public protocol Secret: Identifiable { var name: String { get } var publicKey: Data { get } } + + + +public struct AnySecret: Secret { + + fileprivate let _id: () -> AnyHashable + fileprivate let _name: () -> String + fileprivate let _publicKey: () -> Data + + public init(_ secret: T) where T: Secret { + _id = { secret.id as AnyHashable } + _name = { secret.name } + _publicKey = { secret.publicKey } + } + + public var id: AnyHashable { + return _id() + } + + public var name: String { + return _name() + } + + public var publicKey: Data { + return _publicKey() + } + +} + diff --git a/SecretKit/SecretStore.swift b/SecretKit/SecretStore.swift index d944836..8adc893 100644 --- a/SecretKit/SecretStore.swift +++ b/SecretKit/SecretStore.swift @@ -16,3 +16,37 @@ extension NSNotification.Name { static let secretStoreUpdated = NSNotification.Name("com.maxgoedjen.Secretive.secretStore.updated") } + +public class AnySecretStore: SecretStore { + + fileprivate let _name: () -> String + fileprivate let _secrets: () -> [AnySecret] + fileprivate let _sign: (Data, AnySecret) throws -> Data + fileprivate let _delete: (AnySecret) throws -> Void + + public init(_ secretStore: T) where T: SecretStore { + _name = { secretStore.name } + _secrets = { secretStore.secrets.map { AnySecret($0) } } + _sign = { try secretStore.sign(data: $0, with: $1 as! T.SecretType) } + _delete = { try secretStore.delete(secret: $0 as! T.SecretType) } + } + + public var name: String { + return _name() + } + + public var secrets: [AnySecret] { + return _secrets() + } + + public func sign(data: Data, with secret: AnySecret) throws -> Data { + try _sign(data, secret) + } + + public func delete(secret: AnySecret) throws { + try _delete(secret) + } + +} + + diff --git a/SecretKit/SecureEnclave/SecureEnclaveSecret.swift b/SecretKit/SecureEnclave/SecureEnclaveSecret.swift index 3ab9f5f..33f65e4 100644 --- a/SecretKit/SecureEnclave/SecureEnclaveSecret.swift +++ b/SecretKit/SecureEnclave/SecureEnclaveSecret.swift @@ -4,11 +4,19 @@ import Combine extension SecureEnclave { public struct Secret: SecretKit.Secret { + public init(id: Data, name: String, publicKey: Data) { + self.id = id + self.name = name + self.publicKey = publicKey + } + public let id: Data public let name: String public let publicKey: Data + + } } diff --git a/SecretKit/SmartCard/SmartCardSecret.swift b/SecretKit/SmartCard/SmartCardSecret.swift index 6444470..b5dd310 100644 --- a/SecretKit/SmartCard/SmartCardSecret.swift +++ b/SecretKit/SmartCard/SmartCardSecret.swift @@ -4,9 +4,17 @@ import Combine extension SmartCard { public struct Secret: SecretKit.Secret { + public init(id: Data, name: String, publicKey: Data) { + self.id = id +// self.name = name + self.publicKey = publicKey + } + public let id: Data - public let name: String + public var name: String { + UUID().uuidString + } public let publicKey: Data } diff --git a/Secretive/AppDelegate.swift b/Secretive/AppDelegate.swift index 746dd9d..3f10f41 100644 --- a/Secretive/AppDelegate.swift +++ b/Secretive/AppDelegate.swift @@ -9,6 +9,9 @@ class AppDelegate: NSObject, NSApplicationDelegate { @IBOutlet var toolbar: NSToolbar! let secureEnclave = SecureEnclave.Store() let smartCard = SmartCard.Store() + lazy var allStores: [AnySecretStore] = { + [AnySecretStore(secureEnclave), AnySecretStore(smartCard)] + }() func applicationDidFinishLaunching(_ aNotification: Notification) {