mirror of
https://github.com/MacPass/MacPass.git
synced 2025-12-14 16:22: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];
|
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))];
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user