Skip to content

Commit 30f6669

Browse files
Manage errors that may occur retrieving certificates expiration date
1 parent 4de327d commit 30f6669

File tree

2 files changed

+40
-18
lines changed

2 files changed

+40
-18
lines changed

certificates/certificates.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -269,10 +269,12 @@ func DeleteCertificates(certDir *paths.Path) {
269269
}
270270

271271
// isExpired checks if a certificate is expired or about to expire (less than 1 month)
272-
func isExpired() bool {
272+
func isExpired() (bool, error) {
273273
bound := time.Now().AddDate(0, 1, 0)
274-
// TODO: manage errors
275-
dateS, _ := GetExpirationDate()
274+
dateS, err := GetExpirationDate()
275+
if err != nil {
276+
return false, err
277+
}
276278
date, _ := time.Parse(time.DateTime, dateS)
277-
return date.Before(bound)
279+
return date.Before(bound), nil
278280
}

certificates/install_darwin.go

Lines changed: 34 additions & 14 deletions
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"
@@ -170,10 +185,15 @@ func UninstallCertificates() error {
170185
// GetExpirationDate returns the expiration date of a certificate stored in the keychain
171186
func GetExpirationDate() (string, error) {
172187
log.Infof("Retrieving certificate's expiration date")
173-
p := C.getExpirationDate()
174-
s := strings.ReplaceAll(C.GoString(p), " +0000", "")
188+
dateString := C.CString("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") // 32 characters string
189+
defer C.free(unsafe.Pointer(dateString))
190+
p := C.getExpirationDate(dateString)
191+
s := C.GoString(p)
175192
if len(s) != 0 {
176-
return s, nil
193+
oscmd := exec.Command("osascript", "-e", "display dialog \""+s+"\" buttons \"OK\" with title \"Arduino Agent: Error retrieving expiration date\"")
194+
_ = oscmd.Run()
195+
return "", errors.New(s)
177196
}
178-
return "", nil
197+
date := C.GoString(dateString)
198+
return strings.ReplaceAll(date, " +0000", ""), nil
179199
}

0 commit comments

Comments
 (0)