diff --git a/Cartfile b/Cartfile index dbd3f0f3..f2003e58 100644 --- a/Cartfile +++ b/Cartfile @@ -1,3 +1,3 @@ -github "sparkle-project/Sparkle" ~> 1.15.1 -github "mstarke/KeePassKit" "752150afc789813892eea81c3633f6eec77b41c5" +github "sparkle-project/Sparkle" ~> 1.17.0 +github "mstarke/KeePassKit" "d24bde60a1d73ab2483277f1b424d30d75210150" github "mstarke/HNHUi" ~> 1.1 diff --git a/Cartfile.resolved b/Cartfile.resolved index 9a074f55..c65b85cf 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,3 +1,3 @@ github "mstarke/HNHUi" "1.1" -github "mstarke/KeePassKit" "752150afc789813892eea81c3633f6eec77b41c5" -github "sparkle-project/Sparkle" "1.15.1" +github "mstarke/KeePassKit" "d24bde60a1d73ab2483277f1b424d30d75210150" +github "sparkle-project/Sparkle" "1.17.0" diff --git a/MacPass.xcodeproj/project.pbxproj b/MacPass.xcodeproj/project.pbxproj index 5c8fe3f6..a193993d 100644 --- a/MacPass.xcodeproj/project.pbxproj +++ b/MacPass.xcodeproj/project.pbxproj @@ -1490,7 +1490,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = MP; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = "HicknHack Software GmbH"; TargetAttributes = { 4C77E36115B84A240093A587 = { diff --git a/MacPass.xcodeproj/xcshareddata/xcschemes/MacPass.xcscheme b/MacPass.xcodeproj/xcshareddata/xcschemes/MacPass.xcscheme index 58f42cbf..9ddbc86e 100644 --- a/MacPass.xcodeproj/xcshareddata/xcschemes/MacPass.xcscheme +++ b/MacPass.xcodeproj/xcshareddata/xcschemes/MacPass.xcscheme @@ -1,6 +1,6 @@ - + - + @@ -37,7 +37,7 @@ - + @@ -184,7 +184,7 @@ - + @@ -224,7 +224,7 @@ - + diff --git a/MacPass/MPActionHelper.m b/MacPass/MPActionHelper.m index cfb9c4db..bd37dafa 100644 --- a/MacPass/MPActionHelper.m +++ b/MacPass/MPActionHelper.m @@ -37,8 +37,8 @@ @(MPActionExportXML): NSStringFromSelector(@selector(exportAsXML:)), @(MPActionImportXML): NSStringFromSelector(@selector(importFromXML:)), @(MPActionToggleQuicklook): NSStringFromSelector(@selector(toggleQuicklookPreview:)), - @(MPActionShowEntryHistory): NSStringFromSelector(@selector(showHistoryForEntry:)), - @(MPActionHideEntryHistory): NSStringFromSelector(@selector(hideHistoryForEntry:)), + @(MPActionShowEntryHistory): NSStringFromSelector(@selector(showEntryHistory:)), + @(MPActionHideEntryHistory): NSStringFromSelector(@selector(hideEntryHistory:)), @(MPActionPerformAutotypeForSelectedEntry): NSStringFromSelector(@selector(performAutotypeForEntry:)) }; }); diff --git a/MacPass/MPContextBarViewController.m b/MacPass/MPContextBarViewController.m index f9536b48..955e91a3 100644 --- a/MacPass/MPContextBarViewController.m +++ b/MacPass/MPContextBarViewController.m @@ -69,7 +69,7 @@ typedef NS_ENUM(NSUInteger, MPContextTab) { //self.emptyTrashButton.textColor = [NSColor whiteColor]; } - [[self view] bind:NSSelectedIndexBinding toObject:self withKeyPath:@"activeTab" options:nil]; + [self.view bind:NSSelectedIndexBinding toObject:self withKeyPath:NSStringFromSelector(@selector(activeTab)) options:nil]; /* Setup Filter Bar buttons and menu */ NSInteger tags[] = { MPEntrySearchTitles, MPEntrySearchUsernames, MPEntrySearchPasswords, MPEntrySearchNotes, MPEntrySearchUrls }; @@ -87,7 +87,7 @@ typedef NS_ENUM(NSUInteger, MPContextTab) { [[specialMenu itemAtIndex:0] setAction:@selector(toggleSearchFlags:)]; for(NSInteger iIndex = 0; iIndex < (sizeof(specialTags)/sizeof(NSInteger)); iIndex++) { NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:titles[iIndex] action:@selector(toggleSearchFlags:) keyEquivalent:@""]; - [item setTag:specialTags[iIndex]]; + item.tag = specialTags[iIndex]; [specialMenu addItem:item]; } [self.specialFilterPopUpButton setMenu:specialMenu]; diff --git a/MacPass/MPDocument.m b/MacPass/MPDocument.m index af0786f4..2968cf8d 100644 --- a/MacPass/MPDocument.m +++ b/MacPass/MPDocument.m @@ -346,6 +346,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou return; } self.tree = nil; + self.compositeKey = nil; [[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidLockDatabaseNotification object:self]; } @@ -666,11 +667,11 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou } - (void)duplicateEntry:(id)sender { - /* - KPKEntry *duplicate = [self.selectedEntry copyWithTitle:nil options:kKPKCopyOptionNone]; - [duplicate addToGroup:self.selectedEntry.parent]; - [self.undoManager setActionName:NSLocalizedString(@"DUPLICATE_ENTRY", "")]; - */ + for(KPKEntry *entry in self.selectedEntries) { + KPKEntry *duplicate = [entry copyWithTitle:nil options:kKPKCopyOptionNone]; + [duplicate addToGroup:entry.parent]; + } + [self.undoManager setActionName:NSLocalizedString(@"DUPLICATE_ENTRY", "")]; } - (void)duplicateEntryWithOptions:(id)sender { diff --git a/MacPass/MPDocumentWindowController.h b/MacPass/MPDocumentWindowController.h index eb1b2c7f..e7b1ec96 100644 --- a/MacPass/MPDocumentWindowController.h +++ b/MacPass/MPDocumentWindowController.h @@ -53,8 +53,8 @@ - (IBAction)pickExpiryDate:(id)sender; - (IBAction)performAutotypeForEntry:(id)sender; -- (IBAction)showHistoryForEntry:(id)sender; -- (IBAction)hideHistoryForEntry:(id)sender; +- (IBAction)showEntryHistory:(id)sender; +- (IBAction)hideEntryHistory:(id)sender; #pragma mark Helper - (IBAction)fixAutotype:(id)sender; diff --git a/MacPass/MPDocumentWindowController.m b/MacPass/MPDocumentWindowController.m index 12854c13..2ba4d096 100644 --- a/MacPass/MPDocumentWindowController.m +++ b/MacPass/MPDocumentWindowController.m @@ -495,11 +495,11 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword); [contentView layoutSubtreeIfNeeded]; } -- (IBAction)showHistoryForEntry:(id)sender { - [self.document showHistoryForEntry:nil]; +- (void)showEntryHistory:(id)sender { + } -- (IBAction)hideHistoryForEntry:(id)sender { +- (void)hideEntryHistory:(id)sender { } diff --git a/MacPass/MPEntryInspectorViewController.m b/MacPass/MPEntryInspectorViewController.m index c0bb603c..5793f31b 100644 --- a/MacPass/MPEntryInspectorViewController.m +++ b/MacPass/MPEntryInspectorViewController.m @@ -55,8 +55,6 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) { @property (strong) NSPopover *activePopover; @property (nonatomic, readonly) KPKEntry *representedEntry; - -//@property (nonatomic, weak) KPKEntry *entry; @property (strong) MPTemporaryFileStorage *quicklookStorage; @end diff --git a/MacPass/MPEntryViewController.m b/MacPass/MPEntryViewController.m index e8f244db..fc1a3889 100644 --- a/MacPass/MPEntryViewController.m +++ b/MacPass/MPEntryViewController.m @@ -252,6 +252,8 @@ NSString *const _MPTableSecurCellView = @"PasswordCell"; NSTableCellView *view = nil; if(isTitleColumn || isGroupColumn) { view = [tableView makeViewWithIdentifier:_MPTableImageCellView owner:self]; + [view.textField unbind:NSValueBinding]; + [view.imageView unbind:NSValueBinding]; if( isTitleColumn ) { NSString *titleKeyPath = [NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(objectValue)), diff --git a/MacPass/MPToolbarDelegate.m b/MacPass/MPToolbarDelegate.m index 25d6a99d..31eb95eb 100644 --- a/MacPass/MPToolbarDelegate.m +++ b/MacPass/MPToolbarDelegate.m @@ -43,6 +43,7 @@ NSString *const MPToolbarItemInspector = @"TOOLBAR_INSPECTOR"; NSString *const MPToolbarItemSearch = @"TOOLBAR_SEARCH"; NSString *const MPToolbarItemCopyUsername = @"TOOLBAR_COPY_USERNAME"; NSString *const MPToolbarItemCopyPassword = @"TOOLBAR_COPY_PASSWORD"; +NSString *const MPToolbarItemHistory = @"TOOLBAR_HISTORY"; @interface MPToolbarDelegate() { MPAddEntryContextMenuDelegate *_entryMenuDelegate; @@ -75,7 +76,8 @@ NSString *const MPToolbarItemCopyPassword = @"TOOLBAR_COPY_PASSWORD"; NSToolbarFlexibleSpaceItemIdentifier, MPToolbarItemSearch, MPToolbarItemLock, - MPToolbarItemInspector ]; + MPToolbarItemInspector, + MPToolbarItemHistory ]; _defaultToolbarIdentifiers = @[ MPToolbarItemAddEntry, MPToolbarItemDelete, MPToolbarItemAddGroup, @@ -211,6 +213,7 @@ NSString *const MPToolbarItemCopyPassword = @"TOOLBAR_COPY_PASSWORD"; MPToolbarItemDelete: [MPIconHelper icon:MPIconTrash], MPToolbarItemAction: [NSImage imageNamed:NSImageNameActionTemplate], MPToolbarItemInspector: [MPIconHelper icon:MPIconInfo], + MPToolbarItemHistory: [MPIconHelper icon:MPIconHistory] }; return imageDict; } @@ -233,7 +236,8 @@ NSString *const MPToolbarItemCopyPassword = @"TOOLBAR_COPY_PASSWORD"; MPToolbarItemCopyUsername: NSLocalizedString(@"COPY_USERNAME", @""), MPToolbarItemDelete: NSLocalizedString(@"DELETE", @""), MPToolbarItemInspector: NSLocalizedString(@"INSPECTOR", @""), - MPToolbarItemSearch: NSLocalizedString(@"SEARCH", @"") + MPToolbarItemSearch: NSLocalizedString(@"SEARCH", @""), + MPToolbarItemHistory: NSLocalizedString(@"SHOW_HISTORY", @""), }; }); return labelDict[identifier]; @@ -249,7 +253,8 @@ NSString *const MPToolbarItemCopyPassword = @"TOOLBAR_COPY_PASSWORD"; MPToolbarItemDelete: @(MPActionDelete), MPToolbarItemCopyPassword: @(MPActionCopyPassword), MPToolbarItemCopyUsername: @(MPActionCopyUsername), - MPToolbarItemInspector: @(MPActionToggleInspector) + MPToolbarItemInspector: @(MPActionToggleInspector), + MPToolbarItemHistory: @(MPActionShowEntryHistory), }; }); MPActionType actionType = (MPActionType)[actionDict[identifier] integerValue]; diff --git a/MacPass/MacPass-Info.plist b/MacPass/MacPass-Info.plist index 2cf4e9f4..2e62b24a 100644 --- a/MacPass/MacPass-Info.plist +++ b/MacPass/MacPass-Info.plist @@ -14,7 +14,7 @@ CFBundleTypeIconFile FileTypeIcon CFBundleTypeName - kdbxFileType + KDBX Database CFBundleTypeRole Editor LSItemContentTypes @@ -34,7 +34,7 @@ CFBundleTypeIconFile FileTypeIcon CFBundleTypeName - kdbFileType + KDB Database CFBundleTypeRole Editor LSItemContentTypes @@ -83,7 +83,7 @@ public.data UTTypeDescription - Keepass 2 Database + KDBX Database UTTypeIdentifier com.hicknhack.macpass.kdbx UTTypeTagSpecification @@ -100,7 +100,7 @@ public.data UTTypeDescription - Keepass Database + KDB Database UTTypeIdentifier com.hicknhack.macpass.kdb UTTypeTagSpecification @@ -131,5 +131,16 @@ + UTImportedTypeDeclarations + + + UTTypeDescription + XML + UTTypeIdentifier + public.xml + UTTypeTagSpecification + + + diff --git a/MacPass/SavePanelAccessoryView.xib b/MacPass/SavePanelAccessoryView.xib index 44923b4d..3c39fa5e 100644 --- a/MacPass/SavePanelAccessoryView.xib +++ b/MacPass/SavePanelAccessoryView.xib @@ -1,8 +1,9 @@ - - + + - + + @@ -19,7 +20,7 @@ - + @@ -32,15 +33,15 @@ - + - - + + @@ -60,6 +61,7 @@ + diff --git a/MacPass/de.lproj/Localizable.strings b/MacPass/de.lproj/Localizable.strings index ec6fb88f..7c61ba1a 100644 Binary files a/MacPass/de.lproj/Localizable.strings and b/MacPass/de.lproj/Localizable.strings differ diff --git a/MacPass/en.lproj/Localizable.strings b/MacPass/en.lproj/Localizable.strings index d8d1f641..041c86d1 100644 Binary files a/MacPass/en.lproj/Localizable.strings and b/MacPass/en.lproj/Localizable.strings differ diff --git a/MacPass/fr.lproj/Localizable.strings b/MacPass/fr.lproj/Localizable.strings index 8693e62d..13eb21aa 100644 Binary files a/MacPass/fr.lproj/Localizable.strings and b/MacPass/fr.lproj/Localizable.strings differ diff --git a/MacPass/it.lproj/Localizable.strings b/MacPass/it.lproj/Localizable.strings index 3b37c573..91859244 100644 Binary files a/MacPass/it.lproj/Localizable.strings and b/MacPass/it.lproj/Localizable.strings differ diff --git a/MacPass/nl.lproj/Localizable.strings b/MacPass/nl.lproj/Localizable.strings index 9965b161..147fcd42 100644 Binary files a/MacPass/nl.lproj/Localizable.strings and b/MacPass/nl.lproj/Localizable.strings differ diff --git a/MacPass/pl.lproj/Localizable.strings b/MacPass/pl.lproj/Localizable.strings index eb6f111e..def247b6 100644 Binary files a/MacPass/pl.lproj/Localizable.strings and b/MacPass/pl.lproj/Localizable.strings differ diff --git a/MacPass/ru.lproj/Localizable.strings b/MacPass/ru.lproj/Localizable.strings index 64c9406e..eb65643d 100644 Binary files a/MacPass/ru.lproj/Localizable.strings and b/MacPass/ru.lproj/Localizable.strings differ diff --git a/MacPass/zh-Hans.lproj/Localizable.strings b/MacPass/zh-Hans.lproj/Localizable.strings index b0124ca0..e69de29b 100644 Binary files a/MacPass/zh-Hans.lproj/Localizable.strings and b/MacPass/zh-Hans.lproj/Localizable.strings differ diff --git a/README.md b/README.md index 1d4e1323..820837fa 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ -#MacPass +# MacPass There are a lot of iOS KeePass tools around but a distinct lack of a good native macOS version. KeePass can be used via Mono on macOS but lacks vital functionality and feels sluggish and simply out of place. MacPass is an attempt to create a native macOS port of KeePass on a solid open source foundation with a vibrant community pushing it further to become the best KeePass client for macOS. -##Download +## Download All pre-built releases can be found at [Github](https://github.com/mstarke/MacPass/releases). -##How to Build +## How to Build * Fetch the source of MacPass ```bash @@ -29,12 +29,12 @@ There have been some changes in the submodule urls. Please consider re-syncing a git submodule sync git submodule init -##Known Major Issues +## Known Major Issues * Binary releases (0.5.x): * KDBX History is only preserved. Editing doesn't create new history entries -##How to Contribute +## How to Contribute If you want to contribute by fixing a bug, adding a feature or improving localization you're awesome. Please open a pull request! @@ -44,32 +44,33 @@ Some questions might be ansered in the [FAQ](https://github.com/mstarke/MacPass/ Another place to look is the IRC channel [#macpass](irc://irc.freenode.org/macpass) on [irc.freenode.org](irc://irc.freenode.org) -##System Requirement +## System Requirement The minimum OS X version required for MacPass is currently 10.8 Mountain Lion. -##Status +## Status The Status can be found on the dedicated [Wiki page](https://github.com/mstarke/MacPass/wiki/Status). -##What does it look like? +## What does it look like? ![image](https://raw.github.com/mstarke/MacPass/master/Assets/Screenshots/MacPass.png) More Screenshots in the [Wiki](https://github.com/mstarke/MacPass/wiki/Screenshots) -##Alternatives +## Alternatives [KeePassX](http://www.keepassx.org) is a Qt based KeePass port. It's in active development and open source. It fully supports all KDBX features and can import KDB into a KDBX file but is unable to safe as KDB. There's an older release that only handles KDB files. KDBX3.1 is fully supported, KDBX4.0 is currently unsupported. -[KeePassXC](https://github.com/keepassxc/keepassxc) straight from the project's README: +[KeePassXC](https://github.com/keepassxreboot/keepassxc) straight from the project's README: >KeePassXC is a fork of KeePassX that aims to incorporate stalled pull requests, features, and bug fixes that have never made it into the main KeePassX repository. [KyPass Companion](http://www.kyuran.be/logiciels/kypass4mac/) is a native Cocoa port and offers KeePassHttp compatibility. Should be able to read and write KDB and KDBX files. It is closed source and currently available in the Mac App Store. It's rather expensive considering the bugs and missing features. Based on the user reviews it should work. Not all KDBX features are supported. It is unable to convert between database versions. KDBX4.0 support is in development. -[KeeWeb](https://keeweb.info) is a cross platform web client in active development based on [electron](http://electron.atom.io) and thus also is available as an offline version for all major platforms. The project is open source. It supports all features of KDBX files but has no KDB support. Because of the technology it's look is customizable, but the native one is quite pretty. Full KDBX 4 support is present. Performance for Argon2 requires WebAssembly. -##License +[KeeWeb](https://keeweb.info) is a cross platform web client in active development based on [electron](http://electron.atom.io) and thus also is available as an offline version for all major platforms. The project is open source. It supports all features of KDBX files but has no KDB support. Because of the technology its look is customizable, but the native one is quite pretty. Full KDBX 4 support is present. Performance for Argon2 requires WebAssembly. + +## License MacPass, a KeePass compatible Password Manager for OS X Copyright (c) 2012-2017 Michael Starke (HicknHack Software GmbH) and all [MacPass contributors](https://github.com/mstarke/MacPass/graphs/contributors) @@ -93,7 +94,7 @@ along with this program. If not, see . Due to being licensed under GPLv3 it's not possible to publish a version of MacPass on the App Store. For further details, take a look at the [explanation](https://www.fsf.org/news/2010-05-app-store-compliance) of the Free Software Foundation. -##Contributions +## Contributions The following list might not be complete, please refer to [merged Pull Requests](https://github.com/mstarke/MacPass/pulls?utf8=✓&q=is%3Apr+is%3Aclosed+is%3Amerged) on GitHub for more details. Please report open an issue if you think someone is missing from this list! @@ -153,7 +154,7 @@ The following list might not be complete, please refer to [merged Pull Requests] [Michael Belz](https://github.com/sub0ne) Fixed MacPass not opening any window, when lastly opened Database is missing. -##Copyright +## Copyright This Project is based upon the following work: @@ -183,6 +184,6 @@ This Project is based upon the following work: See submodules for additional Licenses -##Feedback +## Feedback [![Flattr this](http://api.flattr.com/button/flattr-badge-large.png)](http://flattr.com/thing/1550529/mstarkeMacPass-on-GitHub)