Skip to content
This repository was archived by the owner on Mar 7, 2026. It is now read-only.

Commit 4897b7a

Browse files
authored
Enhance CertificateView with status tracking
Added certificate status tracking and updated UI to display certificate statuses.
1 parent 9482ca8 commit 4897b7a

1 file changed

Lines changed: 54 additions & 11 deletions

File tree

Sources/prostore/views/CertificateView.swift

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ extension Date {
4747
struct CertificateView: View {
4848
@State private var customCertificates: [CustomCertificate] = []
4949
@State private var certExpiries: [String: Date?] = [:]
50+
@State private var certStatuses: [String: String] = [:]
5051
@State private var showAddCertificateSheet = false
5152
@State private var showLoyahdevSheet = false
5253
@State private var showOfficialSheet = false
@@ -171,6 +172,13 @@ struct CertificateView: View {
171172
.fontWeight(.medium)
172173
.foregroundColor(.secondary)
173174
}
175+
176+
if let status = certStatuses[cert.folderName] {
177+
Text(status)
178+
.font(.caption)
179+
.fontWeight(.medium)
180+
.foregroundColor(statusColor(for: status))
181+
}
174182
}
175183
.padding(20)
176184
.frame(maxWidth: .infinity)
@@ -201,21 +209,34 @@ struct CertificateView: View {
201209
}
202210

203211
private func certificateBackground(for cert: CustomCertificate) -> Color {
204-
guard let expiry = certExpiries[cert.folderName], expiry != nil else {
212+
guard let expiry = certExpiries[cert.folderName], let validExpiry = expiry,
213+
let status = certStatuses[cert.folderName] else {
205214
return Color.clear
206215
}
207216
let now = Date()
208-
let components = Calendar.current.dateComponents([.day], from: now, to: expiry!)
217+
let components = Calendar.current.dateComponents([.day], from: now, to: validExpiry)
209218
let days = components.day ?? 0
210-
switch days {
211-
case ..<0, 0:
219+
if status != "Signed" || days <= 0 {
212220
return .red.opacity(0.15)
213-
case 1...30:
221+
} else if days <= 30 {
214222
return .yellow.opacity(0.15)
215-
default:
223+
} else {
216224
return .green.opacity(0.15)
217225
}
218226
}
227+
228+
private func statusColor(for status: String) -> Color {
229+
switch status {
230+
case "Signed":
231+
return .green
232+
case "Revoked", "Mismatch":
233+
return .red
234+
case "Unknown":
235+
return .gray
236+
default:
237+
return .secondary
238+
}
239+
}
219240

220241
private func certificateButtons(for cert: CustomCertificate) -> some View {
221242
HStack {
@@ -255,16 +276,36 @@ struct CertificateView: View {
255276
customCertificates = CertificateFileManager.shared.loadCertificates()
256277
selectedCert = UserDefaults.standard.string(forKey: "selectedCertificateFolder")
257278
ensureSelection()
258-
loadExpiries()
279+
Task {
280+
await loadExpiries()
281+
}
259282
}
260283

261-
private func loadExpiries() {
284+
private func loadExpiries() async {
285+
certExpiries = [:]
286+
certStatuses = [:]
262287
for cert in customCertificates {
263288
let folderName = cert.folderName
264289
let certDir = CertificateFileManager.shared.certificatesDirectory.appendingPathComponent(folderName)
265290
let provURL = certDir.appendingPathComponent("profile.mobileprovision")
266-
let expiry = signer.getExpirationDate(provURL: provURL)
267-
certExpiries[folderName] = expiry
291+
let p12URL = certDir.appendingPathComponent("certificate.p12")
292+
let passwordURL = certDir.appendingPathComponent("password.txt")
293+
let localExpiry = signer.getExpirationDate(provURL: provURL)
294+
let password = (try? String(contentsOf: passwordURL, encoding: .utf8)) ?? ""
295+
let result = await CertRevokeChecker.shared.check(p12URL: p12URL, provisionURL: provURL, password: password)
296+
switch result {
297+
case .success(let isSigned, let expires, let match):
298+
if match {
299+
certExpiries[folderName] = expires
300+
certStatuses[folderName] = isSigned ? "Signed" : "Revoked"
301+
} else {
302+
certStatuses[folderName] = "Mismatch"
303+
certExpiries[folderName] = localExpiry
304+
}
305+
case .failure, .networkError:
306+
certStatuses[folderName] = "Unknown"
307+
certExpiries[folderName] = localExpiry
308+
}
268309
}
269310
}
270311
private func ensureSelection() {
@@ -289,7 +330,9 @@ struct CertificateView: View {
289330
}
290331
}
291332
ensureSelection()
292-
loadExpiries()
333+
Task {
334+
await loadExpiries()
335+
}
293336
}
294337
}
295338

0 commit comments

Comments
 (0)