20 Commits
0.7.1 ... 0.7.3

Author SHA1 Message Date
michael starke
e2e6c3e3f9 bumped version 2017-11-23 08:20:48 +01:00
michael starke
2495eac177 Fixes a bug resutling in a reappering password change promt when the database is already lock (fixes #696) 2017-11-23 08:20:18 +01:00
Moises Perez
278a0145d0 Improved or added localisations (#687) 2017-11-21 18:11:52 +01:00
michael starke
287356d93e fixed build warnings 2017-11-21 17:24:16 +01:00
michael starke
775dbd07ee Locking a db now requests a password/key if none is set 2017-11-21 12:32:41 +01:00
michael starke
547e61fc4b removed commented dead code 2017-11-21 12:32:17 +01:00
michael starke
ded8eeadb1 bumped version 2017-11-21 11:37:22 +01:00
michael starke
1bcb002ed0 Updated localizations 2017-11-21 11:31:41 +01:00
michael starke
4b5aa003bf Fixed wrong null placeholder settings for inspector view 2017-11-21 11:20:12 +01:00
michael starke
5f7331aa4d Updated localizations and comments 2017-11-21 11:17:21 +01:00
michael starke
bc2ee9a98f cleaned english .stings for inspector view 2017-11-21 11:16:56 +01:00
michael starke
4e5d491264 fixed stale entry display when database is locked 2017-11-21 10:55:36 +01:00
michael starke
74573de85f consolidated restart plugin code into one function 2017-11-21 10:49:16 +01:00
michael starke
d051421f14 Fixed issue resulting in opening the fix autotype window instead of a new document window (fixes #668)
This also fixes an isse resulting to save request not being shown when closing the document window but when closing the fix-autotype window.
2017-11-21 10:43:06 +01:00
michael starke
68a4864051 Display minimum version information (which might not be the file version!) 2017-11-20 19:36:54 +01:00
michael starke
15d1ce8419 Updated KeePassKit to fix crash on Reference resolving (fixes #693) 2017-11-20 12:56:05 +01:00
michael starke
7f43f3a7ba Minor change to localization 2017-11-20 12:51:48 +01:00
michael starke
c33c6a8cfa Plugin display is now more verbose
The plugin settings now displays more information about a failed plugin instead of just not displaying anything at all.
2017-11-20 12:51:39 +01:00
michael starke
ec62a3e12c Added missing german localization 2017-11-19 13:35:42 +01:00
michael starke
07a8085705 Extended plugin settings
Plugins can be installed via drag and drop
Plugins can be uninstalled via the remove button
2017-11-17 17:45:10 +01:00
55 changed files with 867 additions and 500 deletions

View File

@@ -1,3 +1,3 @@
github "sparkle-project/Sparkle" ~> 1.18.1
github "MacPass/KeePassKit" ~> 1.7.5
github "MacPass/KeePassKit" ~> 1.7.6
github "mstarke/HNHUi" ~> 1.4.1

View File

@@ -1,3 +1,3 @@
github "MacPass/KeePassKit" "1.7.6"
github "MacPass/KeePassKit" "1.7.7"
github "mstarke/HNHUi" "1.4.1"
github "sparkle-project/Sparkle" "1.18.1"

View File

@@ -247,6 +247,7 @@
4CEED1C617D7BD0E007180F1 /* NSError+Messages.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEED1C517D7BD0E007180F1 /* NSError+Messages.m */; };
4CF29BF417879D0000851B60 /* 26_FileSaveTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */; };
4CF5BE6D1BF33E3000048505 /* NSApplication+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF5BE6C1BF33E3000048505 /* NSApplication+MPAdditions.m */; };
4CF6C3021FBF39BF0055AD03 /* MPPluginTabelCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF6C3011FBF39BF0055AD03 /* MPPluginTabelCellView.m */; };
4CF6C711176F4533007A811D /* MPStringLengthValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF6C710176F4533007A811D /* MPStringLengthValueTransformer.m */; };
4CF78064176E75AD0032EE71 /* MPIntegrationSettingsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF78063176E75AD0032EE71 /* MPIntegrationSettingsController.m */; };
4CFB18E418A17FA20097A34B /* MPUpdateSettingsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFB18E318A17FA20097A34B /* MPUpdateSettingsController.m */; };
@@ -487,7 +488,6 @@
4C586FA116D07F6A00E7DB57 /* 02_MessageBoxWarningTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 02_MessageBoxWarningTemplate.pdf; sourceTree = "<group>"; };
4C5A11FB1708DE8700223D8A /* MPPasswordCreatorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordCreatorViewController.h; sourceTree = "<group>"; };
4C5A11FC1708DE8700223D8A /* MPPasswordCreatorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordCreatorViewController.m; sourceTree = "<group>"; };
4C5ADC2E17830AFB004E1E8D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InspectorView.strings; sourceTree = "<group>"; };
4C5ADC3017830B09004E1E8D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InspectorView.strings; sourceTree = "<group>"; };
4C5CD34017D158DE000B7F38 /* fr */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; lineEnding = 0; name = fr; path = fr.lproj/Localizable.strings; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.simpleColoring; };
4C5CD34117D158DE000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = fr; path = fr.lproj/Credits.rtf; sourceTree = "<group>"; };
@@ -497,6 +497,7 @@
4C5CD34617D15912000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/MainMenu.strings; sourceTree = "<group>"; };
4C5CD34717D1591A000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/PasswordInputView.strings; sourceTree = "<group>"; };
4C5CD34817D15920000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InspectorView.strings; sourceTree = "<group>"; };
4C5F72851FC4351E00929153 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InspectorView.strings; sourceTree = "<group>"; };
4C5FE9AC17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSelectedAttachmentTableCellView.h; sourceTree = "<group>"; };
4C5FE9AD17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSelectedAttachmentTableCellView.m; sourceTree = "<group>"; };
4C61EA0116D2FD0800AC519E /* MPOutlineViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOutlineViewController.h; sourceTree = "<group>"; };
@@ -642,7 +643,9 @@
4C89F523182FB4740069C73C /* MPAutotypeCommand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAutotypeCommand.m; sourceTree = "<group>"; };
4C8B36A917A6ED4B005E1FF1 /* MPOutlineContextMenuDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOutlineContextMenuDelegate.h; sourceTree = "<group>"; };
4C8B36AA17A6ED4B005E1FF1 /* MPOutlineContextMenuDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOutlineContextMenuDelegate.m; sourceTree = "<group>"; };
4C8C10061FC489D8003DDD5E /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/PluginSettings.strings; sourceTree = "<group>"; };
4C8DEAA11C314D2C00D24C32 /* MPTestAutotypeDelay.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTestAutotypeDelay.m; sourceTree = "<group>"; };
4C8FB9FA1FC2D0EF003691AA /* MPPlugin_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPlugin_Private.h; sourceTree = "<group>"; };
4C93C5701FBDFEF700F36855 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/AutotypeCandidateSelectionView.strings; sourceTree = "<group>"; };
4C93C5711FBDFEF900F36855 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/AutotypeBuilderView.strings; sourceTree = "<group>"; };
4C978E0C19AE54AB003067DF /* MPFlagsHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFlagsHelper.m; sourceTree = "<group>"; };
@@ -761,6 +764,8 @@
4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 26_FileSaveTemplate.pdf; sourceTree = "<group>"; };
4CF5BE6B1BF33E3000048505 /* NSApplication+MPAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSApplication+MPAdditions.h"; sourceTree = "<group>"; };
4CF5BE6C1BF33E3000048505 /* NSApplication+MPAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSApplication+MPAdditions.m"; sourceTree = "<group>"; };
4CF6C3001FBF39BF0055AD03 /* MPPluginTabelCellView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPluginTabelCellView.h; sourceTree = "<group>"; };
4CF6C3011FBF39BF0055AD03 /* MPPluginTabelCellView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPluginTabelCellView.m; sourceTree = "<group>"; };
4CF6C70F176F4533007A811D /* MPStringLengthValueTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPStringLengthValueTransformer.h; sourceTree = "<group>"; };
4CF6C710176F4533007A811D /* MPStringLengthValueTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPStringLengthValueTransformer.m; sourceTree = "<group>"; };
4CF78062176E75AD0032EE71 /* MPIntegrationSettingsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPIntegrationSettingsController.h; sourceTree = "<group>"; };
@@ -936,6 +941,8 @@
4CCEDE29179F203B008402BE /* MPOutlineView.m */,
4CE082C11F6FCD2A0034FF56 /* MPCollectionView.h */,
4CE082C21F6FCD2A0034FF56 /* MPCollectionView.m */,
4CF6C3001FBF39BF0055AD03 /* MPPluginTabelCellView.h */,
4CF6C3011FBF39BF0055AD03 /* MPPluginTabelCellView.m */,
);
name = Views;
sourceTree = "<group>";
@@ -1536,6 +1543,7 @@
isa = PBXGroup;
children = (
4CD034A41BFE113B003C002C /* MPPlugin.h */,
4C8FB9FA1FC2D0EF003691AA /* MPPlugin_Private.h */,
4CD034A51BFE113B003C002C /* MPPlugin.m */,
4CD034A81BFE113B003C002C /* MPPluginHost.h */,
4CD034A91BFE113B003C002C /* MPPluginHost.m */,
@@ -1867,6 +1875,7 @@
4C4B728518E4B9B400A1A5D5 /* MPDockTileHelper.m in Sources */,
4C5FE9AE17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.m in Sources */,
4C3666411787327E00B249F1 /* MPDocument+Attachments.m in Sources */,
4CF6C3021FBF39BF0055AD03 /* MPPluginTabelCellView.m in Sources */,
4C10412C178CDD44001B5239 /* NSDate+Humanized.m in Sources */,
4C0C59F118B17F10009C7B76 /* DDHotKeyUtilities.m in Sources */,
4CEE46DD181C301D006BF1E5 /* MPAutotypeDaemon.m in Sources */,
@@ -1933,6 +1942,7 @@
4C4161081F50333B003BC0AF /* es */,
4CA182761F96512800DD4A4A /* de */,
4C79B6411FB0562D008250D8 /* en */,
4C8C10061FC489D8003DDD5E /* nl */,
);
name = PluginSettings.xib;
sourceTree = "<group>";
@@ -2024,7 +2034,6 @@
isa = PBXVariantGroup;
children = (
4C7615701764C0E80015A1A6 /* Base */,
4C5ADC2E17830AFB004E1E8D /* en */,
4C5ADC3017830B09004E1E8D /* de */,
4C5CD34817D15920000B7F38 /* fr */,
601F811418E016340028F3DE /* zh-Hans */,
@@ -2033,6 +2042,7 @@
4825CC8C1C414D58003E37E9 /* it */,
4C840C4F1D773E5E0081F605 /* pl */,
4C4161091F50333B003BC0AF /* es */,
4C5F72851FC4351E00929153 /* en */,
);
name = InspectorView.xib;
sourceTree = "<group>";
@@ -2411,7 +2421,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 0.7.1;
CURRENT_PROJECT_VERSION = 0.7.3;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
@@ -2464,7 +2474,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "";
COPY_PHASE_STRIP = YES;
CURRENT_PROJECT_VERSION = 0.7.1;
CURRENT_PROJECT_VERSION = 0.7.3;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;

View File

@@ -30,6 +30,7 @@
<outlet property="enforceKeyChangeIntervalStepper" destination="lH4-xp-5QF" id="K1S-Og-OGK"/>
<outlet property="enforceKeyChangeIntervalTextField" destination="VYh-cm-fix" id="aqu-Dm-tlH"/>
<outlet property="enforceKeyChangeOnceCheckButton" destination="VMc-Qg-eCr" id="Ith-Jn-JVX"/>
<outlet property="fileVersionTextField" destination="1Ci-0B-yV5" id="hZ9-TU-hZE"/>
<outlet property="historyMaximumItemsStepper" destination="599" id="aRL-wb-JSA"/>
<outlet property="historyMaximumItemsTextField" destination="593" id="NrX-e0-8Dw"/>
<outlet property="historyMaximumSizeStepper" destination="1294" id="Jbo-ZY-5h6"/>
@@ -50,7 +51,7 @@
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="1">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="196" y="240" width="500" height="335"/>
<rect key="contentRect" x="196" y="240" width="500" height="360"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
<view key="contentView" id="2">
<rect key="frame" x="0.0" y="0.0" width="500" height="336"/>
@@ -88,11 +89,11 @@ Gw
<tabViewItems>
<tabViewItem label="General" identifier="1" id="358">
<view key="view" id="361">
<rect key="frame" x="10" y="33" width="454" height="242"/>
<rect key="frame" x="10" y="33" width="454" height="267"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="231">
<rect key="frame" x="154" y="200" width="280" height="22"/>
<rect key="frame" x="154" y="225" width="280" height="22"/>
<constraints>
<constraint firstAttribute="width" constant="280" id="cra-uC-nCv"/>
</constraints>
@@ -103,7 +104,7 @@ Gw
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="256">
<rect key="frame" x="70" y="176" width="78" height="17"/>
<rect key="frame" x="70" y="201" width="78" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Description:" id="257">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -111,7 +112,7 @@ Gw
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="189">
<rect key="frame" x="46" y="204" width="102" height="17"/>
<rect key="frame" x="46" y="229" width="102" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Database name:" id="190">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -119,7 +120,7 @@ Gw
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1394">
<rect key="frame" x="152" y="48" width="70" height="26"/>
<rect key="frame" x="152" y="73" width="70" height="26"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="1395">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@@ -132,7 +133,7 @@ Gw
</popUpButtonCell>
</popUpButton>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1404">
<rect key="frame" x="60" y="53" width="88" height="17"/>
<rect key="frame" x="60" y="78" width="88" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Compression:" id="1405">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -140,7 +141,7 @@ Gw
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1434">
<rect key="frame" x="107" y="23" width="41" height="17"/>
<rect key="frame" x="107" y="48" width="41" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Color:" id="1435">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -148,7 +149,7 @@ Gw
</textFieldCell>
</textField>
<colorWell translatesAutoresizingMaskIntoConstraints="NO" id="1439" customClass="HNHUIColorWell">
<rect key="frame" x="154" y="20" width="44" height="23"/>
<rect key="frame" x="154" y="45" width="44" height="23"/>
<constraints>
<constraint firstAttribute="width" constant="44" id="XBF-V3-71G"/>
<constraint firstAttribute="height" constant="23" id="fgN-h5-Mr8"/>
@@ -156,7 +157,7 @@ Gw
<color key="color" red="0.05813049898" green="0.055541899059999997" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</colorWell>
<scrollView horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1530">
<rect key="frame" x="154" y="92" width="280" height="100"/>
<rect key="frame" x="154" y="117" width="280" height="100"/>
<clipView key="contentView" id="WOI-1v-RCe">
<rect key="frame" x="1" y="1" width="278" height="98"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -185,14 +186,34 @@ Gw
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="RhU-5I-S5l">
<rect key="frame" x="75" y="20" width="73" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="File format:" id="bTk-YZ-x0G">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1Ci-0B-yV5">
<rect key="frame" x="152" y="20" width="72" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="VersionInfo" id="Ush-4r-A1A">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="RhU-5I-S5l" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="361" secondAttribute="leading" constant="20" symbolic="YES" id="2g6-05-Nm9"/>
<constraint firstItem="1439" firstAttribute="centerY" secondItem="1434" secondAttribute="centerY" id="3SK-ML-kPr"/>
<constraint firstItem="231" firstAttribute="top" secondItem="361" secondAttribute="top" constant="20" symbolic="YES" id="3xl-TE-tQd"/>
<constraint firstItem="231" firstAttribute="baseline" secondItem="189" secondAttribute="baseline" constant="1" id="46f-FB-PcR"/>
<constraint firstItem="1Ci-0B-yV5" firstAttribute="baseline" secondItem="RhU-5I-S5l" secondAttribute="baseline" id="4jg-Kd-kVn"/>
<constraint firstItem="1530" firstAttribute="top" secondItem="231" secondAttribute="bottom" constant="8" symbolic="YES" id="BRY-Gk-wEF"/>
<constraint firstItem="189" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="361" secondAttribute="leading" constant="20" symbolic="YES" id="EE1-wx-54f"/>
<constraint firstItem="1394" firstAttribute="leading" secondItem="231" secondAttribute="leading" id="EZ7-AG-XXT"/>
<constraint firstItem="1Ci-0B-yV5" firstAttribute="leading" secondItem="RhU-5I-S5l" secondAttribute="trailing" constant="8" symbolic="YES" id="GGY-c2-Uhw"/>
<constraint firstItem="1Ci-0B-yV5" firstAttribute="top" secondItem="1439" secondAttribute="bottom" constant="8" symbolic="YES" id="HGD-Tw-rab"/>
<constraint firstItem="1434" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="361" secondAttribute="leading" constant="20" symbolic="YES" id="ICF-se-FFb"/>
<constraint firstItem="1404" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="361" secondAttribute="leading" constant="20" symbolic="YES" id="LeH-TL-Zoq"/>
<constraint firstItem="1404" firstAttribute="centerY" secondItem="1394" secondAttribute="centerY" id="OSA-6P-L0N"/>
@@ -204,11 +225,13 @@ Gw
<constraint firstItem="1439" firstAttribute="top" secondItem="1394" secondAttribute="bottom" constant="8" symbolic="YES" id="ZeI-7b-IjZ"/>
<constraint firstItem="256" firstAttribute="trailing" secondItem="189" secondAttribute="trailing" id="al9-qI-MaZ"/>
<constraint firstItem="1394" firstAttribute="leading" secondItem="1439" secondAttribute="leading" id="bFE-Ho-9Zk"/>
<constraint firstAttribute="bottom" secondItem="1439" secondAttribute="bottom" constant="20" symbolic="YES" id="dCq-34-0z2"/>
<constraint firstItem="1394" firstAttribute="top" secondItem="1530" secondAttribute="bottom" constant="20" symbolic="YES" id="dfD-cv-lGp"/>
<constraint firstItem="RhU-5I-S5l" firstAttribute="trailing" secondItem="1434" secondAttribute="trailing" id="ff7-L0-hkA"/>
<constraint firstItem="256" firstAttribute="trailing" secondItem="1404" secondAttribute="trailing" id="gwL-uv-AGV"/>
<constraint firstAttribute="bottom" secondItem="1Ci-0B-yV5" secondAttribute="bottom" constant="20" symbolic="YES" id="js5-RZ-xg6"/>
<constraint firstItem="231" firstAttribute="leading" secondItem="189" secondAttribute="trailing" constant="8" symbolic="YES" id="uMg-uh-Qq6"/>
<constraint firstItem="256" firstAttribute="top" secondItem="189" secondAttribute="bottom" constant="11" id="z3y-bc-AMm"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="1Ci-0B-yV5" secondAttribute="trailing" constant="20" symbolic="YES" id="zL8-X5-0oc"/>
</constraints>
</view>
</tabViewItem>
@@ -727,7 +750,7 @@ Gw
<constraint firstItem="956" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="2" secondAttribute="leading" constant="20" symbolic="YES" id="Yla-YR-bgz"/>
</constraints>
</view>
<point key="canvasLocation" x="-1217" y="-566"/>
<point key="canvasLocation" x="-2020" y="-860"/>
</window>
</objects>
</document>

