@@ -47,6 +47,7 @@ extension Date {
4747struct 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