2727#define NSLocalizedString (key, comment ) \
2828[bundlelang localizedStringForKey: (key) value: @" " table: nil ]
2929
30- @interface AdvancedWindowController : NSWindowController
31- @end
32-
33- @implementation AdvancedWindowController
34-
35- - (instancetype )initWithText : (NSString *)text {
36- if (self = [super init ]) {
37- NSView *view = [[NSView alloc ] init ];
38-
39- NSTextField *label = [NSTextField labelWithString: text];
40- label.translatesAutoresizingMaskIntoConstraints = NO ;
41- [view addSubview: label];
42- [label.topAnchor constraintEqualToAnchor: view.topAnchor constant: 25 ].active = YES ;
43- [label.centerXAnchor constraintEqualToAnchor: view.centerXAnchor].active = YES ;
44-
45- NSButton *ok = [[NSButton alloc ] init ];
46- ok.translatesAutoresizingMaskIntoConstraints = NO ;
47- ok.title = @" OK" ;
48- ok.keyEquivalent = @" \r " ;
49- ok.highlighted = YES ;
50- ok.bezelStyle = NSBezelStyleRounded;
51- ok.target = self;
52- ok.action = @selector (buttonPressed: );
53- [view addSubview: ok];
54- [ok.bottomAnchor constraintEqualToAnchor: view.bottomAnchor constant: -25 ].active = YES ;
55- [ok.rightAnchor constraintEqualToAnchor: view.rightAnchor constant: -25 ].active = YES ;
56-
57- self.window = [[NSWindow alloc ] initWithContentRect: NSMakeRect (0 , 0 , 400 , 250 )
58- styleMask: NSWindowStyleMaskBorderless
59- backing: NSBackingStoreBuffered
60- defer: NO ];
61- self.window .contentView = view;
62- self.window .defaultButtonCell = ok.cell ;
63- }
64- return self;
65- }
66-
67- - (void )buttonPressed : (id )sender {
68- [self .window.sheetParent endSheet: self .window];
69- }
70-
71- - (void )showWindow : (id )sender {
72- [self .window makeKeyAndOrderFront: sender];
73- }
74-
75- @end
76-
7730@interface ID_updater : NSPreferencePane <UpdateDelegate, NSURLSessionDownloadDelegate , NSUserNotificationCenterDelegate >
7831
7932@property (weak ) IBOutlet NSTextField *mainLabel;
@@ -235,45 +188,6 @@ - (void)updateAvailable:(NSString *)_available filename:(NSURL *)_filename {
235188 });
236189}
237190
238- - (BOOL )verifyCMSSignature: (NSData *)signatureData data: (NSData *)data cert: (NSData *)cert {
239- #define RETURN_IF_OERROR (MSG ) if (oserr) { NSLog (MSG); return false ; }
240- CMSDecoderRef decoderRef;
241- OSStatus oserr = CMSDecoderCreate (&decoderRef);
242- RETURN_IF_OERROR (@" CMSDecoderCreate" )
243- id decoder = CFBridgingRelease (decoderRef);
244-
245- oserr = CMSDecoderUpdateMessage ((__bridge CMSDecoderRef)decoder, signatureData.bytes , signatureData.length );
246- RETURN_IF_OERROR (@" CMSDecoderUpdateMessage" )
247- oserr = CMSDecoderFinalizeMessage ((__bridge CMSDecoderRef)decoder);
248- RETURN_IF_OERROR (@" CMSDecoderFinalizeMessage" )
249- oserr = CMSDecoderSetDetachedContent ((__bridge CMSDecoderRef)decoder, (__bridge CFDataRef)data);
250- RETURN_IF_OERROR (@" CMSDecoderSetDetachedContent" )
251-
252- size_t numSignersOut = 0 ;
253- oserr = CMSDecoderGetNumSigners ((__bridge CMSDecoderRef)decoder, &numSignersOut);
254- RETURN_IF_OERROR (@" CMSDecoderGetNumSigners" )
255- if (numSignersOut != 1 ) {
256- NSLog (@" Invalid number of signers: %lu " , numSignersOut);
257- return false ;
258- }
259-
260- SecPolicyRef policy = SecPolicyCreateBasicX509 ();
261- CMSSignerStatus status;
262- oserr = CMSDecoderCopySignerStatus ((__bridge CMSDecoderRef)decoder, 0 , policy, TRUE , &status, nil , nil );
263- CFRelease (policy);
264- RETURN_IF_OERROR (@" CMSDecoderCopySignerStatus" )
265- bool isValid = status == kCMSSignerValid ;
266-
267- SecCertificateRef signerCert;
268- oserr = CMSDecoderCopySignerCert ((__bridge CMSDecoderRef)decoder, 0 , &signerCert);
269- RETURN_IF_OERROR (@" CMSDecoderCopySignerCert" )
270- bool isSameCert = [cert isEqualToData: CFBridgingRelease (SecCertificateCopyData (signerCert))];
271- CFRelease (signerCert);
272-
273- NSLog (@" Signature is (%d ) and cert is equal(%d )" , isValid, isSameCert);
274- return isValid && isSameCert;
275- }
276-
277191#pragma mark - Connection delegate
278192
279193- (void )URLSession: (NSURLSession *)session downloadTask: (NSURLSessionDownloadTask *)downloadTask didWriteData: (int64_t )bytesWritten totalBytesWritten: (int64_t )totalBytesWritten totalBytesExpectedToWrite: (int64_t )totalBytesExpectedToWrite {
@@ -292,9 +206,13 @@ - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTas
292206 [NSFileManager .defaultManager moveItemAtPath: location.path toPath: tmp error: nil ];
293207
294208 NSString *volumePath = @" /Volumes/Open-EID" ;
295- NSArray *args = @[@" attach " , @" -verify " , @" -mountpoint " , volumePath, tmp ];
209+ NSArray *args = @[@" detach " , volumePath];
296210 NSTask *task = [NSTask launchedTaskWithLaunchPath: @" /usr/bin/hdiutil" arguments: args];
297211 [task waitUntilExit ];
212+
213+ args = @[@" attach" , @" -verify" , @" -mountpoint" , volumePath, tmp];
214+ task = [NSTask launchedTaskWithLaunchPath: @" /usr/bin/hdiutil" arguments: args];
215+ [task waitUntilExit ];
298216 if (task.terminationStatus != 0 ) {
299217 self.infoLabel .stringValue = [NSString stringWithFormat: @" Verify failed, status: %i " , task.terminationStatus];
300218 return ;
@@ -348,7 +266,7 @@ - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTas
348266 }
349267
350268 if ([signatureType isEqualToString: @" CMS" ]) {
351- if ([self verifyCMSSignature: signature data: data cert: certData])
269+ if ([Updater verifyCMSSignature: signature data: data cert: certData])
352270 [NSTask launchedTaskWithLaunchPath: @" /usr/bin/open" arguments: @[path]];
353271 else
354272 {
@@ -406,42 +324,8 @@ - (IBAction)installUpdate:(id)sender {
406324 }];
407325}
408326
409- - (NSString *)versionInfo: (NSString *)pkg {
410- NSDictionary *list = [NSDictionary dictionaryWithContentsOfFile: [NSString stringWithFormat: @" /var/db/receipts/%@ .plist" , pkg]];
411- return list ? list[@" PackageVersion" ] : [NSString string ];
412- }
413-
414327- (IBAction )diagnostics: (id )sender {
415- NSDictionary *versions = @{
416- @" DigiDoc4" : update.digidoc4 ,
417- @" Open-EID" : update.baseVersion ,
418- @" ID-Updater" : update.updaterVersion ,
419- NSLocalizedString (@" Safari (Extensions) browser plugin" , nil ): [self versionInfo:@"ee.ria.safari-token-signing"],
420- NSLocalizedString(@" Safari (NPAPI) browser plugin" , nil ): [self versionInfo:@"ee.ria.firefox-token-signing"],
421- NSLocalizedString(@" Chrome/Firefox browser plugin" , nil ): [self versionInfo:@"ee.ria.chrome-token-signing"],
422- NSLocalizedString(@" Chrome browser plugin" , nil ): [self versionInfo:@"ee.ria.token-signing-chrome"],
423- NSLocalizedString(@" Chrome browser plugin policy" , nil ): [self versionInfo:@"ee.ria.token-signing-chrome-policy"],
424- NSLocalizedString(@" Firefox browser plugin" , nil ): [self versionInfo:@"ee.ria.token-signing-firefox"],
425- NSLocalizedString(@" Web-eID native component" , nil ): [self versionInfo:@"eu.web-eid.web-eid"],
426- NSLocalizedString(@" Safari browser extension (Web-eID)" , nil ): [self versionInfo:@"eu.web-eid.web-eid-safari"],
427- NSLocalizedString(@" Chrome browser extension (Web-eID)" , nil ): [self versionInfo:@"eu.web-eid.web-eid-chrome"],
428- NSLocalizedString(@" Chrome browser extension policy (Web-eID)" , nil ): [self versionInfo:@"eu.web-eid.web-eid-chrome-policy"],
429- NSLocalizedString(@" Firefox browser extension (Web-eID)" , nil ): [self versionInfo:@"eu.web-eid.web-eid-firefox"],
430- NSLocalizedString(@" PKCS11 loader" , nil ): [self versionInfo:@"ee.ria.firefox-pkcs11-loader"],
431- NSLocalizedString(@" IDEMIA PKCS11 loader" , nil ): [self versionInfo:@"com.idemia.awp.xpi"],
432- @"OpenSC": [self versionInfo:@"org.opensc-project.mac"],
433- @"IDEMIA PKCS11": [self versionInfo:@"com.idemia.awp.pkcs11"],
434- @"EstEID Tokend": [self versionInfo:@"ee.ria.esteid-tokend"],
435- @"EstEID CTK Tokend": [self versionInfo:@"ee.ria.esteid-ctk-tokend"],
436- @"IDEMIA Tokend": [self versionInfo:@"com.idemia.awp.tokend"],
437- };
438- NSMutableArray *list = [[NSMutableArray alloc ] init ];
439- [versions enumerateKeysAndObjectsUsingBlock: ^(id key, id object, BOOL *stop) {
440- if (object != nil && ((NSString *)object).length != 0 )
441- [list addObject: [NSString stringWithFormat: @" %@ (%@ )" , key, object]];
442- }];
443- self.advancedViewController = [[AdvancedWindowController alloc ] initWithText: [list componentsJoinedByString: @" \n " ]];
444- [self .mainView.window beginSheet: self .advancedViewController.window completionHandler: nil ];
328+ self.advancedViewController = [[AdvancedWindowController alloc ] initWithParent: self .mainView.window];
445329}
446330
447331@end
0 commit comments