Skip to content

Commit

Permalink
Backport mutex
Browse files Browse the repository at this point in the history
  • Loading branch information
maxgoedjen committed Jan 6, 2025
1 parent 576e625 commit 9b02afb
Show file tree
Hide file tree
Showing 9 changed files with 60 additions and 15 deletions.
18 changes: 13 additions & 5 deletions Sources/Packages/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,26 @@ let package = Package(
.library(
name: "Brief",
targets: ["Brief"]),
.library(
name: "Backports",
targets: ["Backports"]),
],
dependencies: [
],
targets: [
.target(
name: "SecretKit",
name: "Backports",
dependencies: [],
swiftSettings: swiftSettings
),
.target(
name: "SecretKit",
dependencies: ["Backports"],
swiftSettings: swiftSettings
),
.testTarget(
name: "SecretKitTests",
dependencies: ["SecretKit", "SecureEnclaveSecretKit", "SmartCardSecretKit"],
dependencies: ["Backports", "SecretKit", "SecureEnclaveSecretKit", "SmartCardSecretKit"],
swiftSettings: swiftSettings
),
.target(
Expand All @@ -48,12 +56,12 @@ let package = Package(
),
.target(
name: "SmartCardSecretKit",
dependencies: ["SecretKit"],
dependencies: ["Backports", "SecretKit"],
swiftSettings: swiftSettings
),
.target(
name: "SecretAgentKit",
dependencies: ["SecretKit", "SecretAgentKitHeaders"],
dependencies: ["Backports", "SecretKit", "SecretAgentKitHeaders"],
swiftSettings: swiftSettings
),
.systemLibrary(
Expand All @@ -65,7 +73,7 @@ let package = Package(
,
.target(
name: "Brief",
dependencies: []
dependencies: ["Backports"]
),
.testTarget(
name: "BriefTests",
Expand Down
30 changes: 30 additions & 0 deletions Sources/Packages/Sources/Backports/_Mutex.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
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
3 changes: 2 additions & 1 deletion Sources/Packages/Sources/Brief/Updater.swift
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import Foundation
import Observation
import Synchronization
import Backports

/// A concrete implementation of ``UpdaterProtocol`` which considers the current release and OS version.
@Observable public final class Updater: UpdaterProtocol, ObservableObject, Sendable {

public var update: Release? {
_update.withLock { $0 }
}
private let _update: Mutex<Release?> = .init(nil)
private let _update: _Mutex<Release?> = .init(nil)
public let testBuild: Bool

/// The current OS version.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import Foundation
import OSLog
import Synchronization
import Backports

/// Manages storage and lookup for OpenSSH certificates.
public final class OpenSSHCertificateHandler: Sendable {

private let publicKeyFileStoreController = PublicKeyFileStoreController(homeDirectory: NSHomeDirectory())
private let logger = Logger(subsystem: "com.maxgoedjen.secretive.secretagent", category: "OpenSSHCertificateHandler")
private let writer = OpenSSHKeyWriter()
private let keyBlobsAndNames: Mutex<[AnySecret: (Data, Data)]> = .init([:])
private let keyBlobsAndNames: _Mutex<[AnySecret: (Data, Data)]> = .init([:])

/// Initializes an OpenSSHCertificateHandler.
public init() {
Expand Down
5 changes: 3 additions & 2 deletions Sources/Packages/Sources/SecretKit/SecretStoreList.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import Foundation
import Observation
import Synchronization
import Backports

/// A "Store Store," which holds a list of type-erased stores.
@Observable public final class SecretStoreList: Sendable {
Expand All @@ -9,13 +10,13 @@ import Synchronization
public var stores: [AnySecretStore] {
__stores.withLock { $0 }
}
private let __stores: Mutex<[AnySecretStore]> = .init([])
private let __stores: _Mutex<[AnySecretStore]> = .init([])

/// A modifiable store, if one is available.
public var modifiableStore: AnySecretStoreModifiable? {
__modifiableStore.withLock { $0 }
}
private let __modifiableStore: Mutex<AnySecretStoreModifiable?> = .init(nil)
private let __modifiableStore: _Mutex<AnySecretStoreModifiable?> = .init(nil)

/// Initializes a SecretStoreList.
public init() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import CryptoKit
import LocalAuthentication
import SecretKit
import Synchronization
import Backports

extension SecureEnclave {

Expand All @@ -19,9 +20,9 @@ extension SecureEnclave {
public var secrets: [Secret] {
_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.
public init() {
Expand Down Expand Up @@ -105,7 +106,7 @@ extension SecureEnclave {
}

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 {
// context = existing.context
// } else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import Security
import CryptoTokenKit
import LocalAuthentication
import SecretKit
import Backports

extension SmartCard {

Expand All @@ -19,7 +20,7 @@ extension SmartCard {
/// An implementation of Store backed by a Smart Card.
@Observable public final class Store: SecretStore {

private let state: Mutex<State> = .init(.init())
private let state: _Mutex<State> = .init(.init())
public var isAvailable: Bool {
state.withLock { $0.isAvailable }
}
Expand Down
3 changes: 2 additions & 1 deletion Sources/SecretAgent/Notifier.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import SecretKit
import SecretAgentKit
import Brief
import Synchronization
import Backports

final class Notifier: Sendable {

Expand Down Expand Up @@ -151,7 +152,7 @@ final class NotificationDelegate: NSObject, UNUserNotificationCenterDelegate, Se
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?) {

Expand Down
3 changes: 2 additions & 1 deletion Sources/Secretive/Preview Content/PreviewUpdater.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@ import Foundation
import Synchronization
import Observation
import Brief
import Backports

@Observable class PreviewUpdater: UpdaterProtocol {

var update: Release? {
_update.withLock { $0 }
}
let _update: Mutex<Release?> = .init(nil)
let _update: _Mutex<Release?> = .init(nil)

let testBuild = false

Expand Down

0 comments on commit 9b02afb

Please sign in to comment.