diff --git a/MacPass.xcodeproj/project.pbxproj b/MacPass.xcodeproj/project.pbxproj index aad3e887..5fc5cf3e 100644 --- a/MacPass.xcodeproj/project.pbxproj +++ b/MacPass.xcodeproj/project.pbxproj @@ -117,6 +117,7 @@ 4C45FB30178E0CE20010007D /* MPTestDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C45FB2F178E0CE20010007D /* MPTestDocument.m */; }; 4C46B88517063A070046109A /* NSString+MPPasswordCreation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C46B88417063A070046109A /* NSString+MPPasswordCreation.m */; }; 4C473A8718AFD85B0073FD2E /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C473A8518AFD7250073FD2E /* XCTest.framework */; }; + 4C49CFD624252389004092E7 /* KPKEntry+MPTags.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C49CFD524252389004092E7 /* KPKEntry+MPTags.m */; }; 4C4A100F176286FD00BBF2CA /* MPTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A100E176286FD00BBF2CA /* MPTableView.m */; }; 4C4B728518E4B9B400A1A5D5 /* MPDockTileHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B728418E4B9B400A1A5D5 /* MPDockTileHelper.m */; }; 4C4B7EE917A45EC6000234C7 /* MPDatePickingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B7EE717A45EC5000234C7 /* MPDatePickingViewController.m */; }; @@ -533,6 +534,8 @@ 4C46B88317063A070046109A /* NSString+MPPasswordCreation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+MPPasswordCreation.h"; sourceTree = ""; }; 4C46B88417063A070046109A /* NSString+MPPasswordCreation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+MPPasswordCreation.m"; sourceTree = ""; }; 4C473A8518AFD7250073FD2E /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 4C49CFD424252389004092E7 /* KPKEntry+MPTags.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "KPKEntry+MPTags.h"; sourceTree = ""; }; + 4C49CFD524252389004092E7 /* KPKEntry+MPTags.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "KPKEntry+MPTags.m"; sourceTree = ""; }; 4C4A100D176286FD00BBF2CA /* MPTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPTableView.h; sourceTree = ""; }; 4C4A100E176286FD00BBF2CA /* MPTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTableView.m; sourceTree = ""; }; 4C4B2ED122D8CA6100EB6BFD /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/PluginRepositoryBrowserView.strings; sourceTree = ""; }; @@ -1147,6 +1150,8 @@ 3C0CDECE21CFEDD200B2A10B /* NSTextView+MPTouchBarExtension.m */, 4C2057F523CF3E9A00C731EC /* NSRunningApplication+MPAdditions.h */, 4C2057F623CF3E9A00C731EC /* NSRunningApplication+MPAdditions.m */, + 4C49CFD424252389004092E7 /* KPKEntry+MPTags.h */, + 4C49CFD524252389004092E7 /* KPKEntry+MPTags.m */, ); name = Categories; sourceTree = ""; @@ -2049,6 +2054,7 @@ 4C735FC02035FCBF00708D53 /* MPPluginEntryActionContext.m in Sources */, 4C61EA0316D2FD0800AC519E /* MPOutlineViewController.m in Sources */, 4C65C79C16DD283900E32CFF /* MPToolbarButton.m in Sources */, + 4C49CFD624252389004092E7 /* KPKEntry+MPTags.m in Sources */, 4C431BCD16E2A82800700A81 /* MPPasteBoardController.m in Sources */, 4C6AEEF91A043E2B00CA2420 /* MPDocumentController.m in Sources */, 4C370EFE215B76CB00703AAE /* MPOutlineTableCellView.m in Sources */, diff --git a/MacPass/KPKEntry+MPTags.h b/MacPass/KPKEntry+MPTags.h new file mode 100644 index 00000000..b403970c --- /dev/null +++ b/MacPass/KPKEntry+MPTags.h @@ -0,0 +1,22 @@ +// +// KPKEntry+MPTags.h +// MacPass +// +// Created by Michael Starke on 20.03.20. +// Copyright © 2020 HicknHack Software GmbH. All rights reserved. +// + +#import + + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface KPKEntry (MPTags) + +@property (readonly, copy) NSString *tagsString; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MacPass/KPKEntry+MPTags.m b/MacPass/KPKEntry+MPTags.m new file mode 100644 index 00000000..41d76a01 --- /dev/null +++ b/MacPass/KPKEntry+MPTags.m @@ -0,0 +1,24 @@ +// +// KPKEntry+MPTags.m +// MacPass +// +// Created by Michael Starke on 20.03.20. +// Copyright © 2020 HicknHack Software GmbH. All rights reserved. +// + +#import "KPKEntry+MPTags.h" + +#import + + +@implementation KPKEntry (MPTags) + ++ (NSSet *)keyPathsForValuesAffectingTagsString { + return [NSSet setWithObject:NSStringFromSelector(@selector(tags))]; +} + +- (NSString *)tagsString { + return [self.tags componentsJoinedByString:@" "]; +} + +@end diff --git a/MacPass/MPDocument+Search.m b/MacPass/MPDocument+Search.m index 3c0ffab7..c2a3ba14 100644 --- a/MacPass/MPDocument+Search.m +++ b/MacPass/MPDocument+Search.m @@ -64,7 +64,7 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul MPDocument __weak *weakSelf = self; dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(backgroundQueue, ^{ - NSArray *results = [weakSelf _findEntriesMatchingCurrentSearch]; + NSArray *results = [weakSelf _findEntriesMatchingSearch:weakSelf.searchContext]; dispatch_sync(dispatch_get_main_queue(), ^{ [NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidChangeSearchResults object:weakSelf userInfo:@{ kMPDocumentSearchResultsKey: results }]; }); @@ -128,9 +128,9 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul } #pragma mark Search -- (NSArray *)_findEntriesMatchingCurrentSearch { +- (NSArray *)_findEntriesMatchingSearch:(MPEntrySearchContext *)context { /* Filter double passwords */ - if(MPIsFlagSetInOptions(MPEntrySearchDoublePasswords, self.searchContext.searchFlags)) { + if(MPIsFlagSetInOptions(MPEntrySearchDoublePasswords, context.searchFlags)) { NSMutableDictionary *passwordToEntryMap = [[NSMutableDictionary alloc] initWithCapacity:100]; /* Build up a usage map */ for(KPKEntry *entry in self.root.searchableChildEntries) { @@ -155,7 +155,7 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul } return doublePasswords; } - if(MPIsFlagSetInOptions(MPEntrySearchExpiredEntries, self.searchContext.searchFlags)) { + if(MPIsFlagSetInOptions(MPEntrySearchExpiredEntries, context.searchFlags)) { NSPredicate *expiredPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { KPKNode *node = evaluatedObject; return node.timeInfo.isExpired; @@ -163,7 +163,7 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul return [[self.root searchableChildEntries] filteredArrayUsingPredicate:expiredPredicate]; } /* Filter using predicates */ - NSArray *predicates = [self _filterPredicatesWithString:self.searchContext.searchString]; + NSArray *predicates = [self _filterPredicatesWithString:context.searchString]; if(predicates) { NSPredicate *fullFilter = [NSCompoundPredicate orPredicateWithSubpredicates:predicates]; return [[self.root searchableChildEntries] filteredArrayUsingPredicate:fullFilter]; @@ -194,7 +194,7 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.notes CONTAINS[cd] %@", string]]; } if(searchInAllAttributes) { - [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.tags CONTAINS[cd] %@", string]]; + [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.tagsString CONTAINS[cd] %@", string]]; [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.uuid.UUIDString CONTAINS[cd] %@", string]]; NSPredicate *allAttributesPredicate = [NSPredicate predicateWithBlock:^BOOL(id _Nullable evaluatedObject, NSDictionary * _Nullable bindings) {