View File

@@ -134,7 +134,7 @@
<size key="maxSize" width="463" height="10000000"/>
<color key="insertionPointColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
<connections>
<binding destination="-2" name="editable2" keyPath="representedObject" previousBinding="3gj-Fz-0G8" id="unc-qC-MMH">
<binding destination="-2" name="editable2" keyPath="representedObject" previousBinding="3gj-Fz-0G8" id="AI9-fU-m4Z">
<dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
<integer key="NSNoSelectionPlaceholder" value="-1"/>
@@ -148,10 +148,11 @@
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
<binding destination="-2" name="value" keyPath="representedObject.notes" id="E0d-ZH-Wbc">
<binding destination="-2" name="value" keyPath="representedObject.notes" id="Xpb-G8-gXl">
<dictionary key="options">
<bool key="NSConditionallySetsEditable" value="NO"/>
<string key="NSNoSelectionPlaceholder">No Selection</string>
<string key="NSNullPlaceholder">None</string>
</dictionary>
</binding>
<outlet property="delegate" destination="-2" id="8oq-Ga-UQD"/>

View File

@@ -10,6 +10,8 @@
<customObject id="-2" userLabel="File's Owner" customClass="MPPluginSettingsController">
<connections>
<outlet property="addRemovePluginsControl" destination="B9Q-hq-K4N" id="Oqj-Ko-8UR"/>
<outlet property="fallbackDescriptionTextField" destination="qPL-FR-ky7" id="xCb-ED-NIX"/>
<outlet property="fallbackSettingsView" destination="wIk-iw-Tcz" id="dHl-zW-0aI"/>
<outlet property="loadInsecurePlugsinCheckButton" destination="CqP-oK-S8k" id="YET-o6-7Cc"/>
<outlet property="pluginTableView" destination="Ocu-C0-03d" id="jbH-qr-bVT"/>
<outlet property="settingsView" destination="tD5-Na-7XI" id="Pa0-Tt-20U"/>
@@ -26,6 +28,33 @@
<view key="contentView" id="tD5-Na-7XI">
<rect key="frame" x="1" y="1" width="326" height="349"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="wIk-iw-Tcz">
<rect key="frame" x="20" y="20" width="286" height="309"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="qPL-FR-ky7">
<rect key="frame" x="18" y="272" width="122" height="17"/>
<textFieldCell key="cell" controlSize="mini" sendsActionOnEndEditing="YES" title="Plugin Settings Info" id="OOr-SW-jZb">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="qPL-FR-ky7" firstAttribute="top" secondItem="wIk-iw-Tcz" secondAttribute="top" constant="20" symbolic="YES" id="BAH-sF-W03"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="qPL-FR-ky7" secondAttribute="trailing" constant="20" symbolic="YES" id="HKa-7h-OiN"/>
<constraint firstItem="qPL-FR-ky7" firstAttribute="leading" secondItem="wIk-iw-Tcz" secondAttribute="leading" constant="20" symbolic="YES" id="UTY-Lu-pvl"/>
<constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="qPL-FR-ky7" secondAttribute="bottom" constant="20" symbolic="YES" id="wpb-76-pxa"/>
</constraints>
</customView>
</subviews>
<constraints>
<constraint firstItem="wIk-iw-Tcz" firstAttribute="top" secondItem="tD5-Na-7XI" secondAttribute="top" constant="20" symbolic="YES" id="JEm-yQ-dbO"/>
<constraint firstAttribute="trailing" secondItem="wIk-iw-Tcz" secondAttribute="trailing" constant="20" symbolic="YES" id="Zfc-6L-EPa"/>
<constraint firstAttribute="bottom" secondItem="wIk-iw-Tcz" secondAttribute="bottom" constant="20" symbolic="YES" id="mGC-Qx-83s"/>
<constraint firstItem="wIk-iw-Tcz" firstAttribute="leading" secondItem="tD5-Na-7XI" secondAttribute="leading" constant="20" symbolic="YES" id="phc-Nv-2hD"/>
</constraints>
</view>
</box>
<button translatesAutoresizingMaskIntoConstraints="NO" id="CqP-oK-S8k">
@@ -44,13 +73,13 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<scrollView autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fCk-fL-jU8">
<scrollView autohidesScrollers="YES" horizontalLineScroll="37" horizontalPageScroll="10" verticalLineScroll="37" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fCk-fL-jU8">
<rect key="frame" x="20" y="50" width="150" height="345"/>
<clipView key="contentView" id="lTL-Q2-k45">
<rect key="frame" x="1" y="1" width="148" height="343"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" id="Ocu-C0-03d">
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="35" rowSizeStyle="automatic" viewBased="YES" id="Ocu-C0-03d">
<rect key="frame" x="0.0" y="0.0" width="148" height="343"/>
<autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/>
@@ -70,21 +99,38 @@
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView id="vVt-P3-yLp">
<rect key="frame" x="1" y="1" width="145" height="17"/>
<tableCellView id="vVt-P3-yLp" customClass="MPPluginTabelCellView">
<rect key="frame" x="1" y="1" width="145" height="35"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="q1P-PD-0LW">
<rect key="frame" x="0.0" y="0.0" width="100" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="fug-79-n9g">
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="q1P-PD-0LW">
<rect key="frame" x="0.0" y="18" width="127" height="17"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Table View Cell" id="fug-79-n9g">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fQy-Sz-4VA">
<rect key="frame" x="0.0" y="2" width="145" height="14"/>
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" title="Label" id="yuK-qH-jxx">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="fQy-Sz-4VA" secondAttribute="bottom" constant="2" id="Flm-uU-Rzj"/>
<constraint firstAttribute="trailing" secondItem="fQy-Sz-4VA" secondAttribute="trailing" constant="2" id="Iy0-iV-Mbx"/>
<constraint firstItem="fQy-Sz-4VA" firstAttribute="top" secondItem="q1P-PD-0LW" secondAttribute="bottom" constant="2" id="RZb-58-Zwr"/>
<constraint firstItem="q1P-PD-0LW" firstAttribute="leading" secondItem="vVt-P3-yLp" secondAttribute="leading" constant="2" id="bTc-2c-BYB"/>
<constraint firstAttribute="trailing" secondItem="q1P-PD-0LW" secondAttribute="trailing" constant="20" symbolic="YES" id="gSi-vN-xzX"/>
<constraint firstItem="q1P-PD-0LW" firstAttribute="top" secondItem="vVt-P3-yLp" secondAttribute="top" id="tTs-2E-33f"/>
<constraint firstItem="fQy-Sz-4VA" firstAttribute="leading" secondItem="vVt-P3-yLp" secondAttribute="leading" constant="2" id="zLP-Ci-nUM"/>
</constraints>
<connections>
<outlet property="addionalTextField" destination="fQy-Sz-4VA" id="nr7-5w-TEg"/>
<outlet property="textField" destination="q1P-PD-0LW" id="yB7-Uf-IIx"/>
</connections>
</tableCellView>
@@ -99,7 +145,7 @@
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="150" id="eXb-yq-O8y"/>
</constraints>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="UK5-gt-5o5">
<rect key="frame" x="1" y="133" width="148" height="16"/>
<rect key="frame" x="1" y="328" width="148" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="oqL-7I-4H1">
@@ -152,7 +198,7 @@
<constraint firstItem="vBs-Ga-aq0" firstAttribute="leading" secondItem="fCk-fL-jU8" secondAttribute="trailing" constant="8" id="xNu-Sj-xQO"/>
<constraint firstItem="aoG-FD-ds8" firstAttribute="top" secondItem="CqP-oK-S8k" secondAttribute="bottom" constant="8" symbolic="YES" id="zSW-h3-BrT"/>
</constraints>
<point key="canvasLocation" x="-214" y="11"/>
<point key="canvasLocation" x="-163" y="-18"/>
</customView>
</objects>
<resources>

View File

@@ -314,7 +314,7 @@ NSString *const MPHelpURLKey = @"MPHelpURL";
if(error != nil){
NSAlert *alert = [[NSAlert alloc] init];
[alert setMessageText: NSLocalizedString(@"FILE_OPEN_ERROR", nil)];
[alert setMessageText: NSLocalizedString(@"FILE_OPEN_ERROR", "Error while reopening last known documents")];
[alert setInformativeText: [error localizedDescription]];
[alert setAlertStyle:NSCriticalAlertStyle ];
[alert runModal];

View File

@@ -51,7 +51,7 @@
KPKEntry *entry = document.selectedEntries.count == 1 ? document.selectedEntries.lastObject : nil;
NSPasteboard *draggingPasteBoard = [info draggingPasteboard];
NSArray *arrayOfURLs = [draggingPasteBoard readObjectsForClasses:@[[NSURL class]] options:nil];
NSArray *arrayOfURLs = [draggingPasteBoard readObjectsForClasses:@[NSURL.class] options:nil];
for(NSURL *fileUrl in arrayOfURLs) {
[document addAttachment:fileUrl toEntry:entry];

View File

@@ -28,6 +28,7 @@
FOUNDATION_EXPORT NSString *const MPPasteBoardType;
FOUNDATION_EXPORT NSString *const MPKdbDocumentUTI;
FOUNDATION_EXPORT NSString *const MPKdbxDocumentUTI;
FOUNDATION_EXPORT NSString *const MPPluginUTI;
#endif

View File

@@ -22,6 +22,7 @@
#import "MPConstants.h"
NSString *const MPPasteBoardType = @"com.hicknhack.macpass.pasteboard";
NSString *const MPKdbDocumentUTI = @"com.hicknhack.macpass.kdb";
NSString *const MPKdbxDocumentUTI = @"com.hicknhack.macpass.kdbx";
NSString *const MPPasteBoardType = @"com.hicknhack.macpass.pasteboard";
NSString *const MPKdbDocumentUTI = @"com.hicknhack.macpass.kdb";
NSString *const MPKdbxDocumentUTI = @"com.hicknhack.macpass.kdbx";
NSString *const MPPluginUTI = @"com.hicknhack.macpass.plugin";

View File

@@ -41,6 +41,7 @@ typedef NS_ENUM(NSUInteger, MPDatabaseSettingsTab) {
@property (weak) IBOutlet NSPopUpButton *databaseCompressionPopupButton;
@property (unsafe_unretained) IBOutlet NSTextView *databaseDescriptionTextView;
@property (weak) IBOutlet NSColorWell *databaseColorColorWell;
@property (weak) IBOutlet NSTextField *fileVersionTextField;
/* Security Tab */
@property (weak) IBOutlet NSButton *createKeyDerivationParametersButton;

View File

@@ -204,10 +204,10 @@
return; // no document, just leave
}
/* Update all stuff that might have changed */
KPKMetaData *metaData = ((MPDocument *)self.document).tree.metaData;
[self _setupDatabaseTab:metaData];
[self _setupSecurityTab:metaData];
[self _setupAdvancedTab:((MPDocument *)self.document).tree];
KPKTree *tree = ((MPDocument *)self.document).tree;
[self _setupDatabaseTab:tree];
[self _setupSecurityTab:tree.metaData];
[self _setupAdvancedTab:tree];
self.isDirty = NO;
}
@@ -237,12 +237,30 @@
}
#pragma mark Private Helper
- (void)_setupDatabaseTab:(KPKMetaData *)metaData {
self.databaseNameTextField.stringValue = metaData.databaseName;
self.databaseDescriptionTextView.string = metaData.databaseDescription;
[self.databaseCompressionPopupButton selectItemAtIndex:metaData.compressionAlgorithm];
NSColor *databaseColor = metaData.color ? metaData.color : [NSColor clearColor];
self.databaseColorColorWell.color = databaseColor;
- (void)_setupDatabaseTab:(KPKTree *)tree {
self.databaseNameTextField.stringValue = tree.metaData.databaseName;
self.databaseDescriptionTextView.string = tree.metaData.databaseDescription;
[self.databaseCompressionPopupButton selectItemAtIndex:tree.metaData.compressionAlgorithm];
self.databaseColorColorWell.color = tree.metaData.color ? tree.metaData.color : NSColor.clearColor;
NSData *fileData = [NSData dataWithContentsOfURL:((MPDocument *)self.document).fileURL];
if(!fileData) {
self.fileVersionTextField.stringValue = NSLocalizedString(@"UNKNOWN_FORMAT_FILE_NOT_SAVED_YET", "Database format is unknown since the file is not saved yet");
}
else {
KPKFileVersion version = [[KPKFormat sharedFormat] fileVersionForData:fileData];
NSDictionary *nameMappings = @{
@(KPKDatabaseFormatKdb): @"Kdb",
@(KPKDatabaseFormatKdbx): @"Kdbx",
@(KPKDatabaseFormatUnknown): NSLocalizedString(@"UNKNOWN_FORMAT", "Unknown databas format.")
};
NSUInteger mayor = (version.version >> 16);
NSUInteger minor = (version.version & 0xFFFF);
self.fileVersionTextField.stringValue = [NSString stringWithFormat:@"%@ (Version %ld.%ld)", nameMappings[@(version.format)], mayor, minor];
}
}
- (void)_setupSecurityTab:(KPKMetaData *)metaData {

View File

@@ -42,9 +42,9 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul
- (void)enterSearchWithContext:(MPEntrySearchContext *)context {
/* the search context is loaded via defaults */
self.searchContext = context;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateSearch:) name:NSUndoManagerDidRedoChangeNotification object:self.undoManager];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateSearch:) name:NSUndoManagerDidUndoChangeNotification object:self.undoManager];
[[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidEnterSearchNotification object:self];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(updateSearch:) name:NSUndoManagerDidRedoChangeNotification object:self.undoManager];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(updateSearch:) name:NSUndoManagerDidUndoChangeNotification object:self.undoManager];
[NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidEnterSearchNotification object:self];
[self updateSearch:self];
}

View File

