mirror of
https://github.com/MacPass/MacPass.git
synced 2025-12-14 15:12:21 +00:00
Double-Password search (bound to everywhere filter butter for testing)
This commit is contained in:
@@ -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))];
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user