diff --git a/MacPass.xcodeproj/project.pbxproj b/MacPass.xcodeproj/project.pbxproj index df3d3a21..29f63e54 100644 --- a/MacPass.xcodeproj/project.pbxproj +++ b/MacPass.xcodeproj/project.pbxproj @@ -40,6 +40,7 @@ 4C1ECAE322CCD30F00F46069 /* MPAutotypeDoctor.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1ECAE222CCD30F00F46069 /* MPAutotypeDoctor.m */; }; 4C1F7FA21E3A12E600D6A40E /* MPModifiedKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1F7FA11E3A12E600D6A40E /* MPModifiedKey.m */; }; 4C1FA07B18231900003A3F8C /* MPDocument+Autotype.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1FA07A18231900003A3F8C /* MPDocument+Autotype.m */; }; + 4C2057EE23CDF6F900C731EC /* MPPathCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2057ED23CDF6F900C731EC /* MPPathCell.m */; }; 4C224B4217DFCB2400FF6AEE /* MPNumericalInputFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C224B4117DFCB2400FF6AEE /* MPNumericalInputFormatter.m */; }; 4C25703F1BF11C2300D39416 /* MPPluginPreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C25703D1BF11C2300D39416 /* MPPluginPreferencesController.m */; }; 4C25D58716CF0FAA00F6806C /* EntryView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C25D58616CF0FAA00F6806C /* EntryView.xib */; }; @@ -401,6 +402,9 @@ 4C1F7FA01E3A12E600D6A40E /* MPModifiedKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPModifiedKey.h; sourceTree = ""; }; 4C1F7FA11E3A12E600D6A40E /* MPModifiedKey.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPModifiedKey.m; sourceTree = ""; }; 4C1FA07A18231900003A3F8C /* MPDocument+Autotype.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MPDocument+Autotype.m"; sourceTree = ""; }; + 4C2057EC23CDF6F900C731EC /* MPPathCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPathCell.h; sourceTree = ""; }; + 4C2057ED23CDF6F900C731EC /* MPPathCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPathCell.m; sourceTree = ""; }; + 4C2057EF23CDFC2000C731EC /* MPPathControl+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MPPathControl+Private.h"; sourceTree = ""; }; 4C21F29F195B3A48002D610D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/MainMenu.strings; sourceTree = ""; }; 4C224B4017DFCB2300FF6AEE /* MPNumericalInputFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPNumericalInputFormatter.h; sourceTree = ""; }; 4C224B4117DFCB2400FF6AEE /* MPNumericalInputFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPNumericalInputFormatter.m; sourceTree = ""; }; @@ -1641,7 +1645,10 @@ 4C57AE1217BA422B00CA4F34 /* MPSegmentedContextCell.h */, 4C57AE1317BA422B00CA4F34 /* MPSegmentedContextCell.m */, 4CC59C2521AF0893005E8D6B /* MPPathControl.h */, + 4C2057EF23CDFC2000C731EC /* MPPathControl+Private.h */, 4CC59C2621AF0893005E8D6B /* MPPathControl.m */, + 4C2057EC23CDF6F900C731EC /* MPPathCell.h */, + 4C2057ED23CDF6F900C731EC /* MPPathCell.m */, ); name = Controls; sourceTree = ""; @@ -2115,6 +2122,7 @@ 4C0728BD17B5B7F7005A7DD9 /* MPPasswordEditWindowController.m in Sources */, 4C0F647B17B6BC9C00D9522A /* MPSavePanelAccessoryViewController.m in Sources */, 4C0949591FD6B89B004F2971 /* NSUserNotification+MPAdditions.m in Sources */, + 4C2057EE23CDF6F900C731EC /* MPPathCell.m in Sources */, 4C3B42871F935316007B04FD /* MPDayCountFormatter.m in Sources */, 3C0CDECF21CFEDD200B2A10B /* NSTextView+MPTouchBarExtension.m in Sources */, 4C57AE1417BA422B00CA4F34 /* MPSegmentedContextCell.m in Sources */, diff --git a/MacPass/Base.lproj/PasswordInputView.xib b/MacPass/Base.lproj/PasswordInputView.xib index 24b65fbf..9606084d 100644 --- a/MacPass/Base.lproj/PasswordInputView.xib +++ b/MacPass/Base.lproj/PasswordInputView.xib @@ -1,8 +1,8 @@ - + - + @@ -10,6 +10,7 @@ + @@ -22,10 +23,10 @@ - + - + @@ -46,13 +47,13 @@ DQ - - + + - + @@ -60,7 +61,7 @@ DQ - + @@ -68,7 +69,7 @@ DQ - + @@ -85,14 +86,14 @@ DQ + @@ -144,15 +153,18 @@ Gw + + - + + - + diff --git a/MacPass/MPPasswordInputController.m b/MacPass/MPPasswordInputController.m index 02438664..6bd6d97f 100644 --- a/MacPass/MPPasswordInputController.m +++ b/MacPass/MPPasswordInputController.m @@ -39,6 +39,7 @@ @property (weak) IBOutlet MPPathControl *keyPathControl; @property (weak) IBOutlet NSImageView *messageImageView; @property (weak) IBOutlet NSTextField *messageInfoTextField; +@property (strong) IBOutlet NSTextField *keyFileWarningTextField; @property (weak) IBOutlet NSButton *togglePasswordButton; @property (weak) IBOutlet NSButton *enablePasswordCheckBox; @property (weak) IBOutlet NSButton *unlockButton; @@ -50,6 +51,7 @@ @property (assign) BOOL showPassword; @property (nonatomic, assign) BOOL enablePassword; @property (copy) passwordInputCompletionBlock completionHandler; + @end @implementation MPPasswordInputController @@ -72,6 +74,7 @@ } - (void)viewDidLoad { + [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didSetKeyURL:) name:MPPathControlDidSetURLNotification object:self.keyPathControl]; self.messageImageView.image = [NSImage imageNamed:NSImageNameCaution]; [self.passwordTextField bind:NSStringFromSelector(@selector(showPassword)) toObject:self withKeyPath:NSStringFromSelector(@selector(showPassword)) options:nil]; [self.togglePasswordButton bind:NSValueBinding toObject:self withKeyPath:NSStringFromSelector(@selector(showPassword)) options:nil]; @@ -108,7 +111,7 @@ self.passwordTextField.placeholderString = NSLocalizedString(@"PASSWORD_INPUT_ENTER_PASSWORD", "Placeholder in the unlock-password input field if password is enabled"); } else { - self.passwordTextField.placeholderString = NSLocalizedString(@"PASSWORD_INPUT_NO_PASSWORD", "Placeholder in the unlock-password input field if password is disabled"); + self.passwordTextField.placeholderString = NSLocalizedString(@"PASSWORD_INPUT_NO_PASSWORD", "Placeholder in the unlock-password input field if password is disabled"); } } @@ -211,4 +214,29 @@ } } +- (void)_didSetKeyURL:(NSNotification *)notification { + if(notification.object != self.keyPathControl) { + return; // wrong sender + } + NSDocument *document = (NSDocument *)self.windowController.document; + NSData *keyFileData = [NSData dataWithContentsOfURL:self.keyPathControl.URL]; + KPKFileVersion keyFileVersion = [KPKFormat.sharedFormat fileVersionForData:keyFileData]; + BOOL isKdbDatabaseFile = (keyFileVersion.format != KPKDatabaseFormatUnknown); + if(isKdbDatabaseFile) { + if([document.fileURL isEqual:self.keyPathControl.URL]) { + self.keyFileWarningTextField.stringValue = NSLocalizedString(@"ERROR_CURRENT_DATABASE_FILE_SELECTED_AS_KEY_FILE", "Error message displayed when the current database file is also set as the key file"); + self.keyFileWarningTextField.hidden = NO; + } + else { + self.keyFileWarningTextField.stringValue = NSLocalizedString(@"ERROR_DATABASE_FILE_SELECTED_AS_KEY_FILE", "Error message displayed when a keepass database file is set as the key file"); + self.keyFileWarningTextField.hidden = NO; + } + } + else { + self.keyFileWarningTextField.stringValue = @""; + self.keyFileWarningTextField.hidden = YES; + } +} + + @end diff --git a/MacPass/MPPathCell.h b/MacPass/MPPathCell.h new file mode 100644 index 00000000..01b05fac --- /dev/null +++ b/MacPass/MPPathCell.h @@ -0,0 +1,17 @@ +// +// MPPathCell.h +// MacPass +// +// Created by Michael Starke on 14.01.20. +// Copyright © 2020 HicknHack Software GmbH. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface MPPathCell : NSPathCell + +@end + +NS_ASSUME_NONNULL_END diff --git a/MacPass/MPPathCell.m b/MacPass/MPPathCell.m new file mode 100644 index 00000000..615afbc7 --- /dev/null +++ b/MacPass/MPPathCell.m @@ -0,0 +1,23 @@ +// +// MPPathCell.m +// MacPass +// +// Created by Michael Starke on 14.01.20. +// Copyright © 2020 HicknHack Software GmbH. All rights reserved. +// + +#import "MPPathCell.h" +#import "MPPathControl+Private.h" + +@implementation MPPathCell + +- (void)setURL:(NSURL *)URL { + super.URL = URL; + if([self.controlView isKindOfClass:MPPathControl.class]) { + MPPathControl *pc = (MPPathControl *)self.controlView; + [pc _postDidSetURLNotification]; + } +} + + +@end diff --git a/MacPass/MPPathControl+Private.h b/MacPass/MPPathControl+Private.h new file mode 100644 index 00000000..33780ef8 --- /dev/null +++ b/MacPass/MPPathControl+Private.h @@ -0,0 +1,22 @@ +// +// MPPathControl+Private.h +// MacPass +// +// Created by Michael Starke on 14.01.20. +// Copyright © 2020 HicknHack Software GmbH. All rights reserved. +// + +#import + + +#import "MPPathControl.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface MPPathControl () + +- (void)_postDidSetURLNotification; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MacPass/MPPathControl.h b/MacPass/MPPathControl.h index 1245ff5f..5d77dd79 100644 --- a/MacPass/MPPathControl.h +++ b/MacPass/MPPathControl.h @@ -10,6 +10,8 @@ NS_ASSUME_NONNULL_BEGIN +APPKIT_EXTERN NSString *const MPPathControlDidSetURLNotification; + @interface MPPathControl : NSPathControl - (IBAction)showOpenPanel:(id _Nullable)sender; diff --git a/MacPass/MPPathControl.m b/MacPass/MPPathControl.m index fe5c8d5f..a2b3f7aa 100644 --- a/MacPass/MPPathControl.m +++ b/MacPass/MPPathControl.m @@ -7,6 +7,11 @@ // #import "MPPathControl.h" +#import "MPPathControl+Private.h" + +#import "MPPathCell.h" + +NSString *const MPPathControlDidSetURLNotification = @"MPPathControlDidSetURLNotification"; @implementation MPPathControl @@ -25,15 +30,26 @@ - (instancetype)initWithFrame:(NSRect)frameRect { self = [super initWithFrame:frameRect]; self.delegate = self; + [self _setupCell]; return self; } - (instancetype)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; - self.delegate = self; + self.delegate = self; + [self _setupCell]; return self; } +- (void)_setupCell { + if([self.cell isKindOfClass:MPPathCell.class]) { + return; + } + NSData *archive = [NSKeyedArchiver archivedDataWithRootObject:self.cell]; + NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:archive]; + self.cell = [[MPPathCell alloc] initWithCoder:unarchiver]; +} + - (void)willOpenMenu:(NSMenu *)menu withEvent:(NSEvent *)event { if(!self.URL) { [menu cancelTracking]; @@ -59,7 +75,7 @@ return; } if(@available(macOS 10.11, *)) { - NSLog(@"Skipping 10.10 pathControl:willPopUpMenu"); + // skip } else { if(!self.URL) { @@ -78,4 +94,8 @@ openPanel.prompt = NSLocalizedString(@"CHOOSE_FILE_BUTTON_TITLE", @"Button title in the key file selection dialog for selecting a key"); } +- (void)_postDidSetURLNotification { + [NSNotificationCenter.defaultCenter postNotificationName:MPPathControlDidSetURLNotification object:self]; +} + @end