@@ -358,7 +358,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
- (void)mergeWithContentsFromURL:(NSURL *)url key:(KPKCompositeKey *)key {
NSError *error;
KPKTree *otherTree;
if(key) {
otherTree = [[KPKTree alloc] initWithContentsOfUrl:url key:key error:&error];
}
@@ -383,14 +383,14 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
[passwordInputController requestPasswordWithMessage:NSLocalizedString(@"EXTERN_CHANGE_OF_MASTERKEY", @"The master key was changed by an extrenal programm!")
cancelLabel:NSLocalizedString(@"ABORT_MERGE_KEEP_MINE", @"Button label to abort a merge on a file with changed master key!")
completionHandler:^BOOL(NSString *password, NSURL *keyURL, BOOL didCancel, NSError *__autoreleasing *error) {
[self.windowForSheet endSheet:sheet returnCode:(didCancel ? NSModalResponseCancel : NSModalResponseOK)];
if(!didCancel) {
KPKCompositeKey *compositeKey = [[KPKCompositeKey alloc] initWithPassword:password key:keyURL];
[self mergeWithContentsFromURL:url key:compositeKey];
}
// just return yes regardless since we will display the sheet again if needed!
return YES;
}];
[self.windowForSheet endSheet:sheet returnCode:(didCancel ? NSModalResponseCancel : NSModalResponseOK)];
if(!didCancel) {
KPKCompositeKey *compositeKey = [[KPKCompositeKey alloc] initWithPassword:password key:keyURL];
[self mergeWithContentsFromURL:url key:compositeKey];
}
// just return yes regardless since we will display the sheet again if needed!
return YES;
}];
sheet.contentViewController = passwordInputController;
[self.windowForSheet beginSheet:sheet completionHandler:^(NSModalResponse returnCode) { /* nothing to do, rest is done in other handler! */ }];
}
@@ -440,6 +440,8 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
}
self.tree = nil;
self.compositeKey = nil;
self.selectedGroups = nil;
self.selectedEntries = nil;
[NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidLockDatabaseNotification object:self];
}
@@ -636,10 +638,10 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
[self.undoManager enableUndoRegistration];
}
[newEntry addToGroup:parent];
[newEntry.undoManager setActionName:NSLocalizedString(@"NEW_ENTRY", "")];
[newEntry.undoManager setActionName:NSLocalizedString(@"NEW_ENTRY", "Action name for a newly created entry")];
[NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidAddEntryNotification
object:self
userInfo:@{ MPDocumentEntryKey: newEntry }];
object:self
userInfo:@{ MPDocumentEntryKey: newEntry }];
return newEntry;
}
@@ -661,7 +663,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
[self.undoManager enableUndoRegistration];
}
[newGroup addToGroup:parent];
[newGroup.undoManager setActionName:NSLocalizedString(@"NEW_GROUP", "")];
[newGroup.undoManager setActionName:NSLocalizedString(@"NEW_GROUP", "Action name for a newly created group")];
[NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidAddGroupNotification
object:self
userInfo:@{ MPDocumentGroupKey : newGroup }];
@@ -699,7 +701,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
[self.undoManager setActionName:permanent ? NSLocalizedString(@"DELETE_GROUP", "Delete Group") : NSLocalizedString(@"TRASH_GROUP", "Move Group to Trash")];
}
else if(node.asEntry) {
[self.undoManager setActionName:permanent ? NSLocalizedString(@"DELETE_ENTRY", "") : NSLocalizedString(@"TRASH_ENTRY", "Move Entry to Trash")];
[self.undoManager setActionName:permanent ? NSLocalizedString(@"DELETE_ENTRY", "Delete Entry") : NSLocalizedString(@"TRASH_ENTRY", "Move Entry to Trash")];
}
}
@@ -854,10 +856,8 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
break;
case MPActionDatabaseSettings:
case MPActionEditPassword:
valid &= !self.encrypted;
break;
case MPActionLock:
valid &= self.compositeKey.hasPasswordOrKeyFile;
valid &= !self.encrypted;
break;
case MPActionShowEntryHistory:
valid &= (nil != targetEntry);

View File

@@ -293,7 +293,7 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
if(!self.fixAutotypeWindowController) {
self.fixAutotypeWindowController = [[MPFixAutotypeWindowController alloc] init];
}
[self.document addWindowController:self.fixAutotypeWindowController];
self.fixAutotypeWindowController.document = self.document;
[self.fixAutotypeWindowController.window makeKeyAndOrderFront:sender];
}
@@ -342,13 +342,18 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
}
- (IBAction)lock:(id)sender {
MPDocument *document = [self document];
if(!document.compositeKey.hasPasswordOrKeyFile) {
return; // Document needs a password/keyfile to be lockable
}
MPDocument *document = self.document;
if(document.encrypted) {
return; // Document already locked
}
if(!document.compositeKey) {
[self editPasswordWithCompetionHandler:^(NSInteger result) {
if(result == NSModalResponseOK) {
[self lock:sender];
}
}];
return;
}
[document lockDatabase:sender];
}
@@ -556,7 +561,7 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
alert.informativeText = NSLocalizedString(@"RECOMMEND_PASSWORD_CHANGE_ALERT_DESCRIPTION", "Informative text for the recommend password change alert");
[alert addButtonWithTitle:NSLocalizedString(@"CHANGE_PASSWORD_WITH_DOTS", "Button to show the password change dialog")];
[alert addButtonWithTitle:NSLocalizedString(@"CANCEL", "Cancel button to postpone password change")];
[alert addButtonWithTitle:NSLocalizedString(@"CHANGE_LATER", "Button to postpone the password change")];
alert.buttons[1].keyEquivalent = [NSString stringWithFormat:@"%c", 0x1b];

View File

@@ -49,23 +49,22 @@ typedef NS_OPTIONS(NSUInteger, MPEntrySearchFlags) {
/* Wrap search criteria to be able to store them */
@interface MPEntrySearchContext : NSObject <NSSecureCoding,NSCopying>
/**
* Returns a default search context initialized with sane values.
*
* @return The default search context
*/
+ (instancetype)defaultContext;
@property (readonly, class) MPEntrySearchContext *defaultContext;
/**
* Returns the search context using the users preferences. If none are found, a default context is created
*
* @return Search context configured to the users data. If nothing is configures, defaultContext is used
*/
+ (instancetype)userContext;
- (instancetype)initWithString:(NSString *)searchString flags:(MPEntrySearchFlags)flags;
@property (readonly, class) MPEntrySearchContext *userContext;
@property (nonatomic, assign) NSInteger searchFlags;
@property (nonatomic, copy) NSString *searchString;
- (instancetype)initWithString:(NSString *)searchString flags:(MPEntrySearchFlags)flags;
@end

View File

@@ -68,7 +68,7 @@ NSString *const kMPIconCell = @"IconCell";
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[self.window orderOut:self];
[self.window performClose:self];
}

View File

@@ -75,11 +75,11 @@
[self.view layoutSubtreeIfNeeded];
NSMenu *autotypeMenu = self.autotypePopupButton.menu;
NSMenuItem *inheritAutotype = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOTYPE_INHERIT", "") action:NULL keyEquivalent:@""];
NSMenuItem *inheritAutotype = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOTYPE_INHERIT", "Inherit autotype settings menu item") action:NULL keyEquivalent:@""];
inheritAutotype.tag = KPKInherit;
NSMenuItem *enableAutotype = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOTYPE_YES", "") action:NULL keyEquivalent:@""];
NSMenuItem *enableAutotype = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOTYPE_YES", "Enable autotype menu item") action:NULL keyEquivalent:@""];
enableAutotype.tag = KPKInheritYES;
NSMenuItem *disableAutotype = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOTYPE_NO", "") action:NULL keyEquivalent:@""];
NSMenuItem *disableAutotype = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOTYPE_NO", "Disable autotype menu item") action:NULL keyEquivalent:@""];
disableAutotype.tag = KPKInheritNO;
[autotypeMenu addItem:inheritAutotype];
@@ -87,11 +87,11 @@
[autotypeMenu addItem:disableAutotype];
NSMenu *searchMenu = self.searchPopupButton.menu;
NSMenuItem *inheritSearch = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SEARCH_INHERIT", "") action:NULL keyEquivalent:@""];
NSMenuItem *inheritSearch = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SEARCH_INHERIT", "Inherit search settings menu item") action:NULL keyEquivalent:@""];
inheritSearch.tag = KPKInherit;
NSMenuItem *includeInSearch = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SEARCH_YES", "") action:NULL keyEquivalent:@""];
NSMenuItem *includeInSearch = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SEARCH_YES", "Enable search menu item") action:NULL keyEquivalent:@""];
includeInSearch.tag = KPKInheritYES;
NSMenuItem *excludeFromSearch = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SEARCH_NO", "") action:NULL keyEquivalent:@""];
NSMenuItem *excludeFromSearch = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SEARCH_NO", "Disable search menu item") action:NULL keyEquivalent:@""];
excludeFromSearch.tag = KPKInheritNO;
[searchMenu addItem:inheritSearch];
@@ -102,10 +102,11 @@
}
- (void)_establishBindings {
NSDictionary *nullPlaceholderOptionsDict = @ {NSNullPlaceholderBindingOption: NSLocalizedString(@"NONE", @"Null placeholder for item input field") };
[self.titleTextField bind:NSValueBinding
toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(title))]
options:@{NSNullPlaceholderBindingOption: NSLocalizedString(@"NONE", @"")}];
options:nullPlaceholderOptionsDict];
[self.expiresCheckButton bind:NSValueBinding
toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(timeInfo)), NSStringFromSelector(@selector(expires))]
@@ -121,7 +122,7 @@
[self.autotypeSequenceTextField bind:NSValueBinding
toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(defaultAutoTypeSequence))]
options:@{NSNullPlaceholderBindingOption: NSLocalizedString(@"NONE", @"")}];
options:nullPlaceholderOptionsDict];
[self.searchPopupButton bind:NSSelectedTagBinding
toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(isSearchEnabled))]

View File

@@ -47,9 +47,6 @@
@property (weak) IBOutlet NSButton *changePasswordButton;
@property (weak) IBOutlet NSButton *hasPasswordSwitchButton;
//@property (nonatomic,assign) BOOL allowsEmptyPasswordOrKey;
//@property (weak) id<MPPasswordEditWindowDelegate> delegate;
- (IBAction)clearKey:(id)sender;
- (IBAction)generateKey:(id)sender;

View File

@@ -33,6 +33,7 @@ FOUNDATION_EXPORT NSString *const kMPPluginFileExtension;
@property (copy, readonly) NSString *identifier;
@property (copy, readonly) NSString *name;
@property (copy, readonly) NSString *version;
@property (nonatomic, strong, readonly) NSBundle *bundle;
- (instancetype)initWithPluginHost:(MPPluginHost *)host NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
@@ -48,8 +49,6 @@ FOUNDATION_EXPORT NSString *const kMPPluginFileExtension;
@end
@class KPKTree;
@interface MPPlugin (Deprecated)
- (instancetype)initWithPluginManager:(id)manager;

View File

