81 Commits

Author SHA1 Message Date
Michael Starke
b028ef51f9 Updated localization 2020-01-28 10:44:31 +01:00
Michael Starke
ae9278c4b5 Added privacy usage descriptions for all folders to enhance macOS 10.15 Catalina experience 2020-01-28 10:39:15 +01:00
Michael Starke
86d4defc78 Removed ad-hoc signing 2020-01-28 10:28:49 +01:00
Michael Starke
c85a9cdce1 Fixed autotype regression preventing self-autotyping. Added re-hiding for special placeholders 2020-01-28 10:28:42 +01:00
Michael Starke
9409887942 Introduced direct signing of all parts since --deep did not sign Autoupdate and fileop in Sparkle.framework 2020-01-28 09:41:07 +01:00
Michael Starke
40c62954e4 Removed special code signing id for macOs which caused Xcode to choke on the project 2020-01-28 09:40:18 +01:00
Michael Starke
c6f93ef59a Updated copyright to 2020 2020-01-27 12:25:13 +01:00
Michael Starke
5eef186ab2 Updated contributors 2020-01-27 10:30:36 +01:00
Michael Starke
6c60d72ef9 Update CONTRIBUTE.md 2020-01-27 10:24:25 +01:00
Michael Starke
217b311783 Update CONTRIBUTE.md 2020-01-27 10:24:17 +01:00
Michael Starke
8cd5273082 Added download option for XLIFF files 2020-01-27 10:23:44 +01:00
Michael Starke
3e8a320598 Updated german localization 2020-01-24 12:10:58 +01:00
Michael Starke
0197bdc5bc Added missing english localization 2020-01-24 11:43:36 +01:00
Michael Starke
a425acea4d Updated english localization 2020-01-24 11:41:45 +01:00
Michael Starke
c4222a3159 Fixed regression resulting in auto-type never timing out. 2020-01-24 11:39:42 +01:00
Michael Starke
bd0fe6baf8 Updated localizations 2020-01-24 09:37:06 +01:00
Michael Starke
b2999ca8a8 Merge branch 'feature/refactor_autotype' 2020-01-22 15:11:41 +01:00
Michael Starke
77d96976ec Refactored Autotype to use environment for better encapsulation of parameters 2020-01-22 15:11:28 +01:00
Michael Starke
a4b9b0be8b Formatting 2020-01-22 10:13:33 +01:00
Michael Starke
8e52da7069 Better placeholder for search field to clarify location of the search. Also made the search field larger. 2020-01-21 15:27:38 +01:00
Michael Starke
228170c717 Center search in 10.14 and above, keep it "centerish" in older systems 2020-01-21 15:12:25 +01:00
Michael Starke
2216a14729 Broken WIP commit 2020-01-21 14:38:52 +01:00
Michael Starke
77f3f23cfe Use class property 2020-01-15 13:00:14 +01:00
Michael Starke
07ae4675d4 Fixed typos in localization 2020-01-15 13:00:06 +01:00
Michael Starke
f2279863db removed unnecessary method 2020-01-15 12:59:39 +01:00
Michael Starke
df68d0140f Updated localizations 2020-01-15 12:59:29 +01:00
Michael Starke
1b6efbfd0c Added sanity checks to key file selection in unlock screen (fixes #1008) 2020-01-14 14:54:15 +01:00
Michael Starke
626bb35f80 Re-hide MacPass if it was shown only for autotype candidate selection (fixes #964) 2020-01-13 13:46:24 +01:00
Michael Starke
e6bb9ad191 use class propeties 2020-01-13 12:07:43 +01:00
Michael Starke
4cfe54b65c Updated documentation on export plugin 2020-01-10 15:01:53 +01:00
Michael Starke
2b2e5ddbea Merge branch 'feature/import_plugins' 2020-01-10 10:47:59 +01:00
Michael Starke
334451471e Removed delayed write of preview files to fix missing preview in macOs 10.15 Catalina (fix #1016) 2020-01-10 10:47:11 +01:00
Michael Starke
4069052c86 Using class properties 2020-01-10 10:43:13 +01:00
Michael Starke
7be5190ada Updated comments 2020-01-10 10:42:58 +01:00
Michael Starke
7a1510b77b Using Carthage setup for TransformerKit 2020-01-08 15:23:36 +01:00
Michael Starke
f16c767cbd Use textual date picker instead of graphical one. Fixes #923 2019-12-18 15:45:00 +01:00
Michael Starke
3f76188bf5 Modern objective C 2019-12-18 15:44:26 +01:00
Michael Starke
1215b7317b Merge branch 'master' into feature/import_plugins
# Conflicts:
#	MacPass.xcodeproj/project.pbxproj
2019-12-17 16:27:43 +01:00
Michael Starke
e5ba73589b Cleaned up merge of LockOnScreenSleep feature. Updated fonts 2019-12-17 14:18:24 +01:00
georgesnow
9ba902471c Add Lock database on Screen Sleep (#998)
* added lock databse on Screen sleep

* remove unneeded change

* fix unregister screen sleep method

* fixed constraints and checkbox label
2019-12-17 13:59:01 +01:00
Michael Starke
b1568c5eef Using documented way to create temporary folders for storing preview content (#1016) 2019-12-17 13:47:15 +01:00
Michael Starke
8535579de2 Updated to Xcode 11 2019-12-13 11:18:34 +01:00
Michael Starke
6ec89e146c Merge branch 'refs/heads/master' into feature/import_plugins 2019-11-27 23:05:46 +01:00
Michael Starke
09a7a15141 Altered screen recording check to Craig Hockenberry's solution 2019-11-27 12:02:45 +01:00
Michael Starke
9b77790ddc Use blog based api instead of block one to track down macOS 10.15 bug 2019-11-22 16:30:21 +01:00
Anton Glezman
16cdd4dd4f Fixed overlay window image color (#999)
* Fixed overlay window image color

* Fixed color property
2019-11-07 20:43:23 +01:00
Michael Starke
0a7fcc415c Disabled currently unused context button for add fields button (fixes #995) 2019-11-04 16:11:44 +01:00
Michael Starke
ff72632b3b Do show info when no recent documents are present in Welcome Window (fixes #996) 2019-11-04 16:08:24 +01:00
Michael Starke
b6a7240534 Bumped version. Ensure versioning is always done after Info.plist was copied. 2019-11-04 15:48:36 +01:00
Michael Starke
f10735f96f Changed screen recording detection to use "at least one window name should be present) 2019-11-04 15:47:54 +01:00
Michael Starke
ba538d05af note to use xmllint to check for notarization status 2019-11-04 15:45:34 +01:00
Michael Starke
3639913e6d Re-added english localization for Info.plist since it seems to break on macOS 10.15 2019-11-04 12:38:34 +01:00
Michael Starke
b87e20ca7e prepare release now works 2019-11-04 10:38:45 +01:00
Michael Starke
c7bdce46ff first stab at a automated release 2019-11-01 16:07:42 +01:00
Michael Starke
11bea5fa32 Removed magic numbers 2019-11-01 16:07:42 +01:00
Michael Starke
e8a6af086c Using cancelOperation: since this is called by pressing the Esc key. 2019-11-01 16:07:42 +01:00
Michael Starke
f1033c1006 Use properties 2019-11-01 16:07:42 +01:00
Anton Glezman
264866dff0 Fixed missed localizations (#990)
Thank you very much!
2019-11-01 14:43:39 +01:00
Oleksandr Yakubchyk
631741d30b Fixed #945 Cancel search mode while the search field is empty (#946) 2019-10-30 16:02:06 +01:00
Michael Starke
6897f9e51c Added Github sponsorship details 2019-10-30 14:50:46 +01:00
Michael Starke
21a5b5d6bb Using class properties 2019-10-30 10:29:23 +01:00
Michael Starke
3817bf503f Fixed re-setting of url copy or open after each application launch (fixes #989) 2019-10-30 10:14:37 +01:00
Michael Starke
2beb033572 Updated contributors 2019-10-28 17:03:04 +01:00
Michael Starke
01b1372dda Merge branch 'master' into feature/import_plugins 2019-08-29 12:02:25 +02:00
Michael Starke
d048ea47a6 Aligned localizations 2019-08-28 13:33:40 +02:00
Michael Starke
2a8766eccb Fixed typo 2019-08-28 13:32:32 +02:00
Michael Starke
a2078f721a Merge branch 'master' into feature/import_plugins
# Conflicts:
#	Cartfile.resolved
2019-08-28 13:13:49 +02:00
Michael Starke
68bdcb461f Using KeePassKit 2.4.5 to fix breadcrumb issue 2019-08-27 18:43:10 +02:00
Michael Starke
ec8ce8ec29 remove unnecessary assignment 2019-08-27 18:26:40 +02:00
Michael Starke
95275d9c8a Merge branch 'master' into feature/import_plugins 2019-08-27 15:01:54 +02:00
Michael Starke
09eb1dcf41 Updated at now displays a special text if remote updates are disabled 2019-08-27 11:30:08 +02:00
Michael Starke
224ca6c65b Updated plugin definition 2019-08-27 11:29:39 +02:00
Michael Starke
10dd3e352d Merge branch 'master' into feature/import_plugins 2019-08-27 10:15:42 +02:00
Michael Starke
2103eb8875 Added rudimentary export plugin support 2019-08-26 17:25:25 +02:00
Michael Starke
3b7bf0d77b Removed unneeded parameters in import API 2019-08-26 12:03:14 +02:00
Michael Starke
bc47fb592c Merge branch 'master' into feature/import_plugins 2019-08-23 10:17:49 +02:00
Michael Starke
81dce1928a Updated to Xcode 10.3 2019-08-20 16:08:57 +02:00
Michael Starke
05f820a4a3 Merge branch 'master' into feature/import_plugins 2019-08-20 12:56:06 +02:00
Michael Starke
d3a575fce3 Merge branch 'master' into feature/import_plugins 2019-07-15 18:21:33 +02:00
Michael Starke
0455628d72 Merge branch 'master' into feature/import_plugins 2019-07-15 12:25:15 +02:00
Michael Starke
9d0dc1630d Added simple support for import Plugins via plugin API 2019-07-15 12:23:32 +02:00
93 changed files with 1389 additions and 664 deletions

1
.github/FUNDING.yml vendored
View File

@@ -1 +1,2 @@
github: mstarke
custom: https://flattr.com/thing/1550529/mstarkeMacPass-on-GitHub

3
.gitmodules vendored
View File

@@ -1,6 +1,3 @@
[submodule "DDHotKey"]
path = DDHotKey
url = https://github.com/mstarke/DDHotKey.git
[submodule "TransformerKit"]
path = TransformerKit
url = https://github.com/mattt/TransformerKit.git

View File

@@ -4,18 +4,21 @@ Thanks for taking the time to contribute to MacPass! This documents describes a
## Translations
MacPass has translations for a few languages. If you can translate to another language, or you think a translation is wrong, follow the next steps to add or improve a translation:
- You can use a XLIFF editor for translating the strings. For example [XLIFFTool](https://itunes.apple.com/us/app/xlifftool/id1074282695)
- For a new localization only:
- Select MacPass in the project navigator
- Select the MacPass project in the project and targets list
- Open the info tab and click the `+` button un the localizations section.
- Choose the language you want to translate
- Select all resources and click finish, now the new language is available for export in the next step
- Export the XLIFF file
- Select the MacPass project in XCode
- Go to `Editor -> Export for Localization`
- Select the language you want to translate
- Now use your XLIFF editor and save the file if you are done with your translations
- Get a XLIFF editor for translating localization files. For example [XLIFFTool](https://itunes.apple.com/us/app/xlifftool/id1074282695)
- Get the current XLIFF export for your language. You can either download the `Localizations.zip` on the [Continous release](https://github.com/MacPass/MacPass/releases) or you can export them in Xcode:
- For a new localization only:
- Select MacPass in the project navigator
- Select the MacPass project in the project and targets list
- Open the info tab and click the `+` button un the localizations section.
- Choose the language you want to translate
- Select all resources and click finish, now the new language is available for export in the next step
- For present localizations directly Export the XLIFF file
- Select the MacPass project in Xcode
- Go to `Editor -> Export for Localization`
- Select the language you want to translate
- Now use your XLIFF editor and save the file after you are done with your translations
- Go back to XCode and use `Editor -> Import Localization` to import the changes
- Open a Pull Request with your changes.
Alternatively, you can open an issue to ask a dev to create the XLIFF file for you and send it back after you've finished localising.

View File

@@ -1,3 +1,4 @@
github "sparkle-project/Sparkle" ~> 1.22
github "MacPass/TransformerKit" "b28de3a7de9249dd886979cae4985092523b6dd1"
github "MacPass/KeePassKit" ~> 2.4
github "mstarke/HNHUi" ~> 3.0

View File

@@ -1,4 +1,5 @@
github "MacPass/KeePassKit" "2.4.7"
github "MacPass/TransformerKit" "b28de3a7de9249dd886979cae4985092523b6dd1"
github "mstarke/HNHUi" "3.0"
github "robbiehanson/KissXML" "5.2.3"
github "robbiehanson/KissXML" "5.3.1"
github "sparkle-project/Sparkle" "1.22.0"

View File

@@ -40,6 +40,9 @@
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 */; };
4C2057F423CF3BA600C731EC /* MPAutotypeEnvironment.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2057F323CF3BA600C731EC /* MPAutotypeEnvironment.m */; };
4C2057F723CF3E9A00C731EC /* NSRunningApplication+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2057F623CF3E9A00C731EC /* NSRunningApplication+MPAdditions.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 */; };
@@ -178,17 +181,10 @@
4C7ABA4B17BAEC6700FF5799 /* 19_EmailTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C7ABA4617BAEC6700FF5799 /* 19_EmailTemplate.pdf */; };
4C7ABA4C17BAEC6700FF5799 /* 20_MiscTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C7ABA4717BAEC6700FF5799 /* 20_MiscTemplate.pdf */; };
4C7ABA4E17BAEC7000FF5799 /* addEntryTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C7ABA4D17BAEC7000FF5799 /* addEntryTemplate.pdf */; };
4C7B63711C0CB51F00D7038C /* NSValueTransformer+TransformerKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7B63631C0CB51F00D7038C /* NSValueTransformer+TransformerKit.m */; };
4C7B63721C0CB51F00D7038C /* TTTCryptographyTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7B63661C0CB51F00D7038C /* TTTCryptographyTransformers.m */; };
4C7B63731C0CB51F00D7038C /* TTTDataTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7B63681C0CB51F00D7038C /* TTTDataTransformer.m */; };
4C7B63741C0CB51F00D7038C /* TTTDateTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7B636A1C0CB51F00D7038C /* TTTDateTransformers.m */; };
4C7B63751C0CB51F00D7038C /* TTTImageTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7B636C1C0CB51F00D7038C /* TTTImageTransformers.m */; };
4C7B63761C0CB51F00D7038C /* TTTJSONTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7B636E1C0CB51F00D7038C /* TTTJSONTransformer.m */; };
4C7B63771C0CB51F00D7038C /* TTTStringTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7B63701C0CB51F00D7038C /* TTTStringTransformers.m */; };
4C7B637C1C0CB55600D7038C /* KeePassKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C7B63791C0CB55600D7038C /* KeePassKit.framework */; };
4C7B637D1C0CB55600D7038C /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C7B637A1C0CB55600D7038C /* Sparkle.framework */; };
4C7B637F1C0CB57300D7038C /* KeePassKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4C7B63791C0CB55600D7038C /* KeePassKit.framework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
4C7B63801C0CB57300D7038C /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4C7B637A1C0CB55600D7038C /* Sparkle.framework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
4C7B637F1C0CB57300D7038C /* KeePassKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4C7B63791C0CB55600D7038C /* KeePassKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
4C7B63801C0CB57300D7038C /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4C7B637A1C0CB55600D7038C /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
4C7BD07619FE94C900C7AA5C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4C7BD07519FE94C900C7AA5C /* Assets.xcassets */; };
4C7F8B681A10B68400CCB83D /* WelcomeView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C7F8B6A1A10B68400CCB83D /* WelcomeView.xib */; };
4C80304A1E2FBAA300133E4C /* MPTestKeyMapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8030491E2FBAA300133E4C /* MPTestKeyMapper.m */; };
@@ -233,6 +229,8 @@
4CB33F861EAF54A000C9341E /* KPKNode+MPIsHistory.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CB33F851EAF54A000C9341E /* KPKNode+MPIsHistory.m */; };
4CB9339916D3A0DD00A13B5D /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 4CB9339716D3A0DD00A13B5D /* Credits.rtf */; };
4CBA2ABA17074C07006D8139 /* MPSettingsHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBA2AB917074C07006D8139 /* MPSettingsHelper.m */; };
4CBC5DDD23C61C8900D14B92 /* TransformerKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CBC5DDB23C61C8300D14B92 /* TransformerKit.framework */; };
4CBC5DDE23C61C8900D14B92 /* TransformerKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4CBC5DDB23C61C8300D14B92 /* TransformerKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
4CC0D2CE17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC0D2CD17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m */; };
4CC0D2D117974A5A000B4BDA /* MPAttachmentTableViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC0D2D017974A5A000B4BDA /* MPAttachmentTableViewDelegate.m */; };
4CC281891C0F675B00B9174D /* HNHUi.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CC281881C0F675B00B9174D /* HNHUi.framework */; };
@@ -250,7 +248,7 @@
4CD2B9061849424B0051B395 /* MPAutotypeContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD2B9051849424B0051B395 /* MPAutotypeContext.m */; };
4CD4EE131FC7284000EA6EB3 /* MPPickcharsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD4EE111FC7284000EA6EB3 /* MPPickcharsViewController.m */; };
4CD5D705177A5F3300100649 /* MPDatabaseSettingsWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD5D704177A5F3300100649 /* MPDatabaseSettingsWindowController.m */; };
4CD60C131C104AD4005BE5F8 /* HNHUi.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4CC281881C0F675B00B9174D /* HNHUi.framework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
4CD60C131C104AD4005BE5F8 /* HNHUi.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4CC281881C0F675B00B9174D /* HNHUi.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
4CD7223B17A7CB0700F5A1E1 /* MPWorkflowPreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7223A17A7CB0700F5A1E1 /* MPWorkflowPreferencesController.m */; };
4CD78ABC16D155FF00768A1D /* 07_NotepadTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CD78AB716D155FF00768A1D /* 07_NotepadTemplate.pdf */; };
4CD78ABD16D155FF00768A1D /* 08_SocketTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CD78AB816D155FF00768A1D /* 08_SocketTemplate.pdf */; };
@@ -310,6 +308,7 @@
4CD60C131C104AD4005BE5F8 /* HNHUi.framework in CopyFiles */,
4C7B637F1C0CB57300D7038C /* KeePassKit.framework in CopyFiles */,
4C7B63801C0CB57300D7038C /* Sparkle.framework in CopyFiles */,
4CBC5DDE23C61C8900D14B92 /* TransformerKit.framework in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -405,6 +404,13 @@
4C1F7FA01E3A12E600D6A40E /* MPModifiedKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPModifiedKey.h; sourceTree = "<group>"; };
4C1F7FA11E3A12E600D6A40E /* MPModifiedKey.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPModifiedKey.m; sourceTree = "<group>"; };
4C1FA07A18231900003A3F8C /* MPDocument+Autotype.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MPDocument+Autotype.m"; sourceTree = "<group>"; };
4C2057EC23CDF6F900C731EC /* MPPathCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPathCell.h; sourceTree = "<group>"; };
4C2057ED23CDF6F900C731EC /* MPPathCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPathCell.m; sourceTree = "<group>"; };
4C2057EF23CDFC2000C731EC /* MPPathControl+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MPPathControl+Private.h"; sourceTree = "<group>"; };
4C2057F223CF3BA600C731EC /* MPAutotypeEnvironment.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPAutotypeEnvironment.h; sourceTree = "<group>"; };
4C2057F323CF3BA600C731EC /* MPAutotypeEnvironment.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPAutotypeEnvironment.m; sourceTree = "<group>"; };
4C2057F523CF3E9A00C731EC /* NSRunningApplication+MPAdditions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSRunningApplication+MPAdditions.h"; sourceTree = "<group>"; };
4C2057F623CF3E9A00C731EC /* NSRunningApplication+MPAdditions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSRunningApplication+MPAdditions.m"; sourceTree = "<group>"; };
4C21F29F195B3A48002D610D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/MainMenu.strings; sourceTree = "<group>"; };
4C224B4017DFCB2300FF6AEE /* MPNumericalInputFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPNumericalInputFormatter.h; sourceTree = "<group>"; };
4C224B4117DFCB2400FF6AEE /* MPNumericalInputFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPNumericalInputFormatter.m; sourceTree = "<group>"; };
@@ -653,21 +659,6 @@
4C7ABA4617BAEC6700FF5799 /* 19_EmailTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 19_EmailTemplate.pdf; sourceTree = "<group>"; };
4C7ABA4717BAEC6700FF5799 /* 20_MiscTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 20_MiscTemplate.pdf; sourceTree = "<group>"; };
4C7ABA4D17BAEC7000FF5799 /* addEntryTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = addEntryTemplate.pdf; sourceTree = "<group>"; };
4C7B63621C0CB51F00D7038C /* NSValueTransformer+TransformerKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSValueTransformer+TransformerKit.h"; sourceTree = "<group>"; };
4C7B63631C0CB51F00D7038C /* NSValueTransformer+TransformerKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSValueTransformer+TransformerKit.m"; sourceTree = "<group>"; };
4C7B63641C0CB51F00D7038C /* TransformerKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TransformerKit.h; sourceTree = "<group>"; };
4C7B63651C0CB51F00D7038C /* TTTCryptographyTransformers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TTTCryptographyTransformers.h; sourceTree = "<group>"; };
4C7B63661C0CB51F00D7038C /* TTTCryptographyTransformers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTTCryptographyTransformers.m; sourceTree = "<group>"; };
4C7B63671C0CB51F00D7038C /* TTTDataTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TTTDataTransformer.h; sourceTree = "<group>"; };
4C7B63681C0CB51F00D7038C /* TTTDataTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTTDataTransformer.m; sourceTree = "<group>"; };
4C7B63691C0CB51F00D7038C /* TTTDateTransformers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TTTDateTransformers.h; sourceTree = "<group>"; };
4C7B636A1C0CB51F00D7038C /* TTTDateTransformers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTTDateTransformers.m; sourceTree = "<group>"; };
4C7B636B1C0CB51F00D7038C /* TTTImageTransformers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TTTImageTransformers.h; sourceTree = "<group>"; };
4C7B636C1C0CB51F00D7038C /* TTTImageTransformers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTTImageTransformers.m; sourceTree = "<group>"; };
4C7B636D1C0CB51F00D7038C /* TTTJSONTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TTTJSONTransformer.h; sourceTree = "<group>"; };
4C7B636E1C0CB51F00D7038C /* TTTJSONTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTTJSONTransformer.m; sourceTree = "<group>"; };
4C7B636F1C0CB51F00D7038C /* TTTStringTransformers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TTTStringTransformers.h; sourceTree = "<group>"; };
4C7B63701C0CB51F00D7038C /* TTTStringTransformers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTTStringTransformers.m; sourceTree = "<group>"; };
4C7B63791C0CB55600D7038C /* KeePassKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = KeePassKit.framework; path = Carthage/Build/Mac/KeePassKit.framework; sourceTree = "<group>"; };
4C7B637A1C0CB55600D7038C /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = Carthage/Build/Mac/Sparkle.framework; sourceTree = "<group>"; };
4C7BD07519FE94C900C7AA5C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
@@ -734,6 +725,7 @@
4C97CCEF1FA727DC00E58F8C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
4C9BFFF91FD19B5400264B16 /* MPPrettyPasswordTransformer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPrettyPasswordTransformer.h; sourceTree = "<group>"; };
4C9BFFFA1FD19B5400264B16 /* MPPrettyPasswordTransformer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPrettyPasswordTransformer.m; sourceTree = "<group>"; };
4C9FE47423703DA50096A5EA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
4CA08D9E17A831B200A6544B /* MPAddEntryContextMenuDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAddEntryContextMenuDelegate.h; sourceTree = "<group>"; };
4CA08D9F17A831B200A6544B /* MPAddEntryContextMenuDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAddEntryContextMenuDelegate.m; sourceTree = "<group>"; };
4CA0B2EC15BCADAC00654E32 /* PreferencesWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PreferencesWindow.xib; sourceTree = "<group>"; };
@@ -779,6 +771,7 @@
4CB63A6018986530002DEC4C /* MPFlagsHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPFlagsHelper.h; sourceTree = "<group>"; };
4CBA2AB617074B59006D8139 /* MPSettingsHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSettingsHelper.h; sourceTree = "<group>"; };
4CBA2AB917074C07006D8139 /* MPSettingsHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSettingsHelper.m; sourceTree = "<group>"; };
4CBC5DDB23C61C8300D14B92 /* TransformerKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TransformerKit.framework; path = Carthage/Build/Mac/TransformerKit.framework; sourceTree = "<group>"; };
4CC0D2CC17974A47000B4BDA /* MPCustomFieldTableViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCustomFieldTableViewDelegate.h; sourceTree = "<group>"; };
4CC0D2CD17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCustomFieldTableViewDelegate.m; sourceTree = "<group>"; };
4CC0D2CF17974A5A000B4BDA /* MPAttachmentTableViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAttachmentTableViewDelegate.h; sourceTree = "<group>"; };
@@ -956,9 +949,9 @@
7837112B22553B1D009BD28D /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/AutotypeBuilderView.strings; sourceTree = "<group>"; };
7837112D225540D1009BD28D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/PluginRepositoryBrowserView.xib; sourceTree = "<group>"; };
78371130225540D8009BD28D /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/PluginRepositoryBrowserView.strings; sourceTree = "<group>"; };
78C093DB236A18560008577C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/AutotypeDoctorReportViewController.strings; sourceTree = "<group>"; };
78E1F8AF22E3A3DF00E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/IntegrationPreferences.strings; sourceTree = "<group>"; };
78E1F8B122E3A5D600E738AE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AutotypeDoctorReportViewController.xib; sourceTree = "<group>"; };
78E1F8B422E3A5DB00E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/AutotypeDoctorReportViewController.strings; sourceTree = "<group>"; };
78E1F8B822E3B06700E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/PickcharsView.strings; sourceTree = "<group>"; };
78E1F8BA22E3B0B700E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/PickfieldView.strings; sourceTree = "<group>"; };
78E1F8BC22E3B12300E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/OpenPanelAccessoryView.strings; sourceTree = "<group>"; };
@@ -1052,6 +1045,7 @@
4CAD748E15B88AC100104512 /* libz.dylib in Frameworks */,
4C7B637C1C0CB55600D7038C /* KeePassKit.framework in Frameworks */,
4CAD748C15B889B700104512 /* Security.framework in Frameworks */,
4CBC5DDD23C61C8900D14B92 /* TransformerKit.framework in Frameworks */,
4C77E36715B84A240093A587 /* Cocoa.framework in Frameworks */,
4C7B637D1C0CB55600D7038C /* Sparkle.framework in Frameworks */,
4CC281891C0F675B00B9174D /* HNHUi.framework in Frameworks */,
@@ -1140,6 +1134,8 @@
4C58A4A22192EC1600B13370 /* NSIndexPath+MPAdditions.m */,
3C0CDECD21CFED9000B2A10B /* NSTextView+MPTouchBarExtension.h */,
3C0CDECE21CFEDD200B2A10B /* NSTextView+MPTouchBarExtension.m */,
4C2057F523CF3E9A00C731EC /* NSRunningApplication+MPAdditions.h */,
4C2057F623CF3E9A00C731EC /* NSRunningApplication+MPAdditions.m */,
);
name = Categories;
sourceTree = "<group>";
@@ -1437,10 +1433,10 @@
4C77E35715B84A240093A587 = {
isa = PBXGroup;
children = (
4CBC5DDB23C61C8300D14B92 /* TransformerKit.framework */,
4CC281881C0F675B00B9174D /* HNHUi.framework */,
4C7B63791C0CB55600D7038C /* KeePassKit.framework */,
4C7B637A1C0CB55600D7038C /* Sparkle.framework */,
4C7B63611C0CB51F00D7038C /* TransformerKit */,
4C00E33917D8FA3B00F37192 /* DDHotKey */,
4C77E36C15B84A240093A587 /* MacPass */,
4C45FB1E178E09ED0010007D /* MacPassTests */,
@@ -1526,29 +1522,6 @@
name = "Supporting Files";
sourceTree = "<group>";
};
4C7B63611C0CB51F00D7038C /* TransformerKit */ = {
isa = PBXGroup;
children = (
4C7B63621C0CB51F00D7038C /* NSValueTransformer+TransformerKit.h */,
4C7B63631C0CB51F00D7038C /* NSValueTransformer+TransformerKit.m */,
4C7B63641C0CB51F00D7038C /* TransformerKit.h */,
4C7B63651C0CB51F00D7038C /* TTTCryptographyTransformers.h */,
4C7B63661C0CB51F00D7038C /* TTTCryptographyTransformers.m */,
4C7B63671C0CB51F00D7038C /* TTTDataTransformer.h */,
4C7B63681C0CB51F00D7038C /* TTTDataTransformer.m */,
4C7B63691C0CB51F00D7038C /* TTTDateTransformers.h */,
4C7B636A1C0CB51F00D7038C /* TTTDateTransformers.m */,
4C7B636B1C0CB51F00D7038C /* TTTImageTransformers.h */,
4C7B636C1C0CB51F00D7038C /* TTTImageTransformers.m */,
4C7B636D1C0CB51F00D7038C /* TTTJSONTransformer.h */,
4C7B636E1C0CB51F00D7038C /* TTTJSONTransformer.m */,
4C7B636F1C0CB51F00D7038C /* TTTStringTransformers.h */,
4C7B63701C0CB51F00D7038C /* TTTStringTransformers.m */,
);
name = TransformerKit;
path = TransformerKit/TransformerKit;
sourceTree = "<group>";
};
4C89F525182FB4C50069C73C /* Autotype */ = {
isa = PBXGroup;
children = (
@@ -1556,6 +1529,8 @@
4C90757B18A42E7A00E598DA /* Commands */,
4CEE46DB181C301D006BF1E5 /* MPAutotypeDaemon.h */,
4CEE46DC181C301D006BF1E5 /* MPAutotypeDaemon.m */,
4C2057F223CF3BA600C731EC /* MPAutotypeEnvironment.h */,
4C2057F323CF3BA600C731EC /* MPAutotypeEnvironment.m */,
4CD2B9041849424B0051B395 /* MPAutotypeContext.h */,
4CD2B9051849424B0051B395 /* MPAutotypeContext.m */,
4CA3530918A53CB800839B0F /* MPKeyMapper.h */,
@@ -1680,7 +1655,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 = "<group>";
@@ -1813,7 +1791,7 @@
isa = PBXProject;
attributes = {
CLASSPREFIX = MP;
LastUpgradeCheck = 1020;
LastUpgradeCheck = 1130;
ORGANIZATIONNAME = "HicknHack Software GmbH";
TargetAttributes = {
4C77E36115B84A240093A587 = {
@@ -1994,13 +1972,15 @@
files = (
);
inputPaths = (
"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}",
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = Versioning;
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "git=`sh /etc/profile; which git`\n#branch_name=`$git symbolic-ref HEAD | sed -e 's,refs/heads/\\\\(.*\\\\),\\\\1,'`\nbranch_name=`$git rev-parse --abbrev-ref HEAD`\n#simple_branch_name=`$git rev-parse --abbrev-ref HEAD`\ngit_count=`$git rev-list $branch_name |wc -l | sed 's/^ *//;s/ *$//'`\n\nbuild_number=\"${git_count}0\"\nif [ $CONFIGURATION != \"Release\" ] || [ $branch_name != \"master\" ]; then\nbuild_number+=\"-$branch_name\"\nfi\nif [ \"$CI\" = \"true\" ]; then\nbuild_date=`date +\"%Y%m%d%H%m%S\"`\nbuild_number=\"$build_date-continuous\"\nfi\n\nplist=\"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\"\ndsym_plist=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $build_number\" \"$plist\"\nif [ -f \"$DSYM_INFO_PLIST\" ] ; then\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $build_number\" \"$dsym_plist\"\nfi\n";
shellScript = "git=`sh /etc/profile; which git`\nbranch_name=`$git rev-parse --abbrev-ref HEAD`\ngit_count=`$git rev-list $branch_name |wc -l | sed 's/^ *//;s/ *$//'`\n\nbuild_number=\"${git_count}0\"\nif [ $CONFIGURATION != \"Release\" ] || [ $branch_name != \"master\" ]; then\nbuild_number+=\"-$branch_name\"\nfi\nif [ \"$CI\" = \"true\" ]; then\nbuild_date=`date +\"%Y%m%d%H%m%S\"`\nbuild_number=\"$build_date-continuous\"\nfi\n\nplist=\"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\"\ndsym_plist=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $build_number\" \"$plist\"\nif [ -f \"$DSYM_INFO_PLIST\" ] ; then\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $build_number\" \"$dsym_plist\"\nfi\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
@@ -2050,7 +2030,6 @@
4C769CA9213D59BF00A3F60A /* KPKEntry+MPCustomAttributeProperties.m in Sources */,
4CDF01A316D1B76700D0AC08 /* MPEntryViewController.m in Sources */,
4C3BD51516D276F800389F1F /* MPToolbarDelegate.m in Sources */,
4C7B63731C0CB51F00D7038C /* TTTDataTransformer.m in Sources */,
4C8F0C711FCEF91400BE157F /* MPPickcharsParser.m in Sources */,
4C735FC02035FCBF00708D53 /* MPPluginEntryActionContext.m in Sources */,
4C61EA0316D2FD0800AC519E /* MPOutlineViewController.m in Sources */,
@@ -2060,7 +2039,6 @@
4C370EFE215B76CB00703AAE /* MPOutlineTableCellView.m in Sources */,
4CE8246F16E2E93400573141 /* MPOverlayWindowController.m in Sources */,
4CE8247516E2F2B900573141 /* MPOverlayView.m in Sources */,
4C7B63761C0CB51F00D7038C /* TTTJSONTransformer.m in Sources */,
4C77547516E55FE800970E02 /* MPInspectorViewController.m in Sources */,
4C89F524182FB4740069C73C /* MPAutotypeCommand.m in Sources */,
4C6DCC611FA24C2100C8AD3F /* MPAutotypeCandidateSelectionViewController.m in Sources */,
@@ -2076,6 +2054,7 @@
4CE39AC416ECE4F7000FE29D /* MPIconImageView.m in Sources */,
4C46B88517063A070046109A /* NSString+MPPasswordCreation.m in Sources */,
4C5A11FE1708DE8700223D8A /* MPPasswordCreatorViewController.m in Sources */,
4C2057F423CF3BA600C731EC /* MPAutotypeEnvironment.m in Sources */,
4CE5B54B173AFBA700207B39 /* MPDocument.m in Sources */,
4CE082C31F6FCD2A0034FF56 /* MPCollectionView.m in Sources */,
4C4A100F176286FD00BBF2CA /* MPTableView.m in Sources */,
@@ -2084,13 +2063,11 @@
4CE296191842A166005F01CE /* MPAutotypePaste.m in Sources */,
4C569D9E17652B0600595B62 /* MPConstants.m in Sources */,
4C569DA117652BFE00595B62 /* MPEntryTableDataSource.m in Sources */,
4C7B63711C0CB51F00D7038C /* NSValueTransformer+TransformerKit.m in Sources */,
4CD034AA1BFE113B003C002C /* MPPlugin.m in Sources */,
4CA2335A176DBFE100F0B6AC /* MPLockDaemon.m in Sources */,
4C77C84118E240E000D1C42B /* DDHotKey+MacPassAdditions.m in Sources */,
4C89B71019B4B4A300DC0A6A /* MPTreeDelegate.m in Sources */,
4C88C66918D9F8D600F43852 /* MPTemporaryFileStorageCenter.m in Sources */,
4C7B63741C0CB51F00D7038C /* TTTDateTransformers.m in Sources */,
4CF5BE6D1BF33E3000048505 /* NSApplication+MPAdditions.m in Sources */,
4CE30ACC1A312B7F0063FCC6 /* MPReferenceBuilderViewController.m in Sources */,
4C6F228C19A4AA700012310C /* MPAutotypeDelay.m in Sources */,
@@ -2126,6 +2103,7 @@
4CAD8AA622CF397B0090B2DD /* MPAutotypeDoctorReportViewController.m in Sources */,
4C8990F71EE978EB0043B48D /* MPDuplicateEntryOptionsWindowController.m in Sources */,
4CA3530B18A53CB800839B0F /* MPKeyMapper.m in Sources */,
4C2057F723CF3E9A00C731EC /* NSRunningApplication+MPAdditions.m in Sources */,
4CE298EB1795FC2A00DF7BDB /* MPEntryContextMenuDelegate.m in Sources */,
4CCCE8011D75CA48006AA951 /* MPArrayController.m in Sources */,
4CC0D2CE17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m in Sources */,
@@ -2134,7 +2112,6 @@
4C663D411D6D91A900CB6237 /* MPNumberFormatter.m in Sources */,
4CD2B9061849424B0051B395 /* MPAutotypeContext.m in Sources */,
4CFB18E418A17FA20097A34B /* MPUpdatePreferencesController.m in Sources */,
4C7B63771C0CB51F00D7038C /* TTTStringTransformers.m in Sources */,
4CD4EE131FC7284000EA6EB3 /* MPPickcharsViewController.m in Sources */,
4CCEDE2A179F203B008402BE /* MPOutlineView.m in Sources */,
4CB33F861EAF54A000C9341E /* KPKNode+MPIsHistory.m in Sources */,
@@ -2146,7 +2123,6 @@
4C4B7EE917A45EC6000234C7 /* MPDatePickingViewController.m in Sources */,
4C4B7EEE17A467E1000234C7 /* MPGroupInspectorViewController.m in Sources */,
4C71BCB72167B79C00B4CBDA /* MPPluginVersionComparator.m in Sources */,
4C7B63721C0CB51F00D7038C /* TTTCryptographyTransformers.m in Sources */,
4C4B7EF317A467FC000234C7 /* MPEntryInspectorViewController.m in Sources */,
4C1BDF2B1E4392640012A3F0 /* MPPluginDataViewController.m in Sources */,
4C4B7EF817A4B335000234C7 /* MPUniqueCharactersFormatter.m in Sources */,
@@ -2158,6 +2134,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 */,
@@ -2168,7 +2145,6 @@
4CE501341BBC47F500FB819D /* MPTagsTokenFieldDelegate.m in Sources */,
4CC6DB7A17D23719002C6091 /* KPKNode+IconImage.m in Sources */,
4C15B74618BCA3B1003F8008 /* MPDocument+Search.m in Sources */,
4C7B63751C0CB51F00D7038C /* TTTImageTransformers.m in Sources */,
4CEED1C617D7BD0E007180F1 /* NSError+Messages.m in Sources */,
4C00E33817D8FA3500F37192 /* DDHotKeyCenter.m in Sources */,
4C5EF816218CA03F0003C00E /* MPAutotypeParser.m in Sources */,
@@ -2369,6 +2345,7 @@
4C4161151F50333C003BC0AF /* es */,
FAA9109A1F9A95A500F7CB90 /* pl */,
6A74B07C2076F4B60049BC29 /* sv-SE */,
4C9FE47423703DA50096A5EA /* en */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
@@ -2653,10 +2630,10 @@
isa = PBXVariantGroup;
children = (
78E1F8B122E3A5D600E738AE /* Base */,
78E1F8B422E3A5DB00E738AE /* ru */,
4C1888CF230FBC080054A38F /* de */,
71FF7A27230FEF6B002F488F /* it */,
ABE8662F2316617500201125 /* zh-Hans */,
78C093DB236A18560008577C /* ru */,
);
name = AutotypeDoctorReportViewController.xib;
sourceTree = "<group>";
@@ -2789,7 +2766,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 0.7.10;
CURRENT_PROJECT_VERSION = 0.7.11;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
@@ -2844,7 +2821,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "";
COPY_PHASE_STRIP = YES;
CURRENT_PROJECT_VERSION = 0.7.10;
CURRENT_PROJECT_VERSION = 0.7.11;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
@@ -2872,7 +2849,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = MacPassAppIcon;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "";
CODE_SIGN_IDENTITY = "";
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = "${CURRENT_PROJECT_VERSION}";
FRAMEWORK_SEARCH_PATHS = (
@@ -2902,7 +2879,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = MacPassAppIcon;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "";
CODE_SIGN_IDENTITY = "";
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = "${CURRENT_PROJECT_VERSION}";
FRAMEWORK_SEARCH_PATHS = (

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1030"
LastUpgradeVersion = "1130"
version = "2.0">
<BuildAction
parallelizeBuildables = "YES"
@@ -26,20 +26,8 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
codeCoverageEnabled = "YES"
shouldUseLaunchSchemeArgsEnv = "NO">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4C45FB19178E09ED0010007D"
BuildableName = "MacPassTests.xctest"
BlueprintName = "MacPassTests"
ReferencedContainer = "container:MacPass.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
shouldUseLaunchSchemeArgsEnv = "NO"
codeCoverageEnabled = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -61,8 +49,18 @@
isEnabled = "YES">
</EnvironmentVariable>
</EnvironmentVariables>
<AdditionalOptions>
</AdditionalOptions>
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4C45FB19178E09ED0010007D"
BuildableName = "MacPassTests.xctest"
BlueprintName = "MacPassTests"
ReferencedContainer = "container:MacPass.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@@ -107,8 +105,6 @@
isEnabled = "NO">
</EnvironmentVariable>
</EnvironmentVariables>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15702" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15702"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@@ -27,7 +27,7 @@
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSStatusAvailable" id="DWu-HI-z3k"/>
</imageView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Pqa-Ff-7cc">
<rect key="frame" x="42" y="432" width="80" height="17"/>
<rect key="frame" x="42" y="433" width="80" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Accessibility" id="aIL-8W-63g">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@@ -35,7 +35,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" verticalCompressionResistancePriority="751" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hY9-T0-hke">
<rect key="frame" x="42" y="368" width="340" height="56"/>
<rect key="frame" x="42" y="369" width="340" height="56"/>
<textFieldCell key="cell" controlSize="small" selectable="YES" id="6GI-KJ-Xue">
<font key="font" metaFont="smallSystem"/>
<string key="title">MacPass will send key press events to the system when Autotype or Global Autotype is executed. Since macOS 10.14 Mojave this is only possible, if Accessibility permissions are granted to the application.</string>
@@ -44,7 +44,7 @@
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="x9d-0h-hyJ">
<rect key="frame" x="38" y="320" width="236" height="32"/>
<rect key="frame" x="38" y="321" width="236" height="32"/>
<buttonCell key="cell" type="push" title="Open Accessibilty Preferences…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8m1-vs-pd5">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@@ -54,11 +54,11 @@
</connections>
</button>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="vvZ-Lj-v22">
<rect key="frame" x="20" y="282" width="16" height="16"/>
<rect key="frame" x="20" y="283" width="16" height="16"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSStatusAvailable" id="kCX-CB-5vQ"/>
</imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" verticalCompressionResistancePriority="751" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6vq-iM-inn">
<rect key="frame" x="42" y="175" width="340" height="98"/>
<rect key="frame" x="42" y="177" width="340" height="98"/>
<textFieldCell key="cell" controlSize="small" selectable="YES" id="7of-1z-Nfk">
<font key="font" metaFont="smallSystem"/>
<string key="title">MacPass will read every window title when Global Autotype is executed to find a match. Since macOS 10.15 Catalina it is not possible to read any window title, if the user has not granted permissions to record the screen. If you are running macOS 10.15 or higher, MacPass will check if it can read every window title of currently visible windows. This test will not read the actual title. The titles aren't stored or processed in any way.</string>
@@ -67,7 +67,7 @@
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IP0-CP-tlA">
<rect key="frame" x="42" y="281" width="112" height="17"/>
<rect key="frame" x="42" y="283" width="112" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Screen Recording" id="9gr-mz-2I4">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@@ -75,10 +75,10 @@
</textFieldCell>
</textField>
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="BHb-cd-Q0r">
<rect key="frame" x="20" y="304" width="360" height="5"/>
<rect key="frame" x="20" y="305" width="360" height="5"/>
</box>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="d5Z-hD-bpr">
<rect key="frame" x="38" y="127" width="177" height="32"/>
<rect key="frame" x="38" y="129" width="177" height="32"/>
<buttonCell key="cell" type="push" title="Request Permissions…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="1Nx-Cg-TCn">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@@ -88,7 +88,7 @@
</connections>
</button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" preferredMaxLayoutWidth="336" translatesAutoresizingMaskIntoConstraints="NO" id="cu4-Jq-eaS">
<rect key="frame" x="42" y="84" width="340" height="42"/>
<rect key="frame" x="42" y="86" width="340" height="42"/>
<textFieldCell key="cell" selectable="YES" id="Mhg-rd-1hK">
<font key="font" metaFont="smallSystem"/>
<string key="title">To request Screen Recording permissions, MacPass will try to capture a 1 by 1 Pixel sized screenshot of the top left part of your screen. The data is not stored nor processed in any way.</string>
@@ -97,7 +97,7 @@
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="dek-ho-dPm">
<rect key="frame" x="38" y="48" width="271" height="32"/>
<rect key="frame" x="38" y="50" width="271" height="32"/>
<buttonCell key="cell" type="push" title="Open Screen Recording Preferences…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="lgB-Ys-L9R">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>

View File

@@ -1,4 +1,4 @@
{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf200
{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf600
{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;\f2\fnil\fcharset0 SFProText-Regular;
}
{\colortbl;\red255\green255\blue255;\red0\green0\blue0;\red9\green79\blue209;\red69\green60\blue204;
@@ -22,7 +22,7 @@ License:\
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
\f1\b0 \cf2 MacPass KeePass compatible client for OS X\
Copyright (c) 2012-2019 Michael Starke, HicknHack Software GmbH\
Copyright (c) 2012-2020 Michael Starke, HicknHack Software GmbH\
\
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by\
the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\

View File

@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6254" systemVersion="13F34" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15702" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6254"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15702"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="MPDatePickingViewController">
@@ -15,24 +16,23 @@
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView id="1">
<rect key="frame" x="0.0" y="0.0" width="316" height="259"/>
<rect key="frame" x="0.0" y="0.0" width="180" height="134"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<datePicker horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3">
<rect key="frame" x="20" y="91" width="277" height="148"/>
<datePickerCell key="cell" borderStyle="bezel" alignment="left" datePickerStyle="clockAndCalendar" id="4">
<rect key="frame" x="20" y="91" width="143" height="27"/>
<datePickerCell key="cell" borderStyle="bezel" alignment="left" id="4">
<font key="font" metaFont="system"/>
<calendarDate key="date" timeIntervalSinceReferenceDate="-595929600" calendarFormat="%Y-%m-%d %H:%M:%S %z">
<date key="date" timeIntervalSinceReferenceDate="-595929600">
<!--1982-02-12 16:00:00 +0000-->
<timeZone key="timeZone" name="US/Pacific"/>
</calendarDate>
</date>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<datePickerElements key="datePickerElements" year="YES" month="YES" day="YES" hour="YES" minute="YES"/>
</datePickerCell>
</datePicker>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="15">
<rect key="frame" x="18" y="47" width="281" height="26"/>
<rect key="frame" x="18" y="47" width="145" height="25"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="16">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@@ -43,7 +43,7 @@
</connections>
</popUpButton>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="25">
<rect key="frame" x="226" y="18" width="70" height="25"/>
<rect key="frame" x="90" y="19" width="70" height="23"/>
<buttonCell key="cell" type="roundTextured" title="Use Date" bezelStyle="texturedRounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="26">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@@ -53,7 +53,7 @@
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="29">
<rect key="frame" x="162" y="18" width="56" height="25"/>
<rect key="frame" x="26" y="19" width="56" height="23"/>
<buttonCell key="cell" type="roundTextured" title="Cancel" bezelStyle="texturedRounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="30">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@@ -77,6 +77,7 @@
<constraint firstItem="15" firstAttribute="top" secondItem="3" secondAttribute="bottom" constant="20" symbolic="YES" id="qKB-vi-OAw"/>
<constraint firstItem="25" firstAttribute="top" secondItem="15" secondAttribute="bottom" constant="8" symbolic="YES" id="sxX-fk-xaJ"/>
</constraints>
<point key="canvasLocation" x="-89" y="77"/>
</customView>
</objects>
</document>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15702" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15702"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@@ -14,6 +14,7 @@
<outlet property="fileChangeStrategyPopup" destination="wIu-Sh-2a2" id="oJo-dA-lEE"/>
<outlet property="idleTimeOutPopup" destination="584" id="809"/>
<outlet property="lockOnLogoutCheckButton" destination="5SP-Vi-1sn" id="yaI-LH-R5A"/>
<outlet property="lockOnScreenSleepCheckButton" destination="nRe-7S-HwK" id="0IB-5B-pfw"/>
<outlet property="lockOnSleepCheckButton" destination="630" id="810"/>
<outlet property="preventUniversalClipboardSupportCheckButton" destination="nqZ-rB-mFS" id="sbx-rl-reT"/>
<outlet property="rememberKeyFileCheckButton" destination="bSt-Wf-FNZ" id="aQm-EA-yAN"/>
@@ -24,16 +25,16 @@
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="1">
<rect key="frame" x="0.0" y="0.0" width="411" height="524"/>
<rect key="frame" x="0.0" y="0.0" width="411" height="547"/>
<subviews>
<box autoresizesSubviews="NO" verticalHuggingPriority="500" borderType="line" title="Security" translatesAutoresizingMaskIntoConstraints="NO" id="465">
<rect key="frame" x="17" y="16" width="377" height="357"/>
<rect key="frame" x="17" y="16" width="377" height="381"/>
<view key="contentView" id="mNh-3L-Z6E">
<rect key="frame" x="3" y="3" width="371" height="339"/>
<rect key="frame" x="3" y="3" width="371" height="363"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="431">
<rect key="frame" x="14" y="311" width="120" height="17"/>
<rect key="frame" x="14" y="335" width="120" height="17"/>
<constraints>
<constraint firstAttribute="height" constant="17" id="803"/>
</constraints>
@@ -44,10 +45,10 @@
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="419">
<rect key="frame" x="138" y="308" width="143" height="21"/>
<rect key="frame" x="138" y="332" width="143" height="21"/>
<popUpButtonCell key="cell" type="push" title="Never" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="429" id="420">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<font key="font" metaFont="system"/>
<menu key="menu" title="ClipboardClearInterval" id="421">
<items>
<menuItem title="Never" state="on" id="429">
@@ -62,7 +63,7 @@
</popUpButtonCell>
</popUpButton>
<button verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="447">
<rect key="frame" x="29" y="287" width="164" height="18"/>
<rect key="frame" x="29" y="311" width="164" height="18"/>
<constraints>
<constraint firstAttribute="height" constant="14" id="773"/>
</constraints>
@@ -72,10 +73,10 @@
</buttonCell>
</button>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="584">
<rect key="frame" x="111" y="168" width="125" height="25"/>
<rect key="frame" x="111" y="192" width="125" height="25"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="585">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<font key="font" metaFont="system"/>
<menu key="menu" title="LockTimes" id="586">
<items>
<menuItem title="Never" id="804"/>
@@ -89,14 +90,14 @@
</popUpButtonCell>
</popUpButton>
<button translatesAutoresizingMaskIntoConstraints="NO" id="630">
<rect key="frame" x="29" y="149" width="119" height="18"/>
<rect key="frame" x="29" y="173" width="119" height="18"/>
<buttonCell key="cell" type="check" title="Lock after sleep" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="631">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="805">
<rect key="frame" x="14" y="173" width="93" height="17"/>
<rect key="frame" x="14" y="197" width="93" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Lock while idle" id="806">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -130,21 +131,21 @@
</connections>
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="5SP-Vi-1sn">
<rect key="frame" x="29" y="129" width="129" height="18"/>
<rect key="frame" x="29" y="151" width="129" height="18"/>
<buttonCell key="cell" type="check" title="Lock after log out" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="Dzn-9R-JjE">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="nqZ-rB-mFS">
<rect key="frame" x="14" y="262" width="242" height="18"/>
<rect key="frame" x="14" y="286" width="242" height="18"/>
<buttonCell key="cell" type="check" title="Prevent Universal Clipboard support" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="fNy-mS-phi">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hy4-RL-dAa">
<rect key="frame" x="18" y="200" width="335" height="56"/>
<rect key="frame" x="18" y="224" width="335" height="56"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" id="JGX-Tp-KJk">
<font key="font" metaFont="smallSystem"/>
<string key="title">Disabling this compromises security. If enabled, anything copied to the Clipboard in MacPass will be available on your connected iOS devices. You should clear the clipboard on those devices manually.</string>
@@ -152,20 +153,30 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="nRe-7S-HwK">
<rect key="frame" x="29" y="129" width="164" height="18"/>
<buttonCell key="cell" type="check" title="Lock after screen sleep" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="l3t-og-mJd">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
</subviews>
<constraints>
<constraint firstItem="5cV-xX-SUU" firstAttribute="leading" secondItem="mNh-3L-Z6E" secondAttribute="leading" constant="20" symbolic="YES" id="1jw-nb-bAB"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="630" secondAttribute="trailing" constant="20" symbolic="YES" id="7cd-1e-eRD"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="nqZ-rB-mFS" secondAttribute="trailing" constant="20" symbolic="YES" id="CL9-fA-GTJ"/>
<constraint firstItem="bSt-Wf-FNZ" firstAttribute="top" secondItem="nRe-7S-HwK" secondAttribute="bottom" constant="11" id="MkJ-O0-qYd"/>
<constraint firstItem="nRe-7S-HwK" firstAttribute="leading" secondItem="447" secondAttribute="leading" id="Mrg-k2-soG"/>
<constraint firstItem="584" firstAttribute="top" secondItem="hy4-RL-dAa" secondAttribute="bottom" constant="8" symbolic="YES" id="SV7-PD-nId"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="bSt-Wf-FNZ" secondAttribute="trailing" constant="20" symbolic="YES" id="VQY-eq-fCM"/>
<constraint firstItem="bSt-Wf-FNZ" firstAttribute="top" secondItem="5SP-Vi-1sn" secondAttribute="bottom" constant="11" id="WUG-Uf-FCO"/>
<constraint firstItem="nRe-7S-HwK" firstAttribute="top" secondItem="5SP-Vi-1sn" secondAttribute="bottom" constant="8" id="YZv-Dp-CrZ"/>
<constraint firstItem="5SP-Vi-1sn" firstAttribute="leading" secondItem="447" secondAttribute="leading" id="Ylr-aA-jaD"/>
<constraint firstItem="hy4-RL-dAa" firstAttribute="top" secondItem="nqZ-rB-mFS" secondAttribute="bottom" constant="8" symbolic="YES" id="a3i-tc-gUU"/>
<constraint firstItem="5SP-Vi-1sn" firstAttribute="top" secondItem="630" secondAttribute="bottom" constant="6" symbolic="YES" id="acg-vp-LeB"/>
<constraint firstItem="5SP-Vi-1sn" firstAttribute="top" secondItem="630" secondAttribute="bottom" constant="8" id="acg-vp-LeB"/>
<constraint firstItem="584" firstAttribute="leading" secondItem="805" secondAttribute="trailing" constant="8" symbolic="YES" id="aoz-sS-O0n"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="447" secondAttribute="trailing" constant="20" symbolic="YES" id="i8H-ad-IKb"/>
<constraint firstItem="419" firstAttribute="leading" secondItem="431" secondAttribute="trailing" constant="8" symbolic="YES" id="pN3-pB-Z5I"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="nRe-7S-HwK" secondAttribute="trailing" constant="20" symbolic="YES" id="pgB-km-W16"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="5SP-Vi-1sn" secondAttribute="trailing" constant="20" symbolic="YES" id="q0v-Wo-mHx"/>
<constraint firstItem="nqZ-rB-mFS" firstAttribute="top" secondItem="447" secondAttribute="bottom" constant="11" id="qLm-ih-A04"/>
<constraint firstAttribute="trailing" secondItem="5cV-xX-SUU" secondAttribute="trailing" constant="20" symbolic="YES" id="qY0-io-RZ0"/>
@@ -197,27 +208,27 @@
</constraints>
</box>
<box autoresizesSubviews="NO" verticalHuggingPriority="500" borderType="line" title="File Handling" translatesAutoresizingMaskIntoConstraints="NO" id="888">
<rect key="frame" x="17" y="375" width="377" height="129"/>
<rect key="frame" x="17" y="399" width="377" height="128"/>
<view key="contentView" id="cpg-tt-SHE">
<rect key="frame" x="3" y="3" width="371" height="111"/>
<rect key="frame" x="3" y="3" width="371" height="110"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button verticalHuggingPriority="252" translatesAutoresizingMaskIntoConstraints="NO" id="530">
<rect key="frame" x="14" y="85" width="234" height="18"/>
<rect key="frame" x="14" y="84" width="234" height="18"/>
<buttonCell key="cell" type="check" title="Reopen last Database after Launch" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="531">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="lz3-4U-UMI">
<rect key="frame" x="14" y="65" width="123" height="18"/>
<rect key="frame" x="14" y="64" width="123" height="18"/>
<buttonCell key="cell" type="check" title="Enable Autosave" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="wG7-bi-2fi">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="3Bo-Ml-1KB">
<rect key="frame" x="18" y="45" width="335" height="14"/>
<rect key="frame" x="18" y="44" width="335" height="14"/>
<textFieldCell key="cell" controlSize="small" title="Close and open all documents for changes to take effect" id="ya5-ps-c4W">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@@ -225,7 +236,7 @@
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="h3w-Ms-ohK">
<rect key="frame" x="14" y="20" width="93" height="17"/>
<rect key="frame" x="14" y="20" width="93" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="If file changes:" id="QrK-hM-Xt1">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@@ -233,10 +244,10 @@
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" horizontalCompressionResistancePriority="749" translatesAutoresizingMaskIntoConstraints="NO" id="wIu-Sh-2a2">
<rect key="frame" x="111" y="14" width="38" height="25"/>
<rect key="frame" x="111" y="13" width="38" height="25"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="1R2-5t-LWk">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<font key="font" metaFont="system"/>
<menu key="menu" id="DQY-17-yKP"/>
</popUpButtonCell>
</popUpButton>
@@ -273,7 +284,7 @@
<constraint firstAttribute="bottom" secondItem="465" secondAttribute="bottom" constant="20" symbolic="YES" id="uwq-az-XwJ"/>
<constraint firstItem="465" firstAttribute="top" secondItem="cpg-tt-SHE" secondAttribute="bottom" constant="5" id="wyH-HB-i2U"/>
</constraints>
<point key="canvasLocation" x="-136.5" y="-93"/>
<point key="canvasLocation" x="-458" y="-295"/>
</customView>
</objects>
</document>

View File

@@ -151,9 +151,9 @@
<action selector="mergeWithOther:" target="-1" id="OyM-CZ-TDD"/>
</connections>
</menuItem>
<menuItem title="Import" id="aTb-sW-nUd">
<menuItem title="Import From" id="aTb-sW-nUd">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Import" id="4q9-u1-pcm">
<menu key="submenu" title="Import From" id="4q9-u1-pcm">
<items>
<menuItem title="XML…" id="rW0-r1-QYL">
<modifierMask key="keyEquivalentModifierMask"/>
@@ -167,16 +167,20 @@
</connections>
</menu>
</menuItem>
<menuItem title="Export" id="tz9-yK-pOf">
<menuItem title="Export To" id="tz9-yK-pOf">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Export" id="p8h-Fg-h1O">
<menu key="submenu" title="Export To" id="p8h-Fg-h1O">
<items>
<menuItem title="XML…" keyEquivalent="E" id="1259">
<menuItem title="XML…" id="1259">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="exportAsXML:" target="-1" id="NCG-gr-YI5"/>
</connections>
</menuItem>
</items>
<connections>
<outlet property="delegate" destination="494" id="ALY-P3-PzW"/>
</connections>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="74">
@@ -357,6 +361,7 @@ CA
</menu>
<customObject id="494" customClass="MPAppDelegate">
<connections>
<outlet property="exportMenu" destination="p8h-Fg-h1O" id="elV-BC-ZZt"/>
<outlet property="fileNewMenuItem" destination="82" id="BUX-dy-HS2"/>
<outlet property="fixAutotypeMenuItem" destination="nx7-Vf-LiD" id="5n1-bG-JxJ"/>
<outlet property="importMenu" destination="4q9-u1-pcm" id="0XM-fS-Vyy"/>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15705" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15705"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@@ -10,6 +10,7 @@
<connections>
<outlet property="cancelButton" destination="2pb-ZG-spA" id="YrR-Yi-dnQ"/>
<outlet property="enablePasswordCheckBox" destination="d8O-Ha-rrS" id="2AI-e9-sph"/>
<outlet property="keyFileWarningTextField" destination="txI-yI-5nE" id="WhF-O8-fsZ"/>
<outlet property="keyPathControl" destination="241" id="261"/>
<outlet property="messageImageView" destination="262" id="726-wK-c2h"/>
<outlet property="messageInfoTextField" destination="268" id="ahE-sq-QzR"/>
@@ -22,10 +23,10 @@
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView horizontalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="1">
<rect key="frame" x="0.0" y="0.0" width="508" height="392"/>
<rect key="frame" x="0.0" y="0.0" width="508" height="526"/>
<subviews>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2">
<rect key="frame" x="310" y="105" width="83" height="32"/>
<rect key="frame" x="310" y="168" width="83" height="32"/>
<buttonCell key="cell" type="push" title="Unlock" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="3">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@@ -38,7 +39,7 @@ DQ
</connections>
</button>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="17">
<rect key="frame" x="108" y="157" width="45" height="17"/>
<rect key="frame" x="108" y="226" width="45" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Keyfile" id="18">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -46,13 +47,13 @@ DQ
</textFieldCell>
</textField>
<pathControl verticalHuggingPriority="750" allowsExpansionToolTips="YES" translatesAutoresizingMaskIntoConstraints="NO" id="241" customClass="MPPathControl">
<rect key="frame" x="156" y="153" width="197" height="25"/>
<pathCell key="cell" selectable="YES" editable="YES" alignment="left" pathStyle="popUp" id="242">
<rect key="frame" x="156" y="222" width="197" height="25"/>
<pathCell key="cell" selectable="YES" editable="YES" alignment="left" pathStyle="popUp" id="242" customClass="MPPathCell">
<font key="font" metaFont="system"/>
</pathCell>
</pathControl>
<imageView translatesAutoresizingMaskIntoConstraints="NO" id="262">
<rect key="frame" x="230" y="241" width="48" height="48"/>
<rect key="frame" x="230" y="305" width="48" height="48"/>
<constraints>
<constraint firstAttribute="height" constant="48" id="273"/>
<constraint firstAttribute="width" constant="48" id="456"/>
@@ -60,7 +61,7 @@ DQ
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyUpOrDown" image="02_MessageBoxWarningTemplate" id="263"/>
</imageView>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="268">
<rect key="frame" x="199" y="216" width="110" height="17"/>
<rect key="frame" x="199" y="281" width="110" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Wrong password!" id="269">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -68,7 +69,7 @@ DQ
</textFieldCell>
</textField>
<secureTextField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="338" customClass="HNHUISecureTextField">
<rect key="frame" x="159" y="184" width="191" height="24"/>
<rect key="frame" x="159" y="253" width="191" height="20"/>
<constraints>
<constraint firstAttribute="width" constant="191" id="389"/>
</constraints>
@@ -85,14 +86,14 @@ DQ
</connections>
</secureTextField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="408">
<rect key="frame" x="358" y="185" width="29" height="23"/>
<rect key="frame" x="358" y="250" width="29" height="23"/>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSQuickLookTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="409">
<behavior key="behavior" pushIn="YES" changeContents="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="486">
<rect key="frame" x="358" y="152" width="29" height="23"/>
<rect key="frame" x="358" y="220" width="29" height="23"/>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSStopProgressTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="487">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@@ -102,14 +103,14 @@ DQ
</connections>
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="d8O-Ha-rrS">
<rect key="frame" x="72" y="187" width="81" height="18"/>
<rect key="frame" x="72" y="254" width="81" height="18"/>
<buttonCell key="cell" type="check" title="Password" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="IU9-5u-jn9">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2pb-ZG-spA">
<rect key="frame" x="228" y="105" width="82" height="32"/>
<rect key="frame" x="228" y="168" width="82" height="32"/>
<buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="erj-mR-UyO">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@@ -121,6 +122,14 @@ Gw
<action selector="_submit:" target="-2" id="aVF-1d-1Hq"/>
</connections>
</button>
<textField hidden="YES" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="txI-yI-5nE">
<rect key="frame" x="157" y="204" width="195" height="14"/>
<textFieldCell key="cell" selectable="YES" title="key_file_warnig" id="f6J-5f-ZvP">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="2" secondAttribute="bottom" constant="20" symbolic="YES" id="122"/>
@@ -144,15 +153,18 @@ Gw
<constraint firstItem="2" firstAttribute="trailing" secondItem="486" secondAttribute="trailing" id="496"/>
<constraint firstItem="408" firstAttribute="leading" secondItem="338" secondAttribute="trailing" constant="8" symbolic="YES" id="7qE-8F-QgB"/>
<constraint firstItem="2pb-ZG-spA" firstAttribute="baseline" secondItem="2" secondAttribute="baseline" id="9nK-MH-Ozs"/>
<constraint firstItem="txI-yI-5nE" firstAttribute="trailing" secondItem="241" secondAttribute="trailing" id="AVL-HO-SMq"/>
<constraint firstItem="17" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="EOa-K4-v7J"/>
<constraint firstItem="338" firstAttribute="leading" secondItem="d8O-Ha-rrS" secondAttribute="trailing" constant="8" symbolic="YES" id="KYs-Ia-SVl"/>
<constraint firstItem="2pb-ZG-spA" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="SUS-76-os4"/>
<constraint firstItem="2" firstAttribute="top" secondItem="txI-yI-5nE" secondAttribute="bottom" constant="8" symbolic="YES" id="jJs-hc-O2O"/>
<constraint firstItem="d8O-Ha-rrS" firstAttribute="centerY" secondItem="338" secondAttribute="centerY" id="kgB-jV-OGy"/>
<constraint firstItem="2" firstAttribute="top" secondItem="486" secondAttribute="bottom" constant="20" symbolic="YES" id="v1K-wm-EeB"/>
<constraint firstItem="txI-yI-5nE" firstAttribute="top" secondItem="241" secondAttribute="bottom" constant="8" symbolic="YES" id="lfg-eB-T2O"/>
<constraint firstItem="txI-yI-5nE" firstAttribute="leading" secondItem="241" secondAttribute="leading" id="nGY-6Q-Vwy"/>
<constraint firstItem="d8O-Ha-rrS" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="vxq-YP-UhR"/>
<constraint firstItem="2" firstAttribute="leading" secondItem="2pb-ZG-spA" secondAttribute="trailing" constant="12" id="ytJ-5Z-5rT"/>
</constraints>
<point key="canvasLocation" x="147" y="-80"/>
<point key="canvasLocation" x="-127" y="-46"/>
</customView>
</objects>
<resources>

View File

@@ -186,7 +186,7 @@
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="K0z-aD-K2P">
<rect key="frame" x="18" y="466" width="243" height="18"/>
<buttonCell key="cell" type="check" title="Download current plugin information" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="uHR-uL-Ddm">
<buttonCell key="cell" type="check" title="Download current Plugin information" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="uHR-uL-Ddm">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14313.18" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15702" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14313.18"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15702"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@@ -18,11 +18,11 @@
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView id="c22-O7-iKe">
<rect key="frame" x="0.0" y="0.0" width="205" height="215"/>
<rect key="frame" x="0.0" y="0.0" width="207" height="213"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IZP-Gd-jdU">
<rect key="frame" x="13" y="152" width="82" height="25"/>
<rect key="frame" x="13" y="151" width="83" height="23"/>
<popUpButtonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="KPf-xE-gde">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@@ -37,7 +37,7 @@
</connections>
</popUpButton>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IFf-vC-3vk" customClass="HNHUITextField">
<rect key="frame" x="13" y="102" width="172" height="22"/>
<rect key="frame" x="13" y="101" width="174" height="21"/>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="100" id="Seu-01-P53"/>
</constraints>
@@ -48,14 +48,14 @@
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="T2o-aJ-JmD">
<rect key="frame" x="147" y="18" width="38" height="25"/>
<rect key="frame" x="149" y="19" width="38" height="23"/>
<buttonCell key="cell" type="roundTextured" title="Use" bezelStyle="texturedRounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Kqx-qm-nMG">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="VR5-Rx-ueN">
<rect key="frame" x="101" y="184" width="24" height="14"/>
<rect key="frame" x="102" y="182" width="24" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Key" id="K1t-OZ-ACe">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
@@ -63,7 +63,7 @@
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sZo-ie-Asw">
<rect key="frame" x="11" y="184" width="58" height="14"/>
<rect key="frame" x="11" y="182" width="58" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Reference" id="r1V-VE-ngy">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
@@ -71,10 +71,10 @@
</textFieldCell>
</textField>
<popUpButton horizontalHuggingPriority="249" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="b4e-k2-WPS">
<rect key="frame" x="103" y="152" width="82" height="25"/>
<rect key="frame" x="104" y="151" width="83" height="23"/>
<popUpButtonCell key="cell" type="roundTextured" title="Matching" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" selectedItem="yT1-XL-k6a" id="Aob-tW-bUP">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<font key="font" metaFont="system"/>
<menu key="menu" id="j2A-qj-k7L">
<items>
<menuItem title="Matching" state="on" id="yT1-XL-k6a">
@@ -88,7 +88,7 @@
</connections>
</popUpButton>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="WTJ-he-uTu">
<rect key="frame" x="11" y="132" width="37" height="14"/>
<rect key="frame" x="11" y="130" width="37" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Match" id="9ce-da-syF">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
@@ -96,7 +96,7 @@
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mcC-bG-cCz">
<rect key="frame" x="11" y="80" width="92" height="14"/>
<rect key="frame" x="11" y="79" width="92" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Reference String" id="gik-Ha-hRd">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
@@ -104,7 +104,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="b36-T7-1tO" customClass="HNHUITextField">
<rect key="frame" x="13" y="50" width="172" height="22"/>
<rect key="frame" x="13" y="50" width="174" height="21"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="Reference" drawsBackground="YES" id="dr9-x8-kKk">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15702" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15702"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@@ -32,7 +32,7 @@
<rect key="frame" x="144" y="17" width="114" height="25"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="Hl5-gO-B1c">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<font key="font" metaFont="system"/>
<menu key="menu" title="OtherViews" id="RKd-H8-eCF">
<items>
<menuItem title="every Hour" tag="3600" id="DjF-1I-6Nq"/>
@@ -46,7 +46,7 @@
</popUpButtonCell>
</popUpButton>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ckg-9t-MDS">
<rect key="frame" x="22" y="22" width="118" height="17"/>
<rect key="frame" x="22" y="23" width="118" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Check for Updates" id="9tL-CA-Vdg">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15702" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15702"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@@ -19,16 +19,16 @@
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="1">
<rect key="frame" x="0.0" y="0.0" width="400" height="315"/>
<rect key="frame" x="0.0" y="0.0" width="400" height="314"/>
<subviews>
<box autoresizesSubviews="NO" verticalHuggingPriority="500" borderType="line" title="Entry Table" translatesAutoresizingMaskIntoConstraints="NO" id="2">
<rect key="frame" x="17" y="166" width="366" height="100"/>
<rect key="frame" x="17" y="166" width="366" height="99"/>
<view key="contentView" id="cfa-nq-Kzt">
<rect key="frame" x="3" y="3" width="360" height="82"/>
<rect key="frame" x="3" y="3" width="360" height="81"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9">
<rect key="frame" x="18" y="53" width="134" height="17"/>
<rect key="frame" x="18" y="53" width="134" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Double-click on URL:" id="10">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -36,10 +36,10 @@
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="13">
<rect key="frame" x="156" y="48" width="109" height="25"/>
<rect key="frame" x="156" y="47" width="109" height="25"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="14">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<font key="font" metaFont="system"/>
<menu key="menu" title="OtherViews" id="15">
<items>
<menuItem title="Copies URL" id="16"/>
@@ -49,7 +49,7 @@
</popUpButtonCell>
</popUpButton>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="36">
<rect key="frame" x="18" y="22" width="134" height="17"/>
<rect key="frame" x="18" y="22" width="134" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" enabled="NO" sendsActionOnEndEditing="YES" title="Double-click on Title:" id="37">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -57,10 +57,10 @@
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="40">
<rect key="frame" x="156" y="17" width="139" height="25"/>
<rect key="frame" x="156" y="17" width="139" height="24"/>
<popUpButtonCell key="cell" type="push" title="Opens Inspector" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="44" id="41">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<font key="font" metaFont="system"/>
<menu key="menu" title="OtherViews" id="42">
<items>
<menuItem title="Opens Inspector" state="on" id="44"/>
@@ -90,10 +90,10 @@
</constraints>
</box>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ehI-gq-lsb">
<rect key="frame" x="113" y="271" width="135" height="25"/>
<rect key="frame" x="113" y="270" width="135" height="25"/>
<popUpButtonCell key="cell" type="push" title="Default Browser" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="7YX-EA-9KA" id="7Ip-sU-sAK">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<font key="font" metaFont="system"/>
<menu key="menu" title="OtherViews" id="XgO-Tj-QjO">
<items>
<menuItem title="Default Browser" state="on" id="7YX-EA-9KA"/>
@@ -104,7 +104,7 @@
</popUpButtonCell>
</popUpButton>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="lOo-NI-b07">
<rect key="frame" x="18" y="274" width="91" height="19"/>
<rect key="frame" x="18" y="273" width="91" height="19"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" enabled="NO" sendsActionOnEndEditing="YES" title="Open URLs in:" id="soD-wI-YOH">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>

View File

@@ -33,6 +33,7 @@ APPKIT_EXTERN NSString *const MPDidChangeStoredKeyFilesSettings;
@property (strong) IBOutlet NSMenuItem *fileNewMenuItem;
@property (strong) IBOutlet NSMenu *itemMenu;
@property (strong) IBOutlet NSMenu *importMenu;
@property (strong) IBOutlet NSMenu *exportMenu;
@property (strong, readonly) MPEntryContextMenuDelegate *itemActionMenuDelegate;

View File

@@ -240,19 +240,36 @@ typedef NS_OPTIONS(NSInteger, MPAppStartupState) {
NSString *saveTitle = displayDots ? NSLocalizedString(@"SAVE_WITH_DOTS", "Save file menu item title when save will prompt for a location to save or ask for a password/key") : NSLocalizedString(@"SAVE", "Save file menu item title when save will just save the file");
self.saveMenuItem.title = saveTitle;
}
if(menu == self.fixAutotypeMenuItem.menu) {
else if(menu == self.fixAutotypeMenuItem.menu) {
self.fixAutotypeMenuItem.hidden = !(NSEvent.modifierFlags & NSAlternateKeyMask);
}
if(menu == self.importMenu) {
else if(menu == self.importMenu) {
NSMenuItem *exportXML = menu.itemArray.firstObject;
[menu removeAllItems];
[menu addItem:exportXML];
for(MPPlugin<MPImportPlugin> * plugin in MPPluginHost.sharedHost.importPlugins) {
NSMenuItem *importItem = [[NSMenuItem alloc] init];
[plugin prepareImportMenuItem:importItem];
importItem.submenu = nil; // kill any potential submenu!
importItem.representedObject = plugin.identifier;
importItem.target = nil;
importItem.action = @selector(importFromPlugin:);
importItem.action = @selector(importWithPlugin:);
[menu addItem:importItem];
}
}
else if(menu == self.exportMenu) {
NSMenuItem *importXML = menu.itemArray.firstObject;
[menu removeAllItems];
[menu addItem:importXML];
for(MPPlugin<MPExportPlugin> * plugin in MPPluginHost.sharedHost.exportPlugins) {
NSMenuItem *exportItem = [[NSMenuItem alloc] init];
[plugin prepareExportMenuItem:exportItem];
exportItem.submenu = nil; // kill any potential submenu!
exportItem.representedObject = plugin.identifier;
exportItem.target = nil;
exportItem.action = @selector(exportWithPlugin:);
[menu addItem:exportItem];
}
[menu insertItem:exportXML atIndex:0];
}
}

View File

@@ -22,13 +22,19 @@
#import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
@class MPAutotypeEnvironment;
@class MPAutotypeContext;
@interface MPAutotypeCandidateSelectionViewController : NSViewController
@property (copy) NSArray *candidates;
@property (copy) NSString *windowTitle;
@property (strong) MPAutotypeEnvironment *environment;
@property (copy) NSArray<MPAutotypeContext *> *candidates;
- (IBAction)selectAutotypeContext:(id)sender;
- (IBAction)cancelSelection:(id)sender;
@end
NS_ASSUME_NONNULL_END

View File

@@ -22,6 +22,7 @@
#import "MPAutotypeCandidateSelectionViewController.h"
#import "MPAutotypeContext.h"
#import "MPAutotypeDaemon.h"
#import "MPAutotypeEnvironment.h"
#import "KPKNode+IconImage.h"
@@ -43,7 +44,7 @@
- (void)viewDidLoad {
[super viewDidLoad];
NSString *template = NSLocalizedString(@"AUTOTYPE_CANDIDATE_SELECTION_WINDOW_MESSAGE_%@", "Message text in the autotype selection window. Placeholder is %1 - windowTitle");
self.messageTextField.stringValue = [NSString stringWithFormat:template, self.windowTitle];
self.messageTextField.stringValue = [NSString stringWithFormat:template, self.environment.windowTitle];
self.selectAutotypeContextButton.enabled = NO;
NSNotification *notification = [NSNotification notificationWithName:NSTableViewSelectionDidChangeNotification object:self.contextTableView];
[self tableViewSelectionDidChange:notification];
@@ -80,7 +81,7 @@
- (void)selectAutotypeContext:(id)sender {
NSInteger selectedRow = self.contextTableView.selectedRow;
if(selectedRow >= 0 && selectedRow < self.candidates.count) {
[MPAutotypeDaemon.defaultDaemon selectAutotypeCandiate:self.candidates[selectedRow]];
[MPAutotypeDaemon.defaultDaemon selectAutotypeContext:self.candidates[selectedRow] forEnvironment:self.environment];
}
else {
[self cancelSelection:sender]; // cancel since the selection was invalid!
@@ -88,7 +89,7 @@
}
- (void)cancelSelection:(id)sender {
[[MPAutotypeDaemon defaultDaemon] cancelAutotypeCandidateSelection];
[MPAutotypeDaemon.defaultDaemon cancelAutotypeContextSelectionForEnvironment:self.environment];
}

View File

@@ -25,7 +25,7 @@
@class DDHotKey;
@class KPKEntry;
@class MPAutotypeContext;
@class MPAutotypeExecutionContext;
@class MPAutotypeEnvironment;
/**
* The autotype daemon is responsible for registering the global hotkey and to perform any autotype actions
*/
@@ -40,7 +40,7 @@
- (void)performAutotypeForEntry:(KPKEntry *)entry;
- (void)performAutotypeForEntry:(KPKEntry *)entry overrideSequence:(NSString *)sequence;
- (void)selectAutotypeCandiate:(MPAutotypeContext *)context;
- (void)cancelAutotypeCandidateSelection;
- (void)selectAutotypeContext:(MPAutotypeContext *)context forEnvironment:(MPAutotypeEnvironment *)environment;
- (void)cancelAutotypeContextSelectionForEnvironment:(MPAutotypeEnvironment *)environment;
@end

View File

@@ -25,6 +25,7 @@
#import "MPDocumentWindowController.h"
#import "MPAutotypeCommand.h"
#import "MPAutotypeContext.h"
#import "MPAutotypeEnvironment.h"
#import "MPAutotypePaste.h"
#import "MPAutotypeDelay.h"
#import "MPPasteBoardController.h"
@@ -45,16 +46,12 @@
#import "KeePassKit/KeePassKit.h"
#import <Carbon/Carbon.h>
NSString *const kMPWindowTitleKey = @"kMPWindowTitleKey";
NSString *const kMPProcessIdentifierKey = @"kMPProcessIdentifierKey";
@interface MPAutotypeDaemon ()
@property (nonatomic, assign) BOOL enabled;
@property (nonatomic, copy) NSData *hotKeyData;
@property (strong) DDHotKey *registredHotKey;
@property (assign) pid_t targetPID; // The pid of the process we want to sent commands to
@property (copy) NSString *targetWindowTitle; // The title of the window that we are targeting
@property (strong) NSRunningApplication *previousApplication; // The application that was active before we got invoked
@property (assign) NSTimeInterval userActionRequested;
@property (strong) id applicationActivationObserver;
@@ -85,7 +82,6 @@ static MPAutotypeDaemon *_sharedInstance;
self = [super init];
if (self) {
_enabled = NO;
_targetPID = -1;
_userActionRequested = NSDate.distantPast.timeIntervalSinceReferenceDate;
[self bind:NSStringFromSelector(@selector(enabled))
toObject:NSUserDefaultsController.sharedUserDefaultsController
@@ -144,41 +140,63 @@ static MPAutotypeDaemon *_sharedInstance;
- (void)performAutotypeForEntry:(KPKEntry *)entry {
[self performAutotypeForEntry:entry overrideSequence:nil];
}
- (void)performAutotypeForEntry:(KPKEntry *)entry overrideSequence:(NSString *)sequence {
if(entry) {
[self _updateTargeInformationForApplication:self.previousApplication];
[self _performAutotypeForEntry:entry];
MPAutotypeEnvironment *env = [MPAutotypeEnvironment environmentWithTargetApplication:self.previousApplication entry:entry];
[self _runAutotypeWithEnvironment:env];
}
}
- (void)_didPressHotKey {
[self _updateTargetInformationForFrontMostApplication];
[self _performAutotypeForEntry:nil];
}
#pragma mark -
#pragma mark Actions
- (void)selectAutotypeCandiate:(MPAutotypeContext *)context {
[self.matchSelectionWindow orderOut:self];
self.matchSelectionWindow = nil;
[self _performAutotypeForContext:context];
}
- (void)cancelAutotypeCandidateSelection {
[self.matchSelectionWindow orderOut:self];
self.matchSelectionWindow = nil;
if(self.targetPID) {
[self _orderApplicationToFront:self.targetPID forContext:nil];
}
MPAutotypeEnvironment *env = [MPAutotypeEnvironment environmentWithTargetApplication:NSWorkspace.sharedWorkspace.frontmostApplication entry:nil];
[self _runAutotypeWithEnvironment:env];
}
#pragma mark -
#pragma mark Autotype Execution
- (void)selectAutotypeContext:(MPAutotypeContext *)context forEnvironment:(MPAutotypeEnvironment *)environment {
[self.matchSelectionWindow orderOut:self];
self.matchSelectionWindow = nil;
[self _runAutotypeWithEnvironment:environment forContext:context];
if(environment.hidden) {
[NSApplication.sharedApplication hide:nil];
}
}
- (void)cancelAutotypeContextSelectionForEnvironment:(MPAutotypeEnvironment *)environment {
[self.matchSelectionWindow orderOut:self];
self.matchSelectionWindow = nil;
if(environment.hidden) {
[NSApplication.sharedApplication hide:nil];
}
if(environment.pid) {
[self _orderApplicationToFront:environment.pid completionHandler:nil];
}
}
- (void)_runAutotypeAfterDatabaseUnlockWithEnvironment:(MPAutotypeEnvironment *)environment requestedAt:(NSTimeInterval)requestTime {
NSTimeInterval now = NSDate.date.timeIntervalSinceReferenceDate;
if(now - requestTime > 30) {
NSUserNotification *notification = [[NSUserNotification alloc] init];
notification.title = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_TIMED_OUT_TITLE", "Title for the notification when the Autotype operation timed out");
notification.informativeText = NSLocalizedString(@"AUTOTYPE_TIMED_OUT", "Notficication: Autotype timed out");
notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeAutotypeFeedback };
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
}
else {
[self _runAutotypeWithEnvironment:environment];
}
}
- (void)_runAutotypeWithEnvironment:(MPAutotypeEnvironment *)env {
if(env.isSelfTargeting) {
return; // we do not want to target ourselves
}
- (void)_performAutotypeForEntry:(KPKEntry *)entryOrNil {
if(!self.hasNecessaryAutotypePermissions) {
NSUserNotification *notification = [[NSUserNotification alloc] init];
notification.title = NSApp.applicationName;
notification.title = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_PERMISSIONS_MISSING_TITLE", "Title for autotype feedback on missing permissions");
notification.informativeText = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_MACPASS_IS_MISSING_PERMISSIONS", "Notification: Autotype failed, MacPass has not enough permissions to perform autotype");
notification.actionButtonTitle = NSLocalizedString(@"SHOW_AUTOTYPE_DOCTOR", "Action button in Notification to show the Autotype Doctor");
notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeRunAutotypeDoctor };
@@ -186,24 +204,28 @@ static MPAutotypeDaemon *_sharedInstance;
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
return;
}
NSInteger pid = NSProcessInfo.processInfo.processIdentifier;
if(self.targetPID == pid) {
return; // We do not perform Autotype on ourselves
}
/* find autotype documents */
NSArray *documents = NSApp.orderedDocuments;
/* No open document, inform the user and return without any action */
if(documents.count == 0) {
NSUserNotification *notification = [[NSUserNotification alloc] init];
notification.title = NSApp.applicationName;
notification.informativeText = NSLocalizedString(@"AUTOTYPE_OVERLAY_NO_DOCUMENTS", "Notification: Autotype failed, no documents are open");
notification.title = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_NO_DOCUMENTS_TITLE", "Notification: Title for autotype feedback");
notification.informativeText = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_NO_DOCUMENTS_INFORMATIVE_TEXT", "Notification: Autotype failed, no documents are open");
notification.actionButtonTitle = NSLocalizedString(@"OPEN_DOCUMENT", "Action button in Notification to open a document");
notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeAutotypeOpenDocumentRequest };
notification.showsButtons = YES;
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
self.userActionRequested = NSDate.date.timeIntervalSinceReferenceDate;
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didUnlockDatabase:) name:MPDocumentDidUnlockDatabaseNotification object:nil];
NSNotificationCenter * __weak nc = [NSNotificationCenter defaultCenter];
MPAutotypeDaemon * __weak welf = self;
NSTimeInterval requestTime = NSDate.date.timeIntervalSinceReferenceDate;
id __block unlockToken = [nc addObserverForName:MPDocumentDidUnlockDatabaseNotification
object:nil
queue:NSOperationQueue.mainQueue
usingBlock:^(NSNotification *notification) {
[welf _runAutotypeAfterDatabaseUnlockWithEnvironment:env requestedAt:requestTime];
[nc removeObserver:unlockToken];
}];
return; // Unlock should trigger autotype
}
@@ -211,6 +233,7 @@ static MPAutotypeDaemon *_sharedInstance;
MPDocument *document = evaluatedObject;
return !document.encrypted;
}];
NSArray *unlockedDocuments = [documents filteredArrayUsingPredicate:filterPredicate];
/* We look for all unlocked documents, if all open documents are locked, we pop the front most and try to search again */
if(unlockedDocuments.count == 0) {
@@ -221,60 +244,71 @@ static MPAutotypeDaemon *_sharedInstance;
[document showWindows];
MPDocumentWindowController *wc = document.windowControllers.firstObject;
[wc showPasswordInputWithMessage:NSLocalizedString(@"AUTOTYPE_MESSAGE_UNLOCK_DATABASE", @"Message displayed to the user to unlock the database to perform global autotype")];
self.userActionRequested = NSDate.date.timeIntervalSinceReferenceDate;
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didUnlockDatabase:) name:MPDocumentDidUnlockDatabaseNotification object:nil];
NSNotificationCenter * __weak nc = [NSNotificationCenter defaultCenter];
MPAutotypeDaemon * __weak welf = self;
NSTimeInterval requestTime = NSDate.date.timeIntervalSinceReferenceDate;
id __block unlockToken = [nc addObserverForName:MPDocumentDidUnlockDatabaseNotification
object:nil
queue:NSOperationQueue.mainQueue
usingBlock:^(NSNotification *notification) {
[welf _runAutotypeAfterDatabaseUnlockWithEnvironment:env requestedAt:requestTime];
[nc removeObserver:unlockToken];
}];
return; // wait for the unlock to happen
}
MPAutotypeContext *context = [self _autotypeContextForDocuments:documents forWindowTitle:self.targetWindowTitle preferredEntry:entryOrNil];
/* TODO: that's popping up if the multi selection dialog goes up! */
MPAutotypeContext *context = [self _autotypeContextForDocuments:documents withEnvironment:env];
if(self.matchSelectionWindow) {
return; // we present the match selection window, just return
}
if(!entryOrNil) {
if(!env.preferredEntry) {
NSUserNotification *notification = [[NSUserNotification alloc] init];
notification.title = NSApp.applicationName;
notification.title = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_MATCH_TITLE", "Notification: Title for autotype feedback");
notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeAutotypeFeedback };
if(context) {
notification.informativeText = [NSString stringWithFormat:NSLocalizedString(@"AUTOTYPE_OVERLAY_SINGLE_MATCH_FOR_%@", "Notification: Autotype found a single match for %@ (string placeholder)."), self.targetWindowTitle];
notification.informativeText = [NSString stringWithFormat:NSLocalizedString(@"AUTOTYPE_NOTIFICATION_SINGLE_MATCH_FOR_%@", "Notification: Autotype found a single match for %@ (string placeholder)."), env.windowTitle];
}
else {
notification.informativeText = [NSString stringWithFormat:NSLocalizedString(@"AUTOTYPE_OVERLAY_NO_MATCH_FOR_%@", "Noticiation: Autotype failed to find a match for %@ (string placeholder)"), self.targetWindowTitle];
notification.informativeText = [NSString stringWithFormat:NSLocalizedString(@"AUTOTYPE_NOTIFICATION_NO_MATCH_FOR_%@", "Noticiation: Autotype failed to find a match for %@ (string placeholder)"), env.windowTitle];
}
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
}
[self _performAutotypeForContext:context];
[self _runAutotypeWithEnvironment:env forContext:context];
}
- (MPAutotypeContext *)_autotypeContextForDocuments:(NSArray<MPDocument *> *)documents forWindowTitle:(NSString *)windowTitle preferredEntry:(KPKEntry *)entry {
- (MPAutotypeContext *)_autotypeContextForDocuments:(NSArray<MPDocument *> *)documents withEnvironment:(MPAutotypeEnvironment *)environment {
/*
Query the document to generate a autotype command list for the window title
We do not care where this came form, just get the autotype commands
*/
NSMutableArray *autotypeCandidates = [[NSMutableArray alloc] init];
for(MPDocument *document in documents) {
NSArray *contexts = [document autotypContextsForWindowTitle:windowTitle preferredEntry:entry];
NSArray *contexts = [document autotypContextsForWindowTitle:environment.windowTitle preferredEntry:environment.preferredEntry];
if(contexts ) {
[autotypeCandidates addObjectsFromArray:contexts];
}
}
NSUInteger candidates = autotypeCandidates.count;
if(candidates == 0) {
return nil;
}
if(candidates == 1 ) {
if(autotypeCandidates.count <= 1) {
return autotypeCandidates.lastObject;
}
[self _presentCandiadates:autotypeCandidates forWindowTitle:windowTitle];
[self _presentCandiadates:autotypeCandidates forEnvironment:environment];
return nil; // Nothing to do, we get called back by the window
}
- (void)_performAutotypeForContext:(MPAutotypeContext *)context {
- (void)_runAutotypeWithEnvironment:(MPAutotypeEnvironment *)environment forContext:(MPAutotypeContext *)context {
if(nil == environment) {
return; // no Environment to work in
}
if(nil == context) {
return; // No context to work with
}
if(NO == [self _orderApplicationToFront:self.targetPID forContext:(MPAutotypeContext *)context]) {
__weak MPAutotypeDaemon *welf = self;
BOOL appIsFrontmost = [self _orderApplicationToFront:environment.pid completionHandler:^{
[welf _runAutotypeWithEnvironment:environment forContext:context];
}];
if(!appIsFrontmost) {
return; // We will get called back when the application is in front - hopfully
}
@@ -298,6 +332,10 @@ static MPAutotypeDaemon *_sharedInstance;
usleep(globalDelay*NSEC_PER_USEC);
}
[command execute];
/* re-hide after every command since this might have put us back up front */
if(environment.hidden) {
[NSApplication.sharedApplication hide:nil];
}
});
}
}
@@ -322,38 +360,7 @@ static MPAutotypeDaemon *_sharedInstance;
}
}
- (NSDictionary *)_infoDictionaryForApplication:(NSRunningApplication *)application {
NSArray *currentWindows = CFBridgingRelease(CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID));
NSArray *windowNumbers = [NSWindow windowNumbersWithOptions:NSWindowNumberListAllApplications];
NSUInteger minZIndex = NSNotFound;
NSDictionary *infoDict = nil;
for(NSDictionary *windowDict in currentWindows) {
NSString *windowTitle = windowDict[(NSString *)kCGWindowName];
if(windowTitle.length <= 0) {
continue;
}
NSNumber *processId = windowDict[(NSString *)kCGWindowOwnerPID];
if(processId && [processId isEqualToNumber:@(application.processIdentifier)]) {
NSNumber *number = (NSNumber *)windowDict[(NSString *)kCGWindowNumber];
NSUInteger zIndex = [windowNumbers indexOfObject:number];
if(zIndex < minZIndex) {
minZIndex = zIndex;
infoDict = @{
kMPWindowTitleKey: windowTitle,
kMPProcessIdentifierKey : processId
};
}
}
}
if(currentWindows.count > 0 && infoDict.count == 0) {
// show some information about not being able to determine any windows
NSLog(@"Unable to retrieve any window names. If you encounter this issue you might be running 10.15 and MacPass has no permission for screen recording.");
}
return infoDict;
}
- (void)_presentCandiadates:(NSArray *)candidates forWindowTitle:(NSString *)windowTitle {
- (void)_presentCandiadates:(NSArray *)candidates forEnvironment:(MPAutotypeEnvironment *)environment {
if(!self.matchSelectionWindow) {
self.matchSelectionWindow = [[NSPanel alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
styleMask:NSWindowStyleMaskNonactivatingPanel|NSWindowStyleMaskTitled
@@ -362,7 +369,7 @@ static MPAutotypeDaemon *_sharedInstance;
self.matchSelectionWindow.level = kCGAssistiveTechHighWindowLevel;
MPAutotypeCandidateSelectionViewController *vc = [[MPAutotypeCandidateSelectionViewController alloc] init];
vc.candidates = candidates;
vc.windowTitle = windowTitle;
vc.environment = environment;
self.matchSelectionWindow.collectionBehavior |= (NSWindowCollectionBehaviorFullScreenAuxiliary |
NSWindowCollectionBehaviorMoveToActiveSpace |
NSWindowCollectionBehaviorTransient );
@@ -373,24 +380,6 @@ static MPAutotypeDaemon *_sharedInstance;
[self.matchSelectionWindow makeKeyAndOrderFront:self];
}
#pragma mark -
#pragma mark MPDocument Notifications
- (void)_didUnlockDatabase:(NSNotification *)notification {
/* Remove ourselves and call again to search matches */
[NSNotificationCenter.defaultCenter removeObserver:self name:MPDocumentDidUnlockDatabaseNotification object:nil];
NSTimeInterval now = NSDate.date.timeIntervalSinceReferenceDate;
if(now - self.userActionRequested > 30) {
NSUserNotification *notification = [[NSUserNotification alloc] init];
notification.title = NSApp.applicationName;
notification.informativeText = NSLocalizedString(@"AUTOTYPE_TIMED_OUT", "Notficication: Autotype timed out");
notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeAutotypeFeedback };
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
}
else {
[self _performAutotypeForEntry:nil];
}
}
#pragma mark -
#pragma mark NSApplication Notifications
- (void)_didDeactivateApplication:(NSNotification *)notification {
@@ -400,55 +389,25 @@ static MPAutotypeDaemon *_sharedInstance;
#pragma mark -
#pragma mark Application information
- (BOOL)_orderApplicationToFront:(pid_t)processIdentifier forContext:(MPAutotypeContext *)context {
//- (BOOL)_orderApplicationToFront:(pid_t)processIdentifier inEnvironment:(MPAutotypeEnvironment *) environment {
- (BOOL)_orderApplicationToFront:(pid_t)processIdentifier completionHandler:(void (^_Nullable)(void))completionHandler {
NSRunningApplication *runingApplication = [NSRunningApplication runningApplicationWithProcessIdentifier:processIdentifier];
NSRunningApplication *frontApplication = NSWorkspace.sharedWorkspace.frontmostApplication;
if(frontApplication.processIdentifier == processIdentifier) {
return YES;
}
/* cleanup before to make sure everything is top notch */
if(self.applicationActivationObserver) {
[NSWorkspace.sharedWorkspace.notificationCenter removeObserver:self.applicationActivationObserver name:NSWorkspaceDidActivateApplicationNotification object:nil];
self.applicationActivationObserver = nil;
}
self.applicationActivationObserver = [NSWorkspace.sharedWorkspace.notificationCenter addObserverForName:NSWorkspaceDidActivateApplicationNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
if(self.applicationActivationObserver) {
[NSWorkspace.sharedWorkspace.notificationCenter removeObserver:self.applicationActivationObserver name:NSWorkspaceDidActivateApplicationNotification object:nil];
NSNotificationCenter * __weak nc = NSWorkspace.sharedWorkspace.notificationCenter;
id __block didActivateToken = [nc addObserverForName:NSWorkspaceDidActivateApplicationNotification
object:nil
queue:NSOperationQueue.mainQueue
usingBlock:^(NSNotification *notification) {
[nc removeObserver:didActivateToken];
if(completionHandler) {
completionHandler();
}
[self _performAutotypeForContext:context];
}];
[runingApplication activateWithOptions:NSApplicationActivateIgnoringOtherApps];
return NO;
}
- (void)_updateTargetInformationForFrontMostApplication {
[self _updateTargeInformationForApplication:NSWorkspace.sharedWorkspace.frontmostApplication];
}
- (void)_updateTargeInformationForApplication:(NSRunningApplication *)application {
if(!application) {
self.targetPID = -1;
self.targetWindowTitle = @"";
}
else {
NSDictionary *frontApplicationInfoDict = [self _infoDictionaryForApplication:application];
self.targetPID = [frontApplicationInfoDict[kMPProcessIdentifierKey] intValue];
self.targetWindowTitle = frontApplicationInfoDict[kMPWindowTitleKey];
/* if we have any resolvers, let them provide the window title */
NSArray *resolvers = [MPPluginHost.sharedHost windowTitleResolverForRunningApplication:application];
for(MPPlugin<MPAutotypeWindowTitleResolverPlugin> *resolver in resolvers) {
NSString *windowTitle = [resolver windowTitleForRunningApplication:application];
if(windowTitle.length > 0) {
self.targetWindowTitle = windowTitle;
break;
}
}
}
}
@end

View File

@@ -63,22 +63,41 @@
- (BOOL)hasScreenRecordingPermissions:(NSError *__autoreleasing*)error {
/* macos 10.14 and lower do not require screen recording permission to get window titles */
if (@available(macOS 10.15, *)) {
/*
Solution is heavily inspired by Craig Hockenberry's
https://stackoverflow.com/questions/56597221/detecting-screen-recording-settings-on-macos-catalina/58985069#58985069
*/
if(@available(macOS 10.15, *)) {
CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
NSUInteger numberOfWindows = CFArrayGetCount(windowList);
NSUInteger numberOfWindowsWithName = 0;
BOOL canRecordScreen = NO;
for(int idx = 0; idx < numberOfWindows; idx++) {
NSDictionary *windowInfo = (NSDictionary *)CFArrayGetValueAtIndex(windowList, idx);
NSNumber *ownerPid = windowInfo[(id)kCGWindowOwnerPID];
/*
Skip over our own windows
*/
if(ownerPid.intValue == NSProcessInfo.processInfo.processIdentifier) {
continue;
}
/*
Skip applications we aren't allowed to access anyway
*/
NSRunningApplication *ownerApp = [NSRunningApplication runningApplicationWithProcessIdentifier:ownerPid.intValue];
if(!ownerApp) {
continue;
}
NSString *windowName = windowInfo[(id)kCGWindowName];
if(windowName) {
numberOfWindowsWithName++;
}
else {
break; //breaking early, numberOfWindowsWithName not increased
if([ownerApp.executableURL.lastPathComponent isEqualToString:@"Dock"]) {
continue;
}
canRecordScreen = YES;
break;
}
}
CFRelease(windowList);
BOOL canRecordScreen = (numberOfWindows == numberOfWindowsWithName);
if(!canRecordScreen && error) {
*error = [NSError errorInDomain:MPAutotypeErrorDomain withCode:MPErrorAutotypeIsMissingScreenRecordingPermissions description:NSLocalizedString(@"ERROR_NO_PERMISSION_TO_RECORD_SCREEN", "Error description for missing screen recording permissions")];
}
@@ -93,7 +112,7 @@
if(@available(macOS 10.14, *)) {
isTrusted = AXIsProcessTrusted();
if(!isTrusted && error) {
*error = [NSError errorInDomain:MPAutotypeErrorDomain withCode:MPErrorAutotypeIsMissingAccessibiltyPermissions description:NSLocalizedString(@"ERROR_NO_ACCESSIBILTY_PERMISSIONS", "Error description for missing accessibilty permissions")];
*error = [NSError errorInDomain:MPAutotypeErrorDomain withCode:MPErrorAutotypeIsMissingAccessibiltyPermissions description:NSLocalizedString(@"ERROR_NO_ACCESSIBILITY_PERMISSIONS", "Error description for missing accessibility permissions")];
}
}
return isTrusted;

View File

@@ -0,0 +1,34 @@
//
// MPAutotypeEnvironment.h
// MacPass
//
// Created by Michael Starke on 15.01.20.
// Copyright © 2020 HicknHack Software GmbH. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class KPKEntry;
@class MPAutotypeContext;
@interface MPAutotypeEnvironment : NSObject
/**
The selected entry, if Autotype is run only for a single entry.
If autotype should search for entries, set this to nil.
*/
@property (readonly, weak, nullable) KPKEntry *preferredEntry;
@property (readonly) pid_t pid; // the PID of the target application to which the key strokes should be sent
@property (readonly, copy) NSString *windowTitle; /// The window title of the target application.
@property (readonly) BOOL hidden; /// If set to YES, MacPass was hidden when autotype was initiated
@property (readonly) BOOL isSelfTargeting; /// If MacPass should autotype to itself, YES, otherwise NO
+ (instancetype)environmentWithTargetApplication:(NSRunningApplication *)targetApplication entry:(KPKEntry * _Nullable)entry;
- (instancetype)initWithTargetApplication:(NSRunningApplication *)targetApplication entry:(KPKEntry * _Nullable)entry NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,84 @@
//
// MPAutotypeEnvironment.m
// MacPass
//
// Created by Michael Starke on 15.01.20.
// Copyright © 2020 HicknHack Software GmbH. All rights reserved.
//
#import "MPAutotypeEnvironment.h"
#import "NSRunningApplication+MPAdditions.h"
#import "MPPluginHost.h"
#import "MPPlugin.h"
@implementation MPAutotypeEnvironment
+ (instancetype)environmentWithTargetApplication:(NSRunningApplication *)targetApplication entry:(KPKEntry *)entry {
return [[MPAutotypeEnvironment alloc] initWithTargetApplication:targetApplication entry:entry];
}
- (instancetype)initWithTargetApplication:(NSRunningApplication *)targetApplication entry:(KPKEntry *)entry {
self = [super init];
if(self) {
_preferredEntry = entry;
if(!targetApplication) {
_pid = -1;
_windowTitle = @"";
}
else {
NSDictionary *frontApplicationInfoDict = targetApplication.mp_infoDictionary;
_pid = [frontApplicationInfoDict[MPProcessIdentifierKey] intValue];
_windowTitle = frontApplicationInfoDict[MPWindowTitleKey];
/* if we have any resolvers, let them provide the window title */
NSArray *resolvers = [MPPluginHost.sharedHost windowTitleResolverForRunningApplication:targetApplication];
for(MPPlugin<MPAutotypeWindowTitleResolverPlugin> *resolver in resolvers) {
NSString *windowTitle = [resolver windowTitleForRunningApplication:targetApplication];
if(windowTitle.length > 0) {
_windowTitle = windowTitle;
break;
}
}
}
_hidden = NSRunningApplication.currentApplication.isHidden;
}
return self;
}
- (BOOL)isSelfTargeting {
return NSRunningApplication.currentApplication.processIdentifier == _pid;
}
- (NSDictionary *)_infoDictionaryForApplication:(NSRunningApplication *)application {
NSArray *currentWindows = CFBridgingRelease(CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID));
NSArray *windowNumbers = [NSWindow windowNumbersWithOptions:NSWindowNumberListAllApplications];
NSUInteger minZIndex = NSNotFound;
NSDictionary *infoDict = nil;
for(NSDictionary *windowDict in currentWindows) {
NSString *windowTitle = windowDict[(NSString *)kCGWindowName];
if(windowTitle.length <= 0) {
continue;
}
NSNumber *processId = windowDict[(NSString *)kCGWindowOwnerPID];
if(processId && [processId isEqualToNumber:@(application.processIdentifier)]) {
NSNumber *number = (NSNumber *)windowDict[(NSString *)kCGWindowNumber];
NSUInteger zIndex = [windowNumbers indexOfObject:number];
if(zIndex < minZIndex) {
minZIndex = zIndex;
infoDict = @{
MPWindowTitleKey: windowTitle,
MPProcessIdentifierKey : processId
};
}
}
}
if(currentWindows.count > 0 && infoDict.count == 0) {
// show some information about not being able to determine any windows
NSLog(@"Unable to retrieve any window names. If you encounter this issue you might be running 10.15 and MacPass has no permission for screen recording.");
}
return infoDict;
}
@end

View File

@@ -24,6 +24,12 @@
@interface MPContextButton : NSSegmentedControl
typedef NS_ENUM(NSUInteger, MPContextButtonSegment) {
MPContextButtonSegmentButton,
MPContextButtonSegmentContextButton,
MPContextButtonSegmentCount // do not use
};
@property (nonatomic, strong) NSMenu *contextMenu;
- (void)setImage:(NSImage *)image;

View File

@@ -53,14 +53,14 @@
self.focusRingType = NSFocusRingTypeNone;
self.segmentStyle = NSSegmentStyleTexturedSquare;
self.segmentCount = 2;
self.segmentCount = MPContextButtonSegmentCount;
cell.trackingMode = NSSegmentSwitchTrackingMomentary;
[cell setWidth:31 forSegment:0];
[cell setWidth:17 forSegment:1];
[cell setWidth:31 forSegment:MPContextButtonSegmentButton];
[cell setWidth:17 forSegment:MPContextButtonSegmentContextButton];
cell.trackingMode = NSSegmentSwitchTrackingMomentary;
NSImage *contextTriangle = [NSBundle.mainBundle imageForResource:@"contextTriangleTemplate"];
[self setImage:contextTriangle forSegment:1];
[self setImage:contextTriangle forSegment:MPContextButtonSegmentContextButton];
cell.contextMenuAction = @selector(showContextMenu:);
cell.contextMenuTarget = self;
@@ -76,42 +76,42 @@
Block the segment setter to prevent accidental settings
*/
- (void)setImage:(NSImage *)image forSegment:(NSInteger)segment {
if(segment < 2) {
if(segment < MPContextButtonSegmentCount) {
[super setImage:image forSegment:segment];
}
}
- (void)setSegmentCount:(NSInteger)count {
if(count == 2) {
if(count == MPContextButtonSegmentCount) {
super.segmentCount = count;
}
}
- (void)setImage:(NSImage *)image {
[self setImage:image forSegment:0];
[self setImage:image forSegment:MPContextButtonSegmentButton];
}
- (void)showContextMenu:(id)sender {
NSPoint point = self.frame.origin;
point.x = [self.cell widthForSegment:0];
point.x = [self.cell widthForSegment:MPContextButtonSegmentButton];
point.y = NSHeight(self.frame) + 3;
[_contextMenu popUpMenuPositioningItem:nil atLocation:point inView:self];
}
- (void)setControlSize:(NSControlSize)controlSize {
NSImageRep *rep = [[self imageForSegment:0] bestRepresentationForRect:NSMakeRect(0, 0, 100, 100) context:nil hints:nil];
NSImageRep *rep = [[self imageForSegment:MPContextButtonSegmentButton] bestRepresentationForRect:NSMakeRect(0, 0, 100, 100) context:nil hints:nil];
CGFloat scale = rep.size.width / rep.size.height;
switch (controlSize) {
case NSRegularControlSize:
[self imageForSegment:0].size = NSMakeSize(16 * scale, 16);
[self imageForSegment:MPContextButtonSegmentButton].size = NSMakeSize(16 * scale, 16);
break;
case NSSmallControlSize:
[self imageForSegment:0].size = NSMakeSize(14 * scale, 14);
[self imageForSegment:MPContextButtonSegmentButton].size = NSMakeSize(14 * scale, 14);
break;
case NSMiniControlSize:
[self imageForSegment:0].size = NSMakeSize(8 * scale, 8);
[self imageForSegment:MPContextButtonSegmentButton].size = NSMakeSize(8 * scale, 8);
default:
break;
@@ -123,4 +123,9 @@
return super.controlSize;
}
- (void)_updateContextButtonState {
BOOL hasContextMenu = (self.contextMenu != nil);
[self setEnabled:hasContextMenu forSegment:MPContextButtonSegmentContextButton];
}
@end

View File

@@ -115,7 +115,7 @@ typedef NS_ENUM(NSUInteger, MPDatePreset) {
default:
return; // Nothing to do;
}
self.datePicker.dateValue = [gregorian dateByAddingComponents:offsetComponents toDate:[NSDate date] options:0];
self.datePicker.dateValue = [gregorian dateByAddingComponents:offsetComponents toDate:NSDate.date options:0];
}
@end

View File

@@ -53,7 +53,7 @@ NSString *const MPDocumentHideEntryHistoryNotification = @"MPDocumentHideEntryH
- (void)revertEntry:(KPKEntry *)entry toEntry:(KPKEntry *)historyEntry {
[entry pushHistory];
[entry revertToEntry:historyEntry];
[self.undoManager setActionName:NSLocalizedString(@"RESTORE_HISTORY_ENTRY", "Action to restore and Entry to a previous state of it's history")];
[self.undoManager setActionName:NSLocalizedString(@"RESTORE_HISTORY_ENTRY", "Action to restore an Entry to its previous state of it's history")];
}
@end

View File

@@ -178,8 +178,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
if(!self.fileURL) {
return proposedExtension;
}
NSString *actualExtension = self.fileURL.pathExtension;
return actualExtension;
return self.fileURL.pathExtension;
}
- (NSData *)dataOfType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError {

View File

@@ -58,7 +58,8 @@
- (IBAction)exportAsXML:(id)sender;
- (IBAction)mergeWithOther:(id)sender;
- (IBAction)importFromXML:(id)sender;
- (IBAction)importFromPlugin:(id)sender;
- (IBAction)importWithPlugin:(id)sender;
- (IBAction)exportWithPlugin:(id)sender;
- (IBAction)lock:(id)sender;
- (IBAction)createGroup:(id)sender;

View File

@@ -122,6 +122,11 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
self.toolbar = [[NSToolbar alloc] initWithIdentifier:@"MainWindowToolbar"];
self.toolbar.autosavesConfiguration = YES;
self.toolbar.allowsUserCustomization = YES;
if (@available(macOS 10.14, *)) {
self.toolbar.centeredItemIdentifier = MPToolbarItemIdentifierSearch;
} else {
// to not do any magic here
}
self.toolbar.delegate = self.toolbarDelegate;
self.window.toolbar = self.toolbar;
self.toolbarDelegate.toolbar = self.toolbar;
@@ -279,12 +284,12 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
}];
}
- (void)importFromPlugin:(id)sender {
- (void)importWithPlugin:(id)sender {
if(![sender isKindOfClass:NSMenuItem.class]) {
return;
}
NSMenuItem *menuItem = sender;
if(![menuItem.representedObject isKindOfClass:NSDictionary.class]) {
if(![menuItem.representedObject isKindOfClass:NSString.class]) {
return;
}
@@ -292,12 +297,39 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
if(!sheetWindow) {
return;
}
MPPlugin<MPImportPlugin> *importPlugin;
NSString *bundleIdentifier = menuItem.representedObject;
MPPlugin<MPImportPlugin> *importPlugin = (MPPlugin<MPImportPlugin> *)[MPPluginHost.sharedHost pluginWithBundleIdentifier:bundleIdentifier];
NSOpenPanel *openPanel = NSOpenPanel.openPanel;
[importPlugin prepareOpenPanel:openPanel];
[openPanel beginSheetModalForWindow:sheetWindow completionHandler:^(NSModalResponse result) {
KPKTree *importedTree = [importPlugin treeForRunningOpenPanel:openPanel withResponse:result];
[self.document importTree:importedTree];
if(result == NSModalResponseOK) {
KPKTree *importedTree = [importPlugin treeForRunningOpenPanel:openPanel];
[self.document importTree:importedTree];
}
}];
}
- (void)exportWithPlugin:(id)sender {
if(![sender isKindOfClass:NSMenuItem.class]) {
return;
}
NSMenuItem *menuItem = sender;
if(![menuItem.representedObject isKindOfClass:NSString.class]) {
return;
}
NSWindow *sheetWindow = ((MPDocument *)self.document).windowForSheet;
if(!sheetWindow) {
return;
}
NSString *bundleIdentifier = menuItem.representedObject;
MPPlugin<MPExportPlugin> *exportPlugin = (MPPlugin<MPExportPlugin> *)[MPPluginHost.sharedHost pluginWithBundleIdentifier:bundleIdentifier];
NSSavePanel *savePanel = NSSavePanel.savePanel;
[exportPlugin prepareSavePanel:savePanel];
[savePanel beginSheetModalForWindow:sheetWindow completionHandler:^(NSModalResponse result) {
if(result == NSModalResponseOK) {
[exportPlugin exportTree:((MPDocument *)self.document).tree forRunningSavePanel:savePanel];
}
}];
}
@@ -464,7 +496,7 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
id<MPTargetNodeResolving> entryResolver = [NSApp targetForAction:@selector(currentTargetEntries)];
NSArray *entries = entryResolver.currentTargetEntries;
if(entries.count == 1) {
[[MPAutotypeDaemon defaultDaemon] performAutotypeForEntry:entries.firstObject];
[MPAutotypeDaemon.defaultDaemon performAutotypeForEntry:entries.firstObject];
}
}

View File

@@ -297,7 +297,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
switch([MPActionHelper typeForAction:menuItem.action]) {
case MPActionToggleQuicklook: {
BOOL enabled = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyEnableQuicklookPreview];
BOOL enabled = [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyEnableQuicklookPreview];
return enabled ? [self acceptsPreviewPanelControl:nil] : NO;
case MPActionRemoveAttachment:
return !self.representedEntry.isHistory;
@@ -323,16 +323,16 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
- (void)endPreviewPanelControl:(QLPreviewPanel *)panel {
MPTemporaryFileStorage *storage = (MPTemporaryFileStorage *)panel.dataSource;
[[MPTemporaryFileStorageCenter defaultCenter] unregisterStorage:storage];
[MPTemporaryFileStorageCenter.defaultCenter unregisterStorage:storage];
}
- (void)_updatePreviewItemForPanel:(QLPreviewPanel *)panel {
NSInteger row = [self.attachmentTableView selectedRow];
NSInteger row = self.attachmentTableView.selectedRow;
NSAssert(row > -1, @"Row needs to be selected");
KPKBinary *binary = self.representedEntry.binaries[row];
MPTemporaryFileStorage *oldStorage = (MPTemporaryFileStorage *)panel.dataSource;
[[MPTemporaryFileStorageCenter defaultCenter] unregisterStorage:oldStorage];
panel.dataSource = [[MPTemporaryFileStorageCenter defaultCenter] storageForBinary:binary];
[MPTemporaryFileStorageCenter.defaultCenter unregisterStorage:oldStorage];
panel.dataSource = [MPTemporaryFileStorageCenter.defaultCenter storageForBinary:binary];
}
#pragma mark -
@@ -557,6 +557,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
NSMenu *customFieldMenu = [[NSMenu alloc] initWithTitle:NSLocalizedString(@"ADD_CUSTOM_FIELD_CONTEXT_MENU", @"Menu displayed for adding special custom keys")];
customFieldMenu.delegate = _addCustomFieldContextMenuDelegate;
self.addCustomFieldButton.contextMenu = customFieldMenu;
[self.addCustomFieldButton setEnabled:NO forSegment:MPContextButtonSegmentContextButton];
}
#pragma mark -

View File

@@ -32,6 +32,7 @@
@property (strong) IBOutlet NSPopUpButton *idleTimeOutPopup;
@property (strong) IBOutlet NSButton *lockOnSleepCheckButton;
@property (strong) IBOutlet NSButton *lockOnLogoutCheckButton;
@property (strong) IBOutlet NSButton *lockOnScreenSleepCheckButton;
@property (strong) IBOutlet NSButton *reopenLastDatabase;
@property (strong) IBOutlet NSButton *enableAutosaveCheckButton;
@property (strong) IBOutlet NSButton *rememberKeyFileCheckButton;

View File

@@ -50,6 +50,7 @@
[self.preventUniversalClipboardSupportCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyPreventUniversalClipboard] options:nil];
[self.lockOnSleepCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyLockOnSleep] options:nil];
[self.lockOnLogoutCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingskeyLockOnLogout] options:nil];
[self.lockOnScreenSleepCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingskeyLockOnScreenSleep] options:nil];
[self.idleTimeOutPopup bind:NSSelectedTagBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyIdleLockTimeOut] options:nil];
[self.reopenLastDatabase bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyReopenLastDatabaseOnLaunch] options:nil];
[self.enableAutosaveCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyEnableAutosave] options:nil];

View File

@@ -28,6 +28,7 @@
@property (nonatomic,assign) BOOL lockOnSleep;
@property (nonatomic,assign) BOOL lockOnLogout;
@property (nonatomic,assign) BOOL lockOnScreenSleep;
@property (nonatomic,assign) NSUInteger idleLockTime;
@property (nonatomic,strong) id localEventHandler;
@property (nonatomic,strong) NSTimer *idleCheckTimer;
@@ -59,6 +60,7 @@ static MPLockDaemon *_sharedInstance;
[self bind:NSStringFromSelector(@selector(lockOnSleep)) toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyLockOnSleep] options:nil];
[self bind:NSStringFromSelector(@selector(idleLockTime)) toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyIdleLockTimeOut] options:nil];
[self bind:NSStringFromSelector(@selector(lockOnLogout)) toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingskeyLockOnLogout] options:nil];
[self bind:NSStringFromSelector(@selector(lockOnScreenSleep)) toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingskeyLockOnScreenSleep] options:nil];
}
return self;
}
@@ -95,6 +97,18 @@ static MPLockDaemon *_sharedInstance;
}
}
- (void)setLockOnScreenSleep:(BOOL)lockOnScreenSleep {
if(_lockOnScreenSleep != lockOnScreenSleep) {
_lockOnScreenSleep = lockOnScreenSleep;
if(_lockOnScreenSleep) {
[NSWorkspace.sharedWorkspace.notificationCenter addObserver:self selector:@selector(_willScreenSleepNotification:) name:NSWorkspaceScreensDidSleepNotification object:nil];
}
else {
[NSWorkspace.sharedWorkspace.notificationCenter removeObserver:self name:NSWorkspaceScreensDidSleepNotification object:nil];
}
}
}
- (void)setIdleLockTime:(NSUInteger)idleLockTime {
if(_idleLockTime != idleLockTime) {
_idleLockTime = idleLockTime;
@@ -113,6 +127,9 @@ static MPLockDaemon *_sharedInstance;
- (void)_willSleepNotification:(NSNotification *)notification {
[((MPAppDelegate *)NSApp.delegate) lockAllDocuments];
}
- (void)_willScreenSleepNotification:(NSNotification *)notification {
[((MPAppDelegate *)NSApp.delegate) lockAllDocuments];
}
- (void)_checkIdleTime:(NSTimer *)timer {
if(timer != self.idleCheckTimer) {

View File

@@ -60,10 +60,14 @@
self.window.alphaValue = 0;
self.window.opaque = NO;
self.window.hasShadow = YES;
self.window.backgroundColor = NSColor.clearColor;
self.textField.cell.backgroundStyle = NSBackgroundStyleLowered;
self.imageView.cell.backgroundStyle = NSBackgroundStyleDark;
self.imageView.cell.backgroundStyle = NSBackgroundStyleEmphasized;
((NSImageCell *)self.imageView.cell).imageAlignment = NSImageAlignCenter;
if (@available(macOS 10.14, *)) {
self.imageView.contentTintColor = NSColor.textColor;
}
}
- (void)displayOverlayImage:(NSImage *)imageOrNil label:(NSString *)labelOrNil atView:(NSView *)view {

View File

@@ -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(@"WARNING_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(@"WARNING_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

View File

@@ -71,7 +71,7 @@ NSString *const MPPasteBoardControllerDidClearClipboard = @"com.hicknhack.macpas
- (void)stashObjects {
self.stashedObjects = [NSMutableArray array];
for (NSPasteboardItem *item in NSPasteboard.generalPasteboard.pasteboardItems) {
for(NSPasteboardItem *item in NSPasteboard.generalPasteboard.pasteboardItems) {
NSPasteboardItem *newItem = [[NSPasteboardItem alloc] init];
for (NSString *type in item.types) {
/* mutable copy to ensure actual deep copy */
@@ -85,7 +85,7 @@ NSString *const MPPasteBoardControllerDidClearClipboard = @"com.hicknhack.macpas
}
- (void)restoreObjects {
if (self.stashedObjects) {
if(self.stashedObjects) {
[NSPasteboard.generalPasteboard clearContents];
[NSPasteboard.generalPasteboard writeObjects:self.stashedObjects];
self.stashedObjects = nil;

17
MacPass/MPPathCell.h Normal file
View File

@@ -0,0 +1,17 @@
//
// MPPathCell.h
// MacPass
//
// Created by Michael Starke on 14.01.20.
// Copyright © 2020 HicknHack Software GmbH. All rights reserved.
//
#import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
@interface MPPathCell : NSPathCell
@end
NS_ASSUME_NONNULL_END

23
MacPass/MPPathCell.m Normal file
View File

@@ -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

View File

@@ -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 <AppKit/AppKit.h>
#import "MPPathControl.h"
NS_ASSUME_NONNULL_BEGIN
@interface MPPathControl ()
- (void)_postDidSetURLNotification;
@end
NS_ASSUME_NONNULL_END

View File

@@ -10,6 +10,8 @@
NS_ASSUME_NONNULL_BEGIN
APPKIT_EXTERN NSString *const MPPathControlDidSetURLNotification;
@interface MPPathControl : NSPathControl <NSPathControlDelegate>
- (IBAction)showOpenPanel:(id _Nullable)sender;

View File

@@ -7,9 +7,18 @@
//
#import "MPPathControl.h"
#import "MPPathControl+Private.h"
#import "MPPathCell.h"
NSString *const MPPathControlDidSetURLNotification = @"MPPathControlDidSetURLNotification";
@implementation MPPathControl
+ (Class)cellClass{
return MPPathCell.class;
}
- (BOOL)canBecomeKeyView {
return YES;
}
@@ -25,15 +34,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];
@@ -47,10 +67,11 @@
if([self.delegate respondsToSelector:@selector(pathControl:willDisplayOpenPanel:)]) {
[self.delegate pathControl:self willDisplayOpenPanel:panel];
}
NSModalResponse result = [panel runModal];
if(result == NSModalResponseOK) {
self.URL = panel.URLs.firstObject;
}
[panel beginWithCompletionHandler:^(NSModalResponse result) {
if(result == NSModalResponseOK) {
self.URL = panel.URLs.firstObject;
}
}];
}
- (void)pathControl:(NSPathControl *)pathControl willPopUpMenu:(NSMenu *)menu {
@@ -58,7 +79,7 @@
return;
}
if(@available(macOS 10.11, *)) {
NSLog(@"Skipping 10.10 pathControl:willPopUpMenu");
// skip
}
else {
if(!self.URL) {
@@ -77,4 +98,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

View File

@@ -139,12 +139,45 @@ FOUNDATION_EXPORT NSString *const MPPluginDescriptionInfoDictionaryKey;
For example, if a CVS import might need user input on how to handle the parsed files this is the place to show it.
@param panel The open panel used for selecting what file(s) to import
@param response The response for of the user for running the panel
@return The KPKTree constructed from the selected input file(s)
*/
- (KPKTree *)treeForRunningOpenPanel:(NSOpenPanel *)panel withResponse:(NSModalResponse)response;
- (nullable KPKTree *)treeForRunningOpenPanel:(NSOpenPanel *)panel;
@end
@protocol MPExportPlugin <NSObject>
@required
/**
Called by the host to update a menu item for exporting.
You are supposed to update the title to something meaningfull.
Target and action will get set by host, so do not rely on them
@param item MenuItem that will be used to export via the plugin
*/
- (void)prepareExportMenuItem:(NSMenuItem *)item;
/**
Called by the host when an export is about to happen.
Update the panel to work for all the files and formats you can export
@param panel The panel used to select the export destination
*/
- (void)prepareSavePanel:(NSSavePanel *)panel;
/**
This will get called when the save panel is closed by the user.
You should retrieve any results from the panel and act accordingly.
If you need custom UI in the process, you can show them here.
For example, if a CSV export might need user input to configure its output this is the place to show it.
@param tree The current tree to be exported
@param panel The save panel that was used to specify the export destination
*/
- (void)exportTree:(KPKTree *)tree forRunningSavePanel:(NSSavePanel *)panel;
@end
#pragma mark Deprecated
@interface MPPlugin (Deprecated)

View File

@@ -32,6 +32,7 @@ FOUNDATION_EXPORT NSString *const MPPluginHostPluginBundleIdentifiyerKey;
@class MPPlugin;
@class KPKEntry;
@protocol MPImportPlugin;
@protocol MPExportPlugin;
@protocol MPAutotypeWindowTitleResolverPlugin;
@interface MPPluginHost : NSObject
@@ -53,9 +54,10 @@ FOUNDATION_EXPORT NSString *const MPPluginHostPluginBundleIdentifiyerKey;
- (NSArray *)avilableMenuItemsForEntries:(NSArray <KPKEntry *>*)entries;
@end
@interface MPPluginHost (MPImportPluginSupport)
@interface MPPluginHost (MPImportExportPluginSupport)
@property (readonly, copy) NSArray <MPPlugin<MPImportPlugin> __kindof*> *importPlugins;
@property (readonly, copy) NSArray <MPPlugin<MPExportPlugin> __kindof*> *exportPlugins;
@end

View File

@@ -459,11 +459,14 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
NSString *const MPPluginBundleIdentifierKey = @"MPPluginBundleIdentifierKey";
NSString *const MPImportPluginUTIKey = @"MPImportPluginUTIKey";
@implementation MPPluginHost (MPImportPluginSupport)
@implementation MPPluginHost (MPImportExportPluginSupport)
- (NSArray<MPPlugin *> *)importPlugins {
return [self _pluginsConformingToProtocoll:@protocol(MPImportPlugin)];
}
- (NSArray<MPPlugin<MPImportPlugin> *> *)exportPlugins {
return [self _pluginsConformingToProtocoll:@protocol(MPExportPlugin)];
}
@end

View File

@@ -13,6 +13,7 @@
#import "MPPluginRepositoryItem.h"
#import "MPPluginVersionComparator.h"
#import "MPPluginStatusTableCellView.h"
#import "MPSettingsHelper.h"
typedef NS_ENUM(NSUInteger, MPPluginTableColumn) {
@@ -39,7 +40,13 @@ typedef NS_ENUM(NSUInteger, MPPluginTableColumn) {
- (void)viewDidLoad {
[super viewDidLoad];
self.downloadedItems = [[NSMutableSet alloc] init];
[self.updatedAtTextField bind:NSValueBinding toObject:MPPluginRepository.defaultRepository withKeyPath:NSStringFromSelector(@selector(updatedAt)) options:nil];
BOOL allowRemoteData = [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyAllowRemoteFetchOfPluginRepository];
if(allowRemoteData) {
[self.updatedAtTextField bind:NSValueBinding toObject:MPPluginRepository.defaultRepository withKeyPath:NSStringFromSelector(@selector(updatedAt)) options:nil];
}
else {
self.updatedAtTextField.stringValue = NSLocalizedString(@"REPOSITORY_UPDATED_AT_LOCAL", @"Updated at text when the local plugin defintino is used");
}
[self _refreshRepository];
}

View File

@@ -53,7 +53,7 @@
[menu addItemWithTitle:NSLocalizedString(@"URL","URL reference item") action:NULL keyEquivalent:@""];
[menu addItemWithTitle:NSLocalizedString(@"NOTES","Notes reference item") action:NULL keyEquivalent:@""];
if(allowCustomAttributes) {
[menu addItemWithTitle:NSLocalizedString(@"CUSTOM_ATTRIBUTE","Curstom attribute reference item") action:NULL keyEquivalent:@""];
[menu addItemWithTitle:NSLocalizedString(@"CUSTOM_ATTRIBUTE","Custom attribute reference item") action:NULL keyEquivalent:@""];
}
NSArray *keys = @[ kKPKReferenceUUIDKey, kKPKReferenceTitleKey, kKPKReferenceUsernameKey, kKPKReferencePasswordKey, kKPKReferenceURLKey, kKPKReferenceNotesKey, @"S" ];
[menu.itemArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

View File

@@ -42,6 +42,7 @@ APPKIT_EXTERN NSString *const kMPSettingsKeyBrowserBundleId;
APPKIT_EXTERN NSString *const kMPSettingsKeyLockOnSleep;
APPKIT_EXTERN NSString *const kMPSettingskeyLockOnLogout;
APPKIT_EXTERN NSString *const kMPSettingsKeyIdleLockTimeOut;
APPKIT_EXTERN NSString *const kMPSettingskeyLockOnScreenSleep;
/* Autosaving states */
APPKIT_EXTERN NSString *const kMPSettingsKeyShowInspector;

View File

@@ -37,6 +37,7 @@ NSString *const kMPSettingsKeyFileChangeStrategy = @"FileCh
NSString *const kMPSettingsKeyEnableAutosave = @"EnableAutosave";
NSString *const kMPSettingsKeyLockOnSleep = @"LockOnSleep";
NSString *const kMPSettingskeyLockOnLogout = @"LockOnLogout";
NSString *const kMPSettingskeyLockOnScreenSleep = @"LockOnScreenSleep";
NSString *const kMPSettingsKeyIdleLockTimeOut = @"IdleLockTimeOut";
NSString *const kMPSettingsKeyShowInspector = @"ShowInspector";
NSString *const kMPSettingsKeyEntryTableSortDescriptors = @"EntryTableSortDescriptors";
@@ -102,7 +103,7 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
@implementation MPSettingsHelper
+ (void)setupDefaults {
[[NSUserDefaults standardUserDefaults] registerDefaults:[self _standardDefaults]];
[NSUserDefaults.standardUserDefaults registerDefaults:[self _standardDefaults]];
}
+ (void)migrateDefaults {
@@ -125,23 +126,24 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
standardDefaults = @{
kMPSettingsKeyShowInspector: @YES, // Show the Inspector by default
kMPSettingsKeyPasteboardClearTimeout: @30, // 30 seconds
kMPSettingsKeyClearPasteboardOnQuit: @YES,
kMPSettingsKeyClearPasteboardOnQuit: @YES, // Clear Clipboard on quit
kMPSettingsKeyPreventUniversalClipboard: @YES, // Disable Universal Clipboard by default
kMPSettingsKeyOpenEmptyDatabaseOnLaunch: @NO,
kMPSettingsKeyReopenLastDatabaseOnLaunch: @YES,
kMPSettingsKeyFileChangeStrategy: @(MPFileChangeStrategyAsk), // Ask what to do on a file change!
kMPSettingsKeyLockOnSleep: @YES,
kMPSettingskeyLockOnLogout: @NO,
kMPSettingsKeyIdleLockTimeOut: @0, // 5 minutes
kMPSettingskeyLockOnScreenSleep: @NO,
kMPSettingsKeyIdleLockTimeOut: @0, // Do not lock while idle by default
kMPSettingsKeyLegacyHideNotes: @NO,
kMPSettingsKeyLegacyHidePassword: @YES,
kMPSettingsKeyLegacyHideTitle: @NO,
kMPSettingsKeyLegacyHideURL: @NO,
kMPSettingsKeyLegacyHideUsername: @NO,
kMPSettingsKeyRememberKeyFilesForDatabases: @NO,
kMPSettingsKeySendCommandForControlKey: @YES,
kMPSettingsKeyEnableGlobalAutotype: @NO,
kMPSettingsKeyGlobalAutotypeKeyDataKey: DDHotKey.defaultHotKeyData,
kMPSettingsKeySendCommandForControlKey: @YES, // translate Ctrl to Cmd by default
kMPSettingsKeyEnableGlobalAutotype: @NO, // Keep global autotype disabled by default
kMPSettingsKeyGlobalAutotypeKeyDataKey: DDHotKey.defaultHotKeyData, // Cmd + Alt + M
kMPSettingsKeyDefaultGlobalAutotypeSequence: @"{USERNAME}{TAB}{PASSWORD}{ENTER}",
kMPSettingsKeyAutotypeMatchTitle: @YES,
kMPSettingsKeyAutotypeMatchURL: @NO,
@@ -193,7 +195,7 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
+ (void)_removeDeprecatedValues {
/* Clear old style values */
for(NSString *key in [self _deprecatedSettingsKeys]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
[NSUserDefaults.standardUserDefaults removeObjectForKey:key];
}
}
@@ -206,7 +208,7 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
this was changed in 0.6. to parent.title
*/
NSData *descriptorData = [[NSUserDefaults standardUserDefaults] dataForKey:kMPSettingsKeyEntryTableSortDescriptors];
NSData *descriptorData = [NSUserDefaults.standardUserDefaults dataForKey:kMPSettingsKeyEntryTableSortDescriptors];
if(!descriptorData) {
return; // No user defaults
}
@@ -217,27 +219,35 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
if(descriptor.selector == @selector(compare:)
|| [descriptor.key isEqualToString:@"timeInfo.modificationDate"]
|| [descriptor.key isEqualToString:@"parent.name"] ) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:kMPSettingsKeyEntryTableSortDescriptors];
[NSUserDefaults.standardUserDefaults removeObjectForKey:kMPSettingsKeyEntryTableSortDescriptors];
break;
}
}
}
+ (void)_migrateURLDoubleClickPreferences {
/* Default was NO so if the key was not set, we also get NO, which is what we want */
BOOL openURL = [[NSUserDefaults standardUserDefaults] boolForKey:kMPDeprecatedSettingsKeyDoubleClickURLToLaunch];
if(NO == openURL) {
[[NSUserDefaults standardUserDefaults] setInteger:MPDoubleClickURLActionOpen forKey:kMPSettingsKeyDoubleClickURLAction];
/*
Default was NO so if the key was not set the correct action now should be MPDoubleClickURLActionCopy
But MPDoubleClickURLActionCopy is the default we cannot simply add this value.
Hence we chose to only migrate a changed default and let the "old" default silenty be updated
This is a worth trade-off since the other solution will always re-set the default
*/
if(nil == [NSUserDefaults.standardUserDefaults objectForKey:kMPDeprecatedSettingsKeyDoubleClickURLToLaunch]) {
return; // the value was not set, do nothing since we cannot determine what to do
}
/* only update the settings if the defaults return an explicit set value */
if([NSUserDefaults.standardUserDefaults boolForKey:kMPDeprecatedSettingsKeyDoubleClickURLToLaunch]) {
[NSUserDefaults.standardUserDefaults setInteger:MPDoubleClickURLActionOpen forKey:kMPSettingsKeyDoubleClickURLAction];
}
}
+ (void)_migrateEntrySearchFlags {
/* Entry filters are now stored as archivd search context not just flags */
NSInteger flags = [[NSUserDefaults standardUserDefaults] integerForKey:kMPDeprecatedSettingsKeyEntrySearchFilterMode];
/* Entry filters are now stored as archived search context not just flags */
NSInteger flags = [NSUserDefaults.standardUserDefaults integerForKey:kMPDeprecatedSettingsKeyEntrySearchFilterMode];
if(flags != 0) {
MPEntrySearchContext *context = [[MPEntrySearchContext alloc] initWithString:nil flags:flags];
NSData *contextData = [NSKeyedArchiver archivedDataWithRootObject:context];
[[NSUserDefaults standardUserDefaults] setObject:contextData forKey:kMPSettingsKeyEntrySearchFilterContext];
[NSUserDefaults.standardUserDefaults setObject:contextData forKey:kMPSettingsKeyEntrySearchFilterContext];
}
}
@@ -246,7 +256,7 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
Database file paths was stored as plain text in keyfile mapping.
We only need to store the key file url in plain text, thus hashing the path is sufficent
*/
NSDictionary<NSString *, NSString *> *currentMapping = [[NSUserDefaults standardUserDefaults] dictionaryForKey:kMPSettingsKeyRememeberdKeysForDatabases];
NSDictionary<NSString *, NSString *> *currentMapping = [NSUserDefaults.standardUserDefaults dictionaryForKey:kMPSettingsKeyRememeberdKeysForDatabases];
if(!currentMapping) {
return;
}
@@ -268,7 +278,7 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
}
}
if(didHash) {
[[NSUserDefaults standardUserDefaults] setObject:hashedDict forKey:kMPSettingsKeyRememeberdKeysForDatabases];
[NSUserDefaults.standardUserDefaults setObject:hashedDict forKey:kMPSettingsKeyRememeberdKeysForDatabases];
}
}

View File

@@ -41,7 +41,6 @@
self = [super init];
if(self) {
_binary = binary;
_loadScheduled = NO;
[MPTemporaryFileStorageCenter.defaultCenter registerStorage:self];
}
return self;
@@ -64,17 +63,8 @@
#pragma mark QLPreviewPanelDataSource
- (id<QLPreviewItem>)previewPanel:(QLPreviewPanel *)panel previewItemAtIndex:(NSInteger)index {
if(!self.temporaryFileURL && !self.loadScheduled) {
self.loadScheduled = YES;
dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(defaultQueue, ^{
BOOL success = [self _saveBinary:self.binary];
if(success){
dispatch_async(dispatch_get_main_queue(), ^{
[panel refreshCurrentPreviewItem];
});
}
});
if(!self.temporaryFileURL) {
[self _saveBinary:self.binary];
}
return self;
}
@@ -98,11 +88,22 @@
#pragma mark Private
- (BOOL)_saveBinary:(KPKBinary *)binary {
if(!binary || !binary.data || !binary.name || [binary.name length] == 0) {
if(!binary || !binary.data || !binary.name || binary.name.length == 0) {
return NO;
}
NSString *fileName = [NSString stringWithFormat:@"%@_%@", NSProcessInfo.processInfo.globallyUniqueString, binary.name];
self.temporaryFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:fileName]];
NSURL *userDesktop = [NSFileManager.defaultManager URLsForDirectory:NSDesktopDirectory inDomains:NSUserDomainMask].firstObject;
if(!userDesktop) {
return NO;
}
NSError *error;
NSURL *tempURL = [NSFileManager.defaultManager URLForDirectory:NSItemReplacementDirectory inDomain:NSUserDomainMask appropriateForURL:userDesktop create:YES error:&error];
if(!tempURL) {
NSLog(@"Unable to create temporary directory for file preview: %@", error.description);
return NO;
}
self.temporaryFileURL = [tempURL URLByAppendingPathComponent:fileName isDirectory:NO];
BOOL success = [binary.data writeToURL:self.temporaryFileURL options:0 error:0];
if(!success) {
@@ -131,7 +132,9 @@
}
+ (void)_runCleanupForPath:(NSString *)path {
NSTask *task = [[NSTask alloc] init];
NSTask *task = [[NSTask alloc] init];
// FIXME: Remove when moving to 10.12 as deploy target
NSURL *srmURL = [NSURL fileURLWithPath:@"/usr/bin/srm"];
NSURL *rmURL = [NSURL fileURLWithPath:@"/bin/rm"];

View File

@@ -22,6 +22,18 @@
#import <AppKit/AppKit.h>
APPKIT_EXTERN NSString *const MPToolbarItemIdentifierLock;
APPKIT_EXTERN NSString *const MPToolbarItemIdentifierAddGroup;
APPKIT_EXTERN NSString *const MPToolbarItemIdentifierAddEntry;
APPKIT_EXTERN NSString *const MPToolbarItemIdentifierDelete;
APPKIT_EXTERN NSString *const MPToolbarItemIdentifierAction;
APPKIT_EXTERN NSString *const MPToolbarItemIdentifierInspector;
APPKIT_EXTERN NSString *const MPToolbarItemIdentifierSearch;
APPKIT_EXTERN NSString *const MPToolbarItemIdentifierCopyUsername;
APPKIT_EXTERN NSString *const MPToolbarItemIdentifierCopyPassword;
APPKIT_EXTERN NSString *const MPToolbarItemIdentifierHistory;
APPKIT_EXTERN NSString *const MPToolbarItemIdentifierAutotype;
@class MPDocument;
@interface MPToolbarDelegate : NSObject <NSToolbarDelegate, NSTextFieldDelegate>

View File

@@ -38,17 +38,17 @@
#import "NSApplication+MPAdditions.h"
#import "MPAppDelegate.h"
NSString *const MPToolbarItemLock = @"TOOLBAR_LOCK";
NSString *const MPToolbarItemAddGroup = @"TOOLBAR_ADD_GROUP";
NSString *const MPToolbarItemAddEntry = @"TOOLBAR_ADD_ENTRY";
NSString *const MPToolbarItemDelete =@"TOOLBAR_DELETE";
NSString *const MPToolbarItemAction = @"TOOLBAR_ACTION";
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";
NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
NSString *const MPToolbarItemIdentifierLock = @"TOOLBAR_LOCK";
NSString *const MPToolbarItemIdentifierAddGroup = @"TOOLBAR_ADD_GROUP";
NSString *const MPToolbarItemIdentifierAddEntry = @"TOOLBAR_ADD_ENTRY";
NSString *const MPToolbarItemIdentifierDelete = @"TOOLBAR_DELETE";
NSString *const MPToolbarItemIdentifierAction = @"TOOLBAR_ACTION";
NSString *const MPToolbarItemIdentifierInspector = @"TOOLBAR_INSPECTOR";
NSString *const MPToolbarItemIdentifierSearch = @"TOOLBAR_SEARCH";
NSString *const MPToolbarItemIdentifierCopyUsername = @"TOOLBAR_COPY_USERNAME";
NSString *const MPToolbarItemIdentifierCopyPassword = @"TOOLBAR_COPY_PASSWORD";
NSString *const MPToolbarItemIdentifierHistory = @"TOOLBAR_HISTORY";
NSString *const MPToolbarItemIdentifierAutotype = @"TOOLBAR_AUTOTYPE";
@interface MPToolbarDelegate() {
MPAddEntryContextMenuDelegate *_addEntryMenuDelegate;
@@ -72,27 +72,28 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
if (self) {
_didShowToolbarForSearch = NO;
_didAddSearchfieldForSearch = NO;
_toolbarIdentifiers = @[ MPToolbarItemAddEntry,
MPToolbarItemDelete,
MPToolbarItemAddGroup,
MPToolbarItemAction,
MPToolbarItemCopyPassword,
MPToolbarItemCopyUsername,
_toolbarIdentifiers = @[ MPToolbarItemIdentifierAddEntry,
MPToolbarItemIdentifierDelete,
MPToolbarItemIdentifierAddGroup,
MPToolbarItemIdentifierAction,
MPToolbarItemIdentifierCopyPassword,
MPToolbarItemIdentifierCopyUsername,
NSToolbarFlexibleSpaceItemIdentifier,
MPToolbarItemSearch,
MPToolbarItemLock,
MPToolbarItemInspector,
MPToolbarItemHistory,
MPToolbarItemAutotype ];
_defaultToolbarIdentifiers = @[ MPToolbarItemAddEntry,
MPToolbarItemDelete,
MPToolbarItemAddGroup,
MPToolbarItemAutotype,
MPToolbarItemAction,
MPToolbarItemIdentifierSearch,
MPToolbarItemIdentifierLock,
MPToolbarItemIdentifierInspector,
MPToolbarItemIdentifierHistory,
MPToolbarItemIdentifierAutotype ];
_defaultToolbarIdentifiers = @[ MPToolbarItemIdentifierAddEntry,
MPToolbarItemIdentifierDelete,
MPToolbarItemIdentifierAddGroup,
MPToolbarItemIdentifierAutotype,
MPToolbarItemIdentifierAction,
NSToolbarFlexibleSpaceItemIdentifier,
MPToolbarItemSearch,
MPToolbarItemLock,
MPToolbarItemInspector ];
MPToolbarItemIdentifierSearch,
NSToolbarFlexibleSpaceItemIdentifier,
MPToolbarItemIdentifierLock,
MPToolbarItemIdentifierInspector ];
_toolbarImages = [self createToolbarImages];
_toolbarItems = [[NSMutableDictionary alloc] initWithCapacity:[self.toolbarIdentifiers count]];
_addEntryMenuDelegate = [[MPAddEntryContextMenuDelegate alloc] init];
@@ -113,7 +114,7 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
item.label = itemLabel;
item.paletteLabel = itemLabel;
if([itemIdentifier isEqualToString:MPToolbarItemAction]) {
if([itemIdentifier isEqualToString:MPToolbarItemIdentifierAction]) {
NSPopUpButton *popupButton = [[NSPopUpButton alloc] initWithFrame:NSMakeRect(0, 0, 50, 32) pullsDown:YES];
popupButton.bezelStyle = NSTexturedRoundedBezelStyle;
popupButton.focusRingType = NSFocusRingTypeNone;
@@ -126,7 +127,7 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
NSMenu *menu = [[NSMenu alloc] init];
NSMenuItem *actionImageItem = [[NSMenuItem alloc] initWithTitle:@"" action:NULL keyEquivalent:@""];
actionImageItem.image = self.toolbarImages[MPToolbarItemAction];
actionImageItem.image = self.toolbarImages[MPToolbarItemIdentifierAction];
[menu addItem:actionImageItem];
NSArray *menuItems = [MPContextMenuHelper contextMenuItemsWithItems:MPContextMenuExtended|MPContextMenuShowGroupInOutline];
for(NSMenuItem *item in menuItems) {
@@ -143,7 +144,7 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
item.menuFormRepresentation = menuRepresentation;
item.view = popupButton;
}
else if( [itemIdentifier isEqualToString:MPToolbarItemAddEntry]) {
else if( [itemIdentifier isEqualToString:MPToolbarItemIdentifierAddEntry]) {
MPContextButton *button = [[MPContextButton alloc] initWithFrame:NSMakeRect(0, 0, 32, 32)];
button.action = [self _actionForToolbarItemIdentifier:itemIdentifier];
NSImage *image = self.toolbarImages[itemIdentifier];
@@ -168,7 +169,7 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
item.menuFormRepresentation = menuRepresentation;
}
else if( [itemIdentifier isEqualToString:MPToolbarItemSearch]){
else if( [itemIdentifier isEqualToString:MPToolbarItemIdentifierSearch]){
NSSearchField *searchField = [[NSSearchField alloc] init];
searchField.action = @selector(updateSearch:);
NSSearchFieldCell *cell = searchField.cell;
@@ -178,9 +179,10 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
item.view = searchField;
/* Use default size base on documentation */
item.minSize = NSMakeSize(140, 32);
item.maxSize = NSMakeSize(240, 32);
item.maxSize = NSMakeSize(400, 32);
NSMenu *templateMenu = [self _allocateSearchMenuTemplate];
searchField.searchMenuTemplate = templateMenu;
searchField.placeholderString = NSLocalizedString(@"SEARCH_EVERYWHERE", @"Placeholder string displayed in the search field in the toolbar");
/* 10.10 does not support NSSearchFieldDelegate */
((NSTextField *)searchField).delegate = self;
self.searchField = searchField;
@@ -216,16 +218,16 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
}
- (NSDictionary *)createToolbarImages {
NSDictionary *imageDict = @{ MPToolbarItemLock: [NSImage imageNamed:NSImageNameLockLockedTemplate],
MPToolbarItemAddEntry: [MPIconHelper icon:MPIconAddEntry],
MPToolbarItemAddGroup: [MPIconHelper icon:MPIconAddFolder],
MPToolbarItemCopyUsername : [MPIconHelper icon:MPIconIdentity],
MPToolbarItemCopyPassword : [MPIconHelper icon:MPIconPassword],
MPToolbarItemDelete: [MPIconHelper icon:MPIconTrash],
MPToolbarItemAction: [NSImage imageNamed:NSImageNameActionTemplate],
MPToolbarItemInspector: [MPIconHelper icon:MPIconInfo],
MPToolbarItemHistory: [MPIconHelper icon:MPIconHistory],
MPToolbarItemAutotype : [MPIconHelper icon:MPIconKeyboard]
NSDictionary *imageDict = @{ MPToolbarItemIdentifierLock: [NSImage imageNamed:NSImageNameLockLockedTemplate],
MPToolbarItemIdentifierAddEntry: [MPIconHelper icon:MPIconAddEntry],
MPToolbarItemIdentifierAddGroup: [MPIconHelper icon:MPIconAddFolder],
MPToolbarItemIdentifierCopyUsername : [MPIconHelper icon:MPIconIdentity],
MPToolbarItemIdentifierCopyPassword : [MPIconHelper icon:MPIconPassword],
MPToolbarItemIdentifierDelete: [MPIconHelper icon:MPIconTrash],
MPToolbarItemIdentifierAction: [NSImage imageNamed:NSImageNameActionTemplate],
MPToolbarItemIdentifierInspector: [MPIconHelper icon:MPIconInfo],
MPToolbarItemIdentifierHistory: [MPIconHelper icon:MPIconHistory],
MPToolbarItemIdentifierAutotype : [MPIconHelper icon:MPIconKeyboard]
};
return imageDict;
}
@@ -238,12 +240,20 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
#pragma mark - NSSearchFieldDelegate
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {
if(control != self.searchField) {
return NO;
}
if(commandSelector == @selector(insertNewline:) || commandSelector == @selector(moveDown:)) {
/* Dispatch the focus loss since doing it now will break recent search storage */
dispatch_async(dispatch_get_main_queue(), ^{
[[NSApp targetForAction:@selector(focusEntries:) to:nil from:self] focusEntries:self];
});
}
if(commandSelector == @selector(cancelOperation:) ) {
dispatch_async(dispatch_get_main_queue(), ^{
[[NSApp targetForAction:@selector(exitSearch:) to:nil from:self] exitSearch:nil];
});
}
return NO;
}
@@ -252,17 +262,17 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
static NSDictionary *labelDict;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
labelDict = @{ MPToolbarItemLock: NSLocalizedString(@"LOCK", @"Toolbar item to Lock the database"),
MPToolbarItemAction: NSLocalizedString(@"ACTION", @"Toolbar item with action menu"),
MPToolbarItemAddEntry: NSLocalizedString(@"NEW_ENTRY", @"Toolbar item new entry"),
MPToolbarItemAddGroup: NSLocalizedString(@"NEW_GROUP", @"Toolbar item new group"),
MPToolbarItemCopyPassword: NSLocalizedString(@"COPY_PASSWORD", @"Toolbar item copy password"),
MPToolbarItemCopyUsername: NSLocalizedString(@"COPY_USERNAME", @"Toolbar item copy username"),
MPToolbarItemDelete: NSLocalizedString(@"DELETE", @"Toolbar item delete item"),
MPToolbarItemInspector: NSLocalizedString(@"INSPECTOR", @"Toolbar item toggle inspector"),
MPToolbarItemSearch: NSLocalizedString(@"SEARCH", @"Search input in Toolbar "),
MPToolbarItemHistory: NSLocalizedString(@"SHOW_HISTORY", @"Toolbar item to toggle history display"),
MPToolbarItemAutotype: NSLocalizedString(@"TOOLBAR_PERFORM_AUTOTYPE_FOR_ENTRY", @"Toolbar item to perform autotype")
labelDict = @{ MPToolbarItemIdentifierLock: NSLocalizedString(@"LOCK", @"Toolbar item to Lock the database"),
MPToolbarItemIdentifierAction: NSLocalizedString(@"ACTION", @"Toolbar item with action menu"),
MPToolbarItemIdentifierAddEntry: NSLocalizedString(@"NEW_ENTRY", @"Toolbar item new entry"),
MPToolbarItemIdentifierAddGroup: NSLocalizedString(@"NEW_GROUP", @"Toolbar item new group"),
MPToolbarItemIdentifierCopyPassword: NSLocalizedString(@"COPY_PASSWORD", @"Toolbar item copy password"),
MPToolbarItemIdentifierCopyUsername: NSLocalizedString(@"COPY_USERNAME", @"Toolbar item copy username"),
MPToolbarItemIdentifierDelete: NSLocalizedString(@"DELETE", @"Toolbar item delete item"),
MPToolbarItemIdentifierInspector: NSLocalizedString(@"INSPECTOR", @"Toolbar item toggle inspector"),
MPToolbarItemIdentifierSearch: NSLocalizedString(@"SEARCH", @"Search input in Toolbar "),
MPToolbarItemIdentifierHistory: NSLocalizedString(@"SHOW_HISTORY", @"Toolbar item to toggle history display"),
MPToolbarItemIdentifierAutotype: NSLocalizedString(@"TOOLBAR_PERFORM_AUTOTYPE_FOR_ENTRY", @"Toolbar item to perform autotype")
};
});
return labelDict[identifier];
@@ -272,15 +282,15 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
static NSDictionary *actionDict;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
actionDict = @{ MPToolbarItemLock: @(MPActionLock),
MPToolbarItemAddEntry: @(MPActionAddEntry),
MPToolbarItemAddGroup: @(MPActionAddGroup),
MPToolbarItemDelete: @(MPActionDelete),
MPToolbarItemCopyPassword: @(MPActionCopyPassword),
MPToolbarItemCopyUsername: @(MPActionCopyUsername),
MPToolbarItemInspector: @(MPActionToggleInspector),
MPToolbarItemHistory: @(MPActionShowEntryHistory),
MPToolbarItemAutotype: @(MPActionPerformAutotypeForSelectedEntry)
actionDict = @{ MPToolbarItemIdentifierLock: @(MPActionLock),
MPToolbarItemIdentifierAddEntry: @(MPActionAddEntry),
MPToolbarItemIdentifierAddGroup: @(MPActionAddGroup),
MPToolbarItemIdentifierDelete: @(MPActionDelete),
MPToolbarItemIdentifierCopyPassword: @(MPActionCopyPassword),
MPToolbarItemIdentifierCopyUsername: @(MPActionCopyUsername),
MPToolbarItemIdentifierInspector: @(MPActionToggleInspector),
MPToolbarItemIdentifierHistory: @(MPActionShowEntryHistory),
MPToolbarItemIdentifierAutotype: @(MPActionPerformAutotypeForSelectedEntry)
};
});
MPActionType actionType = (MPActionType)[actionDict[identifier] integerValue];
@@ -313,9 +323,9 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
- (void)_didEnterSearch:(NSNotification *)notification {
/* We enter search. If there is no Item to search in the toolbar, we need to add it */
NSArray *currentItems = self.toolbar.items;
NSToolbarItem *searchItem = self.toolbarItems[MPToolbarItemSearch];
NSToolbarItem *searchItem = self.toolbarItems[MPToolbarItemIdentifierSearch];
if(!searchItem || ![currentItems containsObject:searchItem]) {
[self.toolbar insertItemWithItemIdentifier:MPToolbarItemSearch atIndex:[currentItems count]];
[self.toolbar insertItemWithItemIdentifier:MPToolbarItemIdentifierSearch atIndex:[currentItems count]];
_didAddSearchfieldForSearch = YES;
}
/* Then we should make sure the toolbar is visible. Just to make life easier */
@@ -335,14 +345,14 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
}
- (void)_didExitSearch:(NSNotification *)notification {
[self.searchField setStringValue:@""];
self.searchField.stringValue = @"";
NSWindow *window = [self.searchField window];
/* Resign first responder form search field only if it was the first responder */
if(window.firstResponder == [self.searchField currentEditor]) {
[window makeFirstResponder:nil];
}
if(_didAddSearchfieldForSearch) {
NSToolbarItem *searchItem = self.toolbarItems[MPToolbarItemSearch];
NSToolbarItem *searchItem = self.toolbarItems[MPToolbarItemIdentifierSearch];
NSUInteger index = [self.toolbar.items indexOfObject:searchItem];
if(index != NSNotFound) {
[self.toolbar removeItemAtIndex:index];

View File

@@ -21,7 +21,7 @@
//
#import "MPValueTransformerHelper.h"
#import "NSValueTransformer+TransformerKit.h"
#import <TransformerKit/NSValueTransformer+TransformerKit.h>
NSString *const MPStripLineBreaksTransformerName = @"com.hicknhack.macpass.MPStripLineBreaksTransformerName";
NSString *const MPExpiryDateValueTransformerName = @"com.hicknhack.macpass.MPExpiryDateValueTransformer";

View File

@@ -7,6 +7,7 @@
//
#import "MPWelcomeViewController.h"
#import "MPConstants.h"
@interface MPWelcomeViewController ()
@@ -26,17 +27,32 @@
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return NSDocumentController.sharedDocumentController.recentDocumentURLs.count;
return MAX(1, NSDocumentController.sharedDocumentController.recentDocumentURLs.count);
}
- (nullable NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row {
NSTableCellView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self];
NSURL *url = NSDocumentController.sharedDocumentController.recentDocumentURLs[row];
view.textField.stringValue = url.lastPathComponent;
view.imageView.image = [NSWorkspace.sharedWorkspace iconForFile:url.path];
NSArray<NSURL *> *recentURLS = NSDocumentController.sharedDocumentController.recentDocumentURLs;
if(row > -1 && row < recentURLS.count) {
NSURL *url = recentURLS[row];
view.textField.enabled = YES;
view.imageView.enabled = YES;
view.textField.stringValue = url.lastPathComponent;
view.imageView.image = [NSWorkspace.sharedWorkspace iconForFile:url.path];
}
else {
view.textField.enabled = NO;
view.imageView.enabled = NO;
view.textField.stringValue = NSLocalizedString(@"WELCOME_WINDOW_NO_RECENT_DOCUMENTS", "Text displayed when no recent documents can be displayed in");
view.imageView.image = [NSWorkspace.sharedWorkspace iconForFileType:MPKdbxDocumentUTI];
}
return view;
}
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row {
return (NSDocumentController.sharedDocumentController.recentDocumentURLs.count > 0);
}
- (IBAction)openRecentURL:(id)sender {
NSInteger clicked = self.tableView.clickedRow;
NSArray <NSURL *> *recentURLS = NSDocumentController.sharedDocumentController.recentDocumentURLs;

View File

@@ -71,8 +71,18 @@
<string>https://macpassapp.org/data/plugins.json</string>
<key>NSAppleEventsUsageDescription</key>
<string>MacPass might use AppleEvents to perform Autotype functionality</string>
<key>NSDesktopFolderUsageDescription</key>
<string>MacPass accesses the Desktop to load and save your databases and/or key files there</string>
<key>NSDocumentsFolderUsageDescription</key>
<string>MacPass accesses the Documents folder to load and save your databases and/or key files there</string>
<key>NSDownloadsFolderUsageDescription</key>
<string>MacPass accesses the Downloads folder to load and save your databases and/or key files there</string>
<key>NSNetworkVolumesUsageDescription</key>
<string>MacPass need access to Network Volumes to load and save your databases and/or key files there</string>
<key>NSRemovableVolumesUsageDescription</key>
<string>MacPass need access to Removable Volumes to load and save your databases and/or key files there</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2012-2019 HicknHack Software GmbH. All rights reserved.</string>
<string>Copyright © 2012-2020 HicknHack Software GmbH. All rights reserved.</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>

View File

@@ -0,0 +1,25 @@
//
// NSRunningApplication+MPAdditions.h
// MacPass
//
// Created by Michael Starke on 15.01.20.
// Copyright © 2020 HicknHack Software GmbH. All rights reserved.
//
#import <AppKit/AppKit.h>
#import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
APPKIT_EXTERN NSString *const MPWindowTitleKey;
APPKIT_EXTERN NSString *const MPProcessIdentifierKey;
@interface NSRunningApplication (MPAdditions)
@property (readonly, copy) NSDictionary *mp_infoDictionary;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,50 @@
//
// NSRunningApplication+MPAdditions.m
// MacPass
//
// Created by Michael Starke on 15.01.20.
// Copyright © 2020 HicknHack Software GmbH. All rights reserved.
//
#import "NSRunningApplication+MPAdditions.h"
#import <AppKit/AppKit.h>
NSString *const MPWindowTitleKey = @"MPWindowTitleKey";
NSString *const MPProcessIdentifierKey = @"MPProcessIdentifierKey";
@implementation NSRunningApplication (MPAdditions)
- (NSDictionary *)mp_infoDictionary {
NSArray *currentWindows = CFBridgingRelease(CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID));
NSArray *windowNumbers = [NSWindow windowNumbersWithOptions:NSWindowNumberListAllApplications];
NSUInteger minZIndex = NSNotFound;
NSDictionary *infoDict = nil;
for(NSDictionary *windowDict in currentWindows) {
NSString *windowTitle = windowDict[(NSString *)kCGWindowName];
if(windowTitle.length <= 0) {
continue;
}
NSNumber *processId = windowDict[(NSString *)kCGWindowOwnerPID];
if(processId && [processId isEqualToNumber:@(self.processIdentifier)]) {
NSNumber *number = (NSNumber *)windowDict[(NSString *)kCGWindowNumber];
NSUInteger zIndex = [windowNumbers indexOfObject:number];
if(zIndex < minZIndex) {
minZIndex = zIndex;
infoDict = @{
MPWindowTitleKey: windowTitle,
MPProcessIdentifierKey : processId
};
}
}
}
if(currentWindows.count > 0 && infoDict.count == 0) {
// show some information about not being able to determine any windows
NSLog(@"Unable to retrieve any window names. If you encounter this issue you might be running 10.15 and MacPass has no permission for screen recording.");
}
return infoDict;
}
@end

View File

@@ -16,7 +16,7 @@
{
"name": "MacPassHTTP",
"description": "KeePassHTTP support for MacPass",
"download": "https://github.com/MacPass/MacPassHTTP/releases/download/0.3.1/MacPassHTTP.mpplugin-0.3.2.zip",
"download": "https://github.com/MacPass/MacPassHTTP/releases/download/0.3.2/MacPassHTTP.mpplugin-0.3.2.zip",
"source": "https://github.com/MacPass/MacPassHTTP",
"currentVersion": "0.3.2",
"bundleIdentifier": "com.hicknhacksoftware.MacPassHTTP",

View File

@@ -1,3 +1,6 @@
/* Class = "NSButtonCell"; title = "Request Permissions…"; ObjectID = "1Nx-Cg-TCn"; */
"1Nx-Cg-TCn.title" = "Berechtigung anfordern …";
/* Class = "NSTextFieldCell"; title = "MacPass will send key press events to the system when Autotype or Global Autotype is executed. Since macOS 10.14 Mojave this is only possible, if Accessibility permissions are granted to the application."; ObjectID = "6GI-KJ-Xue"; */
"6GI-KJ-Xue.title" = "MacPass sendet Tastendrücke an das System, wenn Autotype oder Global Autotype ausgeführt wird. Seit macOS 10.14 Mojave ist dies nur noch möglich, wenn der Anwendung Berechtigung zur Bedienungshilfe erteilt wurden.";
@@ -16,3 +19,6 @@
/* Class = "NSButtonCell"; title = "Open Screen Recording Preferences…"; ObjectID = "lgB-Ys-L9R"; */
"lgB-Ys-L9R.title" = "Bildschirmaufzeichnungseinstellungen öffnen …";
/* Class = "NSTextFieldCell"; title = "To request Screen Recording permissions, MacPass will try to capture a 1 by 1 Pixel sized screenshot of the top left part of your screen. The data is not stored nor processed in any way."; ObjectID = "Mhg-rd-1hK"; */
"Mhg-rd-1hK.title" = "Um die Berechtigung zum Aufzeichnen des Bildschirminhaltes anzufordern wird MacPass versuchen ein 1 mal 1 Pixel großes Bildschirmfoto vom linken oberen Rand des Bildschirms zu erstellen. Das Bild wird nicht gespeichert, gesendet oder anderweitig verarbeitet.";

View File

@@ -67,6 +67,9 @@
/* Class = "NSTextFieldCell"; title = "Disabling this compromises security. If enabled, anything copied to the Clipboard in MacPass will be available on your connected iOS devices. You should clear the clipboard on those devices manually."; ObjectID = "JGX-Tp-KJk"; */
"JGX-Tp-KJk.title" = "Das Ausschalten dieser Option beeinträchtigt die Sicherheit. Wird diese Option deaktiviert, werden alle Daten, die von MacPass in die Zwischenablage kopiert werden mit verbundenen iOS Geräten synchronisiert. Die Zwischenablage sollte dann manuell auf diesen Geräten geleert werden.";
/* Class = "NSButtonCell"; title = "Lock after screen sleep"; ObjectID = "l3t-og-mJd"; */
"l3t-og-mJd.title" = "Datenbank beim Schlafen des Bildschirms sperren.";
/* Class = "NSTextFieldCell"; title = "If file changes:"; ObjectID = "QrK-hM-Xt1"; */
"QrK-hM-Xt1.title" = "Bei Dateiänderungen:";

View File

@@ -10,8 +10,26 @@
/* (No Comment) */
"MacPass Plugin" = "MacPass Plugin";
/* Privacy - AppleEvents Sending Usage Description */
"NSAppleEventsUsageDescription" = "MacPass erlaubt Plugins AppleEvents zu nutzen.";
/* Privacy - Desktop Folder Usage Description */
"NSDesktopFolderUsageDescription" = "MacPass greift auf den Schreibtisch zu, um Datenbanken und Schlüsseldateien zu laden oder speichern.";
/* Privacy - Documents Folder Usage Description */
"NSDocumentsFolderUsageDescription" = "MacPass greift auf den Dokumenteordner zu, um Datenbanken und Schlüsseldateien zu laden oder speichern.";
/* Privacy - Downloads Folder Usage Description */
"NSDownloadsFolderUsageDescription" = "MacPass greift auf den Downloadordner zu, um Datenbanken und Schlüsseldateien zu laden oder speichern.";
/* (No Comment) */
"NSHumanReadableCopyright" = "Copyright ©2012-2019 HicknHack Software GmbH. Alle Rechte vorbehalten.";
"NSHumanReadableCopyright" = "Copyright ©2012-2020 HicknHack Software GmbH. Alle Rechte vorbehalten.";
/* Privacy - Network Volumes Usage Description */
"NSNetworkVolumesUsageDescription" = "MacPass greift auf Netzwerklaufwerke zu, um Datenbanken und Schlüsseldateien zu laden oder speichern.";
/* Privacy - Removable Volumes Usage Description */
"NSRemovableVolumesUsageDescription" = "MacPass greift auf Wechseldatenträge zu, um Datenbanken und Schlüsseldateien zu laden oder speichern.";
/* (No Comment) */
"XML" = "XML";

View File

@@ -119,16 +119,28 @@
/* Notification: Autotype failed, MacPass has not enough permissions to perform autotype */
"AUTOTYPE_NOTIFICATION_MACPASS_IS_MISSING_PERMISSIONS" = "MacPass hat nicht alle notwendigen Berechtigungen um Autotype ausführen zu können";
/* Notification: Title for autotype feedback */
"AUTOTYPE_NOTIFICATION_MATCH_TITLE" = "Autotype";
/* Notification: Autotype failed, no documents are open */
"AUTOTYPE_OVERLAY_NO_DOCUMENTS" = "Bitte öffnen Sie eine Datei, um Global-Autotype zu nutzen!";
"AUTOTYPE_NOTIFICATION_NO_DOCUMENTS_INFORMATIVE_TEXT" = "Bitte öffnen Sie eine Datei, um Global-Autotype zu nutzen!";
/* Notification: Title for autotype feedback */
"AUTOTYPE_NOTIFICATION_NO_DOCUMENTS_TITLE" = "Keine Datenbank offen.";
/* Noticiation: Autotype failed to find a match for %@ (string placeholder) */
"AUTOTYPE_OVERLAY_NO_MATCH_FOR_%@" = "Kein Treffer für %@!";
"AUTOTYPE_NOTIFICATION_NO_MATCH_FOR_%@" = "Kein Treffer für %@!";
/* Title for autotype feedback on missing permissions */
"AUTOTYPE_NOTIFICATION_PERMISSIONS_MISSING_TITLE" = "Berechtigungen fehlen.";
/* Notification: Autotype found a single match for %@ (string placeholder). */
"AUTOTYPE_OVERLAY_SINGLE_MATCH_FOR_%@" = "Treffer für %@!";
"AUTOTYPE_NOTIFICATION_SINGLE_MATCH_FOR_%@" = "Treffer für %@!";
/* Status lable when no issue were found in accessibilty */
/* Title for the notification when the Autotype operation timed out */
"AUTOTYPE_NOTIFICATION_TIMED_OUT_TITLE" = "Autotype abgebrochen.";
/* Status label when no issue were found in accessibilty */
"AUTOTYPE_STATUS_ACCESSIBILTY_PERMISSIONS_OK" = "MacPass hat die Berechtigung den Computer zu steuern (Eingabehilfe)";
/* Status MacPass has no accessibilty permissions */
@@ -137,7 +149,7 @@
/* Status MacPass has no screen recording permissions */
"AUTOTYPE_STATUS_NO_SCREEN_RECORDING_PERMISSIONS" = "MacPass hat keine Berechtigung den Bildschirminhalt aufzuzeichnen";
/* Status lable when no issue were found in screen recording permissions */
/* Status label when no issue were found in screen recording permissions */
"AUTOTYPE_STATUS_SCREEN_RECORDING_PERMISSIONS_OK" = "MacPass hat die Berechtigung den Bildschirminhalt aufzuzeichnen";
/* Notficication: Autotype timed out */
@@ -249,7 +261,7 @@
/* Context menu that copies reference to username */
"COPY_USERNAME_REFERENCE" = "Nutzername";
/* Curstom attribute reference item */
/* Custom attribute reference item */
"CUSTOM_ATTRIBUTE" = "Spezielle Eigenschaften";
/* Title for menu for custom search filters */
@@ -303,6 +315,9 @@
Actiontitle for copying groups via drag and drop to antother database */
"DRAG_GROUP" = "Gruppe verschieben";
/* Action name for duplicating entries */
"DUPLICATE_ENTRIES_ACTION_NAME" = "Einträge duplizieren";
/* Menu item to directly diplicate an entry */
"DUPLICATE_ENTRY" = "Eintrag duplizieren";
@@ -312,6 +327,9 @@
/* Menu item to directly diplicate a group */
"DUPLICATE_GROUP" = "Gruppe duplizieren";
/* Action name for duplicating groups */
"DUPLICATE_GROUPS_ACTION_NAME" = "Gruppe duplizieren";
/* Menu item in the database outline context menu to change the template group
Menu item on the add entry context menu to edit template groups */
"EDIT_TEMPLATE_GROUP" = "Vorlagengruppe bearbeiten";
@@ -343,8 +361,8 @@
/* Error description given when adding an invalid plugin */
"ERROR_INVALID_PLUGIN" = "Kein MacPass-Plugin";
/* Error description for missing accessibilty permissions */
"ERROR_NO_ACCESSIBILTY_PERMISSIONS" = "MacPass hat keine Berechtigung den Bildschirminhalt aufzuzeichnen.";
/* Error description for missing accessibility permissions */
"ERROR_NO_ACCESSIBILITY_PERMISSIONS" = "MacPass hat keine Berechtigung den Bildschirminhalt aufzuzeichnen.";
/* Error description for missing screen recording permissions */
"ERROR_NO_PERMISSION_TO_RECORD_SCREEN" = "MacPass hat keine Berechtigungen den Bildschirminhalt aufzuzeichnen";
@@ -355,6 +373,9 @@
/* Passwords do not match, keyfile is invalid */
"ERROR_PASSWORD_MISSMATCH_INVALID_KEYFILE" = "Passwörter stimmen nicht überein oder die Schlüsseldatei ist ungültig!";
/* Recommend/Enforce key change intervall format */
"EVERY_%ld_DAYS" = "Alle %ld Tage";
/* Format to returen the date an item expires. Includes %@ placehoder for date */
"EXPIRES_AT_DATE_%@" = "verfällt: %@";
@@ -545,9 +566,15 @@
/* Menu item to perform autotype with the selected entry */
"PERFORM_AUTOTYPE_FOR_ENTRY" = "Auto-Type ausführen";
/* Info about how many character has to pick in pickchar dialog */
"PICKCHAR_INFO_MESSAGE_PICK_CHARACTERS_%ld" = "Bitte %ld Zeichen wählen";
/* Window displayed to the user to pick an amout of characters */
"PICKCHAR_WINDOW_TITLE" = "Zeichen auswählen";
/* Count of picked characters in pickchars dialog if no limit is set */
"PICKED_%ld_CHARACTERS" = "%ld Zeichen gewählt";
/* Window displayed to the user to pick an amout of characters */
"PICKFIELD_WINDOW_TITLE" = "Wert auswählen";
@@ -617,10 +644,13 @@
/* Message text for the recommend password change alert */
"RECOMMEND_PASSWORD_CHANGE_ALERT_TITLE" = "Bitte ändern sie das Passwort der Datenbank!";
/* Updated at text when the local plugin defintino is used */
"REPOSITORY_UPDATED_AT_LOCAL" = "Niemals (mitgelieferte Version nutzen)";
/* Restart */
"RESTART" = "Neustarten";
/* Action to restore and Entry to a previous state of it's history */
/* Action to restore an Entry to its previous state of it's history */
"RESTORE_HISTORY_ENTRY" = "Eintrag wiederherstellen";
/* Menu item to save the selected attached file.
@@ -639,6 +669,9 @@
/* Search option: Find duplicate passwords */
"SEARCH_DUPLICATE_PASSWORDS" = "Doppelte Passwörter";
/* Placeholder string displayed in the search field in the toolbar */
"SEARCH_EVERYWHERE" = "Überall suchen";
/* Search option: Find expired entries */
"SEARCH_EXPIRED_ENTRIES" = "Abgelaufen";
@@ -769,6 +802,12 @@
UUID reference item */
"UUID" = "UUID";
/* Error message displayed when the current database file is also set as the key file */
"WARNING_CURRENT_DATABASE_FILE_SELECTED_AS_KEY_FILE" = "Die Datenbank kann nicht gleichzeitig als Schlüsseldatei verwendet werden.";
/* Error message displayed when a keepass database file is set as the key file */
"WARNING_DATABASE_FILE_SELECTED_AS_KEY_FILE" = "Eine andere KeePass Datenbank sollte nicht als Schlüsseldatei verwendet werden. Die Datei kann sich ändern und damit kann die aktuelle Datenbank nicht mehr geöffnet werden.";
/* No Key or Password */
"WARNING_NO_PASSWORD_OR_KEYFILE" = "Kein Passwort und/oder Schlüsseldatei festgelegt!";
@@ -790,6 +829,9 @@
/* No comment provided by engineer. */
"WARNING_ON_SAVE_NO_PASSWORD_OR_KEY_SET_SUGGESTION" = "Bitte vergeben Sie ein Passwort und/oder einen Schlüssel. Sofern Sie abbrechen, werden Ihre Änderungen rückgängig gemacht und die Datei gesperrt.";
/* Text displayed when no recent documents can be displayed in */
"WELCOME_WINDOW_NO_RECENT_DOCUMENTS" = "Keine bisherigen Dokumente";
/* Label for the workflow settings tab */
"WORKFLOW_SETTINGS" = "Arbeitsfluss";

View File

@@ -4,7 +4,7 @@
/* Class = "NSMenuItem"; title = "Item"; ObjectID = "3st-rv-EeQ"; */
"3st-rv-EeQ.title" = "Element";
/* Class = "NSMenu"; title = "Import"; ObjectID = "4q9-u1-pcm"; */
/* Class = "NSMenu"; title = "Import From"; ObjectID = "4q9-u1-pcm"; */
"4q9-u1-pcm.title" = "Importieren";
/* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "5"; */
@@ -157,7 +157,7 @@
/* Class = "NSMenuItem"; title = "Lock"; ObjectID = "1261"; */
"1261.title" = "Verschließen";
/* Class = "NSMenuItem"; title = "Import"; ObjectID = "aTb-sW-nUd"; */
/* Class = "NSMenuItem"; title = "Import From"; ObjectID = "aTb-sW-nUd"; */
"aTb-sW-nUd.title" = "Importieren";
/* Class = "NSMenuItem"; title = "Quicklook"; ObjectID = "aVO-9F-Lwc"; */
@@ -172,7 +172,7 @@
/* Class = "NSMenuItem"; title = "Fix Autotype…"; ObjectID = "nx7-Vf-LiD"; */
"nx7-Vf-LiD.title" = "Autotype korrigieren …";
/* Class = "NSMenu"; title = "Export"; ObjectID = "p8h-Fg-h1O"; */
/* Class = "NSMenu"; title = "Export To"; ObjectID = "p8h-Fg-h1O"; */
"p8h-Fg-h1O.title" = "Exportieren";
/* Class = "NSMenuItem"; title = "XML…"; ObjectID = "rW0-r1-QYL"; */
@@ -181,7 +181,7 @@
/* Class = "NSMenu"; title = "Item"; ObjectID = "Ttt-tR-emo"; */
"Ttt-tR-emo.title" = "Element";
/* Class = "NSMenuItem"; title = "Export"; ObjectID = "tz9-yK-pOf"; */
/* Class = "NSMenuItem"; title = "Export To"; ObjectID = "tz9-yK-pOf"; */
"tz9-yK-pOf.title" = "Exportieren";
/* Class = "NSMenuItem"; title = "Focus Inspector"; ObjectID = "Zje-Me-5c8"; */

View File

@@ -1,7 +1,7 @@
/* Class = "NSWindow"; title = "Change Password"; ObjectID = "1"; */
"1.title" = "Fenster";
/* Class = "NSTextFieldCell"; title = "Missmatching Passwords"; ObjectID = "14"; */
/* Class = "NSTextFieldCell"; title = "Mismatching Passwords"; ObjectID = "14"; */
"14.title" = "Passwörter stimmen nicht überein";
/* Class = "NSSecureTextFieldCell"; placeholderString = "Repeat Password"; ObjectID = "15"; */

View File

@@ -13,6 +13,9 @@
/* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "erj-mR-UyO"; */
"erj-mR-UyO.title" = "Abbrechen";
/* Class = "NSTextFieldCell"; title = "key_file_warnig"; ObjectID = "f6J-5f-ZvP"; */
"f6J-5f-ZvP.title" = "!warnung!";
/* Class = "NSButtonCell"; title = "Password"; ObjectID = "IU9-5u-jn9"; */
"IU9-5u-jn9.title" = "Passwort";

View File

@@ -19,7 +19,7 @@
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "STt-PQ-Szr"; */
"STt-PQ-Szr.title" = "Text Cell";
/* Class = "NSButtonCell"; title = "Download current plugin information"; ObjectID = "uHR-uL-Ddm"; */
/* Class = "NSButtonCell"; title = "Download current Plugin information"; ObjectID = "uHR-uL-Ddm"; */
"uHR-uL-Ddm.title" = "Aktuelle Plugin-Informationen herunterladen";
/* Class = "NSBox"; title = "Box"; ObjectID = "vBs-Ga-aq0"; */

View File

@@ -1,4 +1,4 @@
/* Class = "NSButtonCell"; title = "Hide application after copying to clipboard "; ObjectID = "1Vr-nY-Ogv"; */
/* Class = "NSButtonCell"; title = "Hide application after copying to clipboard"; ObjectID = "1Vr-nY-Ogv"; */
"1Vr-nY-Ogv.title" = "MacPass nach dem jedem Kopieren in die Zwischenablage ausblenden";
/* Class = "NSBox"; title = "Entry Table"; ObjectID = "2"; */

View File

@@ -0,0 +1,18 @@
/* Bundle name */
"CFBundleName" = "MacPass";
/* (No Comment) */
"KDB Database" = "KDB Database";
/* (No Comment) */
"KDBX Database" = "KDBX Database";
/* (No Comment) */
"MacPass Plugin" = "MacPass Plugin";
/* (No Comment) */
"NSHumanReadableCopyright" = "Copyright ©2012-2020 HicknHack Software GmbH. All rights reserved.";
/* (No Comment) */
"XML" = "XML";

View File

@@ -43,7 +43,7 @@
/* Informative text displayed on the alert that shows up when MacPass asks for permssion to download the plugin repository JSON file */
"ALERT_ASK_FOR_PLUGIN_REPOSITORY_CONNECTION_PERMISSION_INFORMATIVE_TEXT" = "The plugin defintions are hosted online at https://macpassapp.org. MacPass would like to download those files to ensure the data is up to date.";
/* Message displayed on the alert that askf for permission to download the plugin repository JSON file */
/* Message displayed on the alert that asks for permission to download the plugin repository JSON file */
"ALERT_ASK_FOR_PLUGIN_REPOSITORY_CONNECTION_PERMISSION_MESSAGE" = "MacPass would like to check for updates of plugin definitions online";
/* Disallow the download of the plugin repository file */
@@ -119,14 +119,26 @@
/* Notification: Autotype failed, MacPass has not enough permissions to perform autotype */
"AUTOTYPE_NOTIFICATION_MACPASS_IS_MISSING_PERMISSIONS" = "MacPass does not have all necessary permissions to perform Autotype.";
/* Notification: Title for autotype feedback */
"AUTOTYPE_NOTIFICATION_MATCH_TITLE" = "Autotype";
/* Notification: Autotype failed, no documents are open */
"AUTOTYPE_OVERLAY_NO_DOCUMENTS" = "Please open a database file to use Global Autotype!";
"AUTOTYPE_NOTIFICATION_NO_DOCUMENTS_INFORMATIVE_TEXT" = "Please open a database file to use Global Autotype!";
/* Notification: Title for autotype feedback */
"AUTOTYPE_NOTIFICATION_NO_DOCUMENTS_TITLE" = "No database is open!";
/* Noticiation: Autotype failed to find a match for %@ (string placeholder) */
"AUTOTYPE_OVERLAY_NO_MATCH_FOR_%@" = "No Match for %@!";
"AUTOTYPE_NOTIFICATION_NO_MATCH_FOR_%@" = "No Match for %@!";
/* Title for autotype feedback on missing permissions */
"AUTOTYPE_NOTIFICATION_PERMISSIONS_MISSING_TITLE" = "Missing permissions";
/* Notification: Autotype found a single match for %@ (string placeholder). */
"AUTOTYPE_OVERLAY_SINGLE_MATCH_FOR_%@" = "Found Match for %@!";
"AUTOTYPE_NOTIFICATION_SINGLE_MATCH_FOR_%@" = "Found Match for %@!";
/* Title for the notification when the Autotype operation timed out */
"AUTOTYPE_NOTIFICATION_TIMED_OUT_TITLE" = "Autotype timed out!";
/* Status label when no issue were found in accessibilty */
"AUTOTYPE_STATUS_ACCESSIBILTY_PERMISSIONS_OK" = "MacPass has permission to control your computer (Accessibility)";
@@ -137,11 +149,11 @@
/* Status MacPass has no screen recording permissions */
"AUTOTYPE_STATUS_NO_SCREEN_RECORDING_PERMISSIONS" = "MacPass has no permission to record your screen";
/* Status lable when no issue were found in screen recording permissions */
/* Status label when no issue were found in screen recording permissions */
"AUTOTYPE_STATUS_SCREEN_RECORDING_PERMISSIONS_OK" = "MacPass has permission to record your screen";
/* Notficication: Autotype timed out */
"AUTOTYPE_TIMED_OUT" = "Autotype timed out.";
"AUTOTYPE_TIMED_OUT" = "You did start Autotype too long ago. MacPass did not perform it anymore to prevent any wrong input!";
/* Enable autotype menu item */
"AUTOTYPE_YES" = "Enable Autotype";
@@ -350,7 +362,7 @@
"ERROR_INVALID_PLUGIN" = "Invalid plugin";
/* Error description for missing accessibility permissions */
"ERROR_NO_ACCESSIBILTY_PERMISSIONS" = "MacPass has no permission to control your computer (Accessibility)";
"ERROR_NO_ACCESSIBILITY_PERMISSIONS" = "MacPass has no permission to control your computer (Accessibility)";
/* Error description for missing screen recording permissions */
"ERROR_NO_PERMISSION_TO_RECORD_SCREEN" = "MacPass has no permission to record your screen";
@@ -522,7 +534,7 @@
/* Select Browser */
"OTHER_BROWSER" = "Select Browser…";
/* No comment provided by engineer. */
/* Value field for reference lookup */
"OUTPUT_VALUE" = "Output Value";
/* Menu item to toggle display of password column in entry table
@@ -632,6 +644,9 @@
/* Message text for the recommend password change alert */
"RECOMMEND_PASSWORD_CHANGE_ALERT_TITLE" = "Please change the database password!";
/* Updated at text when the local plugin defintino is used */
"REPOSITORY_UPDATED_AT_LOCAL" = "Never (using bundled version)";
/* Restart */
"RESTART" = "Restart";
@@ -654,6 +669,9 @@
/* Search option: Find duplicate passwords */
"SEARCH_DUPLICATE_PASSWORDS" = "Duplicate Passwords";
/* Placeholder string displayed in the search field in the toolbar */
"SEARCH_EVERYWHERE" = "Search Everywhere";
/* Search option: Find expired entries */
"SEARCH_EXPIRED_ENTRIES" = "Expired";
@@ -663,7 +681,7 @@
/* Disable search menu item */
"SEARCH_NO" = "Exclude from Search";
/* No comment provided by engineer. */
/* Search field for references lookup */
"SEARCH_VALUE" = "Search Value";
/* Enable search menu item */
@@ -784,6 +802,12 @@
UUID reference item */
"UUID" = "UUID";
/* Error message displayed when the current database file is also set as the key file */
"WARNING_CURRENT_DATABASE_FILE_SELECTED_AS_KEY_FILE" = "You cannot select the current database file as the key file.";
/* Error message displayed when a keepass database file is set as the key file */
"WARNING_DATABASE_FILE_SELECTED_AS_KEY_FILE" = "You should not use another database file as a key file since it might change and prevent you from reopening the current file.";
/* No Key or Password */
"WARNING_NO_PASSWORD_OR_KEYFILE" = "No password or keyfile supplied!";
@@ -805,6 +829,9 @@
/* No comment provided by engineer. */
"WARNING_ON_SAVE_NO_PASSWORD_OR_KEY_SET_SUGGESTION" = "Please set a password and/or keyfile for this database. Aborting this will undo all changes and lock the document";
/* Text displayed when no recent documents can be displayed in */
"WELCOME_WINDOW_NO_RECENT_DOCUMENTS" = "No recent Documents";
/* Label for the workflow settings tab */
"WORKFLOW_SETTINGS" = "Workflow";

View File

@@ -11,7 +11,7 @@
"MacPass Plugin" = "Plugin MacPass";
/* (No Comment) */
"NSHumanReadableCopyright" = "Copyright ©2012-2019 HicknHack Software GmbH. All rights reserved. ";
"NSHumanReadableCopyright" = "Copyright ©2012-2020 HicknHack Software GmbH. All rights reserved. ";
/* (No Comment) */
"XML" = "XML";

View File

@@ -132,13 +132,13 @@
"AUTOTYPE_NOTIFICATION_MACPASS_IS_MISSING_PERMISSIONS" = "Autotecleo no tiene los permisos necesarios";
/* Notification: Autotype failed, no documents are open */
"AUTOTYPE_OVERLAY_NO_DOCUMENTS" = "Debes abrir un archivo para usar Autotecleo Global";
"AUTOTYPE_NOTIFICATION_NO_DOCUMENTS_INFORMATIVE_TEXT" = "Debes abrir un archivo para usar Autotecleo Global";
/* Noticiation: Autotype failed to find a match for %@ (string placeholder) */
"AUTOTYPE_OVERLAY_NO_MATCH_FOR_%@" = "¡No hay entradas para %@!";
"AUTOTYPE_NOTIFICATION_NO_MATCH_FOR_%@" = "¡No hay entradas para %@!";
/* Notification: Autotype found a single match for %@ (string placeholder). */
"AUTOTYPE_OVERLAY_SINGLE_MATCH_FOR_%@" = "¡%@ Encontrado!";
"AUTOTYPE_NOTIFICATION_SINGLE_MATCH_FOR_%@" = "¡%@ Encontrado!";
/* Status lable when no issue were found in accessibilty */
"AUTOTYPE_STATUS_ACCESSIBILTY_PERMISSIONS_OK" = "MacPass tiene permiso para controlar su ordenador (Accesibilidad)";
@@ -356,7 +356,7 @@
"ERROR_INVALID_PLUGIN" = "Plugin inválido";
/* Error description for missing accessibilty permissions */
"ERROR_NO_ACCESSIBILTY_PERMISSIONS" = "MacPass no tiene permiso para controlar su ordenador (Accesibilidad)";
"ERROR_NO_ACCESSIBILITY_PERMISSIONS" = "MacPass no tiene permiso para controlar su ordenador (Accesibilidad)";
/* Error description for missing screen recording permissions */
"ERROR_NO_PERMISSION_TO_RECORD_SCREEN" = "MacPass no tiene permiso para grabar su pantalla";
@@ -528,7 +528,7 @@
/* Select Browser */
"OTHER_BROWSER" = "Seleccionar Navegador…";
/* No comment provided by engineer. */
/* Value field for reference lookup */
"OUTPUT_VALUE" = "Valor de salida";
/* Menu item to toggle display of password column in entry table

View File

@@ -19,7 +19,7 @@
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "STt-PQ-Szr"; */
"STt-PQ-Szr.title" = "Campo de Texto";
/* Class = "NSButtonCell"; title = "Download current plugin information"; ObjectID = "uHR-uL-Ddm"; */
/* Class = "NSButtonCell"; title = "Download current Plugin information"; ObjectID = "uHR-uL-Ddm"; */
"uHR-uL-Ddm.title" = "Descargar la información del plugin actual";
/* Class = "NSBox"; title = "Box"; ObjectID = "vBs-Ga-aq0"; */

View File

@@ -39,10 +39,10 @@
"AUTOTYPE_NOTIFICATION_MACPASS_HAS_NO_ACCESSIBILTY_PERMISSIONS" = "Autorisation accessibilité manquant, saisie automatique désactivé.";
/* Notification: Autotype failed, no documents are open */
"AUTOTYPE_OVERLAY_NO_DOCUMENTS" = "Aucun document n'est ouvert";
"AUTOTYPE_NOTIFICATION_NO_DOCUMENTS_INFORMATIVE_TEXT" = "Aucun document n'est ouvert";
/* Noticiation: Autotype failed to find a match for %@ (string placeholder) */
"AUTOTYPE_OVERLAY_NO_MATCH_FOR_%@" = "Pas de correspondance %@ !";
"AUTOTYPE_NOTIFICATION_NO_MATCH_FOR_%@" = "Pas de correspondance %@ !";
/* Enable autotype menu item */
"AUTOTYPE_YES" = "Activer la saisie automatique";

View File

@@ -8,7 +8,7 @@
"MacPass Plugin" = "Plugin MacPass";
/* (No Comment) */
"NSHumanReadableCopyright" = "Copyright ©2012-2019 HicknHack Software GmbH. Tutti i diritti riservati.";
"NSHumanReadableCopyright" = "Copyright ©2012-2020 HicknHack Software GmbH. Tutti i diritti riservati.";
/* (No Comment) */
"XML" = "XML";

View File

@@ -120,13 +120,13 @@
"AUTOTYPE_NOTIFICATION_MACPASS_IS_MISSING_PERMISSIONS" = "MacPass non possiede tutti i permessi necessari per eseguire Autotype.";
/* Notification: Autotype failed, no documents are open */
"AUTOTYPE_OVERLAY_NO_DOCUMENTS" = "Prego aprire un database per utilizzare Autotype Globale!";
"AUTOTYPE_NOTIFICATION_NO_DOCUMENTS_INFORMATIVE_TEXT" = "Prego aprire un database per utilizzare Autotype Globale!";
/* Noticiation: Autotype failed to find a match for %@ (string placeholder) */
"AUTOTYPE_OVERLAY_NO_MATCH_FOR_%@" = "Nessuna corrispondenza %@!";
"AUTOTYPE_NOTIFICATION_NO_MATCH_FOR_%@" = "Nessuna corrispondenza %@!";
/* Notification: Autotype found a single match for %@ (string placeholder). */
"AUTOTYPE_OVERLAY_SINGLE_MATCH_FOR_%@" = "Trovato corrispondenza per %@!";
"AUTOTYPE_NOTIFICATION_SINGLE_MATCH_FOR_%@" = "Trovato corrispondenza per %@!";
/* Status label when no issue were found in accessibilty */
"AUTOTYPE_STATUS_ACCESSIBILTY_PERMISSIONS_OK" = "MacPass ha il permesso per controllare il suo computer (Accessibilità)";
@@ -350,7 +350,7 @@
"ERROR_INVALID_PLUGIN" = "Plugin invalido";
/* Error description for missing accessibility permissions */
"ERROR_NO_ACCESSIBILTY_PERMISSIONS" = "MacPass non ha il permesso per controllare il suo computer (Accessibilità)";
"ERROR_NO_ACCESSIBILITY_PERMISSIONS" = "MacPass non ha il permesso per controllare il suo computer (Accessibilità)";
/* Error description for missing screen recording permissions */
"ERROR_NO_PERMISSION_TO_RECORD_SCREEN" = "MacPass non ha il permesso per registrare lo schermo";

View File

@@ -22,7 +22,7 @@
/* Class = "NSButtonCell"; title = "Browse Available Plugins…"; ObjectID = "sqO-8H-n1y"; */
"sqO-8H-n1y.title" = "Cerca plugin…";
/* Class = "NSButtonCell"; title = "Download current plugin information"; ObjectID = "uHR-uL-Ddm"; */
/* Class = "NSButtonCell"; title = "Download current Plugin information"; ObjectID = "uHR-uL-Ddm"; */
"uHR-uL-Ddm.title" = "Scarica informazioni plugin attuali";
/* Class = "NSButtonCell"; title = "Force loading of incompatible Plugins"; ObjectID = "yak-fS-jtA"; */

View File

@@ -11,7 +11,7 @@
"MacPass Plugin" = "Extensie voor MacPass";
/* (No Comment) */
"NSHumanReadableCopyright" = "Copyright ©2012-2019 HicknHack Software GmbH. Alle rechten voorbehouden.";
"NSHumanReadableCopyright" = "Copyright ©2012-2020 HicknHack Software GmbH. Alle rechten voorbehouden.";
/* (No Comment) */
"XML" = "XML";

View File

@@ -105,13 +105,13 @@
"AUTOTYPE_NOTIFICATION_MACPASS_HAS_NO_ACCESSIBILTY_PERMISSIONS" = "Automatisch inloggen is niet beschikbaar, omdat MacPass geen toestemming heeft om je computer te besturen. Kies Apple-menu >'Systeemvoorkeuren', klik op 'Beveiliging en privacy', klik vervolgens op 'Privacy' en voeg MacPass toe aan de groep Toegankelijkheid om automatisch inloggen aan te zetten. Stop en open MacPass opnieuw om de wijziging door te voeren.";
/* Notification: Autotype failed, no documents are open */
"AUTOTYPE_OVERLAY_NO_DOCUMENTS" = "Open een wachtwoordenkluis om automatisch te kunnen inloggen.";
"AUTOTYPE_NOTIFICATION_NO_DOCUMENTS_INFORMATIVE_TEXT" = "Open een wachtwoordenkluis om automatisch te kunnen inloggen.";
/* Noticiation: Autotype failed to find a match for %@ (string placeholder) */
"AUTOTYPE_OVERLAY_NO_MATCH_FOR_%@" = "Geen overeenkomst gevonden voor %@";
"AUTOTYPE_NOTIFICATION_NO_MATCH_FOR_%@" = "Geen overeenkomst gevonden voor %@";
/* Notification: Autotype found a single match for %@ (string placeholder). */
"AUTOTYPE_OVERLAY_SINGLE_MATCH_FOR_%@" = "Automatisch ingelogd op %@.";
"AUTOTYPE_NOTIFICATION_SINGLE_MATCH_FOR_%@" = "Automatisch ingelogd op %@.";
/* Notficication: Autotype timed out */
"AUTOTYPE_TIMED_OUT" = "Automatisch inloggen mislukt door te lang wachten.";

View File

@@ -57,13 +57,13 @@
"AUTOTYPE_NO" = "Wyłącz Autouzupełnianie";
/* Notification: Autotype failed, no documents are open */
"AUTOTYPE_OVERLAY_NO_DOCUMENTS" = "Otwórz plik, aby używać globalnego autouzupełniania!";
"AUTOTYPE_NOTIFICATION_NO_DOCUMENTS_INFORMATIVE_TEXT" = "Otwórz plik, aby używać globalnego autouzupełniania!";
/* Noticiation: Autotype failed to find a match for %@ (string placeholder) */
"AUTOTYPE_OVERLAY_NO_MATCH_FOR_%@" = "Brak Dopasowania dla %@!";
"AUTOTYPE_NOTIFICATION_NO_MATCH_FOR_%@" = "Brak Dopasowania dla %@!";
/* Notification: Autotype found a single match for %@ (string placeholder). */
"AUTOTYPE_OVERLAY_SINGLE_MATCH_FOR_%@" = "Znaleziono Dopasowanie dla %@!";
"AUTOTYPE_NOTIFICATION_SINGLE_MATCH_FOR_%@" = "Znaleziono Dopasowanie dla %@!";
/* Enable autotype menu item */
"AUTOTYPE_YES" = "Włącz Autouzupełnianie";

View File

@@ -1,8 +1,12 @@
/* Class = "NSButtonCell"; title = "Request Permissions…"; ObjectID = "1Nx-Cg-TCn"; */
"1Nx-Cg-TCn.title" = "Запросить разрешения…";
/* Class = "NSTextFieldCell"; title = "MacPass will send key press events to the system when Autotype or Global Autotype is executed. Since macOS 10.14 Mojave this is only possible, if Accessibility permissions are granted to the application."; ObjectID = "6GI-KJ-Xue"; */
"6GI-KJ-Xue.title" = "MacPass будет отправлять события нажатия клавиш в систему при выполнении Автоввода или Глобального Автоввода. Начиная с macOS 10.14 Mojave это возможно только в том случае, если приложению разрешено управление копьютером через универсальный доступ.";
/* Class = "NSTextFieldCell"; title = "MacPass will read every window title when Global Autotype is executed to find a match. Since macOS 10.15 Catalina it is not possible to read any window title, if the user has not granted permissions to record the screen. If you are running macOS 10.15 or higher, MacPass will try to capture the left top most pixel on your screen to initate a request to record the screen. This pixel will not be stored and processed in any way."; ObjectID = "7of-1z-Nfk"; */
"7of-1z-Nfk.title" = "MacPass будет читать заголовки окон чтобы найти совпадения при выполнении Глобального Автоввода. Начиная с macOS 10.15 Catalina невозможно прочитать заголовок окна, если пользователь не предоставил разрешения на запись экрана. Если вы используете MacOS 10.15 или выше, MacPass попытается захватить левый верхний пиксель на вашем экране, чтобы инициировать запрос на запись экрана. Этот пиксель не будет сохранен и обработан каким-либо образом.";
/* Class = "NSTextFieldCell"; title = "MacPass will read every window title when Global Autotype is executed to find a match. Since macOS 10.15 Catalina it is not possible to read any window title, if the user has not granted permissions to record the screen. If you are running macOS 10.15 or higher, MacPass will check if it can read every window title of currently visible windows. This test will not read the actual title. The titles aren't stored or processed in any way."; ObjectID = "7of-1z-Nfk"; */
"7of-1z-Nfk.title" = "MacPass будет читать заголовки окон чтобы найти совпадения при выполнении Глобального Автоввода. Начиная с macOS 10.15 Catalina невозможно прочитать заголовок окна, если пользователь не предоставил разрешения на запись экрана. Если вы используете MacOS 10.15 или выше, MacPass проверит, возможно ли получить заголовки видимых окон. Заголовки не сохраняются и не обрабатываются каким-либо образом.";
/* Class = "NSButtonCell"; title = "Open Accessibilty Preferences…"; ObjectID = "8m1-vs-pd5"; */
"8m1-vs-pd5.title" = "Открыть настройки универсального доступа…";
@@ -10,9 +14,11 @@
/* Class = "NSTextFieldCell"; title = "Screen Recording"; ObjectID = "9gr-mz-2I4"; */
"9gr-mz-2I4.title" = "Запись экрана";
/* Class = "NSTextFieldCell"; title = "To request Screen Recording permissions, MacPass will try to capture a 1 by 1 Pixel sized screenshot of the top left part of your screen. The data is not stored nor processed in any way."; ObjectID = "Mhg-rd-1hK"; */
"Mhg-rd-1hK.title" = "Чтобы запросить разрешения на запись экрана, MacPass попытается сделать снимок экрана размером 1 на 1 пиксель в верхней левой части экрана. Эти данные не хранятся и не обрабатываются каким-либо образом.";
/* Class = "NSTextFieldCell"; title = "Accessibility"; ObjectID = "aIL-8W-63g"; */
"aIL-8W-63g.title" = "Универсальный доступ";
/* Class = "NSButtonCell"; title = "Open Screen Sharing Preferences…"; ObjectID = "lgB-Ys-L9R"; */
/* Class = "NSButtonCell"; title = "Open Screen Recording Preferences…"; ObjectID = "lgB-Ys-L9R"; */
"lgB-Ys-L9R.title" = "Открыть настройки безопасности…";

View File

@@ -132,13 +132,13 @@
"AUTOTYPE_NOTIFICATION_MACPASS_IS_MISSING_PERMISSIONS" = "MacPass не имеет необходимых разрешений для выполнения автоввода";
/* Notification: Autotype failed, no documents are open */
"AUTOTYPE_OVERLAY_NO_DOCUMENTS" = "Откройте файл базы данных для использования глобального автоввода!";
"AUTOTYPE_NOTIFICATION_NO_DOCUMENTS_INFORMATIVE_TEXT" = "Откройте файл базы данных для использования глобального автоввода!";
/* Noticiation: Autotype failed to find a match for %@ (string placeholder) */
"AUTOTYPE_OVERLAY_NO_MATCH_FOR_%@" = "Нет соответствий %@!";
"AUTOTYPE_NOTIFICATION_NO_MATCH_FOR_%@" = "Нет соответствий %@!";
/* Notification: Autotype found a single match for %@ (string placeholder). */
"AUTOTYPE_OVERLAY_SINGLE_MATCH_FOR_%@" = "Найдено совпадение с %@";
"AUTOTYPE_NOTIFICATION_SINGLE_MATCH_FOR_%@" = "Найдено совпадение с %@";
/* Status lable when no issue were found in accessibilty */
"AUTOTYPE_STATUS_ACCESSIBILTY_PERMISSIONS_OK" = "MacPass имеет разрешение на управление компьютером";
@@ -316,13 +316,19 @@
"DRAG_GROUP" = "Перетащить группу";
/* Action name for duplicating entries */
"DUPLICATE_ENTRIES_%ld" = "Дублирующиеся записи %ld";
"DUPLICATE_ENTRIES_ACTION_NAME" = "Дублировать Записи";
/* Menu item to directly diplicate an entry */
"DUPLICATE_ENTRY" = "Скопировать Запись";
"DUPLICATE_ENTRY" = "Дублировать Запись";
/* Menu item to duplicate an entry with options how to duplicate. Will present a dialog. */
"DUPLICATE_ENTRY_WITH_OPTIONS" = "Скопировать Запись…";
"DUPLICATE_ENTRY_WITH_OPTIONS" = "Дублировать Запись…";
/* Menu item to directly diplicate a group */
"DUPLICATE_GROUP" = "Дублировать Группу";
/* Action name for duplicating groups */
"DUPLICATE_GROUPS_ACTION_NAME" = "Дублировать Группу";
/* Menu item in the database outline context menu to change the template group
Menu item on the add entry context menu to edit template groups */
@@ -356,7 +362,7 @@
"ERROR_INVALID_PLUGIN" = "Недействительный плагин";
/* Error description for missing accessibilty permissions */
"ERROR_NO_ACCESSIBILTY_PERMISSIONS" = "MacPass не имеет разрешения на управление компьютером (Универсальный доступ)";
"ERROR_NO_ACCESSIBILITY_PERMISSIONS" = "MacPass не имеет разрешения на управление компьютером (Универсальный доступ)";
/* Error description for missing screen recording permissions */
"ERROR_NO_PERMISSION_TO_RECORD_SCREEN" = "MacPass не имеет разрешения на запись экрана";
@@ -696,6 +702,9 @@
/* Action button in Notification to show the Autotype Doctor */
"SHOW_AUTOTYPE_DOCTOR" = "Показать помощник автоввода";
/* Menu item to show the entries group in the outline view */
"SHOW_GROUP_IN_OUTLINE" = "Показать группу";
/* Menu item to show the history of the selected entry
Toolbar item to toggle history display */
"SHOW_HISTORY" = "Показать историю";

View File

@@ -16,7 +16,7 @@
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "STt-PQ-Szr"; */
"STt-PQ-Szr.title" = "Текстовая Ячейка";
/* Class = "NSButtonCell"; title = "Download current plugin information"; ObjectID = "uHR-uL-Ddm"; */
/* Class = "NSButtonCell"; title = "Download current Plugin information"; ObjectID = "uHR-uL-Ddm"; */
"uHR-uL-Ddm.title" = "Скачивать информацию об обновлениях плагинов";
/* Class = "NSBox"; title = "Box"; ObjectID = "vBs-Ga-aq0"; */

View File

@@ -1,3 +1,3 @@
/* (No Comment) */
"NSHumanReadableCopyright" = "Copyright ©2012-2019 HicknHack Software GmbH. All rights reserved.";
"NSHumanReadableCopyright" = "Copyright ©2012-2020 HicknHack Software GmbH. All rights reserved.";

View File

@@ -57,10 +57,10 @@
"AUTOTYPE_NO" = "Avaktivera auto-ifyllning";
/* Notification: Autotype failed, no documents are open */
"AUTOTYPE_OVERLAY_NO_DOCUMENTS" = "Var vänlig och öppna en databas för att använda auto-ifyllning!";
"AUTOTYPE_NOTIFICATION_NO_DOCUMENTS_INFORMATIVE_TEXT" = "Var vänlig och öppna en databas för att använda auto-ifyllning!";
/* Noticiation: Autotype failed to find a match for %@ (string placeholder) */
"AUTOTYPE_OVERLAY_NO_MATCH_FOR_%@" = "Ingen matching för %@!";
"AUTOTYPE_NOTIFICATION_NO_MATCH_FOR_%@" = "Ingen matching för %@!";
/* Notification: Autotype found a single match. */
"AUTOTYPE_OVERLAY_SINGLE_MATCH" = "Användaruppgifter hittades!";

View File

@@ -5,7 +5,7 @@
"KDBX Database" = "KDBX 数据库";
/* Copyright (human-readable) */
"NSHumanReadableCopyright" = " Copyright © 2012-2019 HicknHack Software GmbH. 保留一切权利。";
"NSHumanReadableCopyright" = " Copyright © 2012-2020 HicknHack Software GmbH. 保留一切权利。";
/* (No Comment) */
"XML" = "XML";

View File

@@ -81,13 +81,13 @@
"AUTOTYPE_NOTIFICATION_MACPASS_IS_MISSING_PERMISSIONS" = "MacPass 没有执行自动键入的权限。";
/* Notification: Autotype failed, no documents are open */
"AUTOTYPE_OVERLAY_NO_DOCUMENTS" = "请打开一个数据库文件以使用全局自动键入!";
"AUTOTYPE_NOTIFICATION_NO_DOCUMENTS_INFORMATIVE_TEXT" = "请打开一个数据库文件以使用全局自动键入!";
/* Noticiation: Autotype failed to find a match for %@ (string placeholder) */
"AUTOTYPE_OVERLAY_NO_MATCH_FOR_%@" = "没有找到匹配 %@";
"AUTOTYPE_NOTIFICATION_NO_MATCH_FOR_%@" = "没有找到匹配 %@";
/* Notification: Autotype found a single match for %@ (string placeholder). */
"AUTOTYPE_OVERLAY_SINGLE_MATCH_FOR_%@" = "找到匹配 %@";
"AUTOTYPE_NOTIFICATION_SINGLE_MATCH_FOR_%@" = "找到匹配 %@";
/* Status lable when no issue were found in accessibilty */
"AUTOTYPE_STATUS_ACCESSIBILTY_PERMISSIONS_OK" = "MacPass 有权限控制您的计算机(辅助功能)";
@@ -288,7 +288,7 @@
"ERROR_INVALID_PLUGIN" = "无效插件";
/* Error description for missing accessibilty permissions */
"ERROR_NO_ACCESSIBILTY_PERMISSIONS" = "MacPass 没有权限控制您的计算机(辅助功能)";
"ERROR_NO_ACCESSIBILITY_PERMISSIONS" = "MacPass 没有权限控制您的计算机(辅助功能)";
/* Error description for missing screen recording permissions */
"ERROR_NO_PERMISSION_TO_RECORD_SCREEN" = "MacPass 没有权限录制您的屏幕";

View File

@@ -16,7 +16,7 @@
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "STt-PQ-Szr"; */
"STt-PQ-Szr.title" = "Text Cell";
/* Class = "NSButtonCell"; title = "Download current plugin information"; ObjectID = "uHR-uL-Ddm"; */
/* Class = "NSButtonCell"; title = "Download current Plugin information"; ObjectID = "uHR-uL-Ddm"; */
"uHR-uL-Ddm.title" = "下载当前插件信息";
/* Class = "NSBox"; title = "Box"; ObjectID = "vBs-Ga-aq0"; */

View File

@@ -105,11 +105,13 @@ The following list might not be complete, please refer to [merged Pull Requests]
### Contributors
[ad](mailto:github.mnms@mamber.net),
[Alessandro Vinciguerra](mailto:30745465+Arc676@users.noreply.github.com),
[Alex Borisov](mailto:alex@alexborisov.org),
[Alex Seeholzer](mailto:seeholzer@gmail.com),
[amd](mailto:amd@gurge.com),
[Andrew Schleifer](mailto:me@andrewschleifer.name),
[AntoineCa](mailto:antoine@carrincazeaux.fr),
[Anton Glezman](mailto:anton@glezman.ru),
[Benjamin Steinwender](mailto:b@stbe.at),
[binarious](mailto:bieder.martin@googlemail.com),
[Can Rau](mailto:cansrau@gmail.com),
@@ -118,9 +120,11 @@ The following list might not be complete, please refer to [merged Pull Requests]
[Chhom Seng](mailto:chhom.seng@gmail.com),
[Christoph Leimbrock](mailto:christoph.leimbrock@gmx.de),
[Cory Hutchison](mailto:cjhutchi@users.noreply.github.com),
[César Arratia](mailto:buttcmd@gmail.com),
[Daniele Polencic](mailto:daniele.polencic@gmail.com),
[darnel](mailto:vojta.j@gmail.com),
[Deiwin Sarjas](mailto:deiwin.sarjas@gmail.com),
[Deniz Türkoglu](mailto:denizt@users.noreply.github.com),
[Dennis Bolio](mailto:git@bolio.nl),
[Dylan Smith](mailto:dylansmith@gmail.com),
[eiermaaaan](mailto:37532252+eiermaaaan@users.noreply.github.com),
@@ -129,14 +133,16 @@ The following list might not be complete, please refer to [merged Pull Requests]
[floriangouy](mailto:florian.gouy@gmail.com),
[Francesco Servida](mailto:info@francescoservida.ch),
[Frank Enderle](mailto:frank.enderle@anamica.de),
[Frank Kooij](https://github.com/FrankKooij),
[Frank Kooij](mailto:FrankKooij@users.noreply.github.com),
[Gaétan Ryckeboer](mailto:gryckeboer@jouve.com),
[Geigi](mailto:git@geigi.de),
[George Snow](mailto:gsnowiii@gmail.com),
[Henri de Jong](mailto:henridejong@gmail.com),
[James Hurst](mailto:jamesrhurst@outlook.com),
[Jannick Hemelhof](mailto:mister.jannick@gmail.com),
[Jefftree](mailto:jeffrey.ying86@live.com),
[Jellyfrog](mailto:Jellyfrog@users.noreply.github.com),
[Jesse Reppin](mailto:mail@jessereppin.de),
[Joanna Olsen](mailto:jo4flash@gmail.com),
[Josh Halstead](mailto:jhalstead85@gmail.com),
[Kurt](mailto:kurt@soapbox-software.com),
@@ -156,6 +162,7 @@ The following list might not be complete, please refer to [merged Pull Requests]
[Nathan Landis](mailto:nathanlandis@gmail.com),
[Nathaniel Madura](mailto:nmadura@umich.edu),
[neuroine](mailto:d.dzieduch@gmail.com),
[Oleksandr Yakubchyk](mailto:buddax2@gmail.com),
[Patrik Thunström](mailto:magebarf@gmail.com),
[rdoering](mailto:rdoering.info@gmail.com),
[remi6397](mailto:remi6397@gmail.com),
@@ -166,6 +173,7 @@ The following list might not be complete, please refer to [merged Pull Requests]
[thesoundofom](mailto:45923716+thesoundofom@users.noreply.github.com),
[Thom](mailto:thomscode@gmail.com),
[Thorsten Jacoby](mailto:tjacoby@gmail.com),
[Veit-Hendrik Schlenker](mailto:git@vhschlenker.de),
[Volcyy](mailto:Volcyy@users.noreply.github.com),
[Yonatan Mittlefehldt](mailto:yono@toojuice.com),
[Zero King](mailto:l2dy@icloud.com),

Submodule TransformerKit deleted from 337c309a4c

94
scripts/prepare_release.sh Executable file
View File

@@ -0,0 +1,94 @@
#!/bin/bash
POSITIONAL=()
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
-s|--sign)
IDENTITY="$2"
shift # past argument
shift # past value
;;
-u|--username)
USERNAME="$2"
shift # past argument
shift # past value
;;
-p|--password)
PASSWORD="$2"
shift # past argument
shift # past value
;;
-e|--entitlements)
ENTITLEMENTS="$2"
shift # past argument
shift # past value
;;
*) # unknown option
POSITIONAL+=("$1") # save it in an array for later
shift # past argument
;;
esac
done
set -- "${POSITIONAL[@]}" # restore positional parameters
if [[ -z "${IDENTITY}" ]]; then
echo "Missing identity"
exit -1
fi
if [[ -z "${ENTITLEMENTS}" ]]; then
echo "Missing entitlements"
exit -1
fi
if [[ -z "${USERNAME}" ]]; then
echo "Missing username"
exit -1
fi
if [[ -z "${PASSWORD}" ]]; then
echo "Missing password"
exit -1
fi
DERIVED_DATA_FOLDER="${TMPDIR}"
BUILD_FOLDER="${DERIVED_DATA_FOLDER}"/Build/Products/Release
APP_BUNDLE=MacPass.app
APP_BUNDLE_ZIP="${APP_BUNDLE}".zip
APP_FRAMEWORK_PATH="${APP_BUNDLE}"/Contents/Frameworks
SPARKLE_FRAMEWORK="${APP_FRAMEWORK_PATH}"/Sparkle.framework
SPARKLE_AUTOUPDATE_BUNDLE="${SPARKLE_FRAMEWORK}"/Resources/Autoupdate.app
SPARKLE_FILEOP="${SPARKLE_AUTOUPDATE_BUNDLE}"/Contents/MacOS/fileop
TRANSFORMERKIT_FRAMEWORK="${APP_FRAMEWORK_PATH}"/TransformerKit.framework
KEEPASSKIT_FRAMEWORK="${APP_FRAMEWORK_PATH}"/KeePassKit.framework
KISSXML_FRAMEWORK="${KEEPASSKIT_FRAMEWORK}"/Versions/Current/Frameworks/KissXML.framework
HNHUI_FRAMEWORK="${APP_FRAMEWORK_PATH}"/HNHUi.framework
cd ..
echo "Building..."
xcodebuild build -configuration Release -project MacPass.xcodeproj -scheme MacPass CODE_SIGNING_REQUIRED=NO -derivedDataPath "${DERIVED_DATA_FOLDER}"
cd "${BUILD_FOLDER}"
echo ""
echo "Signing Sparkle - fileop..."
codesign --sign "${IDENTITY}" --options runtime --force --entitlements "${ENTITLEMENTS}" "${SPARKLE_FILEOP}"
echo "Signing Sparkle - Autoupdate..."
codesign --sign "${IDENTITY}" --options runtime --force --entitlements "${ENTITLEMENTS}" "${SPARKLE_AUTOUPDATE_BUNDLE}"
echo "Signing Sparkle..."
codesign --sign "${IDENTITY}" --options runtime --force --entitlements "${ENTITLEMENTS}" "${SPARKLE_FRAMEWORK}"
echo "Signing TransformerKit..."
codesign --sign "${IDENTITY}" --options runtime --force --entitlements "${ENTITLEMENTS}" "${TRANSFORMERKIT_FRAMEWORK}"
echo "Signing HNHUi..."
codesign --sign "${IDENTITY}" --options runtime --force --entitlements "${ENTITLEMENTS}" "${HNHUI_FRAMEWORK}"
echo "Signing KeePassKit - KissXML..."
codesign --sign "${IDENTITY}" --options runtime --force --entitlements "${ENTITLEMENTS}" "${KISSXML_FRAMEWORK}"
echo "Signing KeePassKit..."
codesign --sign "${IDENTITY}" --options runtime --force --entitlements "${ENTITLEMENTS}" "${KEEPASSKIT_FRAMEWORK}"
echo "Signing MacPass..."
codesign --sign "${IDENTITY}" --options runtime --force --entitlements "${ENTITLEMENTS}" "${APP_BUNDLE}"
echo ""
echo "Archiving..."
ditto -c -k --keepParent "${APP_BUNDLE}" "${APP_BUNDLE_ZIP}"
echo "Requesting Notarization..."
xcrun altool --notarize-app --primary-bundle-id "com.hicknhacksoftware.MacPass.zip" --username "${USERNAME}" --password "${PASSWORD}" --file "${APP_BUNDLE_ZIP}"
#xcrun stapler staple "${APP_BUNDLE}"
#xmllint --xpath "/plist/dict/key[contains(text(),'success-message')]::following-sibling" status.xml