mirror of
				https://github.com/maxgoedjen/secretive.git
				synced 2025-10-31 15:30:57 +00:00 
			
		
		
		
	
							parent
							
								
									9b02afb20c
								
							
						
					
					
						commit
						bab76da2ab
					
				| @ -27,26 +27,18 @@ let package = Package( | |||||||
|         .library( |         .library( | ||||||
|             name: "Brief", |             name: "Brief", | ||||||
|             targets: ["Brief"]), |             targets: ["Brief"]), | ||||||
|         .library( |  | ||||||
|             name: "Backports", |  | ||||||
|             targets: ["Backports"]), |  | ||||||
|     ], |     ], | ||||||
|     dependencies: [ |     dependencies: [ | ||||||
|     ], |     ], | ||||||
|     targets: [ |     targets: [ | ||||||
|         .target( |  | ||||||
|             name: "Backports", |  | ||||||
|             dependencies: [], |  | ||||||
|             swiftSettings: swiftSettings |  | ||||||
|         ), |  | ||||||
|         .target( |         .target( | ||||||
|             name: "SecretKit", |             name: "SecretKit", | ||||||
|             dependencies: ["Backports"], |             dependencies: [], | ||||||
|             swiftSettings: swiftSettings |             swiftSettings: swiftSettings | ||||||
|         ), |         ), | ||||||
|         .testTarget( |         .testTarget( | ||||||
|             name: "SecretKitTests", |             name: "SecretKitTests", | ||||||
|             dependencies: ["Backports", "SecretKit", "SecureEnclaveSecretKit", "SmartCardSecretKit"], |             dependencies: ["SecretKit", "SecureEnclaveSecretKit", "SmartCardSecretKit"], | ||||||
|             swiftSettings: swiftSettings |             swiftSettings: swiftSettings | ||||||
|         ), |         ), | ||||||
|         .target( |         .target( | ||||||
| @ -56,12 +48,12 @@ let package = Package( | |||||||
|         ), |         ), | ||||||
|         .target( |         .target( | ||||||
|             name: "SmartCardSecretKit", |             name: "SmartCardSecretKit", | ||||||
|             dependencies: ["Backports", "SecretKit"], |             dependencies: ["SecretKit"], | ||||||
|             swiftSettings: swiftSettings |             swiftSettings: swiftSettings | ||||||
|         ), |         ), | ||||||
|         .target( |         .target( | ||||||
|             name: "SecretAgentKit", |             name: "SecretAgentKit", | ||||||
|             dependencies: ["Backports", "SecretKit", "SecretAgentKitHeaders"], |             dependencies: ["SecretKit", "SecretAgentKitHeaders"], | ||||||
|             swiftSettings: swiftSettings |             swiftSettings: swiftSettings | ||||||
|         ), |         ), | ||||||
|         .systemLibrary( |         .systemLibrary( | ||||||
| @ -73,7 +65,7 @@ let package = Package( | |||||||
|         , |         , | ||||||
|         .target( |         .target( | ||||||
|             name: "Brief", |             name: "Brief", | ||||||
|             dependencies: ["Backports"] |             dependencies: [] | ||||||
|         ), |         ), | ||||||
|         .testTarget( |         .testTarget( | ||||||
|             name: "BriefTests", |             name: "BriefTests", | ||||||
|  | |||||||
| @ -1,30 +0,0 @@ | |||||||
| import Foundation |  | ||||||
| 
 |  | ||||||
| #if canImport(Synchronization) |  | ||||||
| import Synchronization |  | ||||||
| public typealias _Mutex = Mutex |  | ||||||
| #else |  | ||||||
| 
 |  | ||||||
| import os |  | ||||||
| 
 |  | ||||||
| public final class _Mutex<Value: ~Copyable>: @unchecked Sendable { |  | ||||||
|      |  | ||||||
|     private var value: Value |  | ||||||
|     private var lock = OSAllocatedUnfairLock() |  | ||||||
|      |  | ||||||
|     public init(_ value: consuming sending Value) { |  | ||||||
|         self.value = value |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     public borrowing func withLock<Result, E>(_ body: (inout sending Value) throws(E) -> sending Result) throws(E) -> sending Result where E : Error, Result : ~Copyable { |  | ||||||
|         lock.lock() |  | ||||||
|         defer { |  | ||||||
|             lock.unlock() |  | ||||||
|         } |  | ||||||
|         return try body(&value) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|      |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #endif |  | ||||||
| @ -1,7 +1,6 @@ | |||||||
| import Foundation | import Foundation | ||||||
| import Observation | import Observation | ||||||
| import Synchronization | import Synchronization | ||||||
| import Backports |  | ||||||
| 
 | 
 | ||||||
| /// A concrete implementation of ``UpdaterProtocol`` which considers the current release and OS version. | /// A concrete implementation of ``UpdaterProtocol`` which considers the current release and OS version. | ||||||
| @Observable public final class Updater: UpdaterProtocol, ObservableObject, Sendable { | @Observable public final class Updater: UpdaterProtocol, ObservableObject, Sendable { | ||||||
| @ -9,7 +8,7 @@ import Backports | |||||||
|     public var update: Release? { |     public var update: Release? { | ||||||
|         _update.withLock { $0 } |         _update.withLock { $0 } | ||||||
|     } |     } | ||||||
|     private let _update: _Mutex<Release?> = .init(nil) |     private let _update: Mutex<Release?> = .init(nil) | ||||||
|     public let testBuild: Bool |     public let testBuild: Bool | ||||||
| 
 | 
 | ||||||
|     /// The current OS version. |     /// The current OS version. | ||||||
|  | |||||||
| @ -1,7 +1,6 @@ | |||||||
| import Foundation | import Foundation | ||||||
| import OSLog | import OSLog | ||||||
| import Synchronization | import Synchronization | ||||||
| import Backports |  | ||||||
| 
 | 
 | ||||||
| /// Manages storage and lookup for OpenSSH certificates. | /// Manages storage and lookup for OpenSSH certificates. | ||||||
| public final class OpenSSHCertificateHandler: Sendable { | public final class OpenSSHCertificateHandler: Sendable { | ||||||
| @ -9,7 +8,7 @@ public final class OpenSSHCertificateHandler: Sendable { | |||||||
|     private let publicKeyFileStoreController = PublicKeyFileStoreController(homeDirectory: NSHomeDirectory()) |     private let publicKeyFileStoreController = PublicKeyFileStoreController(homeDirectory: NSHomeDirectory()) | ||||||
|     private let logger = Logger(subsystem: "com.maxgoedjen.secretive.secretagent", category: "OpenSSHCertificateHandler") |     private let logger = Logger(subsystem: "com.maxgoedjen.secretive.secretagent", category: "OpenSSHCertificateHandler") | ||||||
|     private let writer = OpenSSHKeyWriter() |     private let writer = OpenSSHKeyWriter() | ||||||
|     private let keyBlobsAndNames: _Mutex<[AnySecret: (Data, Data)]> = .init([:]) |     private let keyBlobsAndNames: Mutex<[AnySecret: (Data, Data)]> = .init([:]) | ||||||
| 
 | 
 | ||||||
|     /// Initializes an OpenSSHCertificateHandler. |     /// Initializes an OpenSSHCertificateHandler. | ||||||
|     public init() { |     public init() { | ||||||
|  | |||||||
| @ -1,7 +1,6 @@ | |||||||
| import Foundation | import Foundation | ||||||
| import Observation | import Observation | ||||||
| import Synchronization | import Synchronization | ||||||
| import Backports |  | ||||||
| 
 | 
 | ||||||
| /// A "Store Store," which holds a list of type-erased stores. | /// A "Store Store," which holds a list of type-erased stores. | ||||||
| @Observable public final class SecretStoreList: Sendable { | @Observable public final class SecretStoreList: Sendable { | ||||||
| @ -10,13 +9,13 @@ import Backports | |||||||
|     public var stores: [AnySecretStore] { |     public var stores: [AnySecretStore] { | ||||||
|         __stores.withLock { $0 } |         __stores.withLock { $0 } | ||||||
|     } |     } | ||||||
|     private let __stores: _Mutex<[AnySecretStore]> = .init([]) |     private let __stores: Mutex<[AnySecretStore]> = .init([]) | ||||||
|      |      | ||||||
|     /// A modifiable store, if one is available. |     /// A modifiable store, if one is available. | ||||||
|     public var modifiableStore: AnySecretStoreModifiable? { |     public var modifiableStore: AnySecretStoreModifiable? { | ||||||
|         __modifiableStore.withLock { $0 } |         __modifiableStore.withLock { $0 } | ||||||
|     } |     } | ||||||
|     private let __modifiableStore: _Mutex<AnySecretStoreModifiable?> = .init(nil) |     private let __modifiableStore: Mutex<AnySecretStoreModifiable?> = .init(nil) | ||||||
| 
 | 
 | ||||||
|     /// Initializes a SecretStoreList. |     /// Initializes a SecretStoreList. | ||||||
|     public init() { |     public init() { | ||||||
|  | |||||||
| @ -5,7 +5,6 @@ import CryptoKit | |||||||
| import LocalAuthentication | import LocalAuthentication | ||||||
| import SecretKit | import SecretKit | ||||||
| import Synchronization | import Synchronization | ||||||
| import Backports |  | ||||||
| 
 | 
 | ||||||
| extension SecureEnclave { | extension SecureEnclave { | ||||||
| 
 | 
 | ||||||
| @ -20,9 +19,9 @@ extension SecureEnclave { | |||||||
|         public var secrets: [Secret] { |         public var secrets: [Secret] { | ||||||
|             _secrets.withLock { $0 } |             _secrets.withLock { $0 } | ||||||
|         } |         } | ||||||
|         private let _secrets: _Mutex<[Secret]> = .init([]) |         private let _secrets: Mutex<[Secret]> = .init([]) | ||||||
| 
 | 
 | ||||||
|         private let persistedAuthenticationContexts: _Mutex<[Secret: PersistentAuthenticationContext]> = .init([:]) |         private let persistedAuthenticationContexts: Mutex<[Secret: PersistentAuthenticationContext]> = .init([:]) | ||||||
| 
 | 
 | ||||||
|         /// Initializes a Store. |         /// Initializes a Store. | ||||||
|         public init() { |         public init() { | ||||||
| @ -106,7 +105,7 @@ extension SecureEnclave { | |||||||
|         } |         } | ||||||
|          |          | ||||||
|         public func sign(data: Data, with secret: Secret, for provenance: SigningRequestProvenance) throws -> Data { |         public func sign(data: Data, with secret: Secret, for provenance: SigningRequestProvenance) throws -> Data { | ||||||
|             let context: _Mutex<LAContext> |             let context: Mutex<LAContext> | ||||||
| //            if let existing = persistedAuthenticationContexts.withLock({ $0 })[secret], existing.valid { | //            if let existing = persistedAuthenticationContexts.withLock({ $0 })[secret], existing.valid { | ||||||
| //                context = existing.context | //                context = existing.context | ||||||
| //            } else { | //            } else { | ||||||
|  | |||||||
| @ -5,7 +5,6 @@ import Security | |||||||
| import CryptoTokenKit | import CryptoTokenKit | ||||||
| import LocalAuthentication | import LocalAuthentication | ||||||
| import SecretKit | import SecretKit | ||||||
| import Backports |  | ||||||
| 
 | 
 | ||||||
| extension SmartCard { | extension SmartCard { | ||||||
|      |      | ||||||
| @ -20,7 +19,7 @@ extension SmartCard { | |||||||
|     /// An implementation of Store backed by a Smart Card. |     /// An implementation of Store backed by a Smart Card. | ||||||
|     @Observable public final class Store: SecretStore { |     @Observable public final class Store: SecretStore { | ||||||
| 
 | 
 | ||||||
|         private let state: _Mutex<State> = .init(.init()) |         private let state: Mutex<State> = .init(.init()) | ||||||
|         public var isAvailable: Bool { |         public var isAvailable: Bool { | ||||||
|             state.withLock { $0.isAvailable } |             state.withLock { $0.isAvailable } | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -5,7 +5,6 @@ import SecretKit | |||||||
| import SecretAgentKit | import SecretAgentKit | ||||||
| import Brief | import Brief | ||||||
| import Synchronization | import Synchronization | ||||||
| import Backports |  | ||||||
| 
 | 
 | ||||||
| final class Notifier: Sendable { | final class Notifier: Sendable { | ||||||
| 
 | 
 | ||||||
| @ -152,7 +151,7 @@ final class NotificationDelegate: NSObject, UNUserNotificationCenterDelegate, Se | |||||||
|         fileprivate var pendingPersistableSecrets: [String: AnySecret] = [:] |         fileprivate var pendingPersistableSecrets: [String: AnySecret] = [:] | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     fileprivate let state: _Mutex<State> = .init(.init()) |     fileprivate let state: Mutex<State> = .init(.init()) | ||||||
|      |      | ||||||
|     func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification?) { |     func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification?) { | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,14 +2,13 @@ import Foundation | |||||||
| import Synchronization | import Synchronization | ||||||
| import Observation | import Observation | ||||||
| import Brief | import Brief | ||||||
| import Backports |  | ||||||
| 
 | 
 | ||||||
| @Observable class PreviewUpdater: UpdaterProtocol { | @Observable class PreviewUpdater: UpdaterProtocol { | ||||||
| 
 | 
 | ||||||
|     var update: Release? { |     var update: Release? { | ||||||
|         _update.withLock { $0 } |         _update.withLock { $0 } | ||||||
|     } |     } | ||||||
|     let _update: _Mutex<Release?> = .init(nil) |     let _update: Mutex<Release?> = .init(nil) | ||||||
| 
 | 
 | ||||||
|     let testBuild = false |     let testBuild = false | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user