@@ -21,6 +21,7 @@
//
#import "MPPlugin.h"
#import "MPPlugin_Private.h"
#import "MPPluginHost.h"
#import "MPSettingsHelper.h"
@@ -28,15 +29,35 @@ NSString *const kMPPluginFileExtension = @"mpplugin";
@implementation MPPlugin
@synthesize bundle = _bundle;
- (instancetype)initWithPluginHost:(MPPluginHost *)host {
self = [super init];
if(self) {
_enabled = YES;
}
return self;
}
- (NSBundle *)bundle {
if(_enabled) {
return [NSBundle bundleForClass:self.class];
}
else {
return _bundle;
}
}
- (void)setBundle:(NSBundle *)bundle {
self.enabled = NO;
if(_bundle != bundle) {
_bundle = bundle;
}
}
- (NSString *)identifier {
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
if(bundle && bundle.bundleIdentifier) {
return bundle.bundleIdentifier;
if(self.bundle.bundleIdentifier) {
return self.bundle.bundleIdentifier;
}
return [NSString stringWithFormat:@"unknown.bundle.identifier"];
}
@@ -47,11 +68,16 @@ NSString *const kMPPluginFileExtension = @"mpplugin";
}
- (NSString *)version {
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSString *version;
if(bundle) {
version = bundle.infoDictionary[(NSString *)kCFBundleVersionKey];
if(version) {
if(self.bundle) {
NSString *humanVersion = self.bundle.infoDictionary[@"CFBundleShortVersionString"];
NSString *version = self.bundle.infoDictionary[(NSString *)kCFBundleVersionKey];
if(humanVersion && version) {
return [NSString stringWithFormat:@"%@ (%@)", humanVersion, version];
}
else if(humanVersion) {
return humanVersion;
}
else if(version) {
return version;
}
}
@@ -71,7 +97,7 @@ NSString *const kMPPluginFileExtension = @"mpplugin";
NSLog(@"Deprecated initalizer. Use initWithPluginHost: instead!");
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnonnull"
self = [self initWithPluginHost:nil];
self = [self initWithPluginHost:manager];
#pragma cland diagnostic pop
return self;
}

View File

@@ -31,6 +31,7 @@ FOUNDATION_EXPORT NSString *const MPPluginHostPluginBundleIdentifiyerKey;
@interface MPPluginHost : NSObject
/* List of all plugins known to the plugin manager. Disabled plugins are also present! */
@property (readonly, copy) NSArray <MPPlugin __kindof*> *plugins;
@property (nonatomic, readonly) BOOL loadUnsecurePlugins;
@@ -39,5 +40,8 @@ FOUNDATION_EXPORT NSString *const MPPluginHostPluginBundleIdentifiyerKey;
- (instancetype)init NS_UNAVAILABLE;
- (BOOL)installPluginAtURL:(NSURL *)url error:(NSError *__autoreleasing *)error;
- (BOOL)uninstallPlugin:(MPPlugin *)plugin error:(NSError *__autoreleasing *)error;
- (void)disablePlugin:(MPPlugin *)plugin;
- (void)enablePlugin:(MPPlugin *)plugin;
@end

View File

@@ -23,6 +23,7 @@
#import "MPPluginHost.h"
#import "MPPlugin.h"
#import "MPPlugin_Private.h"
#import "NSApplication+MPAdditions.h"
#import "MPSettingsHelper.h"
@@ -37,10 +38,10 @@ NSString *const MPPluginHostDidLoadPlugin = @"comt.hicknhack.macpass.MPPluginHos
NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBundleIdentifiyerKey";
@interface MPPluginHost () <NSFileManagerDelegate>
@interface MPPluginHost ()
@property (strong) NSMutableArray<MPPlugin __kindof *> *mutablePlugins;
@property (nonatomic) BOOL loadUnsecurePlugins;
@property (copy) NSArray<NSString *> *disabledPlugins;
@end
@@ -67,13 +68,18 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
self = [super init];
if(self) {
_mutablePlugins = [[NSMutableArray alloc] init];
_disabledPlugins = [[NSUserDefaults standardUserDefaults] arrayForKey:kMPSettingsKeyLoadUnsecurePlugins];
_loadUnsecurePlugins = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyLoadUnsecurePlugins];
[self _loadPlugins];
[self bind:NSStringFromSelector(@selector(loadUnsecurePlugins))
toObject:[NSUserDefaultsController sharedUserDefaultsController]
toObject:NSUserDefaultsController.sharedUserDefaultsController
withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyLoadUnsecurePlugins]
options:nil];
[self bind:NSStringFromSelector(@selector(disabledPlugins))
toObject:NSUserDefaultsController.sharedUserDefaultsController
withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyDisabledPlugins]
options:nil];
}
return self;
}
@@ -83,7 +89,7 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
}
- (BOOL)installPluginAtURL:(NSURL *)url error:(NSError *__autoreleasing *)error {
if(![self _validURL:url]) {
if(![self _isValidPluginURL:url]) {
if(error) {
*error = [NSError errorWithCode:MPErrorInvalidPlugin description:NSLocalizedString(@"ERROR_INVALID_PLUGIN", @"Error description given when adding an invalid plugin")];
}
@@ -95,32 +101,37 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
}
NSURL *appSupportURL = [NSApp applicationSupportDirectoryURL:YES];
NSURL *destinationURL = [appSupportURL URLByAppendingPathComponent:fileName];
NSFileManager.defaultManager.delegate = self;
return [NSFileManager.defaultManager moveItemAtURL:url toURL:destinationURL error:error];
}
#pragma mark - NSFileManagerDelegate
- (BOOL)fileManager:(NSFileManager *)fileManager shouldProceedAfterError:(NSError *)error movingItemAtURL:(NSURL *)srcURL toURL:(NSURL *)dstURL {
return NO;
- (BOOL)uninstallPlugin:(MPPlugin *)plugin error:(NSError *__autoreleasing *)error {
return [NSFileManager.defaultManager trashItemAtURL:plugin.bundle.bundleURL resultingItemURL:nil error:error];
}
- (void)disablePlugin:(MPPlugin *)plugin {
}
- (void)enablePlugin:(MPPlugin *)plugin {
}
#pragma mark - Plugin Loading
- (void)_loadPlugins {
NSURL *appSupportDir = [NSApp applicationSupportDirectoryURL:YES];
NSError *error;
NSLog(@"Looking for external plugins at %@.", appSupportDir.path);
NSArray *externalPluginsURLs = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:appSupportDir
includingPropertiesForKeys:@[]
options:NSDirectoryEnumerationSkipsHiddenFiles
error:&error];
NSLog(@"Looking for internal plugins");
NSArray *internalPluginsURLs = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:[NSBundle mainBundle].builtInPlugInsURL
includingPropertiesForKeys:@[]
options:NSDirectoryEnumerationSkipsHiddenFiles
error:&error];
if(!externalPluginsURLs) {
// No external plugins
NSLog(@"No external plugins found!");
@@ -132,23 +143,31 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
NSArray *pluginURLs = [externalPluginsURLs arrayByAddingObjectsFromArray:internalPluginsURLs];
for(NSURL *pluginURL in pluginURLs) {
if(![self _validURL:pluginURL]) {
if(![self _isValidPluginURL:pluginURL]) {
NSLog(@"Skipping %@. No valid plugin file.", pluginURL.path);
continue;
}
if(![self _validSignature:pluginURL]) {
continue;
}
NSBundle *pluginBundle = [NSBundle bundleWithURL:pluginURL];
if(!pluginBundle) {
NSLog(@"Could not create bundle %@", pluginURL.path);
NSLog(@"Could not access plugin bundle %@", pluginURL.path);
continue;
}
if(![self _isSignedPluginURL:pluginURL]) {
if(self.loadUnsecurePlugins) {
NSLog(@"Loading unsecure Plugin at %@.", pluginURL.path);
}
else {
[self _addPluginForBundle:pluginBundle error:NSLocalizedString(@"PLUGIN_ERROR_UNSECURE_PLUGIN", "Error for a plugin that was not signed properly")];
continue;
}
}
NSError *error;
if(![pluginBundle preflightAndReturnError:&error]) {
NSLog(@"Preflight Error %@ %@", error.localizedDescription, error.localizedFailureReason );
[self _addPluginForBundle:pluginBundle error:error.localizedDescription];
continue;
};
@@ -159,18 +178,28 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
if(![pluginBundle loadAndReturnError:&error]) {
NSLog(@"Bundle Loading Error %@ %@", error.localizedDescription, error.localizedFailureReason);
[self _addPluginForBundle:pluginBundle error:error.localizedDescription];
continue;
}
if(![self _validateClass:pluginBundle.principalClass]) {
if(![self _isValidPluginClass:pluginBundle.principalClass]) {
NSLog(@"Wrong principal Class.");
[self _addPluginForBundle:pluginBundle error:NSLocalizedString(@"PLUGIN_ERROR_WRONG_PRINCIPAL_CLASS", "Plugin specifies the wrong principla class!".)];
continue;
}
if([pluginBundle.principalClass instancesRespondToSelector:NSSelectorFromString(@"initWithPluginManager:")]) {
NSLog(@"Plugin uses old interface. Update plugin to use initWithPluginHost: instead of initWithPluginManager:!");
}
MPPlugin *plugin = [[pluginBundle.principalClass alloc] initWithPluginHost:self];
IMP defaultImp = [MPPlugin.class instanceMethodForSelector:@selector(initWithPluginManager:)];
IMP pluginImp = [pluginBundle.principalClass instanceMethodForSelector:@selector(initWithPluginManager:)];
MPPlugin *plugin;
if(defaultImp != pluginImp) {
NSLog(@"Plugin uses old interface. Update plugin to use initWithPluginHost: instead of initWithPluginManager:!");
plugin = [[pluginBundle.principalClass alloc] initWithPluginManager:self];
}
else {
plugin = [[pluginBundle.principalClass alloc] initWithPluginHost:self];
}
if(plugin) {
NSLog(@"Loaded plugin instance %@", pluginBundle.principalClass);
[[NSNotificationCenter defaultCenter] postNotificationName:MPPluginHostWillLoadPlugin
@@ -183,10 +212,19 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
}
else {
NSLog(@"Unable to create instance of plugin class %@", pluginBundle.principalClass);
[self _addPluginForBundle:pluginBundle error:NSLocalizedString(@"PLUGIN_ERROR_INTILIZATION_FAILED", "The plugin could not be initalized".)];
}
}
}
- (void)_addPluginForBundle:(NSBundle *)bundle error:(NSString *)errorMessage {
MPPlugin *plugin = [[MPPlugin alloc] initWithPluginHost:self];
plugin.bundle = bundle;
plugin.enabled = NO;
plugin.errorMessage = errorMessage;
[self.mutablePlugins addObject:plugin];
}
- (BOOL)_validateUniqueBundle:(NSBundle *)bundle {
for(MPPlugin *plugin in self.mutablePlugins) {
NSBundle *pluginBundle = [NSBundle bundleForClass:plugin.class];
@@ -197,24 +235,20 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
return NO;
}
- (BOOL)_validURL:(NSURL *)url {
- (BOOL)_isValidPluginURL:(NSURL *)url {
return (NSOrderedSame == [url.pathExtension compare:kMPPluginFileExtension options:NSCaseInsensitiveSearch]);
}
- (BOOL)_validateClass:(Class)class {
- (BOOL)_isValidPluginClass:(Class)class {
return [class isSubclassOfClass:[MPPlugin class]];
}
/* Code by Jedda Wignall<jedda@jedda.me> http://jedda.me/2012/03/verifying-plugin-bundles-using-code-signing/ */
- (BOOL)_validSignature:(NSURL *)url {
- (BOOL)_isSignedPluginURL:(NSURL *)url {
if(!url.path) {
return NO;
}
if(self.loadUnsecurePlugins) {
return YES;
}
NSTask * task = [[NSTask alloc] init];
NSPipe * pipe = [NSPipe pipe];
NSArray* args = @[ @"--verify",
@@ -234,16 +268,16 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
NSString * taskString = [[NSString alloc] initWithData:pipe.fileHandleForReading.readDataToEndOfFile encoding:NSASCIIStringEncoding];
if ([taskString rangeOfString:@"modified"].length > 0 || [taskString rangeOfString:@"a sealed resource is missing or invalid"].length > 0) {
// The plugin has been modified or resources removed since being signed. You probably don't want to load this.
NSLog(@"Plugin %@ modified - not loaded", pluginPath); // log a real error here
NSLog(@"Plugin %@ modified", pluginPath); // log a real error here
}
else if ([taskString rangeOfString:@"failed to satisfy"].length > 0) {
// The plugin is missing resources since being signed. Don't load.
// throw an error
NSLog(@"Plugin %@ not signed by correct CA - not loaded", pluginPath); // log a real error here
NSLog(@"Plugin %@ not signed by correct CA", pluginPath); // log a real error here
}
else if ([taskString rangeOfString:@"not signed at all"].length > 0) {
// The plugin was not code signed at all. Don't load.
NSLog(@"Plugin %@ not signed at all - don't load.", pluginPath); // log a real error here
NSLog(@"Plugin %@ not signed at all.", pluginPath); // log a real error here
}
else {
NSLog(@"Unkown CodeSign Error!");
@@ -252,5 +286,4 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
return NO;
}
@end

View File

@@ -21,9 +21,12 @@
//
#import "MPPluginSettingsController.h"
#import "MPPluginTabelCellView.h"
#import "MPPluginHost.h"
#import "MPPlugin.h"
#import "MPPlugin_Private.h"
#import "MPConstants.h"
#import "MPSettingsHelper.h"
#import "NSApplication+MPAdditions.h"
@@ -39,6 +42,8 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
@property (weak) IBOutlet NSTableView *pluginTableView;
@property (weak) IBOutlet NSView *settingsView;
@property (strong) IBOutlet NSView *fallbackSettingsView;
@property (weak) IBOutlet NSTextField *fallbackDescriptionTextField;
@property (weak) IBOutlet NSButton *loadInsecurePlugsinCheckButton;
@property (weak) IBOutlet NSSegmentedControl *addRemovePluginsControl;
@@ -66,37 +71,60 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
self.pluginTableView.delegate = self;
self.pluginTableView.dataSource = self;
[self.addRemovePluginsControl setEnabled:NO forSegment:MPRemovePluginSegment];
[self.fallbackSettingsView removeFromSuperview];
[self.loadInsecurePlugsinCheckButton bind:NSValueBinding
toObject:[NSUserDefaultsController sharedUserDefaultsController]
withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyLoadUnsecurePlugins]
options:nil];
[self.pluginTableView registerForDraggedTypes:@[(NSString *)kUTTypeFileURL]];
}
# pragma mark - TableView
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return [MPPluginHost sharedHost].plugins.count;
}
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
MPPlugin *plugin = [self pluginForRow:row];
NSTableCellView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:nil];
view.textField.stringValue = plugin.name;
MPPluginTabelCellView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:nil];
if(plugin.enabled) {
view.textField.stringValue = plugin.name;
}
else {
view.textField.stringValue = (plugin.errorMessage.length > 0
? [NSString stringWithFormat:NSLocalizedString(@"PLUGIN_NAME_ERROR_%@", "Name for unloaded plugin with errors"), plugin.name]
: [NSString stringWithFormat:NSLocalizedString(@"PLUGIN_NAME_DISABLED_%@", "name for disabled unloaded plugin"), plugin.name]);
}
view.addionalTextField.stringValue = [NSString stringWithFormat:NSLocalizedString(@"PLUGIN_VERSION_%@", "Plugin version. Include a %@ placeholder for version string"), plugin.version];
return view;
}
- (void)showSettingsForPlugin:(MPPlugin *)plugin {
/* move old one regardless */
[self.settingsView.subviews.firstObject removeFromSuperview];
if([plugin conformsToProtocol:@protocol(MPPluginSettings)]) {
NSAssert([plugin respondsToSelector:@selector(settingsViewController)], @"Required getter for settings on plugins");
NSViewController *viewController = ((id<MPPluginSettings>)plugin).settingsViewController;
[self.settingsView addSubview:viewController.view];
NSDictionary *dict = @{ @"view" : viewController.view,
if(plugin.enabled) {
if([plugin conformsToProtocol:@protocol(MPPluginSettings)]) {
NSAssert([plugin respondsToSelector:@selector(settingsViewController)], @"Required getter for settings on plugins");
NSViewController *viewController = ((id<MPPluginSettings>)plugin).settingsViewController;
[self.settingsView addSubview:viewController.view];
NSDictionary *dict = @{ @"view" : viewController.view,
@"table" : self.pluginTableView.enclosingScrollView };
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:dict]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:dict]];
}
}
else if(nil != plugin) {
[self.settingsView addSubview:self.fallbackSettingsView];
NSDictionary *dict = @{ @"view" : self.fallbackSettingsView,
@"table" : self.pluginTableView.enclosingScrollView };
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:dict]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:dict]];
if(plugin.errorMessage.length > 0) {
self.fallbackDescriptionTextField.stringValue = plugin.errorMessage;
}
else {
self.fallbackDescriptionTextField.stringValue = NSLocalizedString(@"PLUGIN_SETTINGS_GENERIC_ERROR_MESSAGE", "Generic message displayed if no details are know why a plugin was not loaded.");
}
}
}
@@ -110,11 +138,48 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
- (void)tableViewSelectionDidChange:(NSNotification *)notification {
NSTableView *table = notification.object;
if(table != self.pluginTableView) {
return; // wrong tableview
}
MPPlugin *plugin = [self pluginForRow:table.selectedRow];
//[self.addRemovePluginsControl setEnabled:(nil != plugin) forSegment:MPRemovePluginSegment];
[self.addRemovePluginsControl setEnabled:(nil != plugin) forSegment:MPRemovePluginSegment];
[self showSettingsForPlugin:plugin];
}
- (NSDragOperation)tableView:(NSTableView *)tableView validateDrop:(id <NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)dropOperation {
NSArray *arrayOfURLs = [[info draggingPasteboard] readObjectsForClasses:@[NSURL.class] options:nil];
if(arrayOfURLs.count != 1) {
return NO;
}
NSURL *pluginURL = arrayOfURLs.firstObject;
if(!pluginURL.isFileURL) {
return NO;
}
if(![pluginURL.lastPathComponent.pathExtension isEqualToString:kMPPluginFileExtension]) {
return NO;
}
[tableView setDropRow:-1 dropOperation:NSTableViewDropOn];
return YES;
}
- (BOOL)tableView:(NSTableView *)tableView acceptDrop:(nonnull id<NSDraggingInfo>)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)dropOperation {
/* dispatch installation since we do not want to wait for the result */
if(dropOperation != NSTableViewDropOn) {
return NO;
}
NSPasteboard *draggingPasteboard = [info draggingPasteboard];
NSArray *arrayOfURLs = [draggingPasteboard readObjectsForClasses:@[NSURL.class] options:nil];
if(arrayOfURLs.count != 1) {
return NO;
}
dispatch_async(dispatch_get_main_queue(), ^{
[self _addPlugin:arrayOfURLs.firstObject];
});
return YES;
}
#pragma mark - Actions
- (IBAction)browsePlugins:(id)sender {
[NSWorkspace.sharedWorkspace openURL:[NSApp applicationSupportDirectoryURL:YES]];
}
@@ -128,6 +193,7 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
[self showAddPluginPanel];
break;
case MPRemovePluginSegment:
[self showRemovePluginAlert];
break;
default:
break;
@@ -146,7 +212,7 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
if(NSModalResponseOK) {
if(openPanel.URLs.count == 1) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self _addPlugin:openPanel.URLs.firstObject];
[self _addPlugin:openPanel.URLs.firstObject];
});
}
}
@@ -159,18 +225,50 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
[NSApp presentError:error modalForWindow:self.view.window delegate:nil didPresentSelector:NULL contextInfo:NULL];
}
else {
NSAlert *alert = [[NSAlert alloc] init];
alert.alertStyle = NSAlertStyleInformational;
alert.messageText = NSLocalizedString(@"ALERT_MESSAGE_TEXT_PLUGIN_INSTALLED_SUGGEST_RESTART", "Alert message text when a plugin was successfully installed");
alert.informativeText = NSLocalizedString(@"ALERT_INFORMATIVE_TEXT_PLUGIN_INSTALLED_SUGGEST_RESTART", "ALert informative text when a plugin was sucessfully installed");
[alert addButtonWithTitle:NSLocalizedString(@"CANCEL", @"Cancel button in plugin installed, request restart alert")];
[alert addButtonWithTitle:NSLocalizedString(@"RESTART", @"Restart button in plugin installed, request restart alert")];
[alert beginSheetModalForWindow:self.view.window completionHandler:^(NSModalResponse returnCode) {
if(returnCode == NSAlertSecondButtonReturn) {
[NSApp relaunchAfterDelay:3];
}
}];
[self _showRestartAlert];
}
}
- (void)showRemovePluginAlert {
MPPlugin *plugin = [self pluginForRow:self.pluginTableView.selectedRow];
if(!plugin) {
return;
}
NSAlert *alert = [[NSAlert alloc] init];
alert.alertStyle = NSAlertStyleWarning;
alert.messageText = [NSString stringWithFormat:NSLocalizedString(@"ALERT_MESSAGE_TEXT_REALLY_UNINSTALL_PLUGIN_%@", "Alert message text to ask the user if he really want to uninstall the plugin. Include %@ placeholder for plugin name"), plugin.name];
alert.informativeText = NSLocalizedString(@"ALERT_INFORMATIVE_TEXT_REALLY_UNINSTALL_PLUGIN", "Alert informative text to ask the user if he really want to uninstall the plugin");
[alert addButtonWithTitle:NSLocalizedString(@"UNINSTALL", @"Uninstall plugin")];
[alert addButtonWithTitle:NSLocalizedString(@"KEEP_PLUGIN", @"Do not install the plugin")];
[alert beginSheetModalForWindow:self.view.window completionHandler:^(NSModalResponse returnCode) {
if(returnCode == NSAlertFirstButtonReturn) {
[self _removePlugin:plugin];
}
}];
}
- (void)_removePlugin:(MPPlugin *)plugin {
NSError *error;
if(![[MPPluginHost sharedHost] uninstallPlugin:plugin error:&error]) {
[NSApp presentError:error modalForWindow:self.view.window delegate:nil didPresentSelector:NULL contextInfo:NULL];
}
else {
[self _showRestartAlert];
}
}
- (void)_showRestartAlert {
NSAlert *alert = [[NSAlert alloc] init];
alert.alertStyle = NSAlertStyleInformational;
alert.messageText = NSLocalizedString(@"ALERT_MESSAGE_PLUGINS_CHANGED_SUGGEST_RESTART", "Alert message text when plugins or their settings change and require a restart");
alert.informativeText = NSLocalizedString(@"ALERT_INFORMATIVE_TEXT_PLUGINS_CHANGED_SUGGEST_RESTART", "Alert informative text when plugins or their settings change and require a restart");
[alert addButtonWithTitle:NSLocalizedString(@"RESTART", @"Restart")];
[alert addButtonWithTitle:NSLocalizedString(@"KEEP_RUNNING", @"Do not restart MacPass")];
[alert beginSheetModalForWindow:self.view.window completionHandler:^(NSModalResponse returnCode) {
if(returnCode == NSAlertFirstButtonReturn) {
[NSApp relaunchAfterDelay:3];
}
}];
}
@end

View File

@@ -0,0 +1,15 @@
//
// MPPluginTabelCellView.h
// MacPass
//
// Created by Michael Starke on 17.11.17.
// Copyright © 2017 HicknHack Software GmbH. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface MPPluginTabelCellView : NSTableCellView
@property (weak) IBOutlet NSTextField *addionalTextField;
@end

View File

@@ -0,0 +1,13 @@
//
// MPPluginTabelCellView.m
// MacPass
//
// Created by Michael Starke on 17.11.17.
// Copyright © 2017 HicknHack Software GmbH. All rights reserved.
//
#import "MPPluginTabelCellView.h"
@implementation MPPluginTabelCellView
@end

View File

@@ -0,0 +1,17 @@
//
// MPPlugin+Private.h
// MacPass
//
// Created by Michael Starke on 20.11.17.
// Copyright © 2017 HicknHack Software GmbH. All rights reserved.
//
#import "MPPlugin.h"
@interface MPPlugin ()
@property (nonatomic, strong) NSBundle *bundle;
@property (copy) NSString *errorMessage;
@property BOOL enabled;
@end

View File

