From 78f2de9393c0bdeb6c24209182f933c4cf7816b8 Mon Sep 17 00:00:00 2001 From: Michael Starke Date: Thu, 23 Feb 2023 14:44:18 +0100 Subject: [PATCH] feature(touchIdSettings): Migrate touchID settings correctly to hashed databasefilenames --- MacPass/Base.lproj/IntegrationPreferences.xib | 9 +- .../MPDocument+BiometricEncryptionSupport.m | 6 +- MacPass/MPIntegrationPreferencesController.m | 2 +- MacPass/MPSettingsHelper.h | 1 - MacPass/MPSettingsHelper.m | 182 +++++++++--------- MacPass/MPTouchIdCompositeKeyStore.m | 4 +- 6 files changed, 102 insertions(+), 102 deletions(-) diff --git a/MacPass/Base.lproj/IntegrationPreferences.xib b/MacPass/Base.lproj/IntegrationPreferences.xib index 63b9f590..cce806c2 100644 --- a/MacPass/Base.lproj/IntegrationPreferences.xib +++ b/MacPass/Base.lproj/IntegrationPreferences.xib @@ -1,8 +1,7 @@ - + - - + @@ -48,7 +47,7 @@ diff --git a/MacPass/MPDocument+BiometricEncryptionSupport.m b/MacPass/MPDocument+BiometricEncryptionSupport.m index 2803c14a..af21dc18 100644 --- a/MacPass/MPDocument+BiometricEncryptionSupport.m +++ b/MacPass/MPDocument+BiometricEncryptionSupport.m @@ -7,8 +7,9 @@ // #import "MPDocument+BiometricEncryptionSupport.h" -#import "MPSettingsHelper.h" #import "MPTouchIdCompositeKeyStore.h" +#import "NSString+MPHash.h" + @implementation MPDocument (BiometricEncryptionSupport) @@ -18,7 +19,8 @@ - (NSString *)biometricKey { if(nil == self.fileURL || nil == self.fileURL.lastPathComponent) { return nil; } - return [NSString stringWithFormat:kMPSettingsKeyEntryTouchIdDatabaseEncryptedKeyFormat, self.fileURL.lastPathComponent]; + + return [self.fileURL.lastPathComponent sha1HexDigest]; } - (NSData *)encryptedKeyData { diff --git a/MacPass/MPIntegrationPreferencesController.m b/MacPass/MPIntegrationPreferencesController.m index 6205e03a..9d363912 100644 --- a/MacPass/MPIntegrationPreferencesController.m +++ b/MacPass/MPIntegrationPreferencesController.m @@ -137,7 +137,7 @@ - (void)runAutotypeDoctor:(id)sender { #pragma mark - #pragma mark Keychain Actions -- (IBAction)RenewTouchIdKey:(id)sender { +- (IBAction)renewTouchIdKey:(id)sender { NSData* publicKeyTag = [MPTouchIdUnlockPublicKeyTag dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *publicKeyQuery = @{ (id)kSecClass: (id)kSecClassKey, diff --git a/MacPass/MPSettingsHelper.h b/MacPass/MPSettingsHelper.h index ce637658..0704732e 100644 --- a/MacPass/MPSettingsHelper.h +++ b/MacPass/MPSettingsHelper.h @@ -25,7 +25,6 @@ /* TouchID */ APPKIT_EXTERN NSString *const kMPSettingsKeyTouchIdEnabled; APPKIT_EXTERN NSString *const kMPSettingsKeyTouchIdEncryptedKeyStore; // NSDictionary with hased file names mapped to keys -APPKIT_EXTERN NSString *const kMPSettingsKeyEntryTouchIdDatabaseEncryptedKeyFormat; /* Clipboard */ APPKIT_EXTERN NSString *const kMPSettingsKeyPasteboardClearTimeout; diff --git a/MacPass/MPSettingsHelper.m b/MacPass/MPSettingsHelper.m index 8262c5d8..a36928a5 100644 --- a/MacPass/MPSettingsHelper.m +++ b/MacPass/MPSettingsHelper.m @@ -26,93 +26,95 @@ #import "MPEntrySearchContext.h" #import "DDHotKey+MacPassAdditions.h" // Default hotkey; -NSString *const kMPSettingsKeyPasteboardClearTimeout = @"ClipboardClearTimeout"; -NSString *const kMPSettingsKeyClearPasteboardOnQuit = @"ClearClipboardOnQuit"; -NSString *const kMPSettingsKeyPreventUniversalClipboard = @"PreventUniversalClipboard"; -NSString *const kMPSettingsKeyBrowserBundleId = @"BrowserBundleId"; -NSString *const kMPSettingsKeyUsePrivateBrowsingWhenOpeningURLs = @"UsePrivateBrowsingWhenOpeningURLs"; -NSString *const kMPSettingsKeyOpenEmptyDatabaseOnLaunch = @"OpenEmptyDatabaseOnLaunch"; -NSString *const kMPSettingsKeyReopenLastDatabaseOnLaunch = @"ReopenLastDatabaseOnLaunch"; -NSString *const kMPSettingsKeyQuitOnLastWindowClose = @"QuitOnLastWindowClose"; -NSString *const kMPSettingsKeyFileChangeStrategy = @"FileChangeStrategy"; -NSString *const kMPSettingsKeyEnableAutosave = @"EnableAutosave"; -NSString *const kMPSettingsKeyFocusSearchAfterUnlock = @"FocusSearchAfterUnlock"; - -NSString *const kMPSettingsKeyDisplayClearTextPasswordsInEntryList = @"DisplayClearTextPasswordsInEntryList"; - -NSString *const kMPSettingsKeyLockOnSleep = @"LockOnSleep"; -NSString *const kMPSettingskeyLockOnLogout = @"LockOnLogout"; -NSString *const kMPSettingskeyLockOnScreenSleep = @"LockOnScreenSleep"; -NSString *const kMPSettingsKeyIdleLockTimeOut = @"IdleLockTimeOut"; -NSString *const kMPSettingsKeyShowInspector = @"ShowInspector"; -NSString *const kMPSettingsKeyEntryTableSortDescriptors = @"EntryTableSortDescriptors"; - -NSString *const kMPSettingsKeyLegacyHideTitle = @"LegacyHideTitle"; -NSString *const kMPSettingsKeyLegacyHideUsername = @"LegacyHideUsername "; -NSString *const kMPSettingsKeyLegacyHidePassword = @"LegacyHidePassword"; -NSString *const kMPSettingsKeyLegacyHideNotes = @"LegacyHideNotes"; -NSString *const kMPSettingsKeyLegacyHideURL = @"LegacyHideURL"; - -NSString *const kMPSettingsKeyLastDatabasePath = @"LastDatabasePath"; -NSString *const kMPSettingsKeyRememberKeyFilesForDatabases = @"RememberKeyFilesForDatabases"; -NSString *const kMPSettingsKeyRememeberdKeysForDatabases = @"RememeberdKeysForDatabases"; - -NSString *const kMPSettingsKeySendCommandForControlKey = @"SendCommandKeyForControlKey"; -NSString *const kMPSettingsKeyEnableGlobalAutotype = @"EnableGlobalAutotype"; -NSString *const kMPSettingsKeyGlobalAutotypeKeyDataKey = @"GlobalAutotypeKeyDataKey"; -NSString *const kMPSettingsKeyDefaultGlobalAutotypeSequence = @"DefaultGlobalAutotypeSequence"; -NSString *const kMPSettingsKeyAutotypeMatchTitle = @"AutotypeMatchTitle"; -NSString *const kMPSettingsKeyAutotypeMatchURL = @"AutotypeMatchURL"; -NSString *const kMPSettingsKeyAutotypeMatchHost = @"AutotypeMatchHost"; -NSString *const kMPSettingsKeyAutotypeMatchTags = @"AutotypeMatchTags"; -NSString *const kMPSettingsKeyGloablAutotypeAlwaysShowCandidateSelection = @"GloablAutotypeAlwaysShowCandidateSelection"; - -NSString *const kMPSettingsKeyTouchIdEnabled = @"EnableSubsequentUnlocksWithTouchID"; -NSString *const kMPSettingsKeyTouchIdEncryptedKeyStore = @"TouchIdEncryptedKeyStore"; -NSString *const kMPSettingsKeyEntryTouchIdDatabaseEncryptedKeyFormat = @"EncryptedDatabaseKeyForTouchID-%@"; - -NSString *const kMPSettingsKeyEntrySearchFilterContext = @"EntrySearchFilterContext"; - -NSString *const kMPSettingsKeyEnableQuicklookPreview = @"EnableQuicklookPreview"; - -NSString *const kMPSettingsKeyCopyGeneratedPasswordToClipboard = @"CopyGeneratedPasswordToClipboard"; - -NSString *const kMPSettingsKeyDefaultPasswordLength = @"DefaultPasswordLength"; -NSString *const kMPSettingsKeyPasswordCharacterFlags = @"PasswordCharacterFlags"; -NSString *const kMPSettingsKeyPasswordEnsureOccurance = @"PasswordEnsureOccurance"; -NSString *const kMPSettingsKeyPasswordUseCustomString = @"PasswordUseCustomString"; -NSString *const kMPSettingsKeyPasswordCustomString = @"PasswordCustomString"; - -NSString *const kMPSettingsKeyPasswordDefaultsForEntry = @"PasswordDefaultsForEntry"; - -NSString *const kMPSettingsKeyDoubleClickURLAction = @"DoubleClickURLAction"; -NSString *const kMPSettingsKeyDoubleClickTitleAction = @"DoubleClickTitleAction"; -NSString *const kMPSettingsKeyUpdatePasswordOnTemplateEntries = @"UpdatePasswordOnTemplateEntries"; -NSString *const kMPSettingsKeyGeneratePasswordForNewEntires = @"GeneratePasswordForNewEntires"; -NSString *const kMPSettingsKeyHideAfterCopyToClipboard = @"HideAfterCopyToClipboard"; - -NSString *const kMPSettingsKeyLoadUnsecurePlugins = @"LoadUnsecurePlugins"; -NSString *const kMPSettingsKeyLoadIncompatiblePlugins = @"LoadIncompatiblePlugins"; -NSString *const kMPSettingsKeyDisabledPlugins = @"DisabledPlugins"; -NSString *const kMPSettingsKeyHideIncopatiblePluginsWarning = @"HideIncopatiblePluginsWarning"; -NSString *const kMPSettingsKeyAllowRemoteFetchOfPluginRepository = @"AllowRemoteFetchOfPluginRepository"; - -NSString *const kMPSettingsKeyFaviconDownloadMethod = @"FaviconDownloadMethod"; - -NSString *const kMPSettingsKeyUseUnifiedToolbar =@"UseUnifiedToolbar"; +#import "NSString+MPHash.h" + +NSString *const kMPSettingsKeyPasteboardClearTimeout = @"ClipboardClearTimeout"; +NSString *const kMPSettingsKeyClearPasteboardOnQuit = @"ClearClipboardOnQuit"; +NSString *const kMPSettingsKeyPreventUniversalClipboard = @"PreventUniversalClipboard"; +NSString *const kMPSettingsKeyBrowserBundleId = @"BrowserBundleId"; +NSString *const kMPSettingsKeyUsePrivateBrowsingWhenOpeningURLs = @"UsePrivateBrowsingWhenOpeningURLs"; +NSString *const kMPSettingsKeyOpenEmptyDatabaseOnLaunch = @"OpenEmptyDatabaseOnLaunch"; +NSString *const kMPSettingsKeyReopenLastDatabaseOnLaunch = @"ReopenLastDatabaseOnLaunch"; +NSString *const kMPSettingsKeyQuitOnLastWindowClose = @"QuitOnLastWindowClose"; +NSString *const kMPSettingsKeyFileChangeStrategy = @"FileChangeStrategy"; +NSString *const kMPSettingsKeyEnableAutosave = @"EnableAutosave"; +NSString *const kMPSettingsKeyFocusSearchAfterUnlock = @"FocusSearchAfterUnlock"; + +NSString *const kMPSettingsKeyDisplayClearTextPasswordsInEntryList = @"DisplayClearTextPasswordsInEntryList"; + +NSString *const kMPSettingsKeyLockOnSleep = @"LockOnSleep"; +NSString *const kMPSettingskeyLockOnLogout = @"LockOnLogout"; +NSString *const kMPSettingskeyLockOnScreenSleep = @"LockOnScreenSleep"; +NSString *const kMPSettingsKeyIdleLockTimeOut = @"IdleLockTimeOut"; +NSString *const kMPSettingsKeyShowInspector = @"ShowInspector"; +NSString *const kMPSettingsKeyEntryTableSortDescriptors = @"EntryTableSortDescriptors"; + +NSString *const kMPSettingsKeyLegacyHideTitle = @"LegacyHideTitle"; +NSString *const kMPSettingsKeyLegacyHideUsername = @"LegacyHideUsername "; +NSString *const kMPSettingsKeyLegacyHidePassword = @"LegacyHidePassword"; +NSString *const kMPSettingsKeyLegacyHideNotes = @"LegacyHideNotes"; +NSString *const kMPSettingsKeyLegacyHideURL = @"LegacyHideURL"; + +NSString *const kMPSettingsKeyLastDatabasePath = @"LastDatabasePath"; +NSString *const kMPSettingsKeyRememberKeyFilesForDatabases = @"RememberKeyFilesForDatabases"; +NSString *const kMPSettingsKeyRememeberdKeysForDatabases = @"RememeberdKeysForDatabases"; + +NSString *const kMPSettingsKeySendCommandForControlKey = @"SendCommandKeyForControlKey"; +NSString *const kMPSettingsKeyEnableGlobalAutotype = @"EnableGlobalAutotype"; +NSString *const kMPSettingsKeyGlobalAutotypeKeyDataKey = @"GlobalAutotypeKeyDataKey"; +NSString *const kMPSettingsKeyDefaultGlobalAutotypeSequence = @"DefaultGlobalAutotypeSequence"; +NSString *const kMPSettingsKeyAutotypeMatchTitle = @"AutotypeMatchTitle"; +NSString *const kMPSettingsKeyAutotypeMatchURL = @"AutotypeMatchURL"; +NSString *const kMPSettingsKeyAutotypeMatchHost = @"AutotypeMatchHost"; +NSString *const kMPSettingsKeyAutotypeMatchTags = @"AutotypeMatchTags"; +NSString *const kMPSettingsKeyGloablAutotypeAlwaysShowCandidateSelection = @"GloablAutotypeAlwaysShowCandidateSelection"; + +NSString *const kMPSettingsKeyTouchIdEnabled = @"EnableSubsequentUnlocksWithTouchID"; +NSString *const kMPSettingsKeyTouchIdEncryptedKeyStore = @"TouchIdEncryptedKeyStore"; + +NSString *const kMPSettingsKeyEntrySearchFilterContext = @"EntrySearchFilterContext"; + +NSString *const kMPSettingsKeyEnableQuicklookPreview = @"EnableQuicklookPreview"; + +NSString *const kMPSettingsKeyCopyGeneratedPasswordToClipboard = @"CopyGeneratedPasswordToClipboard"; + +NSString *const kMPSettingsKeyDefaultPasswordLength = @"DefaultPasswordLength"; +NSString *const kMPSettingsKeyPasswordCharacterFlags = @"PasswordCharacterFlags"; +NSString *const kMPSettingsKeyPasswordEnsureOccurance = @"PasswordEnsureOccurance"; +NSString *const kMPSettingsKeyPasswordUseCustomString = @"PasswordUseCustomString"; +NSString *const kMPSettingsKeyPasswordCustomString = @"PasswordCustomString"; + +NSString *const kMPSettingsKeyPasswordDefaultsForEntry = @"PasswordDefaultsForEntry"; + +NSString *const kMPSettingsKeyDoubleClickURLAction = @"DoubleClickURLAction"; +NSString *const kMPSettingsKeyDoubleClickTitleAction = @"DoubleClickTitleAction"; +NSString *const kMPSettingsKeyUpdatePasswordOnTemplateEntries = @"UpdatePasswordOnTemplateEntries"; +NSString *const kMPSettingsKeyGeneratePasswordForNewEntires = @"GeneratePasswordForNewEntires"; +NSString *const kMPSettingsKeyHideAfterCopyToClipboard = @"HideAfterCopyToClipboard"; + +NSString *const kMPSettingsKeyLoadUnsecurePlugins = @"LoadUnsecurePlugins"; +NSString *const kMPSettingsKeyLoadIncompatiblePlugins = @"LoadIncompatiblePlugins"; +NSString *const kMPSettingsKeyDisabledPlugins = @"DisabledPlugins"; +NSString *const kMPSettingsKeyHideIncopatiblePluginsWarning = @"HideIncopatiblePluginsWarning"; +NSString *const kMPSettingsKeyAllowRemoteFetchOfPluginRepository = @"AllowRemoteFetchOfPluginRepository"; + +NSString *const kMPSettingsKeyFaviconDownloadMethod = @"FaviconDownloadMethod"; + +NSString *const kMPSettingsKeyUseUnifiedToolbar = @"UseUnifiedToolbar"; /* Deprecated */ -NSString *const kMPDeprecatedSettingsKeyRememberKeyFilesForDatabases = @"kMPSettingsKeyRememberKeyFilesForDatabases"; -NSString *const kMPDeprecatedSettingsKeyLastDatabasePath = @"MPLastDatabasePath"; -NSString *const kMPDeprecatedSettingsKeyDocumentsAutotypeFixNoteWasShown = @"DocumentsAutotypeFixNoteWasShown"; -NSString *const kMPDeprecatedSettingsKeyDoubleClickURLToLaunch = @"DoubleClickURLToLaunch"; -NSString *const kMPDeprecatedSettingsKeyEntrySearchFilterMode = @"EntrySearchFilterMode"; -NSString *const kMPDeprecatedSettingsKeyHttpPort = @"HttpPort"; -NSString *const kMPDeprecatedSettingsKeyEnableHttpServer = @"EnableHttpServer"; -NSString *const kMPDeprecatedSettingsKeyShowMenuItem = @"ShowMenuItem"; -NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"KeyDefaultPasswordRounds"; -NSString *const kMPDepricatedSettingsKeyLoadUnsecurePlugins = @"MPLoadUnsecurePlugins"; -NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"AutotypeHideAccessibiltyWarning"; +NSString *const kMPDeprecatedSettingsKeyRememberKeyFilesForDatabases = @"kMPSettingsKeyRememberKeyFilesForDatabases"; +NSString *const kMPDeprecatedSettingsKeyLastDatabasePath = @"MPLastDatabasePath"; +NSString *const kMPDeprecatedSettingsKeyDocumentsAutotypeFixNoteWasShown = @"DocumentsAutotypeFixNoteWasShown"; +NSString *const kMPDeprecatedSettingsKeyDoubleClickURLToLaunch = @"DoubleClickURLToLaunch"; +NSString *const kMPDeprecatedSettingsKeyEntrySearchFilterMode = @"EntrySearchFilterMode"; +NSString *const kMPDeprecatedSettingsKeyHttpPort = @"HttpPort"; +NSString *const kMPDeprecatedSettingsKeyEnableHttpServer = @"EnableHttpServer"; +NSString *const kMPDeprecatedSettingsKeyShowMenuItem = @"ShowMenuItem"; +NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"KeyDefaultPasswordRounds"; +NSString *const kMPDepricatedSettingsKeyLoadUnsecurePlugins = @"MPLoadUnsecurePlugins"; +NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"AutotypeHideAccessibiltyWarning"; +NSString *const kMPDepricatedSettingsKeyEntryTouchIdDatabaseEncryptedKeyFormat = @"EncryptedDatabaseKeyForTouchID-%@"; @implementation MPSettingsHelper @@ -320,13 +322,13 @@ + (void)_migrateTouchIdKeyStore { NSArray *defaultKeys = [NSUserDefaults.standardUserDefaults dictionaryRepresentation].allKeys; // find all keys in old format for(NSString *key in defaultKeys) { - NSString *prefix = [NSString stringWithFormat:kMPSettingsKeyEntryTouchIdDatabaseEncryptedKeyFormat, @""]; + NSString *prefix = [NSString stringWithFormat:kMPDepricatedSettingsKeyEntryTouchIdDatabaseEncryptedKeyFormat, @""]; if([key hasPrefix:prefix]) { - // database name was adde - NSString *databaseName = [key substringFromIndex:prefix.length]; + // database name was added + NSString *databaseNameHash = [key substringFromIndex:prefix.length].sha1HexDigest; NSData *encryptedKey = [NSUserDefaults.standardUserDefaults dataForKey:key]; - if(!storedKeys[databaseName] && encryptedKey) { - storedKeys[databaseName] = encryptedKey; + if(!storedKeys[databaseNameHash] && encryptedKey) { + storedKeys[databaseNameHash] = encryptedKey; } [NSUserDefaults.standardUserDefaults removeObjectForKey:key]; } diff --git a/MacPass/MPTouchIdCompositeKeyStore.m b/MacPass/MPTouchIdCompositeKeyStore.m index 39cc7ae7..5b698b8e 100644 --- a/MacPass/MPTouchIdCompositeKeyStore.m +++ b/MacPass/MPTouchIdCompositeKeyStore.m @@ -66,9 +66,7 @@ - (void)saveCompositeKey:(KPKCompositeKey *)compositeKey forDocumentKey:(NSStrin } /* FIXME this behavour is wrong. Old keys do not get cleared so this leaves a lot of data behind that should be cleaned up*/ - - MPTouchIDKeyStorage touchIdMode = [NSUserDefaults.standardUserDefaults integerForKey:kMPSettingsKeyTouchIdEnabled]; - switch(touchIdMode) { + switch(self.touchIdEnabledState) { case MPTouchIDKeyStorageTransient: [NSUserDefaults.standardUserDefaults removeObjectForKey:documentKey]; if(nil != encryptedCompositeKey) {