From 1a2659d311b17a35ceb6c215d5737d790467e612 Mon Sep 17 00:00:00 2001 From: michael starke Date: Fri, 7 Mar 2014 01:55:06 +0100 Subject: [PATCH] Double-Password search (bound to everywhere filter butter for testing) --- MacPass/MPContextBarViewController.m | 7 +++-- MacPass/MPDocument+Search.m | 41 ++++++++++++++++++---------- MacPass/MPDocument.h | 11 ++++++-- MacPass/MPDocument.m | 12 ++++++-- 4 files changed, 48 insertions(+), 23 deletions(-) diff --git a/MacPass/MPContextBarViewController.m b/MacPass/MPContextBarViewController.m index 4dccb960..19b0a9a0 100644 --- a/MacPass/MPContextBarViewController.m +++ b/MacPass/MPContextBarViewController.m @@ -68,8 +68,8 @@ typedef NS_ENUM(NSUInteger, MPContextTab) { self.emptyTrashButton.textColor = [NSColor whiteColor]; - NSInteger tags[] = { MPEntrySearchTitles, MPEntrySearchUsernames, MPEntrySearchPasswords, MPEntrySearchNotes, MPEntrySearchUrls }; - NSArray *buttons = @[self.titleButton, self.usernameButton, self.passwordButton, self.notesButton, self.urlButton ]; + NSInteger tags[] = { MPEntrySearchTitles, MPEntrySearchUsernames, MPEntrySearchPasswords, MPEntrySearchNotes, MPEntrySearchUrls, MPEntrySearchDoublePasswords }; + NSArray *buttons = @[self.titleButton, self.usernameButton, self.passwordButton, self.notesButton, self.urlButton, self.everywhereButton ]; for(NSUInteger iIndex = 0; iIndex < [buttons count]; iIndex++) { [buttons[iIndex] setAction:@selector(toggleSearchFlags:)]; [buttons[iIndex] setTag:tags[iIndex]]; @@ -122,7 +122,8 @@ typedef NS_ENUM(NSUInteger, MPContextTab) { - (void)_updateFilterButtons { MPDocument *document = [[self windowController] document]; - [self.everywhereButton setEnabled:NO]; + //[self.everywhereButton setEnabled:NO]; + [self.everywhereButton setState:HNHStateForBool(MPTestFlagInOptions(MPEntrySearchDoublePasswords, document.activeFlags))]; [self.notesButton setState:HNHStateForBool(MPTestFlagInOptions(MPEntrySearchNotes, document.activeFlags))]; [self.passwordButton setState:HNHStateForBool(MPTestFlagInOptions(MPEntrySearchPasswords, document.activeFlags))]; [self.titleButton setState:HNHStateForBool(MPTestFlagInOptions(MPEntrySearchTitles, document.activeFlags))]; diff --git a/MacPass/MPDocument+Search.m b/MacPass/MPDocument+Search.m index 6aef9152..26c06554 100644 --- a/MacPass/MPDocument+Search.m +++ b/MacPass/MPDocument+Search.m @@ -1,5 +1,5 @@ -// // MPDocument+Search.m +// // MacPass // // Created by Michael Starke on 25.02.14. @@ -59,6 +59,7 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul } - (void)toggleSearchFlags:(id)sender { + static MPEntrySearchFlags oldFlags; if(![sender respondsToSelector:@selector(tag)]) { return; // We need to read the button tag } @@ -67,13 +68,22 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul } MPEntrySearchFlags toggleFlag = [sender tag]; MPEntrySearchFlags newFlags = MPEntrySearchNone; + BOOL isDoublePasswordFlag = (toggleFlag == MPEntrySearchDoublePasswords); switch([sender state]) { case NSOffState: toggleFlag ^= MPEntrySearchAllFlags; - newFlags = self.activeFlags & toggleFlag; + newFlags = isDoublePasswordFlag ? oldFlags : (self.activeFlags & toggleFlag); break; case NSOnState: - newFlags = self.activeFlags | toggleFlag; + if(isDoublePasswordFlag) { + oldFlags = self.activeFlags; + newFlags = MPEntrySearchDoublePasswords; + } + else { + /* always mask the double passwords in case another button was pressed */ + self.activeFlags &= (MPEntrySearchDoublePasswords ^ MPEntrySearchAllFlags); + newFlags = self.activeFlags | toggleFlag; + } break; default: NSAssert(NO, @"Internal state is inconsistent"); @@ -89,27 +99,28 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul #pragma mark Search - (NSArray *)_findEntriesMatchingCurrentSearch { /* Filter double passwords */ - MPDocument __weak *weakSelf = self; if(MPTestFlagInOptions(MPEntrySearchDoublePasswords, self.activeFlags)) { - __block NSMutableDictionary *passwordToEntryMap; + __block NSMutableDictionary *passwordToEntryMap = [[NSMutableDictionary alloc] initWithCapacity:100]; /* Build up a usage map */ - [[weakSelf.root childEntries] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + [[self.root childEntries] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { KPKEntry *entry = obj; - NSMutableSet *entrySet = passwordToEntryMap[entry.password]; - if(entrySet) { - [entrySet addObject:entry]; - } - else { - passwordToEntryMap[entry.password] = [NSMutableSet setWithObject:entry]; + /* skip entries without passwords */ + if([entry.password length] > 0) { + NSMutableSet *entrySet = passwordToEntryMap[entry.password]; + if(entrySet) { + [entrySet addObject:entry]; + } + else { + passwordToEntryMap[entry.password] = [NSMutableSet setWithObject:entry]; + } } }]; /* check for usage count */ __block NSMutableArray *doublePasswords = [[NSMutableArray alloc] init]; [[passwordToEntryMap allKeys] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSSet *entrySet = passwordToEntryMap[obj]; - KPKEntry *entry = [entrySet anyObject]; - if(entry) { - [doublePasswords addObject:entry]; + if([entrySet count] > 1) { + [doublePasswords addObjectsFromArray:[entrySet allObjects]]; } }]; return doublePasswords; diff --git a/MacPass/MPDocument.h b/MacPass/MPDocument.h index 4077fd7d..2af9467f 100644 --- a/MacPass/MPDocument.h +++ b/MacPass/MPDocument.h @@ -48,8 +48,15 @@ typedef NS_OPTIONS(NSUInteger, MPEntrySearchFlags) { MPEntrySearchTitles = (1<<2), MPEntrySearchPasswords = (1<<3), MPEntrySearchNotes = (1<<4), - MPEntrySearchDoublePasswords = (1<<5), - MPEntrySearchAllFlags = (MPEntrySearchDoublePasswords | MPEntrySearchNotes | MPEntrySearchPasswords | MPEntrySearchTitles | MPEntrySearchUrls | MPEntrySearchUsernames) + MPEntrySearchAllAttributes = (1<<5), + MPEntrySearchDoublePasswords = (1<<6), // Unused in GUI for now + MPEntrySearchAllFlags = (MPEntrySearchDoublePasswords | + MPEntrySearchNotes | + MPEntrySearchPasswords | + MPEntrySearchTitles | + MPEntrySearchUrls | + MPEntrySearchUsernames | + MPEntrySearchAllAttributes ) }; @interface MPDocument : NSDocument diff --git a/MacPass/MPDocument.m b/MacPass/MPDocument.m index c17d7173..d5d824a8 100644 --- a/MacPass/MPDocument.m +++ b/MacPass/MPDocument.m @@ -147,12 +147,14 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey } return NO; } + [self _watchForFileChanges:NO]; NSData *treeData = [self.tree encryptWithPassword:self.compositeKey forVersion:version error:outError]; - if(![treeData writeToURL:url options:0 error:outError]) { + BOOL sucess = [treeData writeToURL:url options:0 error:outError]; + if(!sucess) { NSLog(@"%@", [*outError localizedDescription]); - return NO; } - return YES; + [self _watchForFileChanges:YES]; + return sucess; } - (BOOL)readFromURL:(NSURL *)url ofType:(NSString *)typeName error:(NSError **)outError { @@ -634,4 +636,8 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey [self.trash clear]; } +# pragma mark File Watching +- (void) _watchForFileChanges:(BOOL)watch { +} + @end