@@ -79,6 +79,7 @@ APPKIT_EXTERN NSString *const kMPSettingsKeyUpdatePasswordOnTemplateEntries;
/* Plugins */
APPKIT_EXTERN NSString *const kMPSettingsKeyLoadUnsecurePlugins; // If set to YES this will load all plugins regardless of their codesignature status
APPKIT_EXTERN NSString *const kMPSettingsKeyDisabledPlugins; // NSArray of bundle identifiers of disabled plugins
typedef NS_ENUM(NSUInteger, MPFileChangeStrategy) {
MPFileChangeStrategyAsk,

View File

@@ -74,7 +74,8 @@ NSString *const kMPSettingsKeyDoubleClickURLAction = @"Double
NSString *const kMPSettingsKeyDoubleClickTitleAction = @"DoubleClickTitleAction";
NSString *const kMPSettingsKeyUpdatePasswordOnTemplateEntries = @"UpdatePasswordOnTemplateEntries";
NSString *const kMPSettingsKeyLoadUnsecurePlugins = @"MPLoadUnsecurePlugins";
NSString *const kMPSettingsKeyLoadUnsecurePlugins = @"LoadUnsecurePlugins";
NSString *const kMPSettingsKeyDisabledPlugins = @"DisabledPlugins";
/* Deprecated */
NSString *const kMPDeprecatedSettingsKeyRememberKeyFilesForDatabases = @"kMPSettingsKeyRememberKeyFilesForDatabases";
@@ -86,6 +87,7 @@ NSString *const kMPDeprecatedSettingsKeyHttpPort = @"Ht
NSString *const kMPDeprecatedSettingsKeyEnableHttpServer = @"EnableHttpServer";
NSString *const kMPDeprecatedSettingsKeyShowMenuItem = @"ShowMenuItem";
NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"KeyDefaultPasswordRounds";
NSString *const kMPDepricatedSettingsKeyLoadUnsecurePlugins = @"MPLoadUnsecurePlugins";
@implementation MPSettingsHelper
@@ -99,6 +101,7 @@ NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"Ke
[self _migrateURLDoubleClickPreferences];
[self _migrateEntrySearchFlags];
[self _migrateRememberedKeyFiles];
[self _migrateLoadUnsecurePlugins];
[self _removeDeprecatedValues];
}
@@ -143,7 +146,8 @@ NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"Ke
kMPSettingsKeyDoubleClickURLAction: @(MPDoubleClickURLActionCopy),
kMPSettingsKeyDoubleClickTitleAction: @(MPDoubleClickTitleActionInspect),
kMPSettingsKeyLoadUnsecurePlugins: @NO,
kMPSettingsKeyUpdatePasswordOnTemplateEntries: @YES
kMPSettingsKeyUpdatePasswordOnTemplateEntries: @YES,
kMPSettingsKeyDisabledPlugins: @[]
};
});
return standardDefaults;
@@ -162,7 +166,8 @@ NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"Ke
/* Moved to KeePassHttp Plugin */
kMPDeprecatedSettingsKeyHttpPort,
kMPDeprecatedSettingsKeyEnableHttpServer,
kMPDeprecatedSettingsKeyShowMenuItem
kMPDeprecatedSettingsKeyShowMenuItem,
kMPDepricatedSettingsKeyLoadUnsecurePlugins
];
});
return deprecatedSettings;
@@ -251,4 +256,16 @@ NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"Ke
}
}
+ (void)_migrateLoadUnsecurePlugins {
id value = [NSUserDefaults.standardUserDefaults objectForKey:kMPDepricatedSettingsKeyLoadUnsecurePlugins];
if(!value) {
return; // value already migrated or was set to default value
}
BOOL oldValue = [NSUserDefaults.standardUserDefaults boolForKey:kMPDepricatedSettingsKeyLoadUnsecurePlugins];
if(oldValue != [[self _standardDefaults][kMPDepricatedSettingsKeyLoadUnsecurePlugins] boolValue]) {
[NSUserDefaults.standardUserDefaults setBool:oldValue forKey:kMPSettingsKeyLoadUnsecurePlugins];
}
}
@end

View File

@@ -68,7 +68,7 @@
<key>MPHelpURL</key>
<string>https://github.com/mstarke/MacPass</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2012-2016 HicknHack Software GmbH. All rights reserved.</string>
<string>Copyright © 2012-2017 HicknHack Software GmbH. All rights reserved.</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>

View File

@@ -8,7 +8,7 @@
"TN3-3a-LaA.title" = "Inhalt";
/* Class = "NSTextFieldCell"; title = "There are multiple matches for the current window. Please select which match should be used."; ObjectID = "gcf-gb-ZsF"; */
"gcf-gb-ZsF.title" = "Es gibt mehrere Treffer für den aktuellen Fenstertitel. Bitte wählen Sie den Eintrag aus der Liste aus, welcher verwendet werdern soll.";
"gcf-gb-ZsF.title" = "Es gibt mehrere Treffer für den aktuellen Fenstertitel. Bitte wählen Sie den Eintrag aus der Liste aus, welcher verwendet werden soll.";
/* Class = "NSButtonCell"; title = "Perform Autotype"; ObjectID = "w7H-hx-CUF"; */
"w7H-hx-CUF.title" = "Auto-Type ausführen.";

View File

@@ -1,14 +1,14 @@
/* Class = "NSTextFieldCell"; title = "Search:"; ObjectID = "7"; */
"7.title" = "Search:";
"7.title" = "Suche:";
/* Class = "NSButtonCell"; title = "Empty Trash"; ObjectID = "8Ok-oe-6AB"; */
"8Ok-oe-6AB.title" = "Empty Trash";
"8Ok-oe-6AB.title" = "Papierkorb leeren.";
/* Class = "NSTextFieldCell"; title = "Trash"; ObjectID = "8P1-Rp-sF4"; */
"8P1-Rp-sF4.title" = "Trash";
"8P1-Rp-sF4.title" = "Papierkorb";
/* Class = "NSButtonCell"; title = "Title"; ObjectID = "53D-ne-nv6"; */
"53D-ne-nv6.title" = "Title";
"53D-ne-nv6.title" = "Titel";
/* Class = "NSButtonCell"; title = "URL"; ObjectID = "92o-gN-Psj"; */
"92o-gN-Psj.title" = "URL";
@@ -17,13 +17,13 @@
"CFk-71-NYQ.title" = "Item 3";
/* Class = "NSTextFieldCell"; title = "History"; ObjectID = "ER3-Ic-v0N"; */
"ER3-Ic-v0N.title" = "History";
"ER3-Ic-v0N.title" = "Historie";
/* Class = "NSMenuItem"; title = "Item 1"; ObjectID = "LRm-iZ-XrA"; */
"LRm-iZ-XrA.title" = "Item 1";
/* Class = "NSButtonCell"; title = "Restore Entry"; ObjectID = "UTg-y9-4DN"; */
"UTg-y9-4DN.title" = "Restore Entry";
"UTg-y9-4DN.title" = "Eintrag wiederherstellen";
/* Class = "NSTabViewItem"; label = "Filter"; ObjectID = "Ud6-Nz-6PS"; */
"Ud6-Nz-6PS.label" = "Filter";
@@ -32,23 +32,23 @@
"cpr-p6-YAY.title" = "Item 2";
/* Class = "NSButtonCell"; title = "Exit History"; ObjectID = "ewQ-8F-e1E"; */
"ewQ-8F-e1E.title" = "Exit History";
"ewQ-8F-e1E.title" = "Historie verlassen";
/* Class = "NSButtonCell"; title = "Notes"; ObjectID = "iDN-2E-hwt"; */
"iDN-2E-hwt.title" = "Notes";
"iDN-2E-hwt.title" = "Notizten";
/* Class = "NSButtonCell"; title = "Username"; ObjectID = "jfQ-Jh-2gl"; */
"jfQ-Jh-2gl.title" = "Username";
"jfQ-Jh-2gl.title" = "Benutzername";
/* Class = "NSTabViewItem"; label = "Trash"; ObjectID = "na6-h9-r9q"; */
"na6-h9-r9q.label" = "Trash";
"na6-h9-r9q.label" = "Papierkorb";
/* Class = "NSButtonCell"; title = "Password"; ObjectID = "rvQ-4V-SsS"; */
"rvQ-4V-SsS.title" = "Password";
"rvQ-4V-SsS.title" = "Passwort";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "wC4-fF-dLW"; */
"wC4-fF-dLW.title" = "OtherViews";
/* Class = "NSTabViewItem"; label = "History"; ObjectID = "z4I-cp-nhf"; */
"z4I-cp-nhf.label" = "History";
"z4I-cp-nhf.label" = "Historie";

View File

@@ -82,9 +82,15 @@
/* Class = "NSButtonCell"; title = "Generate Parameters"; ObjectID = "PoI-Er-Y8P"; */
"PoI-Er-Y8P.title" = "Parameter bestimmen";
/* Class = "NSTextFieldCell"; title = "VersionInfo"; ObjectID = "Ush-4r-A1A"; */
"Ush-4r-A1A.title" = "Versionsinformation";
/* Class = "NSTextFieldCell"; title = "Recommend key change"; ObjectID = "Xib-Fn-sqx"; */
"Xib-Fn-sqx.title" = "Empfehlung zur Änderung des Schlüssels";
/* Class = "NSTextFieldCell"; title = "File format:"; ObjectID = "bTk-YZ-x0G"; */
"bTk-YZ-x0G.title" = "Dateiformat:";
/* Class = "NSTabViewItem"; label = "Aes"; ObjectID = "ft1-pl-lpO"; */
"ft1-pl-lpO.label" = "AES";

View File

@@ -1,72 +1,3 @@
/* (No Comment) */
"101.title" = "Name";
/* (No Comment) */
"1266.title" = "Name";
/* (No Comment) */
"1267.title" = "Nutzername";
/* (No Comment) */
"1268.title" = "URL";
/* (No Comment) */
"1269.title" = "Passwort";
/* (No Comment) */
"1274.title" = "Password erstellen";
/* (No Comment) */
"1394.label" = "Allgemein";
/* (No Comment) */
"1395.label" = "Notizen";
/* (No Comment) */
"1481.title" = "Text Cell";
/* (No Comment) */
"1513.title" = "Anhänge";
/* (No Comment) */
"1529.title" = "Notizen";
/* (No Comment) */
"1568.title" = "Table View Cell";
/* (No Comment) */
"1581.title" = "Neue Datei";
/* (No Comment) */
"1586.title" = "Datei speichern";
/* (No Comment) */
"1605.title" = "Qualität";
/* (No Comment) */
"1885.title" = "Erstellt";
/* (No Comment) */
"1930.title" = "Verändert";
/* (No Comment) */
"1945.label" = "Anhänge";
/* (No Comment) */
"1947.label" = "Fields";
/* (No Comment) */
"1991.title" = "Eigene Werte";
/* (No Comment) */
"2017.title" = "Text Cell";
/* (No Comment) */
"2043.placeholderString" = "Wert";
/* (No Comment) */
"2049.placeholderString" = "Titel";
/* Class = "NSTabViewItem"; label = "Group"; ObjectID = "2896"; */
"2896.label" = "Gruppe";
@@ -82,8 +13,11 @@
/* Class = "NSTextFieldCell"; title = "Label"; ObjectID = "3014"; */
"3014.title" = "Bezeichnung";
/* Class = "CocoaBindingsConnection"; ibShadowedNoSelectionPlaceholder = "No Selection"; ObjectID = "E0d-ZH-Wbc"; */
"E0d-ZH-Wbc.ibShadowedNoSelectionPlaceholder" = "Keine Auswahl";
/* Class = "CocoaBindingsConnection"; ibShadowedIsNilPlaceholder = "None"; ObjectID = "Xpb-G8-gXl"; */
"Xpb-G8-gXl.ibShadowedIsNilPlaceholder" = "Leer";
/* Class = "CocoaBindingsConnection"; ibShadowedNoSelectionPlaceholder = "No Selection"; ObjectID = "Xpb-G8-gXl"; */
"Xpb-G8-gXl.ibShadowedNoSelectionPlaceholder" = "Keine Auswahl";
/* Class = "NSTextFieldCell"; title = "Notes"; ObjectID = "hwn-UY-9Cr"; */
"hwn-UY-9Cr.title" = "Notizen";

View File

