Update SecureStorgageSample
This commit is contained in:
parent
cde14bd387
commit
31a85b3b22
@ -3,26 +3,22 @@ import LocalData
|
|||||||
import SharedKit
|
import SharedKit
|
||||||
|
|
||||||
struct AppStorageCatalog: StorageKeyCatalog {
|
struct AppStorageCatalog: StorageKeyCatalog {
|
||||||
static var allKeys: [StorageKeyEntry] {
|
static var allKeys: [AnyStorageKey] {
|
||||||
[
|
[
|
||||||
StorageKeyEntry(StorageKeys.AppVersionKey()),
|
.key(StorageKeys.AppVersionKey()),
|
||||||
StorageKeyEntry(StorageKeys.UserPreferencesKey()),
|
.key(StorageKeys.UserPreferencesKey()),
|
||||||
StorageKeyEntry(StorageKeys.CredentialsKey()),
|
.key(StorageKeys.CredentialsKey()),
|
||||||
StorageKeyEntry(StorageKeys.LastLocationKey()),
|
.key(StorageKeys.LastLocationKey()),
|
||||||
StorageKeyEntry(StorageKeys.APITokenKey()),
|
.key(StorageKeys.APITokenKey()),
|
||||||
StorageKeyEntry(StorageKeys.UserProfileFileKey()),
|
.key(StorageKeys.UserProfileFileKey()),
|
||||||
StorageKeyEntry(StorageKeys.CachedDataKey()),
|
.key(StorageKeys.CachedDataKey()),
|
||||||
StorageKeyEntry(StorageKeys.SettingsPlistKey()),
|
.key(StorageKeys.SettingsPlistKey()),
|
||||||
StorageKeyEntry(StorageKeys.SessionLogsKey()),
|
.key(StorageKeys.SessionLogsKey()),
|
||||||
StorageKeyEntry(StorageKeys.PrivateNotesKey()),
|
.key(StorageKeys.PrivateNotesKey()),
|
||||||
StorageKeyEntry(StorageKeys.ExternalSessionLogsKey()),
|
.key(StorageKeys.ExternalSessionLogsKey()),
|
||||||
StorageKeyEntry(StorageKeys.WatchVibrationKey()),
|
.key(StorageKeys.WatchVibrationKey()),
|
||||||
StorageKeyEntry(StorageKeys.SyncableSettingKey()),
|
.key(StorageKeys.SyncableSettingKey()),
|
||||||
StorageKeyEntry(
|
.key(StorageKeys.ExternalKeyMaterialKey())
|
||||||
StorageKeys.ExternalKeyMaterialKey(keyName: "<dynamic>"),
|
|
||||||
nameRule: .prefix(StorageKeys.ExternalKeyMaterialKey.namePrefix),
|
|
||||||
notes: "Key name is dynamic per external source (prefix matched)."
|
|
||||||
)
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,7 +9,7 @@ struct ExternalKeyMaterialProvider: KeyMaterialProviding {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func keyMaterial(for keyName: String) async throws -> Data {
|
func keyMaterial(for keyName: String) async throws -> Data {
|
||||||
let key = StorageKeys.ExternalKeyMaterialKey(keyName: keyName)
|
let key = StorageKeys.ExternalKeyMaterialKey()
|
||||||
if let existing = try await StorageRouter.shared.get(key) as Data? {
|
if let existing = try await StorageRouter.shared.get(key) as Data? {
|
||||||
return existing
|
return existing
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,6 +13,7 @@ extension StorageKeys {
|
|||||||
)
|
)
|
||||||
let serializer: Serializer<[String]> = .json
|
let serializer: Serializer<[String]> = .json
|
||||||
let owner = "SampleApp"
|
let owner = "SampleApp"
|
||||||
|
let description = "Stores session logs encrypted with external key material."
|
||||||
let availability: PlatformAvailability = .phoneOnly
|
let availability: PlatformAvailability = .phoneOnly
|
||||||
let syncPolicy: SyncPolicy = .never
|
let syncPolicy: SyncPolicy = .never
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,6 +13,7 @@ extension StorageKeys {
|
|||||||
)
|
)
|
||||||
let serializer: Serializer<String> = .json
|
let serializer: Serializer<String> = .json
|
||||||
let owner = "SampleApp"
|
let owner = "SampleApp"
|
||||||
|
let description = "Stores private notes encrypted at rest."
|
||||||
let availability: PlatformAvailability = .phoneOnly
|
let availability: PlatformAvailability = .phoneOnly
|
||||||
let syncPolicy: SyncPolicy = .never
|
let syncPolicy: SyncPolicy = .never
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,6 +12,7 @@ extension StorageKeys {
|
|||||||
let security: SecurityPolicy
|
let security: SecurityPolicy
|
||||||
let serializer: Serializer<[String]> = .json
|
let serializer: Serializer<[String]> = .json
|
||||||
let owner = "SampleApp"
|
let owner = "SampleApp"
|
||||||
|
let description = "Stores session logs encrypted with PBKDF2-derived keys."
|
||||||
let availability: PlatformAvailability = .phoneOnly
|
let availability: PlatformAvailability = .phoneOnly
|
||||||
let syncPolicy: SyncPolicy = .never
|
let syncPolicy: SyncPolicy = .never
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,7 @@ extension StorageKeys {
|
|||||||
let security: SecurityPolicy = .none
|
let security: SecurityPolicy = .none
|
||||||
let serializer: Serializer<Data> = .data
|
let serializer: Serializer<Data> = .data
|
||||||
let owner = "SampleApp"
|
let owner = "SampleApp"
|
||||||
|
let description = "Stores cached binary data that can be regenerated."
|
||||||
let availability: PlatformAvailability = .all
|
let availability: PlatformAvailability = .all
|
||||||
let syncPolicy: SyncPolicy = .never
|
let syncPolicy: SyncPolicy = .never
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,6 +22,7 @@ extension StorageKeys {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
let owner = "SampleApp"
|
let owner = "SampleApp"
|
||||||
|
let description = "Stores custom-encoded string data (Base64 example)."
|
||||||
let availability: PlatformAvailability = .all
|
let availability: PlatformAvailability = .all
|
||||||
let syncPolicy: SyncPolicy = .never
|
let syncPolicy: SyncPolicy = .never
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,6 +11,7 @@ extension StorageKeys {
|
|||||||
let security: SecurityPolicy = .none
|
let security: SecurityPolicy = .none
|
||||||
let serializer: Serializer<[String: AnyCodable]> = .plist
|
let serializer: Serializer<[String: AnyCodable]> = .plist
|
||||||
let owner = "SampleApp"
|
let owner = "SampleApp"
|
||||||
|
let description = "Stores app settings exported as a property list."
|
||||||
let availability: PlatformAvailability = .all
|
let availability: PlatformAvailability = .all
|
||||||
let syncPolicy: SyncPolicy = .never
|
let syncPolicy: SyncPolicy = .never
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,6 +12,7 @@ extension StorageKeys {
|
|||||||
let security: SecurityPolicy = .none
|
let security: SecurityPolicy = .none
|
||||||
let serializer: Serializer<UserProfile> = .json
|
let serializer: Serializer<UserProfile> = .json
|
||||||
let owner = "SampleApp"
|
let owner = "SampleApp"
|
||||||
|
let description = "Stores a lightweight user profile for file storage and watch sync."
|
||||||
let availability: PlatformAvailability = .phoneWithWatchSync
|
let availability: PlatformAvailability = .phoneWithWatchSync
|
||||||
let syncPolicy: SyncPolicy = .automaticSmall
|
let syncPolicy: SyncPolicy = .automaticSmall
|
||||||
|
|
||||||
|
|||||||
@ -14,6 +14,7 @@ extension StorageKeys {
|
|||||||
)
|
)
|
||||||
let serializer: Serializer<String> = .json
|
let serializer: Serializer<String> = .json
|
||||||
let owner = "SampleApp"
|
let owner = "SampleApp"
|
||||||
|
let description = "Stores API auth token for network requests."
|
||||||
let availability: PlatformAvailability = .phoneOnly
|
let availability: PlatformAvailability = .phoneOnly
|
||||||
let syncPolicy: SyncPolicy = .never
|
let syncPolicy: SyncPolicy = .never
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,6 +12,7 @@ extension StorageKeys {
|
|||||||
let security: SecurityPolicy
|
let security: SecurityPolicy
|
||||||
let serializer: Serializer<Credential> = .json
|
let serializer: Serializer<Credential> = .json
|
||||||
let owner = "SampleApp"
|
let owner = "SampleApp"
|
||||||
|
let description = "Stores user credentials for sign-in flows."
|
||||||
let availability: PlatformAvailability = .phoneOnly
|
let availability: PlatformAvailability = .phoneOnly
|
||||||
let syncPolicy: SyncPolicy = .never
|
let syncPolicy: SyncPolicy = .never
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@ extension StorageKeys {
|
|||||||
struct ExternalKeyMaterialKey: StorageKey {
|
struct ExternalKeyMaterialKey: StorageKey {
|
||||||
typealias Value = Data
|
typealias Value = Data
|
||||||
|
|
||||||
let name: String
|
let name = "external_key_material"
|
||||||
let domain: StorageDomain = .keychain(service: "com.example.securestorage.externalkey")
|
let domain: StorageDomain = .keychain(service: "com.example.securestorage.externalkey")
|
||||||
let security: SecurityPolicy = .keychain(
|
let security: SecurityPolicy = .keychain(
|
||||||
accessibility: .afterFirstUnlock,
|
accessibility: .afterFirstUnlock,
|
||||||
@ -14,13 +14,8 @@ extension StorageKeys {
|
|||||||
)
|
)
|
||||||
let serializer: Serializer<Data> = .data
|
let serializer: Serializer<Data> = .data
|
||||||
let owner = "SampleApp"
|
let owner = "SampleApp"
|
||||||
|
let description = "Stores external key material used by encryption policies."
|
||||||
let availability: PlatformAvailability = .phoneOnly
|
let availability: PlatformAvailability = .phoneOnly
|
||||||
let syncPolicy: SyncPolicy = .never
|
let syncPolicy: SyncPolicy = .never
|
||||||
|
|
||||||
static let namePrefix = "externalkey."
|
|
||||||
|
|
||||||
init(keyName: String) {
|
|
||||||
self.name = Self.namePrefix + keyName
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,6 +14,7 @@ extension StorageKeys {
|
|||||||
)
|
)
|
||||||
let serializer: Serializer<SampleLocationData> = .json
|
let serializer: Serializer<SampleLocationData> = .json
|
||||||
let owner = "SampleApp"
|
let owner = "SampleApp"
|
||||||
|
let description = "Stores last known location for location-aware features."
|
||||||
let availability: PlatformAvailability = .phoneOnly
|
let availability: PlatformAvailability = .phoneOnly
|
||||||
let syncPolicy: SyncPolicy = .never
|
let syncPolicy: SyncPolicy = .never
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,6 +12,7 @@ extension StorageKeys {
|
|||||||
let security: SecurityPolicy = .none
|
let security: SecurityPolicy = .none
|
||||||
let serializer: Serializer<String> = .json
|
let serializer: Serializer<String> = .json
|
||||||
let owner = "SampleApp"
|
let owner = "SampleApp"
|
||||||
|
let description = "Stores a setting that can be synced to watch."
|
||||||
let availability: PlatformAvailability
|
let availability: PlatformAvailability
|
||||||
let syncPolicy: SyncPolicy
|
let syncPolicy: SyncPolicy
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,7 @@ extension StorageKeys {
|
|||||||
let security: SecurityPolicy = .none
|
let security: SecurityPolicy = .none
|
||||||
let serializer: Serializer<Bool> = .json
|
let serializer: Serializer<Bool> = .json
|
||||||
let owner = "SampleApp"
|
let owner = "SampleApp"
|
||||||
|
let description = "Controls haptic feedback on watch-only experiences."
|
||||||
let availability: PlatformAvailability = .watchOnly
|
let availability: PlatformAvailability = .watchOnly
|
||||||
let syncPolicy: SyncPolicy = .never
|
let syncPolicy: SyncPolicy = .never
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,6 +14,7 @@ extension StorageKeys {
|
|||||||
let security: SecurityPolicy = .none
|
let security: SecurityPolicy = .none
|
||||||
let serializer: Serializer<String> = .json
|
let serializer: Serializer<String> = .json
|
||||||
let owner = "SampleApp"
|
let owner = "SampleApp"
|
||||||
|
let description = "Tracks the last app version for migration and UI messaging."
|
||||||
let availability: PlatformAvailability = .all
|
let availability: PlatformAvailability = .all
|
||||||
let syncPolicy: SyncPolicy = .automaticSmall
|
let syncPolicy: SyncPolicy = .automaticSmall
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,6 +14,7 @@ extension StorageKeys {
|
|||||||
let security: SecurityPolicy = .none
|
let security: SecurityPolicy = .none
|
||||||
let serializer: Serializer<[String: AnyCodable]> = .json
|
let serializer: Serializer<[String: AnyCodable]> = .json
|
||||||
let owner = "SampleApp"
|
let owner = "SampleApp"
|
||||||
|
let description = "Stores user preferences for app configuration screens."
|
||||||
let availability: PlatformAvailability = .all
|
let availability: PlatformAvailability = .all
|
||||||
let syncPolicy: SyncPolicy = .never
|
let syncPolicy: SyncPolicy = .never
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user