mirror of
https://github.com/maxgoedjen/secretive.git
synced 2025-08-19 11:40:56 +00:00
* Enable language mode
* WIP
* WIP
* Fix concurrency issues in SmartCardStore
* Switch to SMAppService
* Bump runners
* Base
* Finish Testing migration
* Tweak async for updater
* More
* Backport mutex
* Revert "Backport mutex"
This reverts commit 9b02afb20c
.
* WIP
* Reenable
* Fix preview.
* Update package.
* Bump to latest public macOS and Xcode
* Bump back down to 6.1
* Update to Xcode 26.
* Fixed tests.
* More cleanup
* Env fixes
* var->let
* Cleanup
* Persist auth async
* Whitespace.
* Whitespace.
* Cleanup.
* Cleanup
* Redoing locks in actors bc of observable
* Actors.
* .
* Specify b5
* Update package to 6.2
* Fix disabled updater
* Remove preconcurrency warning
* Move updater init
113 lines
3.8 KiB
Swift
113 lines
3.8 KiB
Swift
import Cocoa
|
|
import SwiftUI
|
|
import SecretKit
|
|
import SecureEnclaveSecretKit
|
|
import SmartCardSecretKit
|
|
import Brief
|
|
|
|
extension EnvironmentValues {
|
|
|
|
// This is injected through .environment modifier below instead of @Entry for performance reasons (basially, restrictions around init/mainactor causing delay in loading secrets/"empty screen" blip).
|
|
@MainActor fileprivate static let _secretStoreList: SecretStoreList = {
|
|
let list = SecretStoreList()
|
|
list.add(store: SecureEnclave.Store())
|
|
list.add(store: SmartCard.Store())
|
|
return list
|
|
}()
|
|
|
|
private static let _agentStatusChecker = AgentStatusChecker()
|
|
@Entry var agentStatusChecker: any AgentStatusCheckerProtocol = _agentStatusChecker
|
|
private static let _updater: any UpdaterProtocol = {
|
|
@AppStorage("defaultsHasRunSetup") var hasRunSetup = false
|
|
return Updater(checkOnLaunch: hasRunSetup)
|
|
}()
|
|
@Entry var updater: any UpdaterProtocol = _updater
|
|
|
|
@MainActor var secretStoreList: SecretStoreList {
|
|
EnvironmentValues._secretStoreList
|
|
}
|
|
}
|
|
|
|
@main
|
|
struct Secretive: App {
|
|
|
|
private let justUpdatedChecker = JustUpdatedChecker()
|
|
@Environment(\.agentStatusChecker) var agentStatusChecker
|
|
@AppStorage("defaultsHasRunSetup") var hasRunSetup = false
|
|
@State private var showingSetup = false
|
|
@State private var showingCreation = false
|
|
|
|
@SceneBuilder var body: some Scene {
|
|
WindowGroup {
|
|
ContentView(showingCreation: $showingCreation, runningSetup: $showingSetup, hasRunSetup: $hasRunSetup)
|
|
.environment(EnvironmentValues._secretStoreList)
|
|
.onAppear {
|
|
if !hasRunSetup {
|
|
showingSetup = true
|
|
}
|
|
}
|
|
.onReceive(NotificationCenter.default.publisher(for: NSApplication.didBecomeActiveNotification)) { _ in
|
|
guard hasRunSetup else { return }
|
|
agentStatusChecker.check()
|
|
if agentStatusChecker.running && justUpdatedChecker.justUpdated {
|
|
// Relaunch the agent, since it'll be running from earlier update still
|
|
reinstallAgent()
|
|
} else if !agentStatusChecker.running && !agentStatusChecker.developmentBuild {
|
|
forceLaunchAgent()
|
|
}
|
|
}
|
|
}
|
|
.commands {
|
|
CommandGroup(after: CommandGroupPlacement.newItem) {
|
|
Button("app_menu_new_secret_button") {
|
|
showingCreation = true
|
|
}
|
|
.keyboardShortcut(KeyboardShortcut(KeyEquivalent("N"), modifiers: [.command, .shift]))
|
|
}
|
|
CommandGroup(replacing: .help) {
|
|
Button("app_menu_help_button") {
|
|
NSWorkspace.shared.open(Constants.helpURL)
|
|
}
|
|
}
|
|
CommandGroup(after: .help) {
|
|
Button("app_menu_setup_button") {
|
|
showingSetup = true
|
|
}
|
|
}
|
|
SidebarCommands()
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
extension Secretive {
|
|
|
|
private func reinstallAgent() {
|
|
justUpdatedChecker.check()
|
|
Task {
|
|
await LaunchAgentController().install()
|
|
try? await Task.sleep(for: .seconds(1))
|
|
agentStatusChecker.check()
|
|
if !agentStatusChecker.running {
|
|
forceLaunchAgent()
|
|
}
|
|
}
|
|
}
|
|
|
|
private func forceLaunchAgent() {
|
|
// We've run setup, we didn't just update, launchd is just not doing it's thing.
|
|
// Force a launch directly.
|
|
Task {
|
|
_ = await LaunchAgentController().forceLaunch()
|
|
agentStatusChecker.check()
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
private enum Constants {
|
|
static let helpURL = URL(string: "https://github.com/maxgoedjen/secretive/blob/main/FAQ.md")!
|
|
}
|
|
|