@@ -19,22 +19,35 @@
/* Button label to abort a merge on a file with changed master key! */
"ABORT_MERGE_KEEP_MINE" = "Synchronisation abbrechen. Meine Änderungen behalten.";
/* No comment provided by engineer. */
/* Toolbar item with action menu */
"ACTION" = "Aktion";
/* No comment provided by engineer. */
/* Action to add an entry via template */
"ADD_TREMPLATE_ENTRY" = "Vorgabeeintrag erstellen";
/* Attachments column title (shows counts) */
/* Alert informative text when plugins or their settings change and require a restart */
"ALERT_INFORMATIVE_TEXT_PLUGINS_CHANGED_SUGGEST_RESTART" = "Änderungen zu den globalen Einstellungen von Plugins treten erst nach einem Neustadt in Kraft. Soll MacPass jetzt neu gestartet werden?";
/* Alert informative text to ask the user if he really want to uninstall the plugin */
"ALERT_INFORMATIVE_TEXT_REALLY_UNINSTALL_PLUGIN" = "Das Plugin wird in den Papierkorb verschoben";
/* Alert message text when plugins or their settings change and require a restart */
"ALERT_MESSAGE_PLUGINS_CHANGED_SUGGEST_RESTART" = "Die globalen Plugineinstellungen haben sich geändert.";
/* Alert message text to ask the user if he really want to uninstall the plugin. Include %@ placeholder for plugin name */
"ALERT_MESSAGE_TEXT_REALLY_UNINSTALL_PLUGIN_%@" = "Möchten Sie das Plugin %@ wirklich deinstallieren?";
/* Attachments column title (shows counts)
Menu item to toggle display of attachment count column in entry table */
"ATTACHMENTS" = "Anhänge";
/* Menu item for automatic trash creation */
"AUTOCREATE_TRASH_FOLDER" = "Automatisch erstellen";
/* No comment provided by engineer. */
/* Inherit autotype settings menu item */
"AUTOTYPE_INHERIT" = "Autotype Einstellungen vererben";
/* No comment provided by engineer. */
/* Disable autotype menu item */
"AUTOTYPE_NO" = "Autotype deaktiveren";
/* Notification: Autotype failed, no documents are open */
@@ -46,11 +59,13 @@
/* Notification: Autotype found a single match. */
"AUTOTYPE_OVERLAY_SINGLE_MATCH" = "Treffer!";
/* No comment provided by engineer. */
/* Enable autotype menu item */
"AUTOTYPE_YES" = "Autotype aktivieren";
/* Cancel
Cancel button to postpone password change */
/* Sucessfully merged external changes */
"AUTO_MERGE_NOTIFICATION_TEXT" = "Daten wurden erfolgreich automatische synchronisiert";
/* Cancel */
"CANCEL" = "Abbrechen";
/* Menu item in the database outline context menu to change the database name */
@@ -59,6 +74,9 @@
/* (No Comment) */
"CHANGE_FORMAT" = "Als KDBX speichern";
/* Button to postpone the password change */
"CHANGE_LATER" = "Später Ändern";
/* Button to show the password change dialog
Single button to show the password change dialog */
"CHANGE_PASSWORD_WITH_DOTS" = "Password ändern …";
@@ -72,7 +90,7 @@
/* Clear Autotype Button */
"CLEAR_AUTOTYPE" = "Autotype Löschen";
/* No comment provided by engineer. */
/* Menu to clear recent searches */
"CLEAR_RECENT_SEARCHES" = "Letzte Suchanfragen entfernen";
/* Field name that was copied to the pasteboard */
@@ -90,6 +108,9 @@
/* Submenu to Copy custom fields */
"COPY_CUSTOM_FIELDS" = "Feld kopieren";
/* Context menu sub-menu to copy custom fields to clipboard */
"COPY_CUSTOM_FIELDS_MENU" = "Feld kopieren…";
/* Action title for copying an entry via drag and drop */
"COPY_ENTRY" = "Eintrag kopieren";
@@ -99,19 +120,27 @@
/* Action title for copying a group via drag and drop */
"COPY_GROUP" = "Gruppe kopieren";
/* Menu item to copy the password of an entry */
/* Menu item to copy the password of an entry
Toolbar item copy password */
"COPY_PASSWORD" = "Passwort kopieren";
/* Menu item to copy the URL of an entry */
"COPY_URL" = "Adresse kopieren";
/* Menu item to copy the username of an entry */
/* Menu item to copy the username of an entry
Toolbar item copy username */
"COPY_USERNAME" = "Benutzername kopieren";
/* (No Comment) */
"CREATED_AT_%@" = "erstellt: %@";
/* Default name database */
/* Curstom attribute reference item */
"CUSTOM_ATTRIBUTE" = "Spezielle Eigenschaften";
/* Title for menu for custom search filters */
"CUSTOM_SEARCH_FILTER_MENU" = "Spezielle Suchefilter…";
/* Default display name for KDB databases */
"DATABASE" = "Datenbank";
/* Default Browser */
@@ -135,7 +164,8 @@
/* Menu item in the database outline context menu to delete the node from the trash
Menu item to delete an entry
Menu item to delete the selected attached file
Menu item to delete the selected custom icon */
Menu item to delete the selected custom icon
Toolbar item delete item */
"DELETE" = "Löschen";
/* No comment provided by engineer. */
@@ -153,20 +183,15 @@
/* No comment provided by engineer. */
"DOCUMENT_AUTOTYPE_CORRUPTION_WARNING" = "Bitte Autotypekorrektur durchführen!";
/* Action name for duplicating entries */
"DUPLICATE_ENTRIES_%ld" = "Einträge duplizieren %ld";
/* Menu item to directly diplicate an entry */
"DUPLICATE_ENTRY" = "Eintrag duplizieren";
"DUPLICATE_ENTRIES_%ld" = "Einträge duplizieren %ld";
/* Menu item to duplicate an entry with options how to duplicate. Will present a dialog. */
"DUPLICATE_ENTRY_WITH_OPTIONS" = "Eintrag duplizieren…";
/* (No Comment) */
"DUPLICTE_PASSWORDS" = "Doppelte Passwörter";
/* (No Comment) */
"EDIT" = "Bearbeiten";
/* 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";
@@ -186,6 +211,9 @@
/* Keyfile not valid */
"ERROR_INVALID_KEYFILE" = "Schlüsseldatei ist ungültig";
/* Error description given when adding an invalid plugin */
"ERROR_INVALID_PLUGIN" = "Kein MacPass-Plugin";
/* Passwords do not match */
"ERROR_PASSWORD_MISSMATCH" = "Passwörter stimmen nicht überein";
@@ -220,7 +248,7 @@
/* External file change strategy option: Use the changed file and discard local changes */
"FILE_CHANGE_STRATEGY_USE_OTHER" = "Lade die andere Version und verwerfe meine Änderungen";
/* No comment provided by engineer. */
/* Error while reopening last known documents */
"FILE_OPEN_ERROR" = "Fehler beim Öffnen der Datei.";
/* General Settings Label */
@@ -229,13 +257,14 @@
/* Group column title */
"GROUP" = "Gruppe";
/* History count column title */
/* History count column title
Menu item to toggle display of history count column in entry table */
"HISTORY" = "Historie";
/* Imports a dragged URL for a new entry */
"IMPORT_URL" = "URL importieren";
/* No comment provided by engineer. */
/* Toolbar item toggle inspector */
"INSPECTOR" = "Inspektor";
/* Label for the integration settings tab */
@@ -253,16 +282,29 @@
/* Reopen the file! */
"KEEP_OTHER_DISCARD_MINE" = "Behalte andere, verwerfe meine!";
/* Do not install the plugin */
"KEEP_PLUGIN" = "Plugin Behalten";
/* Do not restart MacPass */
"KEEP_RUNNING" = "Nicht Neustarten";
/* last week */
"LAST_WEEK" = "Letze Woche";
/* No comment provided by engineer. */
/* Toolbar item to Lock the database */
"LOCK" = "Sperren";
/* (No Comment) */
"MODIFED_AT_%@" = "verändert: %@";
/* Message in the open panel to add attachments to an entry */
"MESSAGE_ADD_ATTACHMENT_OPEN_PANEL" = "Bitte wählen Sie die Datei aus, die hinzugefügt werden soll";
/* Modification date column title */
/* Message in the add plugin open panel */
"MESSAGE_ADD_PLUGIN_OPEN_PANEL" = "Bitte wählen Sie das Plugin aus, welches installiert werden soll";
/* Message in the open panel to import an XML file */
"MESSAGE_XML_OPEN_PANEL" = "Bitte wählen Sie die XML-Datei aus, die importiert werden soll.";
/* Menu item to toggle display of modified date column in entry table
Modification date column title */
"MODIFIED" = "Verändert";
/* Action title for moving an entry via drag and drop */
@@ -274,19 +316,23 @@
/* Name for a newly created Database */
"NEW_DATABASE" = "Datenbank";
/* Menu item to create a new entry */
/* Menu item to create a new entry
Toolbar item new entry */
"NEW_ENTRY" = "Neuer Eintrag";
/* Submenu to add an entry via template */
"NEW_ENTRY_WITH_TEMPLATE_%@" = "Neuer Eintrag aus Vorlage %@";
/* Menu item to create a new group */
/* Menu item to create a new group
Toolbar item new group */
"NEW_GROUP" = "Neue Gruppe";
/* Placeholder text for input fields if no entry or group is selected */
/* Null placeholder for item input field
Placeholder text for input fields if no entry or group is selected */
"NONE" = "Leer";
/* Displayed name when notes or part of notes was copied
Menu item to toggle display of notes column in entry table
Notes column title
Notes reference item */
"NOTES" = "Notizen";
@@ -315,6 +361,15 @@
/* preset to expire after one year from now */
"ONE_YEAR" = "in enem Jahr";
/* Open button in the open panel to add attachments to an entry */
"OPEN_BUTTON_ADD_ATTACHMENT_OPEN_PANEL" = "Hinzufügen";
/* Open button in the add plugin open panel */
"OPEN_BUTTON_ADD_PLUGIN_OPEN_PANEL" = "Installieren";
/* Open button in the open panel to import an XML file */
"OPEN_BUTTON_IMPORT_XML_OPEN_PANEL" = "Importieren";
/* Menu item to open the URL with the default application */
"OPEN_URL" = "Adresse öffnen";
@@ -324,7 +379,8 @@
/* No comment provided by engineer. */
"OUTPUT_VALUE" = "Ausgabewert";
/* Password column title
/* Menu item to toggle display of password column in entry table
Password column title
Password reference item */
"PASSWORD" = "Passwort";
@@ -347,15 +403,36 @@
"PASSWORD_INPUT_REPEAT_PASSWORD" = "Passwort wiederholen";
/* Menu item to perform autotype with the selected entry */
"PERFORM_AUTOTYPE_FOR_ENTRY" = "Autotype ausführen";
"PERFORM_AUTOTYPE_FOR_ENTRY" = "Auto-Type ausführen";
/* The plugin could not be initalized */
"PLUGIN_ERROR_INTILIZATION_FAILED" = "Das Plugin konnten nicht korrekt initialisiert werden";
/* Error for a plugin that was not signed properly */
"PLUGIN_ERROR_UNSECURE_PLUGIN" = "Das Plugin ist nicht korrekt signiert";
/* Plugin specifies the wrong principla class! */
"PLUGIN_ERROR_WRONG_PRINCIPAL_CLASS" = "Die Hauptklasse des Plugins stimmt nicht mit der erwarteten überein";
/* name for disabled unloaded plugin */
"PLUGIN_NAME_DISABLED_%@" = "🚫 %@";
/* Name for unloaded plugin with errors */
"PLUGIN_NAME_ERROR_%@" = "⚠️ %@";
/* Label for plugin settings tab */
"PLUGIN_SETTINGS" = "Plugins";
/* Generic message displayed if no details are know why a plugin was not loaded. */
"PLUGIN_SETTINGS_GENERIC_ERROR_MESSAGE" = "Das Plugin konnte nicht geladen werden.";
/* Plugin version. Include a %@ placeholder for version string */
"PLUGIN_VERSION_%@" = "Version: %@";
/* Menu item to preview the selected attached file. */
"PREVIEW" = "Vorschau";
/* No comment provided by engineer. */
/* Recent searches menu item */
"RECENT_SEARCHES" = "Letze Suchanfragen";
/* Informative text for the recommend password change alert */
@@ -364,6 +441,9 @@
/* Message text for the recommend password change alert */
"RECOMMEND_PASSWORD_CHANGE_ALERT_TITLE" = "Bitte ändern sie das Password der Datenbank!";
/* Restart */
"RESTART" = "Neustarten";
/* Action to restore and Entry to a previous state of it's history */
"RESTORE_HISTORY_ENTRY" = "Eintrag wiederherstellen";
@@ -378,9 +458,9 @@
"SAVE_LOSSY" = "Mit Datenverlust speichern";
/* Save file menu item title when save will prompt for a location to save or ask for a password/key */
"SAVE_WITH_DOTS" = "Speichern …";
"SAVE_WITH_DOTS" = "Speichern…";
/* No comment provided by engineer. */
/* Search input in Toolbar */
"SEARCH" = "Suche";
/* Search option: Find duplicate passwords */
@@ -389,16 +469,16 @@
/* Search option: Find expired entries */
"SEARCH_EXPIRED_ENTRIES" = "Abgelaufen";
/* No comment provided by engineer. */
/* Inherit search settings menu item */
"SEARCH_INHERIT" = "Sucheeinstellung vererben";
/* No comment provided by engineer. */
/* Disable search menu item */
"SEARCH_NO" = "Nicht durchsuchbar";
/* No comment provided by engineer. */
"SEARCH_VALUE" = "Suchwert";
"SEARCH_VALUE" = "Suche nach";
/* No comment provided by engineer. */
/* Enable search menu item */
"SEARCH_YES" = "Durchsuchbar";
/* (No Comment) */
@@ -407,6 +487,12 @@
/* Menu item title for the expiry preset selection menu in the date picker */
"SELECT_DATE_PRESET" = "Datumvorgabe wählen …";
/* Message on the open panel for selecting which browser to use for opening URLs */
"SELECT_DEFAULT_BROWSER_OPEN_PANEL_MESSAGE" = "Bitte wählen Sie einen Web-Browser, mit dem URLs geöffnet werden sollen";
/* Label for the select browser button on the open panel for selecting which browser to use for opening URLs */
"SELECT_DEFAULT_BROWSER_OPEN_PANEL_SELECT_BUTTON" = "Auswählen";
/* Message for the dialog to open a file for merge */
"SELECT_FILE_TO_MERGE" = "Datei für Synchronisation auswählen";
@@ -419,13 +505,15 @@
/* (No Comment) */
"SHORT_FILE_CHANGE_STRATEGY_ASK" = "Nachfragen";
/* Menu item to show the history of the selected entry */
/* Menu item to show the history of the selected entry
Toolbar item to toggel history display */
"SHOW_HISTORY" = "Historie anzeigen";
/* Menu item to show the reference builder in a text view's context menu */
"SHOW_REFERENCE_BUILDER" = "Referenz einfügen…";
/* Displayed name when title field was copied
Menu item to toggle display of title column in entry table
Title column title
Title reference item */
"TITLE" = "Titel";
@@ -433,30 +521,38 @@
/* preset to expire tomorrow */
"TOMORROW" = "Morgen";
/* (No Comment) */
"TRASH" = "Papierkorb";
/* Move Entry to Trash */
"TRASH_ENTRY" = "Eintrag löschen";
/* Move Group to Trash */
"TRASH_GROUP" = "Gruppe löschen";
/* Uninstall plugin */
"UNINSTALL" = "Deinstallieren";
/* No comment provided by engineer. */
"UNKNOWN_FILE_VERSION" = "Unbekannte Dateiversion";
/* Unknown databas format. */
"UNKNOWN_FORMAT" = "Unbekanntes Dateiformat";
/* Database format is unknown since the file is not saved yet */
"UNKNOWN_FORMAT_FILE_NOT_SAVED_YET" = "Unbekannt. Datei wurde noch nicht gespeichert.";
/* No comment provided by engineer. */
"UNKNOWN_TOOLBAR_ITEM" = "Unbekanntes Toolbar-Element";
/* Update Settings Label */
"UPDATE_SETTINGS" = "Aktualisierung";
/* Submenu with options what to do with the URL of an entry
/* Menu item to toggle display of url column in entry table
Submenu with options what to do with the URL of an entry
Url column title
URL reference item */
"URL" = "Adresse";
/* Username column title
/* Menu item to toggle display of username column in entry table
Username column title
Username reference item */
"USERNAME" = "Nutzername";
@@ -470,6 +566,12 @@
/* No Key or Password */
"WARNING_NO_PASSWORD_OR_KEYFILE" = "Kein Password und/oder Schlüsseldatei festgelegt!";
/* Informative Text displayed when clearing the Trash */
"WARNING_ON_DELETE_TRASHED_NODE_DESCRIPTION" = "Die gewählten Elemente werden dauerhauft aus dem Papierkorb entfernt.";
/* Message text for the alert displayed when deleting a node */
"WARNING_ON_DELETE_TRASHED_NODE_TITLE" = "Gelöschtes Element entferen.";
/* Informative Text displayed when clearing the Trash */
"WARNING_ON_EMPTY_TRASH_DESCRIPTION" = "Das Leeren des Papierkorbs kann nicht rückgängig gemacht werdern.";

View File

@@ -1,40 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>DUPLICATE_ENTRIES_%ld</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@entries@</string>
<key>entries</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>one</key>
<string>Eintrag duplizieren</string>
<key>other</key>
<string>Einträge duplizieren</string>
</dict>
</dict>
<key>EVERY_%ld_DAYS</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@days@</string>
<key>days</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>one</key>
<string>jeden Tag</string>
<key>other</key>
<string>alle %ld Tage</string>
<key>zero</key>
<string>nach jedem Entsperren</string>
</dict>
</dict>
</dict>
</plist>
{
"DUPLICATE_ENTRIES_%ld" = {
NSStringLocalizedFormatKey = "%#@entries@";
entries = {
NSStringFormatSpecTypeKey = NSStringPluralRuleType;
NSStringFormatValueTypeKey = ld;
one = "Eintrag duplizieren";
other = "Eintr\U00e4ge duplizieren";
};
};
"EVERY_%ld_DAYS" = {
NSStringLocalizedFormatKey = "%#@days@";
days = {
NSStringFormatSpecTypeKey = NSStringPluralRuleType;
NSStringFormatValueTypeKey = ld;
one = "jeden Tag";
other = "alle %ld Tage";
zero = "nach jedem Entsperren";
};
};
}

View File

@@ -4,12 +4,21 @@
/* Class = "NSButtonCell"; title = "Load unsecure Plugins"; ObjectID = "C4B-6z-ZqX"; */
"C4B-6z-ZqX.title" = "Unsichere Plugins laden";
/* Class = "NSTextFieldCell"; title = "Plugin Settings Info"; ObjectID = "OOr-SW-jZb"; */
"OOr-SW-jZb.title" = "Informationen zu Plugin-Einstellungen";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "STt-PQ-Szr"; */
"STt-PQ-Szr.title" = "Text Cell";
/* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "fug-79-n9g"; */
"fug-79-n9g.title" = "Table View Cell";
/* Class = "NSButtonCell"; title = "Browse Plugins…"; ObjectID = "sqO-8H-n1y"; */
"sqO-8H-n1y.title" = "Plugins durchsuchen…";
/* Class = "NSBox"; title = "Box"; ObjectID = "vBs-Ga-aq0"; */
"vBs-Ga-aq0.title" = "Box";
/* Class = "NSTextFieldCell"; title = "Label"; ObjectID = "yuK-qH-jxx"; */
"yuK-qH-jxx.title" = "Bezeichnung";

View File

@@ -82,9 +82,15 @@
/* Class = "NSButtonCell"; title = "Generate Parameters"; ObjectID = "PoI-Er-Y8P"; */
"PoI-Er-Y8P.title" = "Generate Parameters";
/* Class = "NSTextFieldCell"; title = "VersionInfo"; ObjectID = "Ush-4r-A1A"; */
"Ush-4r-A1A.title" = "VersionInfo";
/* Class = "NSTextFieldCell"; title = "Recommend key change"; ObjectID = "Xib-Fn-sqx"; */
"Xib-Fn-sqx.title" = "Recommend key change";
/* Class = "NSTextFieldCell"; title = "File format:"; ObjectID = "bTk-YZ-x0G"; */
"bTk-YZ-x0G.title" = "File format:";
/* Class = "NSTabViewItem"; label = "Aes"; ObjectID = "ft1-pl-lpO"; */
"ft1-pl-lpO.label" = "Aes";

View File

@@ -1,71 +1,3 @@
/* (No Comment) */
"101.title" = "Name";
/* (No Comment) */
"1266.title" = "Name";
/* (No Comment) */
"1267.title" = "Username";
/* (No Comment) */
"1268.title" = "URL";
/* (No Comment) */
"1269.title" = "Password";
/* (No Comment) */
"1274.title" = "Generate";
/* (No Comment) */
"1394.label" = "General";
/* (No Comment) */
"1395.label" = "Notes";
/* (No Comment) */
"1481.title" = "Text Cell";
/* (No Comment) */
"1513.title" = "Attachments";
/* (No Comment) */
"1529.title" = "Notes";
/* (No Comment) */
"1568.title" = "Table View Cell";
/* (No Comment) */
"1581.title" = "Add File";
/* (No Comment) */
"1586.title" = "Save File";
/* (No Comment) */
"1605.title" = "Quality";
/* (No Comment) */
"1885.title" = "Created";
/* (No Comment) */
"1930.title" = "Modified";
/* (No Comment) */
"1945.label" = "Attachments";
/* (No Comment) */
"1947.label" = "Fields";
/* (No Comment) */
"1991.title" = "Custom Fields";
/* (No Comment) */
"2017.title" = "Text Cell";
/* (No Comment) */
"2043.placeholderString" = "Value";
/* (No Comment) */
"2049.placeholderString" = "Title";
/* Class = "NSTabViewItem"; label = "Group"; ObjectID = "2896"; */
"2896.label" = "Group";
@@ -82,9 +14,11 @@
/* Class = "NSTextFieldCell"; title = "Label"; ObjectID = "3014"; */
"3014.title" = "Label";
/* Class = "CocoaBindingsConnection"; ibShadowedNoSelectionPlaceholder = "No Selection"; ObjectID = "E0d-ZH-Wbc"; */
"E0d-ZH-Wbc.ibShadowedNoSelectionPlaceholder" = "No Selection";
/* Class = "CocoaBindingsConnection"; ibShadowedIsNilPlaceholder = "None"; ObjectID = "Xpb-G8-gXl"; */
"Xpb-G8-gXl.ibShadowedIsNilPlaceholder" = "None";
/* Class = "CocoaBindingsConnection"; ibShadowedNoSelectionPlaceholder = "No Selection"; ObjectID = "Xpb-G8-gXl"; */
"Xpb-G8-gXl.ibShadowedNoSelectionPlaceholder" = "No Selection";
/* Class = "NSTextFieldCell"; title = "Notes"; ObjectID = "hwn-UY-9Cr"; */
"hwn-UY-9Cr.title" = "Notes";

