mirror of
https://github.com/MacPass/MacPass.git
synced 2025-12-13 14:42:18 +00:00
Fixed layout issues in Group inspector
Added key-file generator fixes #25 #76 Improvements on the context menu toolbar button to add templates entries
This commit is contained in:
File diff suppressed because one or more lines are too long
Submodule KeePassKit updated: 8894b319ad...065b6bf115
@@ -121,6 +121,7 @@
|
||||
4C569D9E17652B0600595B62 /* MPConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C569D9D17652B0600595B62 /* MPConstants.m */; };
|
||||
4C569DA117652BFE00595B62 /* MPEntryTableDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C569DA017652BFE00595B62 /* MPEntryTableDataSource.m */; };
|
||||
4C569DA417653F3500595B62 /* KdbEntry+MPTreeTools.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C569DA317653F3500595B62 /* KdbEntry+MPTreeTools.m */; };
|
||||
4C57AE1417BA422B00CA4F34 /* MPSegmentedContextCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C57AE1317BA422B00CA4F34 /* MPSegmentedContextCell.m */; };
|
||||
4C586F9E16D07ABD00E7DB57 /* 00_PasswordTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C586F9D16D07ABD00E7DB57 /* 00_PasswordTemplate.pdf */; };
|
||||
4C586FA016D07D7200E7DB57 /* 01_PackageNetworkTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C586F9F16D07D7200E7DB57 /* 01_PackageNetworkTemplate.pdf */; };
|
||||
4C586FA216D07F6A00E7DB57 /* 02_MessageBoxWarningTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C586FA116D07F6A00E7DB57 /* 02_MessageBoxWarningTemplate.pdf */; };
|
||||
@@ -268,6 +269,9 @@
|
||||
4CE76DAD17B3AD010043B82B /* KPKHashedDataTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE76DAC17B3AD010043B82B /* KPKHashedDataTest.m */; };
|
||||
4CE8246F16E2E93400573141 /* MPOverlayWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8246E16E2E93400573141 /* MPOverlayWindowController.m */; };
|
||||
4CE8247516E2F2B900573141 /* MPOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8247416E2F2B900573141 /* MPOverlayView.m */; };
|
||||
4CE88B9717BA651C0042E078 /* contextTriangleTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CE88B9617BA651C0042E078 /* contextTriangleTemplate.pdf */; };
|
||||
4CEAF85717BA9B1D001307A6 /* Keepass2Key.xml in Resources */ = {isa = PBXBuildFile; fileRef = 4CEAF85617BA9B1D001307A6 /* Keepass2Key.xml */; };
|
||||
4CEAF85B17BA9B44001307A6 /* KPKTestKeyfileParsing.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEAF85A17BA9B44001307A6 /* KPKTestKeyfileParsing.m */; };
|
||||
4CECB31717AC326D00EAFB0F /* KPKLegacyWritingTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CECB31617AC326D00EAFB0F /* KPKLegacyWritingTest.m */; };
|
||||
4CF1F0CA1786B37900CD920E /* NSData+Gzip.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF1F0C81786B37900CD920E /* NSData+Gzip.m */; };
|
||||
4CF29BF417879D0000851B60 /* 26_FileSaveTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */; };
|
||||
@@ -430,7 +434,7 @@
|
||||
4C305F3B179A19F90082334F /* KPKIconLoading.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKIconLoading.m; sourceTree = "<group>"; };
|
||||
4C305F3D179A1A760082334F /* image.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = image.png; path = Images/image.png; sourceTree = "<group>"; };
|
||||
4C3666401787327E00B249F1 /* MPDocument+Attachments.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MPDocument+Attachments.m"; sourceTree = "<group>"; };
|
||||
4C366642178748F500B249F1 /* 99_HarddiskTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 99_HarddiskTemplate.pdf; sourceTree = "<group>"; };
|
||||
4C366642178748F500B249F1 /* 99_HarddiskTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = 99_HarddiskTemplate.pdf; path = Icons/99_HarddiskTemplate.pdf; sourceTree = "<group>"; };
|
||||
4C36E5B2177CD4FB00152132 /* Kdb4Tree+KVOAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Kdb4Tree+KVOAdditions.h"; sourceTree = "<group>"; };
|
||||
4C36E5B3177CD4FB00152132 /* Kdb4Tree+KVOAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Kdb4Tree+KVOAdditions.m"; sourceTree = "<group>"; };
|
||||
4C37A6711769393300AD0A40 /* HNHTableHeaderCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHTableHeaderCell.h; sourceTree = "<group>"; };
|
||||
@@ -501,6 +505,8 @@
|
||||
4C569DA017652BFE00595B62 /* MPEntryTableDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPEntryTableDataSource.m; sourceTree = "<group>"; };
|
||||
4C569DA217653F3500595B62 /* KdbEntry+MPTreeTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KdbEntry+MPTreeTools.h"; sourceTree = "<group>"; };
|
||||
4C569DA317653F3500595B62 /* KdbEntry+MPTreeTools.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KdbEntry+MPTreeTools.m"; sourceTree = "<group>"; };
|
||||
4C57AE1217BA422B00CA4F34 /* MPSegmentedContextCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSegmentedContextCell.h; sourceTree = "<group>"; };
|
||||
4C57AE1317BA422B00CA4F34 /* MPSegmentedContextCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSegmentedContextCell.m; sourceTree = "<group>"; };
|
||||
4C586F9D16D07ABD00E7DB57 /* 00_PasswordTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 00_PasswordTemplate.pdf; sourceTree = "<group>"; };
|
||||
4C586F9F16D07D7200E7DB57 /* 01_PackageNetworkTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 01_PackageNetworkTemplate.pdf; sourceTree = "<group>"; };
|
||||
4C586FA116D07F6A00E7DB57 /* 02_MessageBoxWarningTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 02_MessageBoxWarningTemplate.pdf; sourceTree = "<group>"; };
|
||||
@@ -613,7 +619,7 @@
|
||||
4C6BEA2F17A88E6C00CF69A8 /* MPStripLineBreaksTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPStripLineBreaksTransformer.h; sourceTree = "<group>"; };
|
||||
4C6BEA3017A88E6C00CF69A8 /* MPStripLineBreaksTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPStripLineBreaksTransformer.m; sourceTree = "<group>"; };
|
||||
4C6D1D24178579570014C5A5 /* 48_FolderTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 48_FolderTemplate.pdf; sourceTree = "<group>"; };
|
||||
4C6D1D26178586CA0014C5A5 /* 99_AddFolderTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 99_AddFolderTemplate.pdf; sourceTree = "<group>"; };
|
||||
4C6D1D26178586CA0014C5A5 /* 99_AddFolderTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = 99_AddFolderTemplate.pdf; path = Icons/99_AddFolderTemplate.pdf; sourceTree = "<group>"; };
|
||||
4C6D1D2A17858A250014C5A5 /* MacPass.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = MacPass.icns; path = "../Assets/App icon/MacPass.icns"; sourceTree = "<group>"; };
|
||||
4C701CBB178618A000581B88 /* 12_RemoteTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 12_RemoteTemplate.pdf; sourceTree = "<group>"; };
|
||||
4C70D0FE179092F200652EE9 /* KPKPassword.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKPassword.h; sourceTree = "<group>"; };
|
||||
@@ -630,7 +636,7 @@
|
||||
4C7615781764C4A50015A1A6 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = de; path = de.lproj/Credits.rtf; sourceTree = "<group>"; };
|
||||
4C7615791764C4A50015A1A6 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
4C7714A9176C998F00549F2A /* 43_TrashTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 43_TrashTemplate.pdf; sourceTree = "<group>"; };
|
||||
4C7714AB176C9D4600549F2A /* 99_InfoTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 99_InfoTemplate.pdf; sourceTree = "<group>"; };
|
||||
4C7714AB176C9D4600549F2A /* 99_InfoTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = 99_InfoTemplate.pdf; path = Icons/99_InfoTemplate.pdf; sourceTree = "<group>"; };
|
||||
4C77547316E55FE800970E02 /* MPInspectorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPInspectorViewController.h; sourceTree = "<group>"; };
|
||||
4C77547416E55FE800970E02 /* MPInspectorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPInspectorViewController.m; sourceTree = "<group>"; };
|
||||
4C77E36215B84A240093A587 /* MacPass.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MacPass.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
@@ -676,7 +682,7 @@
|
||||
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>"; };
|
||||
4C8FECC716D57E3200BF26CF /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
|
||||
4C96D15317A12E4F00D931FA /* 99_CreatedTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 99_CreatedTemplate.pdf; sourceTree = "<group>"; };
|
||||
4C96D15317A12E4F00D931FA /* 99_CreatedTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = 99_CreatedTemplate.pdf; path = Icons/99_CreatedTemplate.pdf; sourceTree = "<group>"; };
|
||||
4C9D6AA717615199001C660C /* HNHRoundedSecureTextFieldCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHRoundedSecureTextFieldCell.h; sourceTree = "<group>"; };
|
||||
4C9D6AA817615199001C660C /* HNHRoundedSecureTextFieldCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHRoundedSecureTextFieldCell.m; sourceTree = "<group>"; };
|
||||
4CA08D9E17A831B200A6544B /* MPAddEntryContextMenuDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAddEntryContextMenuDelegate.h; sourceTree = "<group>"; };
|
||||
@@ -782,6 +788,10 @@
|
||||
4CE8246E16E2E93400573141 /* MPOverlayWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOverlayWindowController.m; sourceTree = "<group>"; };
|
||||
4CE8247316E2F2B900573141 /* MPOverlayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOverlayView.h; sourceTree = "<group>"; };
|
||||
4CE8247416E2F2B900573141 /* MPOverlayView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOverlayView.m; sourceTree = "<group>"; };
|
||||
4CE88B9617BA651C0042E078 /* contextTriangleTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = contextTriangleTemplate.pdf; path = Icons/contextTriangleTemplate.pdf; sourceTree = "<group>"; };
|
||||
4CEAF85617BA9B1D001307A6 /* Keepass2Key.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = Keepass2Key.xml; path = Keyfiles/Keepass2Key.xml; sourceTree = "<group>"; };
|
||||
4CEAF85917BA9B44001307A6 /* KPKTestKeyfileParsing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKTestKeyfileParsing.h; sourceTree = "<group>"; };
|
||||
4CEAF85A17BA9B44001307A6 /* KPKTestKeyfileParsing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKTestKeyfileParsing.m; sourceTree = "<group>"; };
|
||||
4CECB31517AC326D00EAFB0F /* KPKLegacyWritingTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKLegacyWritingTest.h; sourceTree = "<group>"; };
|
||||
4CECB31617AC326D00EAFB0F /* KPKLegacyWritingTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKLegacyWritingTest.m; sourceTree = "<group>"; };
|
||||
4CF1F0C81786B37900CD920E /* NSData+Gzip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+Gzip.m"; sourceTree = "<group>"; };
|
||||
@@ -1213,6 +1223,7 @@
|
||||
4C45FB1E178E09ED0010007D /* MacPassTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4CEAF85817BA9B25001307A6 /* Keyfiles */,
|
||||
4C305F3F179A1A790082334F /* Images */,
|
||||
4C18F9AC178E123200890BCE /* Databases */,
|
||||
4C45FB2B178E0BCB0010007D /* MPDatabaseLoading.h */,
|
||||
@@ -1240,6 +1251,8 @@
|
||||
4C6366AE17AF207600AAF17D /* KPKTestHexColor.m */,
|
||||
4CE76DAB17B3AD010043B82B /* KPKHashedDataTest.h */,
|
||||
4CE76DAC17B3AD010043B82B /* KPKHashedDataTest.m */,
|
||||
4CEAF85917BA9B44001307A6 /* KPKTestKeyfileParsing.h */,
|
||||
4CEAF85A17BA9B44001307A6 /* KPKTestKeyfileParsing.m */,
|
||||
);
|
||||
path = MacPassTests;
|
||||
sourceTree = "<group>";
|
||||
@@ -1264,7 +1277,7 @@
|
||||
name = Inspector;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4C586F9C16D07ABD00E7DB57 /* Icons */ = {
|
||||
4C586F9C16D07ABD00E7DB57 /* Database Icons */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4C586F9D16D07ABD00E7DB57 /* 00_PasswordTemplate.pdf */,
|
||||
@@ -1286,11 +1299,8 @@
|
||||
4C7714A9176C998F00549F2A /* 43_TrashTemplate.pdf */,
|
||||
4C6D1D24178579570014C5A5 /* 48_FolderTemplate.pdf */,
|
||||
4C52A891178863B000868229 /* 68_PhoneTemplate.pdf */,
|
||||
4C6D1D26178586CA0014C5A5 /* 99_AddFolderTemplate.pdf */,
|
||||
4C96D15317A12E4F00D931FA /* 99_CreatedTemplate.pdf */,
|
||||
4C366642178748F500B249F1 /* 99_HarddiskTemplate.pdf */,
|
||||
4C7714AB176C9D4600549F2A /* 99_InfoTemplate.pdf */,
|
||||
);
|
||||
name = "Database Icons";
|
||||
path = Icons;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@@ -1438,7 +1448,8 @@
|
||||
4C245C11176E22150086100E /* KeepassHttp */,
|
||||
4C2C4C2516D3BCEA00D49295 /* KeePassLib Categories */,
|
||||
4C2E382016D141F700037A9D /* Helper */,
|
||||
4C586F9C16D07ABD00E7DB57 /* Icons */,
|
||||
4CE88B9317BA64DB0042E078 /* Icons */,
|
||||
4C586F9C16D07ABD00E7DB57 /* Database Icons */,
|
||||
4CA0B30E15BCB70200654E32 /* Protocolls */,
|
||||
4CE8247116E2E98200573141 /* Data Controller */,
|
||||
4CE8247016E2E96500573141 /* Window Controller */,
|
||||
@@ -1709,6 +1720,8 @@
|
||||
4C888C9216EB6F5E003D34A1 /* MPToolbarItem.m */,
|
||||
4C63B8F917A3154D0091BD72 /* MPContextToolbarButton.h */,
|
||||
4C63B8FA17A3154D0091BD72 /* MPContextToolbarButton.m */,
|
||||
4C57AE1217BA422B00CA4F34 /* MPSegmentedContextCell.h */,
|
||||
4C57AE1317BA422B00CA4F34 /* MPSegmentedContextCell.m */,
|
||||
);
|
||||
name = Controls;
|
||||
sourceTree = "<group>";
|
||||
@@ -1754,6 +1767,26 @@
|
||||
name = Windows;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4CE88B9317BA64DB0042E078 /* Icons */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4CE88B9617BA651C0042E078 /* contextTriangleTemplate.pdf */,
|
||||
4C6D1D26178586CA0014C5A5 /* 99_AddFolderTemplate.pdf */,
|
||||
4C96D15317A12E4F00D931FA /* 99_CreatedTemplate.pdf */,
|
||||
4C366642178748F500B249F1 /* 99_HarddiskTemplate.pdf */,
|
||||
4C7714AB176C9D4600549F2A /* 99_InfoTemplate.pdf */,
|
||||
);
|
||||
name = Icons;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4CEAF85817BA9B25001307A6 /* Keyfiles */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4CEAF85617BA9B1D001307A6 /* Keepass2Key.xml */,
|
||||
);
|
||||
name = Keyfiles;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4CF78060176E75180032EE71 /* Settings */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -1854,6 +1887,7 @@
|
||||
4C6366B317AFB52500AAF17D /* CustomIcon_Password_1234.kdbx in Resources */,
|
||||
4C6366B417AFB52500AAF17D /* CustomIcon_Password_1234.xml in Resources */,
|
||||
4C6366B517AFB52500AAF17D /* KDB1_KeePassX_test.kdb in Resources */,
|
||||
4CEAF85717BA9B1D001307A6 /* Keepass2Key.xml in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -1912,6 +1946,7 @@
|
||||
4CD7223817A7C9EA00F5A1E1 /* WorkflowSettings.xib in Resources */,
|
||||
4C0728BA17B5B7A4005A7DD9 /* PasswordEditWindow.xib in Resources */,
|
||||
4C0728BF17B68ED0005A7DD9 /* SavePanelAccessoryView.xib in Resources */,
|
||||
4CE88B9717BA651C0042E078 /* contextTriangleTemplate.pdf in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -1950,6 +1985,7 @@
|
||||
4CAC614317AD319200023F9E /* KPKTestXmlParsing.m in Sources */,
|
||||
4C6366AF17AF207600AAF17D /* KPKTestHexColor.m in Sources */,
|
||||
4CE76DAD17B3AD010043B82B /* KPKHashedDataTest.m in Sources */,
|
||||
4CEAF85B17BA9B44001307A6 /* KPKTestKeyfileParsing.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -2160,6 +2196,7 @@
|
||||
4C0728BD17B5B7F7005A7DD9 /* MPPasswordEditWindowController.m in Sources */,
|
||||
4C0F647817B6B65E00D9522A /* MPSheetWindowController.m in Sources */,
|
||||
4C0F647B17B6BC9C00D9522A /* MPSavePanelAccessoryViewController.m in Sources */,
|
||||
4C57AE1417BA422B00CA4F34 /* MPSegmentedContextCell.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
||||
@@ -102,6 +102,7 @@
|
||||
<string key="NSFrameSize">{293, 503}</string>
|
||||
<reference key="NSSuperview" ref="171621726"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="15582376"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<array class="NSMutableArray" key="NSTabViewItems">
|
||||
<object class="NSTabViewItem" id="695903737">
|
||||
@@ -113,6 +114,7 @@
|
||||
<string key="NSFrameSize">{293, 503}</string>
|
||||
<reference key="NSSuperview" ref="239090452"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:11</string>
|
||||
</object>
|
||||
<string key="NSLabel">General</string>
|
||||
@@ -587,6 +589,7 @@
|
||||
<string key="NSFrame">{{20, 20}, {212, 77}}</string>
|
||||
<reference key="NSSuperview" ref="413602841"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSTokenFieldCell" key="NSCell" id="222663528">
|
||||
@@ -721,7 +724,7 @@
|
||||
<string key="NSFrameSize">{210, 258}</string>
|
||||
<reference key="NSSuperview" ref="964754936"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="601656903"/>
|
||||
<reference key="NSNextKeyView" ref="932823276"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:13</string>
|
||||
<object class="NSTextContainer" key="NSTextContainer" id="877434204">
|
||||
<object class="NSLayoutManager" key="NSLayoutManager">
|
||||
@@ -841,7 +844,7 @@
|
||||
<string key="NSFrame">{{20, 151}, {212, 260}}</string>
|
||||
<reference key="NSSuperview" ref="413602841"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="964754936"/>
|
||||
<reference key="NSNextKeyView" ref="601656903"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<int key="NSsFlags">133138</int>
|
||||
<reference key="NSVScroller" ref="932823276"/>
|
||||
@@ -888,6 +891,7 @@
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="773665137"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<string key="NSAntiCompressionPriority">{249, 750}</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSSecureTextFieldCell" key="NSCell" id="421697878">
|
||||
<int key="NSCellFlags">342884416</int>
|
||||
@@ -988,8 +992,8 @@
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSTextFieldCell" key="NSCell" id="239887593">
|
||||
<int key="NSCellFlags">-1804599231</int>
|
||||
<int key="NSCellFlags2">272631104</int>
|
||||
<int key="NSCellFlags">-1805647807</int>
|
||||
<int key="NSCellFlags2">272632128</int>
|
||||
<string key="NSContents"/>
|
||||
<reference key="NSSupport" ref="710335884"/>
|
||||
<string key="NSCellIdentifier">_NS:9</string>
|
||||
@@ -1008,6 +1012,7 @@
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="621371892"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<string key="NSAntiCompressionPriority">{249, 750}</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSTextFieldCell" key="NSCell" id="673201743">
|
||||
<int key="NSCellFlags">-1805647807</int>
|
||||
@@ -1051,6 +1056,7 @@
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="620411807"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<string key="NSAntiCompressionPriority">{249, 750}</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSTextFieldCell" key="NSCell" id="633046755">
|
||||
<int key="NSCellFlags">-1805647807</int>
|
||||
|
||||
@@ -116,6 +116,7 @@
|
||||
<string key="NSFrame">{{18, 61}, {222, 26}}</string>
|
||||
<reference key="NSSuperview" ref="154788810"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<string key="NSAntiCompressionPriority">{249, 750}</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
@@ -377,7 +378,7 @@
|
||||
<string key="NSFrameSize">{215, 257}</string>
|
||||
<reference key="NSSuperview" ref="600246267"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="707535614"/>
|
||||
<reference key="NSNextKeyView" ref="747041324"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:13</string>
|
||||
<object class="NSTextContainer" key="NSTextContainer" id="192398905">
|
||||
<object class="NSLayoutManager" key="NSLayoutManager">
|
||||
@@ -503,7 +504,7 @@
|
||||
<string key="NSFrame">{{20, 190}, {217, 259}}</string>
|
||||
<reference key="NSSuperview" ref="154788810"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="600246267"/>
|
||||
<reference key="NSNextKeyView" ref="707535614"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<string key="NSAntiCompressionPriority">{750, 750}</string>
|
||||
<int key="NSsFlags">133138</int>
|
||||
@@ -522,10 +523,11 @@
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="54933662"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<string key="NSAntiCompressionPriority">{249, 750}</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSTextFieldCell" key="NSCell" id="1004379867">
|
||||
<int key="NSCellFlags">-2075131840</int>
|
||||
<int key="NSCellFlags2">272631104</int>
|
||||
<int key="NSCellFlags">-2076180416</int>
|
||||
<int key="NSCellFlags2">272632128</int>
|
||||
<string key="NSContents"/>
|
||||
<reference key="NSSupport" ref="851874085"/>
|
||||
<string key="NSCellIdentifier">_NS:9</string>
|
||||
@@ -590,7 +592,7 @@
|
||||
<string key="NSFrameSize">{255, 421}</string>
|
||||
<reference key="NSSuperview" ref="83897318"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="296338600"/>
|
||||
<reference key="NSNextKeyView" ref="227728764"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:13</string>
|
||||
</object>
|
||||
</array>
|
||||
@@ -623,6 +625,7 @@
|
||||
<string key="NSFrame">{{0, 405}, {255, 16}}</string>
|
||||
<reference key="NSSuperview" ref="279099458"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:26</string>
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
<int key="NSsFlags">1</int>
|
||||
@@ -634,7 +637,7 @@
|
||||
<string key="NSFrameSize">{255, 421}</string>
|
||||
<reference key="NSSuperview"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="83897318"/>
|
||||
<reference key="NSNextKeyView" ref="296338600"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<int key="NSsFlags">133152</int>
|
||||
<reference key="NSVScroller" ref="296338600"/>
|
||||
|
||||
BIN
MacPass/Icons/contextTriangleTemplate.pdf
Normal file
BIN
MacPass/Icons/contextTriangleTemplate.pdf
Normal file
Binary file not shown.
@@ -29,6 +29,7 @@
|
||||
}
|
||||
[menu removeAllItems];
|
||||
[menu addItemWithTitle:NSLocalizedString(@"EDIT_TEMPLATE_GROUP", "") action:[MPActionHelper actionOfType:MPActionEditTemplateGroup] keyEquivalent:@""];
|
||||
|
||||
[menu addItem:[NSMenuItem separatorItem]];
|
||||
for(KdbEntry *entry in [document.templates childEntries]) {
|
||||
NSString *templateMask = NSLocalizedString(@"NEW_ENTRY_WITH_TEMPLATE_%@", "");
|
||||
@@ -38,6 +39,10 @@
|
||||
[templateItem setRepresentedObject:entry];
|
||||
[menu addItem:templateItem];
|
||||
}
|
||||
/* If there are no entries, add a note as disabled menu item */
|
||||
if([[menu itemArray] count] == 2) {
|
||||
[menu addItemWithTitle:NSLocalizedString(@"NO_TEMPLATES", "") action:NULL keyEquivalent:@""];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -11,4 +11,5 @@
|
||||
@interface MPContextToolbarButton : NSSegmentedControl
|
||||
|
||||
- (void)setImage:(NSImage *)image;
|
||||
|
||||
@end
|
||||
|
||||
@@ -7,18 +7,30 @@
|
||||
//
|
||||
|
||||
#import "MPContextToolbarButton.h"
|
||||
#import "MPSegmentedContextCell.h"
|
||||
|
||||
@implementation MPContextToolbarButton
|
||||
|
||||
- (id)initWithFrame:(NSRect)frame {
|
||||
self = [super initWithFrame:frame];
|
||||
if (self) {
|
||||
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:[self cell]];
|
||||
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
|
||||
MPSegmentedContextCell *cell = [[MPSegmentedContextCell alloc] initWithCoder:unarchiver];
|
||||
[self setCell:cell];
|
||||
|
||||
[self setFocusRingType:NSFocusRingTypeNone];
|
||||
[self setSegmentCount:2];
|
||||
[[self cell] setTrackingMode:NSSegmentSwitchTrackingMomentary];
|
||||
[cell setTrackingMode:NSSegmentSwitchTrackingMomentary];
|
||||
[self setSegmentStyle:NSSegmentStyleTexturedSquare];
|
||||
[[self cell] setWidth:32 forSegment:0];
|
||||
[[self cell] setWidth:20 forSegment:1];
|
||||
[cell setWidth:31 forSegment:0];
|
||||
[cell setWidth:17 forSegment:1];
|
||||
|
||||
NSImage *contextTriangle = [[NSBundle mainBundle] imageForResource:@"contextTriangleTemplate"];
|
||||
[self setImage:contextTriangle forSegment:1];
|
||||
|
||||
cell.contextMenuAction = @selector(showContextMenu:);
|
||||
cell.contextMenuTarget = self;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
@@ -27,7 +39,7 @@
|
||||
Block the segment setter to prevent accidential settings
|
||||
*/
|
||||
- (void)setImage:(NSImage *)image forSegment:(NSInteger)segment {
|
||||
if(segment == 0) {
|
||||
if(segment < 2) {
|
||||
[super setImage:image forSegment:segment];
|
||||
}
|
||||
}
|
||||
@@ -42,20 +54,12 @@
|
||||
[self setImage:image forSegment:0];
|
||||
}
|
||||
|
||||
- (SEL)action {
|
||||
NSLog(@"actionSegment:%ld", [[self cell] selectedSegment]);
|
||||
if([self selectedSegment] == 1) {
|
||||
return @selector(showContextMenu:);
|
||||
}
|
||||
return [super action];
|
||||
}
|
||||
|
||||
- (id)target {
|
||||
NSLog(@"targetSegment:%ld", [[self cell] selectedSegment]);
|
||||
if([self selectedSegment] == 1) {
|
||||
return self;
|
||||
}
|
||||
return [super target];
|
||||
- (void)showContextMenu:(id)sender {
|
||||
NSMenu *menu = [self menuForSegment:0];
|
||||
NSPoint point = [self frame].origin;
|
||||
point.x = [[self cell] widthForSegment:0];
|
||||
point.y = NSHeight([self frame]) + 3;
|
||||
[menu popUpMenuPositioningItem:nil atLocation:point inView:self];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
#import "HNHRoundedSecureTextField.h"
|
||||
#import "NSString+Empty.h"
|
||||
#import "NSData+Keyfile.h"
|
||||
|
||||
@interface MPPasswordEditWindowController () {
|
||||
MPDocument * __unsafe_unretained _document;
|
||||
@@ -92,6 +93,23 @@
|
||||
}
|
||||
|
||||
- (IBAction)generateKey:(id)sender {
|
||||
NSData *data = [NSData generateKeyfiledataForVersion:(KPKVersion)(_document.version + 1)];
|
||||
if(data) {
|
||||
NSSavePanel *savePanel = [NSSavePanel savePanel];
|
||||
[savePanel setAllowedFileTypes:@[@"key", @"xml"]];
|
||||
[savePanel setCanCreateDirectories:YES];
|
||||
[savePanel setTitle:NSLocalizedString(@"SAVE_KEYFILE", "")];
|
||||
[savePanel beginWithCompletionHandler:^(NSInteger result) {
|
||||
if(result == NSFileHandlingPanelOKButton) {
|
||||
NSURL *keyURL = [savePanel URL];
|
||||
NSError *error;
|
||||
BOOL saveOk = [data writeToURL:keyURL options:NSDataWritingAtomic error:&error];
|
||||
if(saveOk) {
|
||||
self.keyURL = keyURL;
|
||||
}
|
||||
}
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark NSTextFieldDelegate
|
||||
|
||||
16
MacPass/MPSegmentedContextCell.h
Normal file
16
MacPass/MPSegmentedContextCell.h
Normal file
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// MPSegmentedContextCell.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 13.08.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@interface MPSegmentedContextCell : NSSegmentedCell
|
||||
|
||||
@property (nonatomic, assign) SEL contextMenuAction;
|
||||
@property (nonatomic, weak) id contextMenuTarget;
|
||||
|
||||
@end
|
||||
45
MacPass/MPSegmentedContextCell.m
Normal file
45
MacPass/MPSegmentedContextCell.m
Normal file
@@ -0,0 +1,45 @@
|
||||
//
|
||||
// MPSegmentedContextCell.m
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 13.08.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MPSegmentedContextCell.h"
|
||||
|
||||
@implementation MPSegmentedContextCell
|
||||
|
||||
- (id)initWithCoder:(NSCoder *)aDecoder {
|
||||
self = [super initWithCoder:aDecoder];
|
||||
if(self) {
|
||||
_contextMenuAction = NULL;
|
||||
_contextMenuTarget = nil;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)init {
|
||||
self = [super init];
|
||||
if(self) {
|
||||
_contextMenuAction = NULL;
|
||||
_contextMenuTarget = nil;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (SEL)action {
|
||||
if([self selectedSegment] == 1) {
|
||||
return self.contextMenuAction;
|
||||
}
|
||||
return [super action];
|
||||
}
|
||||
|
||||
- (id)target {
|
||||
if([self selectedSegment] == 1) {
|
||||
return self.contextMenuTarget;
|
||||
}
|
||||
return [super target];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -155,7 +155,7 @@
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSButtonCell" key="NSCell" id="1067181375">
|
||||
<int key="NSCellFlags">-1543503872</int>
|
||||
<int key="NSCellFlags">-2080374784</int>
|
||||
<int key="NSCellFlags2">134217728</int>
|
||||
<string key="NSContents">Generate Keyfile</string>
|
||||
<object class="NSFont" key="NSSupport">
|
||||
@@ -350,7 +350,6 @@
|
||||
<string key="NSFrame">{{184, 13}, {151, 32}}</string>
|
||||
<reference key="NSSuperview" ref="1006"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSButtonCell" key="NSCell" id="767191408">
|
||||
@@ -400,7 +399,7 @@
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="1060378975"/>
|
||||
</object>
|
||||
<string key="NSScreenRect">{{0, 0}, {1920, 1058}}</string>
|
||||
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
|
||||
<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
|
||||
<bool key="NSWindowIsRestorable">YES</bool>
|
||||
</object>
|
||||
@@ -1554,6 +1553,7 @@
|
||||
</object>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="outlets">
|
||||
<string key="changePasswordButton">NSButton</string>
|
||||
<string key="errorTextField">NSTextField</string>
|
||||
<string key="keyfilePathControl">NSPathControl</string>
|
||||
<string key="passwordRepeatTextField">HNHRoundedSecureTextField</string>
|
||||
@@ -1561,6 +1561,10 @@
|
||||
<string key="togglePasswordButton">NSButton</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
|
||||
<object class="IBToOneOutletInfo" key="changePasswordButton">
|
||||
<string key="name">changePasswordButton</string>
|
||||
<string key="candidateClassName">NSButton</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="errorTextField">
|
||||
<string key="name">errorTextField</string>
|
||||
<string key="candidateClassName">NSTextField</string>
|
||||
|
||||
Binary file not shown.
Binary file not shown.
13
MacPassTests/KPKTestKeyfileParsing.h
Normal file
13
MacPassTests/KPKTestKeyfileParsing.h
Normal file
@@ -0,0 +1,13 @@
|
||||
//
|
||||
// KPKTestKeyfileParsing.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 13.08.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import <SenTestingKit/SenTestingKit.h>
|
||||
|
||||
@interface KPKTestKeyfileParsing : SenTestCase
|
||||
|
||||
@end
|
||||
47
MacPassTests/KPKTestKeyfileParsing.m
Normal file
47
MacPassTests/KPKTestKeyfileParsing.m
Normal file
@@ -0,0 +1,47 @@
|
||||
//
|
||||
// KPKTestKeyfileParsing.m
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 13.08.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "KPKTestKeyfileParsing.h"
|
||||
#import "NSData+Keyfile.h"
|
||||
|
||||
@implementation KPKTestKeyfileParsing
|
||||
|
||||
- (void)testXmlKeyfileLoadingValidFile {
|
||||
NSBundle *myBundle = [NSBundle bundleForClass:[self class]];
|
||||
NSURL *url = [myBundle URLForResource:@"Keepass2Key" withExtension:@"xml"];
|
||||
NSError *error;
|
||||
NSData *data = [NSData dataWithContentsOfKeyFile:url version:KPKXmlVersion error:&error];
|
||||
STAssertNotNil(data, @"Data should be loaded");
|
||||
STAssertNil(error, @"No error should occur on keyfile loading");
|
||||
}
|
||||
|
||||
- (void)testXmlKeyfileLoadingCorruptData {
|
||||
STAssertFalse(NO, @"Not Implemented");
|
||||
}
|
||||
|
||||
- (void)testXmlKeyfileLoadingMissingVersion {
|
||||
STAssertFalse(NO, @"Not Implemented");
|
||||
}
|
||||
|
||||
- (void)testXmlKeyfileLoadingLowerVersion {
|
||||
STAssertFalse(NO, @"Not Implemented");
|
||||
}
|
||||
|
||||
- (void)testXmlKeyfilGeneration {
|
||||
NSData *data = [NSData generateKeyfiledataForVersion:KPKXmlVersion];
|
||||
// Test if structure is sound;
|
||||
STAssertNotNil(data, @"Keydata should have been generated");
|
||||
}
|
||||
|
||||
- (void)testLegacyKeyfileGeneration {
|
||||
NSData *data = [NSData generateKeyfiledataForVersion:KPKLegacyVersion];
|
||||
// test if strucutre is sound;
|
||||
STAssertNotNil(data, @"Keydata should have been generated");
|
||||
}
|
||||
|
||||
@end
|
||||
9
MacPassTests/Keyfiles/Keepass2Key.xml
Normal file
9
MacPassTests/Keyfiles/Keepass2Key.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<KeyFile>
|
||||
<Meta>
|
||||
<Version>1.00</Version>
|
||||
</Meta>
|
||||
<Key>
|
||||
<Data>L8JyIjlAd3SowrQPm6ZaR9mMolm/7iL6T1GJRGBNrAE=</Data>
|
||||
</Key>
|
||||
</KeyFile>
|
||||
Submodule MiniKeePassLib updated: 6a917076ab...c56ef24aac
Reference in New Issue
Block a user