Skip to content

Commit 3425d99

Browse files
committed
fix: prevent SSHProfileStorage from overwriting data on decode failure
1 parent 8743051 commit 3425d99

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

TablePro/Core/Storage/SSHProfileStorage.swift

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,34 @@ final class SSHProfileStorage {
1414
private let defaults = UserDefaults.standard
1515
private let encoder = JSONEncoder()
1616
private let decoder = JSONDecoder()
17+
private var lastLoadFailed = false
1718

1819
private init() {}
1920

2021
// MARK: - Profile CRUD
2122

2223
func loadProfiles() -> [SSHProfile] {
2324
guard let data = defaults.data(forKey: profilesKey) else {
25+
lastLoadFailed = false
2426
return []
2527
}
2628

2729
do {
28-
return try decoder.decode([SSHProfile].self, from: data)
30+
let profiles = try decoder.decode([SSHProfile].self, from: data)
31+
lastLoadFailed = false
32+
return profiles
2933
} catch {
3034
Self.logger.error("Failed to load SSH profiles: \(error)")
35+
lastLoadFailed = true
3136
return []
3237
}
3338
}
3439

3540
func saveProfiles(_ profiles: [SSHProfile]) {
41+
guard !lastLoadFailed else {
42+
Self.logger.warning("Refusing to save SSH profiles: previous load failed (would overwrite existing data)")
43+
return
44+
}
3645
do {
3746
let data = try encoder.encode(profiles)
3847
defaults.set(data, forKey: profilesKey)
@@ -43,12 +52,14 @@ final class SSHProfileStorage {
4352

4453
func addProfile(_ profile: SSHProfile) {
4554
var profiles = loadProfiles()
55+
guard !lastLoadFailed else { return }
4656
profiles.append(profile)
4757
saveProfiles(profiles)
4858
}
4959

5060
func updateProfile(_ profile: SSHProfile) {
5161
var profiles = loadProfiles()
62+
guard !lastLoadFailed else { return }
5263
if let index = profiles.firstIndex(where: { $0.id == profile.id }) {
5364
profiles[index] = profile
5465
saveProfiles(profiles)
@@ -57,6 +68,7 @@ final class SSHProfileStorage {
5768

5869
func deleteProfile(_ profile: SSHProfile) {
5970
var profiles = loadProfiles()
71+
guard !lastLoadFailed else { return }
6072
profiles.removeAll { $0.id == profile.id }
6173
saveProfiles(profiles)
6274

0 commit comments

Comments
 (0)