View File

@@ -19,23 +19,23 @@
/* Button label to abort a merge on a file with changed master key! */
"ABORT_MERGE_KEEP_MINE" = "Abort Merge. Keep Mine.";
/* No comment provided by engineer. */
/* Toolbar item with action menu */
"ACTION" = "Action";
/* No comment provided by engineer. */
/* Action to add an entry via template */
"ADD_TREMPLATE_ENTRY" = "Create Template Entry";
/* ALert informative text when a plugin was sucessfully installed */
"ALERT_INFORMATIVE_TEXT_PLUGIN_INSTALLED_SUGGEST_RESTART" = "Plugins can only be loaded at start up. To activate the installed pluing, please restart MacPass.";
/* Alert informative text when plugins or their settings change and require a restart */
"ALERT_INFORMATIVE_TEXT_PLUGINS_CHANGED_SUGGEST_RESTART" = "Changes to plugins and global plugin settings take only effect after restart. Restart MacPass now?";
/* (No Comment) */
"ALERT_KDB_UNSUPPORTED_ADD_ENTRY_INFORMATIVE" = "The KDB format does not support entries inside this group. The entry will be moved when the file is saved.";
/* Alert informative text to ask the user if he really want to uninstall the plugin */
"ALERT_INFORMATIVE_TEXT_REALLY_UNINSTALL_PLUGIN" = "The Plugin will be moved to the Trash.";
/* (No Comment) */
"ALERT_KDB_UNSUPPORTED_ADD_ENTRY_MESSAGE" = "Adding entries not supported";
/* Alert message text when plugins or their settings change and require a restart */
"ALERT_MESSAGE_PLUGINS_CHANGED_SUGGEST_RESTART" = "Plugin settings changed. Please restart.";
/* Alert message text when a plugin was successfully installed */
"ALERT_MESSAGE_TEXT_PLUGIN_INSTALLED_SUGGEST_RESTART" = "Sucessfully installed Plugin!";
/* Alert message text to ask the user if he really want to uninstall the plugin. Include %@ placeholder for plugin name */
"ALERT_MESSAGE_TEXT_REALLY_UNINSTALL_PLUGIN_%@" = "Should the Plugin %@ really be uninstalled?";
/* Attachments column title (shows counts)
Menu item to toggle display of attachment count column in entry table */
@@ -65,16 +65,17 @@
/* Sucessfully merged external changes */
"AUTO_MERGE_NOTIFICATION_TEXT" = "Auto merge successfull!";
/* Cancel
Cancel button in plugin installed, request restart alert
Cancel button to postpone password change */
/* Cancel */
"CANCEL" = "Cancel";
/* Menu item in the database outline context menu to change the database name */
"CHANGE_DATABASE_NAME" = "Change Database Name";
/* (No Comment) */
"CHANGE_FORMAT" = "Change File Format to KDBX";
"CHANGE_FORMAT" = "Change File Format to Kdbx";
/* Button to postpone the password change */
"CHANGE_LATER" = "Change Later";
/* Button to show the password change dialog
Single button to show the password change dialog */
@@ -89,7 +90,7 @@
/* Clear Autotype Button */
"CLEAR_AUTOTYPE" = "Clear Autotype";
/* No comment provided by engineer. */
/* Menu to clear recent searches */
"CLEAR_RECENT_SEARCHES" = "Clear recent searches";
/* Field name that was copied to the pasteboard */
@@ -119,13 +120,15 @@
/* Action title for copying a group via drag and drop */
"COPY_GROUP" = "Copy Group";
/* Menu item to copy the password of an entry */
/* Menu item to copy the password of an entry
Toolbar item copy password */
"COPY_PASSWORD" = "Copy Password";
/* Menu item to copy the URL of an entry */
"COPY_URL" = "Copy URL";
/* Menu item to copy the username of an entry */
/* Menu item to copy the username of an entry
Toolbar item copy username */
"COPY_USERNAME" = "Copy Username";
/* (No Comment) */
@@ -137,7 +140,7 @@
/* Title for menu for custom search filters */
"CUSTOM_SEARCH_FILTER_MENU" = "Custom Search Filter…";
/* Default name database */
/* Default display name for KDB databases */
"DATABASE" = "Database";
/* Default Browser */
@@ -161,7 +164,8 @@
/* Menu item in the database outline context menu to delete the node from the trash
Menu item to delete an entry
Menu item to delete the selected attached file
Menu item to delete the selected custom icon */
Menu item to delete the selected custom icon
Toolbar item delete item */
"DELETE" = "Delete";
/* No comment provided by engineer. */
@@ -188,12 +192,6 @@
/* Menu item to duplicate an entry with options how to duplicate. Will present a dialog. */
"DUPLICATE_ENTRY_WITH_OPTIONS" = "Duplicate Entry…";
/* (No Comment) */
"DUPLICTE_PASSWORDS" = "Duplicate Passwords";
/* (No Comment) */
"EDIT" = "Edit";
/* 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" = "Edit Entry Template Group";
@@ -266,7 +264,7 @@
/* Imports a dragged URL for a new entry */
"IMPORT_URL" = "Import URL";
/* No comment provided by engineer. */
/* Toolbar item toggle inspector */
"INSPECTOR" = "Inspector";
/* Label for the integration settings tab */
@@ -284,10 +282,16 @@
/* Reopen the file! */
"KEEP_OTHER_DISCARD_MINE" = "Keep Other, Discard Mine";
/* Do not install the plugin */
"KEEP_PLUGIN" = "Keep Plugin";
/* Do not restart MacPass */
"KEEP_RUNNING" = "Keep Running";
/* last week */
"LAST_WEEK" = "Last week";
/* No comment provided by engineer. */
/* Toolbar item to Lock the database */
"LOCK" = "Lock";
/* Message in the open panel to add attachments to an entry */
@@ -312,13 +316,15 @@
/* Name for a newly created Database */
"NEW_DATABASE" = "Database";
/* Menu item to create a new entry */
/* Menu item to create a new entry
Toolbar item new entry */
"NEW_ENTRY" = "New Entry";
/* Submenu to add an entry via template */
"NEW_ENTRY_WITH_TEMPLATE_%@" = "Create Entry with Template %@";
/* Menu item to create a new group */
/* Menu item to create a new group
Toolbar item new group */
"NEW_GROUP" = "New Group";
/* Placeholder text for input fields if no entry or group is selected */
@@ -398,13 +404,34 @@
/* Menu item to perform autotype with the selected entry */
"PERFORM_AUTOTYPE_FOR_ENTRY" = "Perform Autotype";
/* The plugin could not be initalized */
"PLUGIN_ERROR_INTILIZATION_FAILED" = "Plugin could not be initalized";
/* Error for a plugin that was not signed properly */
"PLUGIN_ERROR_UNSECURE_PLUGIN" = "Plugin is not properly signed";
/* Plugin specifies the wrong principla class! */
"PLUGIN_ERROR_WRONG_PRINCIPAL_CLASS" = "Unexpected principal class in plugin";
/* name for disabled unloaded plugin */
"PLUGIN_NAME_DISABLED_%@" = "🚫 %@";
/* Name for unloaded plugin with errors */
"PLUGIN_NAME_ERROR_%@" = "⚠️ %@";
/* Label for plugin settings tab */
"PLUGIN_SETTINGS" = "Plugins";
/* Generic message displayed if no details are know why a plugin was not loaded. */
"PLUGIN_SETTINGS_GENERIC_ERROR_MESSAGE" = "Plugin could not be loaded.";
/* Plugin version. Include a %@ placeholder for version string */
"PLUGIN_VERSION_%@" = "Version: %@";
/* Menu item to preview the selected attached file. */
"PREVIEW" = "Preview";
/* No comment provided by engineer. */
/* Recent searches menu item */
"RECENT_SEARCHES" = "Recent searches";
/* Informative text for the recommend password change alert */
@@ -413,7 +440,7 @@
/* Message text for the recommend password change alert */
"RECOMMEND_PASSWORD_CHANGE_ALERT_TITLE" = "Please change the database password!";
/* Restart button in plugin installed, request restart alert */
/* Restart */
"RESTART" = "Restart";
/* Action to restore and Entry to a previous state of it's history */
@@ -432,7 +459,7 @@
/* Save file menu item title when save will prompt for a location to save or ask for a password/key */
"SAVE_WITH_DOTS" = "Save…";
/* No comment provided by engineer. */
/* Search input in Toolbar */
"SEARCH" = "Search";
/* Search option: Find duplicate passwords */
@@ -477,7 +504,8 @@
/* (No Comment) */
"SHORT_FILE_CHANGE_STRATEGY_ASK" = "Ask";
/* Menu item to show the history of the selected entry */
/* Menu item to show the history of the selected entry
Toolbar item to toggel history display */
"SHOW_HISTORY" = "Show History";
/* Menu item to show the reference builder in a text view's context menu */
@@ -498,8 +526,17 @@
/* Move Group to Trash */
"TRASH_GROUP" = "Trash Group";
/* Uninstall plugin */
"UNINSTALL" = "Uninstall";
/* No comment provided by engineer. */
"UNKNOWN_FILE_VERSION" = "Unknown File Version";
"UNKNOWN_FILE_VERSION" = "Unknown file version";
/* Unknown databas format. */
"UNKNOWN_FORMAT" = "Unknown file format";
/* Database format is unknown since the file is not saved yet */
"UNKNOWN_FORMAT_FILE_NOT_SAVED_YET" = "Unknown, file not saved yet";
/* No comment provided by engineer. */
"UNKNOWN_TOOLBAR_ITEM" = "Unknown Toolbar Item";
@@ -541,10 +578,10 @@
"WARNING_ON_EMPTY_TRASH_TITLE" = "Empty Trash?";
/* (No Comment) */
"WARNING_ON_LOSSY_SAVE" = "Saving with KDB format, will lead to lost data.";
"WARNING_ON_LOSSY_SAVE" = "Saving with Kdb format, will lead to lost data.";
/* (No Comment) */
"WARNING_ON_LOSSY_SAVE_DESCRIPTION" = "The KDB file format cannot hold all information.";
"WARNING_ON_LOSSY_SAVE_DESCRIPTION" = "The Kdb file format cannot hold all information.";
/* No comment provided by engineer. */
"WARNING_ON_SAVE_NO_PASSWORD_OR_KEY_SET" = "No password or keyfile is set.";

View File

@@ -4,6 +4,9 @@
/* Class = "NSButtonCell"; title = "Load unsecure Plugins"; ObjectID = "C4B-6z-ZqX"; */
"C4B-6z-ZqX.title" = "Load unsecure Plugins";
/* Class = "NSTextFieldCell"; title = "Plugin Settings Info"; ObjectID = "OOr-SW-jZb"; */
"OOr-SW-jZb.title" = "Plugin Settings Info";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "STt-PQ-Szr"; */
"STt-PQ-Szr.title" = "Text Cell";
@@ -16,3 +19,6 @@
/* Class = "NSBox"; title = "Box"; ObjectID = "vBs-Ga-aq0"; */
"vBs-Ga-aq0.title" = "Box";
/* Class = "NSTextFieldCell"; title = "Label"; ObjectID = "yuK-qH-jxx"; */
"yuK-qH-jxx.title" = "Label";

View File

@@ -1,15 +1,15 @@
/* Class = "NSTextFieldCell"; title = "Search:"; ObjectID = "7"; */
"7.title" = "Search:";
"7.title" = "Buscar:";
/* Class = "NSButtonCell"; title = "Title"; ObjectID = "53D-ne-nv6"; */
"53D-ne-nv6.title" = "Title";
"53D-ne-nv6.title" = "Título";
/* Class = "NSButtonCell"; title = "Empty Trash"; ObjectID = "8Ok-oe-6AB"; */
"8Ok-oe-6AB.title" = "Empty Trash";
"8Ok-oe-6AB.title" = "Vaciar Papelera";
/* Class = "NSTextFieldCell"; title = "Trash"; ObjectID = "8P1-Rp-sF4"; */
"8P1-Rp-sF4.title" = "Trash";
"8P1-Rp-sF4.title" = "Papelera";
/* Class = "NSButtonCell"; title = "URL"; ObjectID = "92o-gN-Psj"; */
"92o-gN-Psj.title" = "URL";
@@ -18,37 +18,37 @@
"CFk-71-NYQ.title" = "Item 3";
/* Class = "NSTextFieldCell"; title = "History"; ObjectID = "ER3-Ic-v0N"; */
"ER3-Ic-v0N.title" = "History";
"ER3-Ic-v0N.title" = "Historial";
/* Class = "NSMenuItem"; title = "Item 1"; ObjectID = "LRm-iZ-XrA"; */
"LRm-iZ-XrA.title" = "Item 1";
/* Class = "NSButtonCell"; title = "Restore Entry"; ObjectID = "UTg-y9-4DN"; */
"UTg-y9-4DN.title" = "Restore Entry";
"UTg-y9-4DN.title" = "Restaurar Entrada";
/* Class = "NSTabViewItem"; label = "Filter"; ObjectID = "Ud6-Nz-6PS"; */
"Ud6-Nz-6PS.label" = "Filter";
"Ud6-Nz-6PS.label" = "Filtro";
/* Class = "NSMenuItem"; title = "Item 2"; ObjectID = "cpr-p6-YAY"; */
"cpr-p6-YAY.title" = "Item 2";
/* Class = "NSButtonCell"; title = "Exit History"; ObjectID = "ewQ-8F-e1E"; */
"ewQ-8F-e1E.title" = "Exit History";
"ewQ-8F-e1E.title" = "Salir de Historial";
/* Class = "NSButtonCell"; title = "Notes"; ObjectID = "iDN-2E-hwt"; */
"iDN-2E-hwt.title" = "Notes";
"iDN-2E-hwt.title" = "Notas";
/* Class = "NSButtonCell"; title = "Username"; ObjectID = "jfQ-Jh-2gl"; */
"jfQ-Jh-2gl.title" = "Username";
"jfQ-Jh-2gl.title" = "Usuario";
/* Class = "NSTabViewItem"; label = "Trash"; ObjectID = "na6-h9-r9q"; */
"na6-h9-r9q.label" = "Trash";
"na6-h9-r9q.label" = "Papelera";
/* Class = "NSButtonCell"; title = "Password"; ObjectID = "rvQ-4V-SsS"; */
"rvQ-4V-SsS.title" = "Password";
"rvQ-4V-SsS.title" = "Contraseña";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "wC4-fF-dLW"; */
"wC4-fF-dLW.title" = "OtherViews";
"wC4-fF-dLW.title" = "Otras Vistas";
/* Class = "NSTabViewItem"; label = "History"; ObjectID = "z4I-cp-nhf"; */
"z4I-cp-nhf.label" = "History";
"z4I-cp-nhf.label" = "Historial";

View File

