From f6e784b1de446fd46a25a83d851108bdc486caf9 Mon Sep 17 00:00:00 2001 From: Michael Starke Date: Wed, 31 Aug 2022 21:32:45 +0200 Subject: [PATCH] Fixed missing breaks in key storage. Added popup to set touchId in favour of checkbox --- MacPass/Base.lproj/PasswordInputView.xib | 44 +++++++++++++++++++++--- MacPass/MPPasswordInputController.m | 29 ++++++++++++++-- MacPass/MPSettingsHelper.h | 8 +++++ MacPass/MPTouchIdCompositeKeyStore.m | 2 ++ 4 files changed, 77 insertions(+), 6 deletions(-) diff --git a/MacPass/Base.lproj/PasswordInputView.xib b/MacPass/Base.lproj/PasswordInputView.xib index 6d7731d5..e54e1c5a 100644 --- a/MacPass/Base.lproj/PasswordInputView.xib +++ b/MacPass/Base.lproj/PasswordInputView.xib @@ -1,8 +1,9 @@ - + - + + @@ -16,6 +17,8 @@ + + @@ -130,9 +133,33 @@ Gw + + + + + + + + + + + + + + + - @@ -151,24 +178,33 @@ Gw + + + + + + + + - + + diff --git a/MacPass/MPPasswordInputController.m b/MacPass/MPPasswordInputController.m index 617ad249..a5aee9fb 100644 --- a/MacPass/MPPasswordInputController.m +++ b/MacPass/MPPasswordInputController.m @@ -50,6 +50,7 @@ @interface MPPasswordInputController () @property (weak) IBOutlet NSButton *cancelButton; @property (weak) IBOutlet NSButton *touchIdButton; @property (weak) IBOutlet NSButton *touchIdEnabledButton; +@property (strong) IBOutlet NSPopUpButton *touchIdModeButton; @property (copy) NSString *message; @property (copy) NSString *cancelLabel; @@ -87,8 +88,32 @@ - (void)viewDidLoad { [self.enablePasswordCheckBox bind:NSValueBinding toObject:self withKeyPath:NSStringFromSelector(@selector(enablePassword)) options:nil]; [self.togglePasswordButton bind:NSEnabledBinding toObject:self withKeyPath:NSStringFromSelector(@selector(enablePassword)) options:nil]; [self.passwordTextField bind:NSEnabledBinding toObject:self withKeyPath:NSStringFromSelector(@selector(enablePassword)) options:nil]; - NSUserDefaultsController *defaultsController = [NSUserDefaultsController sharedUserDefaultsController]; - [self.touchIdEnabledButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyEntryTouchIdEnabled] options:nil]; + + NSMenu* touchIDMenu = [[NSMenu alloc] init]; + NSMenuItem *disabledItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"TOUCHID_DISABLED", @"menu item to disable touchid key storage") + action:NULL + keyEquivalent:@""]; + NSMenuItem *transitentItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"TOUCHID_TRANSIENT_KEY_STORAGE", @"menu item to enable transient touchid key storage") + action:NULL + keyEquivalent:@""]; + NSMenuItem *persistentItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"TOUCHID_PERSISTENT_KEY_STORAGE", @"menu item to enable persisntent touchid key storage") + action:NULL + keyEquivalent:@""]; + + disabledItem.tag = MPTouchIDKeyStorageDisabled; + transitentItem.tag = MPTouchIDKeyStorageTransient; + persistentItem.tag = MPTouchIDKeyStoragePersistent; + + touchIDMenu.itemArray = @[disabledItem, transitentItem, persistentItem]; + self.touchIdModeButton.menu = touchIDMenu; + [self.touchIdModeButton bind:NSSelectedTagBinding + toObject:NSUserDefaultsController.sharedUserDefaultsController + withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyEntryTouchIdEnabled] + options:nil]; + [self.touchIdEnabledButton bind:NSValueBinding + toObject:NSUserDefaultsController.sharedUserDefaultsController + withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyEntryTouchIdEnabled] + options:nil]; self.touchIdEnabledButton.hidden = YES; if (@available(macOS 10.13.4, *)) { self.touchIdEnabledButton.hidden = NO; diff --git a/MacPass/MPSettingsHelper.h b/MacPass/MPSettingsHelper.h index fff5779b..3b850c2c 100644 --- a/MacPass/MPSettingsHelper.h +++ b/MacPass/MPSettingsHelper.h @@ -129,6 +129,14 @@ typedef NS_ENUM(NSUInteger, MPFaviconDownloadMethod) { MPFaviconDownloadMethodGoogle, }; +// the values are mapped to NSControlStateValue for backwards compatibilty +// older implementations did use a checkbox to store this setting +typedef NS_ENUM(NSInteger, MPTouchIDKeyStorage) { + MPTouchIDKeyStorageTransient = NSControlStateValueMixed, + MPTouchIDKeyStorageDisabled = NSControlStateValueOff, + MPTouchIDKeyStoragePersistent = NSControlStateValueOn +}; + /* Password Generation */ APPKIT_EXTERN NSString *const kMPSettingsKeyCopyGeneratedPasswordToClipboard; APPKIT_EXTERN NSString *const kMPSettingsKeyDefaultPasswordLength; diff --git a/MacPass/MPTouchIdCompositeKeyStore.m b/MacPass/MPTouchIdCompositeKeyStore.m index 235c7082..cc90562f 100644 --- a/MacPass/MPTouchIdCompositeKeyStore.m +++ b/MacPass/MPTouchIdCompositeKeyStore.m @@ -49,11 +49,13 @@ - (void)saveCompositeKey:(KPKCompositeKey *)compositeKey forDocumentKey:(NSStrin if(nil != encryptedCompositeKey) { self.keys[documentKey] = encryptedCompositeKey; } + break; case NSControlStateValueOn: self.keys[documentKey] = nil; if(nil != encryptedCompositeKey) { [NSUserDefaults.standardUserDefaults setObject:encryptedCompositeKey forKey:documentKey]; } + break; default: [NSUserDefaults.standardUserDefaults removeObjectForKey:documentKey]; self.keys[documentKey] = nil;