Skip to content

Commit e370cee

Browse files
Manage errors that may occur retrieving certificates expiration date
1 parent 6b6577b commit e370cee

File tree

2 files changed

+39
-17
lines changed

2 files changed

+39
-17
lines changed

certificates/certificates.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -270,10 +270,12 @@ func DeleteCertificates(certDir *paths.Path) {
270270
}
271271

272272
// IsExpired checks if a certificate is expired
273-
func IsExpired() bool {
273+
func IsExpired() (bool, error) {
274274
bound := time.Now().AddDate(0, 1, 0)
275-
// TODO: manage errors
276-
dateS, _ := GetExpirationDate()
275+
dateS, err := GetExpirationDate()
276+
if err != nil {
277+
return false, err
278+
}
277279
date, _ := time.Parse(time.DateTime, strings.ReplaceAll(dateS, " +0000", ""))
278-
return date.Before(bound)
280+
return date.Before(bound), nil
279281
}

certificates/install_darwin.go

+33-13
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ const char *uninstallCert() {
9090
return "";
9191
}
9292
93-
const char *getExpirationDate(){
93+
const char *getExpirationDate(char *expirationDate){
9494
// Create a key-value dictionary used to query the Keychain and look for the "Arduino" root certificate.
9595
NSDictionary *getquery = @{
9696
(id)kSecClass: (id)kSecClassCertificate,
@@ -104,24 +104,39 @@ const char *getExpirationDate(){
104104
// Use this function to check for errors
105105
err = SecItemCopyMatching((CFDictionaryRef)getquery, (CFTypeRef *)&cert);
106106
107-
if (err != errSecItemNotFound && err != noErr){
107+
if (err != noErr){
108108
NSString *errString = [@"Error: " stringByAppendingFormat:@"%d", err];
109109
NSLog(@"%@", errString);
110-
return "";
110+
return [errString cStringUsingEncoding:[NSString defaultCStringEncoding]];
111111
}
112112
113113
// Get data from the certificate. We just need the "invalidity date" property.
114114
CFDictionaryRef valuesDict = SecCertificateCopyValues(cert, (__bridge CFArrayRef)@[(__bridge id)kSecOIDInvalidityDate], NULL);
115115
116-
// TODO: Error checking.
117-
CFDictionaryRef invalidityDateDictionaryRef = CFDictionaryGetValue(valuesDict, kSecOIDInvalidityDate);
118-
CFTypeRef invalidityRef = CFDictionaryGetValue(invalidityDateDictionaryRef, kSecPropertyKeyValue);
119-
id expirationDateValue = CFBridgingRelease(invalidityRef);
120-
121-
CFRelease(valuesDict);
116+
id expirationDateValue;
117+
if(valuesDict){
118+
CFDictionaryRef invalidityDateDictionaryRef = CFDictionaryGetValue(valuesDict, kSecOIDInvalidityDate);
119+
if(invalidityDateDictionaryRef){
120+
CFTypeRef invalidityRef = CFDictionaryGetValue(invalidityDateDictionaryRef, kSecPropertyKeyValue);
121+
if(invalidityRef){
122+
expirationDateValue = CFBridgingRelease(invalidityRef);
123+
}
124+
}
125+
CFRelease(valuesDict);
126+
}
122127
123128
NSString *outputString = [@"" stringByAppendingFormat:@"%@", expirationDateValue];
124-
return [outputString cStringUsingEncoding:[NSString defaultCStringEncoding]];
129+
if([outputString isEqualToString:@""]){
130+
NSString *errString = @"Error: the expiration date of the certificate could not be found";
131+
NSLog(@"%@", errString);
132+
return [errString cStringUsingEncoding:[NSString defaultCStringEncoding]];
133+
}
134+
135+
// This workaround allows to obtain the expiration date alongside the error message
136+
strncpy(expirationDate, [outputString cStringUsingEncoding:[NSString defaultCStringEncoding]], 32);
137+
expirationDate[32-1] = 0;
138+
139+
return "";
125140
}
126141
*/
127142
import "C"
@@ -169,10 +184,15 @@ func UninstallCertificates() error {
169184
// GetExpirationDate returns the expiration date of a certificate stored in the keychain
170185
func GetExpirationDate() (string, error) {
171186
log.Infof("Retrieving certificate's expiration date")
172-
p := C.getExpirationDate()
187+
dateString := C.CString("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") // 32 characters string
188+
defer C.free(unsafe.Pointer(dateString))
189+
p := C.getExpirationDate(dateString)
173190
s := C.GoString(p)
174191
if len(s) != 0 {
175-
return s, nil
192+
oscmd := exec.Command("osascript", "-e", "display dialog \""+s+"\" buttons \"OK\" with title \"Arduino Agent: Error retrieving expiration date\"")
193+
_ = oscmd.Run()
194+
return "", errors.New(s)
176195
}
177-
return "", nil
196+
date := C.GoString(dateString)
197+
return date, nil
178198
}

0 commit comments

Comments
 (0)