Double-Password search (bound to everywhere filter butter for testing)

This commit is contained in:
michael starke
2014-03-07 01:55:06 +01:00
parent 41ba8f57ba
commit 1a2659d311
4 changed files with 48 additions and 23 deletions

View File

@@ -68,8 +68,8 @@ typedef NS_ENUM(NSUInteger, MPContextTab) {
self.emptyTrashButton.textColor = [NSColor whiteColor]; self.emptyTrashButton.textColor = [NSColor whiteColor];
NSInteger tags[] = { MPEntrySearchTitles, MPEntrySearchUsernames, MPEntrySearchPasswords, MPEntrySearchNotes, MPEntrySearchUrls }; NSInteger tags[] = { MPEntrySearchTitles, MPEntrySearchUsernames, MPEntrySearchPasswords, MPEntrySearchNotes, MPEntrySearchUrls, MPEntrySearchDoublePasswords };
NSArray *buttons = @[self.titleButton, self.usernameButton, self.passwordButton, self.notesButton, self.urlButton ]; NSArray *buttons = @[self.titleButton, self.usernameButton, self.passwordButton, self.notesButton, self.urlButton, self.everywhereButton ];
for(NSUInteger iIndex = 0; iIndex < [buttons count]; iIndex++) { for(NSUInteger iIndex = 0; iIndex < [buttons count]; iIndex++) {
[buttons[iIndex] setAction:@selector(toggleSearchFlags:)]; [buttons[iIndex] setAction:@selector(toggleSearchFlags:)];
[buttons[iIndex] setTag:tags[iIndex]]; [buttons[iIndex] setTag:tags[iIndex]];
@@ -122,7 +122,8 @@ typedef NS_ENUM(NSUInteger, MPContextTab) {
- (void)_updateFilterButtons { - (void)_updateFilterButtons {
MPDocument *document = [[self windowController] document]; 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.notesButton setState:HNHStateForBool(MPTestFlagInOptions(MPEntrySearchNotes, document.activeFlags))];
[self.passwordButton setState:HNHStateForBool(MPTestFlagInOptions(MPEntrySearchPasswords, document.activeFlags))]; [self.passwordButton setState:HNHStateForBool(MPTestFlagInOptions(MPEntrySearchPasswords, document.activeFlags))];
[self.titleButton setState:HNHStateForBool(MPTestFlagInOptions(MPEntrySearchTitles, document.activeFlags))]; [self.titleButton setState:HNHStateForBool(MPTestFlagInOptions(MPEntrySearchTitles, document.activeFlags))];

View File

@@ -1,5 +1,5 @@
//
// MPDocument+Search.m // MPDocument+Search.m
//
// MacPass // MacPass
// //
// Created by Michael Starke on 25.02.14. // Created by Michael Starke on 25.02.14.
@@ -59,6 +59,7 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul
} }
- (void)toggleSearchFlags:(id)sender { - (void)toggleSearchFlags:(id)sender {
static MPEntrySearchFlags oldFlags;
if(![sender respondsToSelector:@selector(tag)]) { if(![sender respondsToSelector:@selector(tag)]) {
return; // We need to read the button tag return; // We need to read the button tag
} }
@@ -67,13 +68,22 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul
} }
MPEntrySearchFlags toggleFlag = [sender tag]; MPEntrySearchFlags toggleFlag = [sender tag];
MPEntrySearchFlags newFlags = MPEntrySearchNone; MPEntrySearchFlags newFlags = MPEntrySearchNone;
BOOL isDoublePasswordFlag = (toggleFlag == MPEntrySearchDoublePasswords);
switch([sender state]) { switch([sender state]) {
case NSOffState: case NSOffState:
toggleFlag ^= MPEntrySearchAllFlags; toggleFlag ^= MPEntrySearchAllFlags;
newFlags = self.activeFlags & toggleFlag; newFlags = isDoublePasswordFlag ? oldFlags : (self.activeFlags & toggleFlag);
break; break;
case NSOnState: 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; break;
default: default:
NSAssert(NO, @"Internal state is inconsistent"); NSAssert(NO, @"Internal state is inconsistent");
@@ -89,27 +99,28 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul
#pragma mark Search #pragma mark Search
- (NSArray *)_findEntriesMatchingCurrentSearch { - (NSArray *)_findEntriesMatchingCurrentSearch {
/* Filter double passwords */ /* Filter double passwords */
MPDocument __weak *weakSelf = self;
if(MPTestFlagInOptions(MPEntrySearchDoublePasswords, self.activeFlags)) { if(MPTestFlagInOptions(MPEntrySearchDoublePasswords, self.activeFlags)) {
__block NSMutableDictionary *passwordToEntryMap; __block NSMutableDictionary *passwordToEntryMap = [[NSMutableDictionary alloc] initWithCapacity:100];
/* Build up a usage map */ /* 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; KPKEntry *entry = obj;
NSMutableSet *entrySet = passwordToEntryMap[entry.password]; /* skip entries without passwords */
if(entrySet) { if([entry.password length] > 0) {
[entrySet addObject:entry]; NSMutableSet *entrySet = passwordToEntryMap[entry.password];
} if(entrySet) {
else { [entrySet addObject:entry];
passwordToEntryMap[entry.password] = [NSMutableSet setWithObject:entry]; }
else {
passwordToEntryMap[entry.password] = [NSMutableSet setWithObject:entry];
}
} }
}]; }];
/* check for usage count */ /* check for usage count */
__block NSMutableArray *doublePasswords = [[NSMutableArray alloc] init]; __block NSMutableArray *doublePasswords = [[NSMutableArray alloc] init];
[[passwordToEntryMap allKeys] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { [[passwordToEntryMap allKeys] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSSet *entrySet = passwordToEntryMap[obj]; NSSet *entrySet = passwordToEntryMap[obj];
KPKEntry *entry = [entrySet anyObject]; if([entrySet count] > 1) {
if(entry) { [doublePasswords addObjectsFromArray:[entrySet allObjects]];
[doublePasswords addObject:entry];
} }
}]; }];
return doublePasswords; return doublePasswords;

View File

@@ -48,8 +48,15 @@ typedef NS_OPTIONS(NSUInteger, MPEntrySearchFlags) {
MPEntrySearchTitles = (1<<2), MPEntrySearchTitles = (1<<2),
MPEntrySearchPasswords = (1<<3), MPEntrySearchPasswords = (1<<3),
MPEntrySearchNotes = (1<<4), MPEntrySearchNotes = (1<<4),
MPEntrySearchDoublePasswords = (1<<5), MPEntrySearchAllAttributes = (1<<5),
MPEntrySearchAllFlags = (MPEntrySearchDoublePasswords | MPEntrySearchNotes | MPEntrySearchPasswords | MPEntrySearchTitles | MPEntrySearchUrls | MPEntrySearchUsernames) MPEntrySearchDoublePasswords = (1<<6), // Unused in GUI for now
MPEntrySearchAllFlags = (MPEntrySearchDoublePasswords |
MPEntrySearchNotes |
MPEntrySearchPasswords |
MPEntrySearchTitles |
MPEntrySearchUrls |
MPEntrySearchUsernames |
MPEntrySearchAllAttributes )
}; };
@interface MPDocument : NSDocument @interface MPDocument : NSDocument

View File

@@ -147,12 +147,14 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey
} }
return NO; return NO;
} }
[self _watchForFileChanges:NO];
NSData *treeData = [self.tree encryptWithPassword:self.compositeKey forVersion:version error:outError]; 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]); NSLog(@"%@", [*outError localizedDescription]);
return NO;
} }
return YES; [self _watchForFileChanges:YES];
return sucess;
} }
- (BOOL)readFromURL:(NSURL *)url ofType:(NSString *)typeName error:(NSError **)outError { - (BOOL)readFromURL:(NSURL *)url ofType:(NSString *)typeName error:(NSError **)outError {
@@ -634,4 +636,8 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey
[self.trash clear]; [self.trash clear];
} }
# pragma mark File Watching
- (void) _watchForFileChanges:(BOOL)watch {
}
@end @end