@@ -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*/
127142import "C"
@@ -170,10 +185,15 @@ func UninstallCertificates() error {
170185// GetExpirationDate returns the expiration date of a certificate stored in the keychain
171186func 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