@@ -41,6 +41,8 @@ Russian Translation by {\field{\*\fldinst{HYPERLINK "mailto:alex@mrdoggy.info"}}
\
Italian Translation by {\field{\*\fldinst{HYPERLINK "mailto:info@francescoservida.ch"}}{\fldrslt Francesco Servida}}\
\
Spanish Translation by {\field{\*\fldinst{HYPERLINK "https://github.com/m0yP"}}{\fldrslt Moises Perez}}\
\
MacPass\kerning1\expnd0\expndtw3
\kerning1\expnd0\expndtw0 Icon by {\field{\*\fldinst{HYPERLINK "http://iiro.jappinen.me"}}{\fldrslt Iiro J\'e4ppinen}}\
\
@@ -89,4 +91,4 @@ Copyright \'a92008-2009 Jim Dovey, All rights reserved.\
\
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
{\field{\*\fldinst{HYPERLINK "https://github.com/mattt/TransformerKit"}}{\fldrslt \cf3 TransformerKit}}\
Copyright \'a92012 Mattt Thompson. All rights reseverd}
Copyright \'a92012 Mattt Thompson. All rights reseverd}

View File

@@ -1,18 +1,18 @@
/* Class = "NSButtonCell"; title = "Reference username instead of copying it"; ObjectID = "O9X-XH-n8o"; */
"O9X-XH-n8o.title" = "Reference username instead of copying it";
"O9X-XH-n8o.title" = "Referenciar Usuario en vez de copiarlo";
/* Class = "NSWindow"; title = "Window"; ObjectID = "QvC-M9-y7g"; */
"QvC-M9-y7g.title" = "Window";
"QvC-M9-y7g.title" = "Ventana";
/* Class = "NSButtonCell"; title = "Duplicate Entry"; ObjectID = "WqI-qH-ARf"; */
"WqI-qH-ARf.title" = "Duplicate Entry";
"WqI-qH-ARf.title" = "Duplicar Entrada";
/* Class = "NSButtonCell"; title = "Duplicate history"; ObjectID = "dXl-KS-4rE"; */
"dXl-KS-4rE.title" = "Duplicate history";
"dXl-KS-4rE.title" = "Duplicar historial";
/* Class = "NSButtonCell"; title = "Reference password instead of copying it"; ObjectID = "daA-QV-CDq"; */
"daA-QV-CDq.title" = "Reference password instead of copying it";
"daA-QV-CDq.title" = "Referenciar contraseña en vez de copiarla";
/* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "x6e-bE-Y6R"; */
"x6e-bE-Y6R.title" = "Cancel";
"x6e-bE-Y6R.title" = "Cancelar";

View File

@@ -69,13 +69,13 @@
"238.ibShadowedLabels[2]" = "Personalizado";
/* Class = "NSSegmentedCell"; 238.ibShadowedLabels[3] = "Autotype"; ObjectID = "238"; */
"238.ibShadowedLabels[3]" = "Autotype";
"238.ibShadowedLabels[3]" = "Autollenado";
/* Class = "NSMenuItem"; title = "Save"; ObjectID = "0ok-MC-QMP"; */
"0ok-MC-QMP.title" = "Guardar";
/* Class = "NSButtonCell"; title = "Enable Autotype"; ObjectID = "9Nx-mE-DK3"; */
"9Nx-mE-DK3.title" = "Habilitar Autotype";
"9Nx-mE-DK3.title" = "Habilitar Autollenado";
/* Class = "NSMenuItem"; title = "Quicklook"; ObjectID = "NtM-y3-l4D"; */
"NtM-y3-l4D.title" = "Vista Rápida";
@@ -87,7 +87,7 @@
"RQB-bR-MC0.title" = "Secuencia de Ventana";
/* Class = "NSTextFieldCell"; title = "Autotype Sequence"; ObjectID = "bQ5-0E-h3O"; */
"bQ5-0E-h3O.title" = "Secuencia Autotype";
"bQ5-0E-h3O.title" = "Secuencia Autollenado";
/* Class = "NSTextFieldCell"; title = "Window Title"; ObjectID = "bkO-Bk-AuX"; */
"bkO-Bk-AuX.title" = "Título de Ventana";
@@ -96,7 +96,7 @@
"bke-G2-oEf.title" = "Eliminar";
/* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "dyA-lo-PGa"; */
"dyA-lo-PGa.title" = "Campo de Vista de Tabla View";
"dyA-lo-PGa.title" = "Campo de Vista de Tabla";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "ep5-bQ-cfZ"; */
"ep5-bQ-cfZ.title" = "Campo de Texto";
@@ -105,7 +105,7 @@
"fW9-9p-wwR.placeholderString" = "Secuencia de Ventana Personalizada";
/* Class = "NSTabViewItem"; label = "Autotype"; ObjectID = "hK7-Dx-yjH"; */
"hK7-Dx-yjH.label" = "Autotype";
"hK7-Dx-yjH.label" = "Autollenado";
/* Class = "NSTextFieldCell"; title = "Window Associations"; ObjectID = "ned-1Q-FXA"; */
"ned-1Q-FXA.title" = "Asociaciones de Ventana";

View File

@@ -1,6 +1,6 @@
/* Class = "NSMenu"; title = "ClipboardClearInterval"; ObjectID = "421"; */
"421.title" = "Intervalo de Limpieza de Portapapeles";
"421.title" = "Intervalo de vaciado de Portapapeles";
/* Class = "NSMenuItem"; title = "after 10 Seconds"; ObjectID = "422"; */
"422.title" = "después de 10 Segundos";
@@ -30,7 +30,7 @@
"928.title" = "General";
/* Class = "NSButtonCell"; title = "Double-click entry URL to Launch"; ObjectID = "937"; */
"937.title" = "Abrir URL al dar doble click";
"937.title" = "Abrir URL al dar doble clic";
/* Class = "NSMenu"; title = "LockTimes"; ObjectID = "586"; */
"586.title" = "Tiempos de Bloqueo";

View File

@@ -15,4 +15,4 @@
"265.title" = "Buscar";
/* Class = "NSTextFieldCell"; title = "Autotype"; ObjectID = "277"; */
"277.title" = "Autotype";
"277.title" = "Autollenado";

View File

@@ -3,7 +3,7 @@
"3.title" = "Habilitar Servidor KeePassHttp";
/* Class = "NSButtonCell"; title = "Enable global Autotype"; ObjectID = "1qb-Rd-jYu"; */
"1qb-Rd-jYu.title" = "Habilitar Autotype Global";
"1qb-Rd-jYu.title" = "Habilitar Autollenado Global";
/* Class = "NSTextFieldCell"; title = "Shortcut"; ObjectID = "6oN-CH-T0O"; */
"6oN-CH-T0O.title" = "Atajo";
@@ -15,13 +15,13 @@
"KbH-0Q-5Tw.title" = "Keepass HTTP";
/* Class = "NSBox"; title = "Autotype"; ObjectID = "P9N-HM-wER"; */
"P9N-HM-wER.title" = "Autotype";
"P9N-HM-wER.title" = "Autollenado";
/* Class = "NSBox"; title = "Preview"; ObjectID = "VVs-b5-cX9"; */
"VVs-b5-cX9.title" = "Vista Previa";
/* Class = "NSTextFieldCell"; title = "If enabled attached files will be copied to a temporary location for preview and deleted after the preview is closed."; ObjectID = "WmI-IB-Aso"; */
"WmI-IB-Aso.title" = "Si se habilita, los archivos adjuntos serán copiados a una carpeta demporal para generar la vista previa y serán elimiandos al cerrarla. Esto es un riesgo de seguridad.";
"WmI-IB-Aso.title" = "Si se habilita, los archivos adjuntos serán copiados a una carpeta temporal para generar la vista previa y serán elimiandos al cerrarla. Esto es un riesgo de seguridad.";
/* Class = "NSButtonCell"; title = "Interpret ⌃ as ⌘"; ObjectID = "QfO-yG-l3F"; */
"QfO-yG-l3F.title" = "Intérprete ⌃ as ⌘";

View File

@@ -38,13 +38,13 @@
"NEW_ENTRY_WITH_TEMPLATE_%@" = "Crear Entrada con Plantilla %@";
"NEW_DATABASE" = "Base de Datos";
"OPEN_URL" = "Abrir URL";
"PERFORM_AUTOTYPE_FOR_ENTRY" = "Generar Autotype";
"PERFORM_AUTOTYPE_FOR_ENTRY" = "Generar Autollenado";
"PREVIEW" = "Vista Previa";
"PASSWORD_GENERATOR_SET_DEFAULTS" = "Configurar Predeterminados";
"PASSWORD_GENERATOR_RESET_ENTRY_DEFAULTS" = "Reiniciar";
"TRASH_ENTRY" = "Entrada de Papelera";
"TRASH_GROUP" = "Grupo de Papelera";
"SHOW_HISTORY" = "Show History";
"SHOW_HISTORY" = "Mostrar Historial";
/*
Search
@@ -101,14 +101,14 @@
/* Group Inspector */
/* Autotype Combobox */
"AUTOTYPE_NO" = "Deshabilitar Autotype";
"AUTOTYPE_YES" = "Habilitar Autotype";
"AUTOTYPE_INHERIT" = "Heredar Configuración de Autotype";
"AUTOTYPE_NO" = "Deshabilitar Autollenado";
"AUTOTYPE_YES" = "Habilitar Autollenado";
"AUTOTYPE_INHERIT" = "Heredar Configuración de Autollenado";
/* Search Combobox */
"SEARCH_INHERIT" = "Inherit Search Settings";
"SEARCH_YES" = "Include in Search";
"SEARCH_NO" = "Exclude from Search";
"SEARCH_INHERIT" = "Heredar Configuración de Búsqueda";
"SEARCH_YES" = "Incluir en Búsqueda";
"SEARCH_NO" = "Exluir de Búsqueda";
/*
Date/Time Displays
@@ -140,7 +140,7 @@
"PLUGIN_SETTINGS" = "Plugins";
/* Feature not supported in Version */
"KDBX_ONLY_FEATURE" = "Caraterística no soportada en base de datos KDB";
"KDBX_ONLY_FEATURE" = "Caraterística no soportada en archivos KDB";
/* Template */
"NO_TEMPLATE_GROUP" = "Sin plantillas";
@@ -152,7 +152,7 @@
/* Autoype */
/* Candiate dialog */
"SELECT_AUTOTYPE_CANDIDATE" = "Seleccionar candidato";
"AUTOTYPE_OVERLAY_NO_DOCUMENTS" = "Please open a file to use Global Autotype!";
"AUTOTYPE_OVERLAY_NO_DOCUMENTS" = "Debes abrir un archivo para usar Autollenado Global";
"AUTOTYPE_OVERLAY_NO_MATCH_FOR_%@" = "No hay registros para %@!";
"AUTOTYPE_OVERLAY_SINGLE_MATCH" = "Encontrado";
@@ -179,15 +179,15 @@
/* Informative text displayed when the file was change form another application */
"FILE_CHANGED_BY_OTHERS_INFO_TEXT" = "El archivo cargado no coincide con el guardado en el disco. ¿Deseas continuar?";
/* Set the selection as default file change strategy */
"SET_AS_DEFAULT_FILE_CHANGE_STRATEGY" = "Use the selected strategy and do not ask me again!";
"SET_AS_DEFAULT_FILE_CHANGE_STRATEGY" = "Utilizar la estrategia seleccionada y no volverme a preguntar.";
/* Always show a dialog after an external file change */
"FILE_CHANGE_STRATEGY_ASK" = "Ask Me What to Do";
"FILE_CHANGE_STRATEGY_ASK" = "Preguntarme qué hacer";
/* Button to ignore the changes */
"KEEP_MINE" = "Conservar versión actual y descartar cambios";
/* Button to reload the changes form disk */
"LOAD_CHANGES" = "Cargar archivo modificado";
/* Merge changes into file! */
"MERGE_CHANGES" = "Merge changes!";
"MERGE_CHANGES" = "Unir cambios";
/* Password Input Messages, Errors and Warning */
"PASSWORD_INPUT_NO_PASSWORD" = "Sin Contraseña";
@@ -199,5 +199,5 @@
"ERROR_INVALID_KEYFILE" = "El Keyfile no es válido";
/* Misc */
"DOCUMENT_AUTOTYPE_CORRUPTION_WARNING" = "Por favor ejecuta Corregir Autotype...";
"DOCUMENT_AUTOTYPE_CORRUPTION_WARNING" = "Por favor ejecuta Corregir Autollenado...";
"FILE_OPEN_ERROR" = "Error al abrir el archivo.";

View File

@@ -162,7 +162,7 @@
"aVO-9F-Lwc.title" = "Vista Rápida";
/* Class = "NSMenuItem"; title = "Fix Autotype…"; ObjectID = "nx7-Vf-LiD"; */
"nx7-Vf-LiD.title" = "Corregir Autotype…";
"nx7-Vf-LiD.title" = "Corregir Autollenado…";
/* Class = "NSMenuItem"; title = "Import XML…"; ObjectID = "rW0-r1-QYL"; */
"rW0-r1-QYL.title" = "Importar XML…";

View File

@@ -3,7 +3,7 @@
"1.title" = "Ventana";
/* Class = "NSTextFieldCell"; title = "Missmatching Passwords"; ObjectID = "14"; */
"14.title" = "Contraseñas no Coincidentes";
"14.title" = "Contraseñas no coinciden";
/* Class = "NSSecureTextFieldCell"; placeholderString = "Repeat Password"; ObjectID = "15"; */
"15.placeholderString" = "Repetir Contraseña";

View File

@@ -1,15 +1,15 @@
/* Class = "NSTextFieldCell"; title = "If enabled, only properly signed Plugins will be loaded. Keep in mind, that Plugins have full access to your data! Changes take affect on restart."; ObjectID = "2bX-8S-9XM"; */
"2bX-8S-9XM.title" = "If enabled, only properly signed Plugins will be loaded. Keep in mind, that Plugins have full access to your data! Changes take affect on restart.";
"2bX-8S-9XM.title" = "Si se habilita, solo los Plugins propiamente firmados serán cargados. Ten en mente que los Plugins tenrán acceso a tu información. Es necesario reiniciar para aplicar los cambios.";
/* Class = "NSButtonCell"; title = "Load unsecure Plugins"; ObjectID = "C4B-6z-ZqX"; */
"C4B-6z-ZqX.title" = "Load unsecure Plugins";
"C4B-6z-ZqX.title" = "Cargar Plugins no seguros";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "STt-PQ-Szr"; */
"STt-PQ-Szr.title" = "Text Cell";
"STt-PQ-Szr.title" = "Campo de Texto";
/* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "fug-79-n9g"; */
"fug-79-n9g.title" = "Table View Cell";
"fug-79-n9g.title" = "Vista de tabla de campos";
/* Class = "NSBox"; title = "Box"; ObjectID = "vBs-Ga-aq0"; */
"vBs-Ga-aq0.title" = "Box";
"vBs-Ga-aq0.title" = "Caja";

View File

@@ -1,27 +1,27 @@
/* Class = "NSMenuItem"; title = "Get"; ObjectID = "142-bE-IMZ"; */
"142-bE-IMZ.title" = "Get";
"142-bE-IMZ.title" = "Obtener";
/* Class = "NSTextFieldCell"; title = "Match"; ObjectID = "9ce-da-syF"; */
"9ce-da-syF.title" = "Match";
"9ce-da-syF.title" = "Coincidir";
/* Class = "NSTextFieldCell"; title = "Key"; ObjectID = "K1t-OZ-ACe"; */
"K1t-OZ-ACe.title" = "Key";
"K1t-OZ-ACe.title" = "Llave";
/* Class = "NSButtonCell"; title = "Use"; ObjectID = "Kqx-qm-nMG"; */
"Kqx-qm-nMG.title" = "Use";
"Kqx-qm-nMG.title" = "Usar";
/* Class = "NSTextFieldCell"; placeholderString = "Reference"; ObjectID = "dr9-x8-kKk"; */
"dr9-x8-kKk.placeholderString" = "Reference";
"dr9-x8-kKk.placeholderString" = "Referencia";
/* Class = "NSTextFieldCell"; placeholderString = "Value"; ObjectID = "fNP-ye-2bD"; */
"fNP-ye-2bD.placeholderString" = "Value";
"fNP-ye-2bD.placeholderString" = "Valor";
/* Class = "NSTextFieldCell"; title = "Reference String"; ObjectID = "gik-Ha-hRd"; */
"gik-Ha-hRd.title" = "Reference String";
"gik-Ha-hRd.title" = "Valor Referencial";
/* Class = "NSTextFieldCell"; title = "Reference"; ObjectID = "r1V-VE-ngy"; */
"r1V-VE-ngy.title" = "Reference";
"r1V-VE-ngy.title" = "Referencia";
/* Class = "NSMenuItem"; title = "Matching"; ObjectID = "yT1-XL-k6a"; */
"yT1-XL-k6a.title" = "Matching";
"yT1-XL-k6a.title" = "Coincidente";

View File

@@ -3,7 +3,7 @@
"2.title" = "Tabla de Entradas";
/* Class = "NSTextFieldCell"; title = "Double-click on URL:"; ObjectID = "10"; */
"10.title" = "Doble click en URL:";
"10.title" = "Doble clic en URL:";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "15"; */
"15.title" = "Otras Vistas";

View File

@@ -0,0 +1,24 @@
/* Class = "NSTextFieldCell"; title = "If enabled, only properly signed Plugins will be loaded. Keep in mind, that Plugins have full access to your data! Changes take affect on restart."; ObjectID = "2bX-8S-9XM"; */
"2bX-8S-9XM.title" = "If enabled, only properly signed Plugins will be loaded. Keep in mind, that Plugins have full access to your data! Changes take affect on restart.";
/* Class = "NSButtonCell"; title = "Load unsecure Plugins"; ObjectID = "C4B-6z-ZqX"; */
"C4B-6z-ZqX.title" = "Load unsecure Plugins";
/* Class = "NSTextFieldCell"; title = "Plugin Settings Info"; ObjectID = "OOr-SW-jZb"; */
"OOr-SW-jZb.title" = "Plugin Settings Info";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "STt-PQ-Szr"; */
"STt-PQ-Szr.title" = "Text Cell";
/* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "fug-79-n9g"; */
"fug-79-n9g.title" = "Table View Cell";
/* Class = "NSButtonCell"; title = "Browse Plugins…"; ObjectID = "sqO-8H-n1y"; */
"sqO-8H-n1y.title" = "Browse Plugins…";
/* Class = "NSBox"; title = "Box"; ObjectID = "vBs-Ga-aq0"; */
"vBs-Ga-aq0.title" = "Box";
/* Class = "NSTextFieldCell"; title = "Label"; ObjectID = "yuK-qH-jxx"; */
"yuK-qH-jxx.title" = "Label";