Skip to content

Commit

Permalink
Make SettingsStore functions non-static, re-implement them as
Browse files Browse the repository at this point in the history
subscripts and make settingsStore an environmentObject

Fixes: maxgoedjen#536 (comment)
  • Loading branch information
paulhdk committed Jul 25, 2024
1 parent ce48a35 commit 35bd7ec
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 39 deletions.
2 changes: 2 additions & 0 deletions Sources/Secretive/App.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ struct Secretive: App {
}()
private let agentStatusChecker = AgentStatusChecker()
private let justUpdatedChecker = JustUpdatedChecker()
private let settingsStore = SettingsStore()

@AppStorage("defaultsHasRunSetup") var hasRunSetup = false
@State private var showingSetup = false
Expand All @@ -27,6 +28,7 @@ struct Secretive: App {
.environmentObject(storeList)
.environmentObject(Updater(checkOnLaunch: hasRunSetup))
.environmentObject(agentStatusChecker)
.environmentObject(settingsStore)
.onAppear {
if !hasRunSetup {
showingSetup = true
Expand Down
81 changes: 42 additions & 39 deletions Sources/Secretive/Helpers/SettingsHelper.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,53 +8,56 @@

import Foundation

class SettingsStore {
static let service = "com.maxgoedjen.Secretive"
class SettingsStore: ObservableObject {
let service = "com.maxgoedjen.Secretive"
}

extension SettingsStore {
static func set(key: String, value: String) -> Bool {
let valueData = value.data(using: String.Encoding.utf8)!

if let keyVal = get(key: key) {
if keyVal == value {
return true
subscript(key: String) -> String? {
set(value) {
guard let valueData = value?.data(using: String.Encoding.utf8)! else {
return
}

let updateQuery: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
kSecAttrServer as String: service]
let attributes: [String: Any] = [kSecAttrAccount as String: key,
kSecValueData as String: valueData]
// FIXME: Make this non-blocking as described here: https://developer.apple.com/documentation/security/1393617-secitemupdate
let status = SecItemUpdate(updateQuery as CFDictionary, attributes as CFDictionary)
guard status == errSecSuccess else {
print("Couldn't update item in keychain. " + status.description)
return false
if let keyVal = self[key] {
if keyVal == value {
return
}

let updateQuery: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
kSecAttrServer as String: service]
let attributes: [String: Any] = [kSecAttrAccount as String: key,
kSecValueData as String: valueData]
// FIXME: Make this non-blocking as described here: https://developer.apple.com/documentation/security/1393617-secitemupdate
let status = SecItemUpdate(updateQuery as CFDictionary, attributes as CFDictionary)
guard status == errSecSuccess else {
print("Couldn't update item in keychain. " + status.description)
return
}
} else {
let addquery: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecAttrServer as String: service,
kSecValueData as String: valueData]
// FIXME: Make this non-blocking as described here: https://developer.apple.com/documentation/security/1401659-secitemadd
let status = SecItemAdd(addquery as CFDictionary, nil)
guard status == errSecSuccess else {
print("Couldn't add item to keychain. " + status.description)
return
}
}
} else {
let addquery: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
}

get {
let getquery: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecAttrServer as String: service,
kSecValueData as String: valueData]
// FIXME: Make this non-blocking as described here: https://developer.apple.com/documentation/security/1401659-secitemadd
let status = SecItemAdd(addquery as CFDictionary, nil)
guard status == errSecSuccess else {
print("Couldn't add item to keychain. " + status.description)
return false
}
kSecMatchLimit as String: kSecMatchLimitOne,
kSecReturnData as String: true]
var item: CFTypeRef?
let status = SecItemCopyMatching(getquery as CFDictionary, &item)

return status == errSecSuccess ? String(decoding: item as! Data, as: UTF8.self) : nil
}
return true
}

static func get(key: String) -> String? {
let getquery: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecAttrServer as String: service,
kSecMatchLimit as String: kSecMatchLimitOne,
kSecReturnData as String: true]
var item: CFTypeRef?
let status = SecItemCopyMatching(getquery as CFDictionary, &item)

return status == errSecSuccess ? String(decoding: item as! Data, as: UTF8.self) : nil
}
}

0 comments on commit 35bd7ec

Please sign in to comment.