mirror of
https://github.com/seemoo-lab/openhaystack.git
synced 2026-08-23 21:46:15 +00:00
Don't save preview data to keychain + get rid of shared controller instances
This commit is contained in:
@@ -11,10 +11,13 @@ import OSLog
|
||||
import SwiftUI
|
||||
|
||||
class FindMyController: ObservableObject {
|
||||
static let shared = FindMyController()
|
||||
|
||||
@Published var error: Error?
|
||||
@Published var devices = [FindMyDevice]()
|
||||
var accessories: AccessoryController
|
||||
|
||||
init(accessories: AccessoryController) {
|
||||
self.accessories = accessories
|
||||
}
|
||||
|
||||
func loadPrivateKeys(from data: Data, with searchPartyToken: Data, completion: @escaping (Error?) -> Void) {
|
||||
do {
|
||||
@@ -97,9 +100,9 @@ class FindMyController: ObservableObject {
|
||||
|
||||
self.fetchReports(with: token) { error in
|
||||
|
||||
let reports = FindMyController.shared.devices.compactMap({ $0.reports }).flatMap({ $0 })
|
||||
let reports = self.devices.compactMap({ $0.reports }).flatMap({ $0 })
|
||||
if reports.isEmpty == false {
|
||||
AccessoryController.shared.updateWithDecryptedReports(devices: FindMyController.shared.devices)
|
||||
self.accessories.updateWithDecryptedReports(devices: self.devices)
|
||||
}
|
||||
|
||||
if let error = error {
|
||||
@@ -231,17 +234,6 @@ class FindMyController: ObservableObject {
|
||||
|
||||
}
|
||||
|
||||
struct FindMyControllerKey: EnvironmentKey {
|
||||
static var defaultValue: FindMyController = .shared
|
||||
}
|
||||
|
||||
extension EnvironmentValues {
|
||||
var findMyController: FindMyController {
|
||||
get { self[FindMyControllerKey.self] }
|
||||
set { self[FindMyControllerKey.self] = newValue }
|
||||
}
|
||||
}
|
||||
|
||||
enum FindMyErrors: Error {
|
||||
case decodingPlistFailed(message: String)
|
||||
}
|
||||
|
||||
@@ -10,18 +10,20 @@ import Foundation
|
||||
import SwiftUI
|
||||
|
||||
class AccessoryController: ObservableObject {
|
||||
static let shared = AccessoryController()
|
||||
|
||||
@Published var accessories: [Accessory]
|
||||
var selfObserver: AnyCancellable?
|
||||
var listElementsObserver = [AnyCancellable]()
|
||||
|
||||
init() {
|
||||
self.accessories = KeychainController.loadAccessoriesFromKeychain()
|
||||
init(accessories: [Accessory]) {
|
||||
self.accessories = accessories
|
||||
initAccessoryObserver()
|
||||
initObserver()
|
||||
}
|
||||
|
||||
convenience init() {
|
||||
self.init(accessories: KeychainController.loadAccessoriesFromKeychain())
|
||||
}
|
||||
|
||||
func initAccessoryObserver() {
|
||||
self.selfObserver = self.objectWillChange.sink { _ in
|
||||
// objectWillChange is called before the values are actually changed,
|
||||
@@ -45,19 +47,13 @@ class AccessoryController: ObservableObject {
|
||||
})
|
||||
}
|
||||
|
||||
init(accessories: [Accessory]) {
|
||||
self.accessories = accessories
|
||||
initAccessoryObserver()
|
||||
initObserver()
|
||||
}
|
||||
|
||||
func save() throws {
|
||||
try KeychainController.storeInKeychain(accessories: self.accessories)
|
||||
}
|
||||
|
||||
func updateWithDecryptedReports(devices: [FindMyDevice]) {
|
||||
// Assign last locations
|
||||
for device in FindMyController.shared.devices {
|
||||
for device in devices {
|
||||
if let idx = self.accessories.firstIndex(where: { $0.id == Int(device.deviceId) }) {
|
||||
self.objectWillChange.send()
|
||||
let accessory = self.accessories[idx]
|
||||
@@ -91,3 +87,9 @@ class AccessoryController: ObservableObject {
|
||||
return accessory
|
||||
}
|
||||
}
|
||||
|
||||
class AccessoryControllerPreview: AccessoryController {
|
||||
override func save() {
|
||||
// don't allow saving dummy data to keychain
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import SwiftUI
|
||||
|
||||
struct ManageAccessoriesView: View {
|
||||
|
||||
@ObservedObject var accessoryController = AccessoryController.shared
|
||||
@EnvironmentObject var accessoryController: AccessoryController
|
||||
var accessories: [Accessory] {
|
||||
return self.accessoryController.accessories
|
||||
}
|
||||
|
||||
@@ -12,7 +12,8 @@ import SwiftUI
|
||||
struct OpenHaystackMainView: View {
|
||||
|
||||
@State var loading = false
|
||||
@ObservedObject var accessoryController = AccessoryController.shared
|
||||
@EnvironmentObject var accessoryController: AccessoryController
|
||||
@EnvironmentObject var findMyController: FindMyController
|
||||
var accessories: [Accessory] {
|
||||
return self.accessoryController.accessories
|
||||
}
|
||||
@@ -169,7 +170,7 @@ struct OpenHaystackMainView: View {
|
||||
self.isLoading = true
|
||||
}
|
||||
|
||||
FindMyController.shared.fetchReports(for: accessories, with: tokenData) { result in
|
||||
findMyController.fetchReports(for: accessories, with: tokenData) { result in
|
||||
switch result {
|
||||
case .failure(let error):
|
||||
os_log(.error, "Downloading reports failed %@", error.localizedDescription)
|
||||
@@ -365,12 +366,11 @@ struct OpenHaystackMainView: View {
|
||||
}
|
||||
|
||||
struct OpenHaystackMainView_Previews: PreviewProvider {
|
||||
|
||||
static var accessories: [Accessory] = PreviewData.accessories
|
||||
|
||||
static var accessoryController = AccessoryControllerPreview(accessories: PreviewData.accessories) as AccessoryController
|
||||
|
||||
static var previews: some View {
|
||||
OpenHaystackMainView(accessoryController: AccessoryController(accessories: accessories))
|
||||
.frame(width: 800, height: 600, alignment: .center)
|
||||
OpenHaystackMainView()
|
||||
.environmentObject(accessoryController)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,14 +9,25 @@ import SwiftUI
|
||||
|
||||
@main
|
||||
struct OpenHaystackApp: App {
|
||||
@StateObject var accessoryController: AccessoryController
|
||||
@StateObject var findMyController: FindMyController
|
||||
|
||||
init() {
|
||||
var accessoryController: AccessoryController
|
||||
if ProcessInfo().arguments.contains("-preview") {
|
||||
accessoryController = AccessoryControllerPreview(accessories: PreviewData.accessories)
|
||||
} else {
|
||||
accessoryController = AccessoryController()
|
||||
}
|
||||
self._accessoryController = StateObject(wrappedValue: accessoryController)
|
||||
self._findMyController = StateObject(wrappedValue: FindMyController(accessories: accessoryController))
|
||||
}
|
||||
|
||||
var body: some Scene {
|
||||
WindowGroup {
|
||||
if ProcessInfo().arguments.contains("-preview") {
|
||||
OpenHaystackMainView(accessoryController: AccessoryController(accessories: PreviewData.accessories))
|
||||
} else {
|
||||
OpenHaystackMainView()
|
||||
}
|
||||
OpenHaystackMainView()
|
||||
.environmentObject(accessoryController)
|
||||
.environmentObject(findMyController)
|
||||
}
|
||||
.commands {
|
||||
SidebarCommands()
|
||||
|
||||
Reference in New Issue
Block a user