@@ -90,7 +90,7 @@ const char *uninstallCert() {
90
90
return "";
91
91
}
92
92
93
- const char *getExpirationDate(){
93
+ const char *getExpirationDate(char *expirationDate ){
94
94
// Create a key-value dictionary used to query the Keychain and look for the "Arduino" root certificate.
95
95
NSDictionary *getquery = @{
96
96
(id)kSecClass: (id)kSecClassCertificate,
@@ -104,24 +104,39 @@ const char *getExpirationDate(){
104
104
// Use this function to check for errors
105
105
err = SecItemCopyMatching((CFDictionaryRef)getquery, (CFTypeRef *)&cert);
106
106
107
- if (err != errSecItemNotFound && err != noErr){
107
+ if (err != noErr){
108
108
NSString *errString = [@"Error: " stringByAppendingFormat:@"%d", err];
109
109
NSLog(@"%@", errString);
110
- return "" ;
110
+ return [errString cStringUsingEncoding:[NSString defaultCStringEncoding]] ;
111
111
}
112
112
113
113
// Get data from the certificate. We just need the "invalidity date" property.
114
114
CFDictionaryRef valuesDict = SecCertificateCopyValues(cert, (__bridge CFArrayRef)@[(__bridge id)kSecOIDInvalidityDate], NULL);
115
115
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
+ }
122
127
123
128
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 "";
125
140
}
126
141
*/
127
142
import "C"
@@ -169,10 +184,15 @@ func UninstallCertificates() error {
169
184
// GetExpirationDate returns the expiration date of a certificate stored in the keychain
170
185
func GetExpirationDate () (string , error ) {
171
186
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 )
173
190
s := C .GoString (p )
174
191
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 )
176
195
}
177
- return "" , nil
196
+ date := C .GoString (dateString )
197
+ return date , nil
178
198
}
0 commit comments