Compare commits
68 Commits
0.3.1-alph
...
0.3.8-alph
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a6622148a0 | ||
|
|
af4336e94b | ||
|
|
4a35d0d4ff | ||
|
|
8087085fc0 | ||
|
|
9ced3fce0b | ||
|
|
acc800c9e6 | ||
|
|
45cb4a2652 | ||
|
|
1f94a626bb | ||
|
|
a6afe0bcf4 | ||
|
|
1fd89bfab6 | ||
|
|
db0640840f | ||
|
|
fb735d9e41 | ||
|
|
862cbe839e | ||
|
|
cb5a71dfee | ||
|
|
30697648b9 | ||
|
|
e5e8d01dff | ||
|
|
030dbd5be7 | ||
|
|
e306b2b3f2 | ||
|
|
0fe99cda97 | ||
|
|
c207b2b24a | ||
|
|
dc51c60c19 | ||
|
|
86d983f776 | ||
|
|
efa727eaba | ||
|
|
5e6d2bed3d | ||
|
|
5e6e31fb47 | ||
|
|
8d34f77a1f | ||
|
|
859fe5ede8 | ||
|
|
fef291df88 | ||
|
|
c1b47bdb77 | ||
|
|
0e102d3f0f | ||
|
|
d4c7d49d6f | ||
|
|
0144e3c21f | ||
|
|
dd5eef4e60 | ||
|
|
bfc610a25e | ||
|
|
0986271199 | ||
|
|
63c3c83eb8 | ||
|
|
0a42e55f0e | ||
|
|
442d16e297 | ||
|
|
6f92b70039 | ||
|
|
8496140f9c | ||
|
|
d814556376 | ||
|
|
c0051f852e | ||
|
|
726f8846b8 | ||
|
|
c50da8f0ac | ||
|
|
f4c67ea603 | ||
|
|
99163ab84c | ||
|
|
3ae08796a1 | ||
|
|
665dad02ac | ||
|
|
2630dc8778 | ||
|
|
9836d3c194 | ||
|
|
55d0eddbf8 | ||
|
|
03c5f78960 | ||
|
|
1d688293af | ||
|
|
6b14f84afb | ||
|
|
a31e287ec8 | ||
|
|
860d6bb21c | ||
|
|
3d14904640 | ||
|
|
3d4c183bdb | ||
|
|
00eec52781 | ||
|
|
ab0199e3dd | ||
|
|
910c89288f | ||
|
|
eaa072f298 | ||
|
|
d0b6927a5e | ||
|
|
b7d15f7e49 | ||
|
|
515190a74e | ||
|
|
75c9aa6873 | ||
|
|
c34d840e35 | ||
|
|
fb0887ebf0 |
3
.gitmodules
vendored
@@ -10,3 +10,6 @@
|
||||
[submodule "CocoaHTTPServer"]
|
||||
path = CocoaHTTPServer
|
||||
url = git://github.com/robbiehanson/CocoaHTTPServer.git
|
||||
[submodule "KeePassKit"]
|
||||
path = KeePassKit
|
||||
url = https://mstarke@github.com/mstarke/KeePassKit
|
||||
|
||||
BIN
Assets/Screenshots/Attachments.png
Normal file
|
After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 105 KiB |
BIN
Assets/Screenshots/NoInspector.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 159 KiB |
BIN
Assets/Screenshots/SetPassword.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
2
HNHUi
1
KeePassKit
Submodule
@@ -10,7 +10,25 @@
|
||||
4C01C23F1764D2980016D5D0 /* KdbEntry+Undo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C01C23E1764D2980016D5D0 /* KdbEntry+Undo.m */; };
|
||||
4C01C2421764D8980016D5D0 /* MPContextMenuHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C01C2411764D8980016D5D0 /* MPContextMenuHelper.m */; };
|
||||
4C01C245176500C40016D5D0 /* HNHLevelIndicatorCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C01C244176500C40016D5D0 /* HNHLevelIndicatorCell.m */; };
|
||||
4C055E74179620BF00BD2BAB /* NSString+CommandString.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C055E73179620BF00BD2BAB /* NSString+CommandString.m */; };
|
||||
4C10412C178CDD44001B5239 /* NSDate+Humanized.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C10412B178CDD44001B5239 /* NSDate+Humanized.m */; };
|
||||
4C16BA6217879A3C002B42BD /* MPPasswordStringFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C16BA6117879A3C002B42BD /* MPPasswordStringFormatter.m */; };
|
||||
4C1842AB179B027800E2F5BC /* KPKDeletedNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842AA179B027800E2F5BC /* KPKDeletedNode.m */; };
|
||||
4C1842AF179B211C00E2F5BC /* KPKXmlTreeReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842AE179B211C00E2F5BC /* KPKXmlTreeReader.m */; };
|
||||
4C1842B2179B28C400E2F5BC /* KPKLegacyTreeReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842B1179B28C400E2F5BC /* KPKLegacyTreeReader.m */; };
|
||||
4C1842B5179B28D400E2F5BC /* KPKLegacyTreeWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842B4179B28D400E2F5BC /* KPKLegacyTreeWriter.m */; };
|
||||
4C1842B8179B348600E2F5BC /* KPKLegacyLoadingTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842B7179B348600E2F5BC /* KPKLegacyLoadingTest.m */; };
|
||||
4C1842BC179B434C00E2F5BC /* KPKXmlHeaderReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842BB179B434C00E2F5BC /* KPKXmlHeaderReader.m */; };
|
||||
4C1842C0179B5BFD00E2F5BC /* NSData+CommonCrypto.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842BF179B5BFD00E2F5BC /* NSData+CommonCrypto.m */; };
|
||||
4C1842C3179B69E700E2F5BC /* NSData+HashedData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842C2179B69E700E2F5BC /* NSData+HashedData.m */; };
|
||||
4C1842C6179BF52100E2F5BC /* KPKLegacyHeaderReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842C5179BF52000E2F5BC /* KPKLegacyHeaderReader.m */; };
|
||||
4C1842CA179C616700E2F5BC /* KPKTreeCryptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842C9179C616700E2F5BC /* KPKTreeCryptor.m */; };
|
||||
4C1842D0179C64DD00E2F5BC /* KPKLegacyTreeCryptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842CF179C64DD00E2F5BC /* KPKLegacyTreeCryptor.m */; };
|
||||
4C1842D3179C64F000E2F5BC /* KPKXmlTreeCryptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842D2179C64EF00E2F5BC /* KPKXmlTreeCryptor.m */; };
|
||||
4C18816C179E06920045C5B7 /* TrashBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C18816B179E06920045C5B7 /* TrashBar.xib */; };
|
||||
4C18F9AB178E122500890BCE /* Test_Password_1234.kdb in Resources */ = {isa = PBXBuildFile; fileRef = 4C18F9AA178E122500890BCE /* Test_Password_1234.kdb */; };
|
||||
4C19E500178E26EF002F2CD0 /* Test_Password_1234.kdbx in Resources */ = {isa = PBXBuildFile; fileRef = 4C19E4FF178E26EF002F2CD0 /* Test_Password_1234.kdbx */; };
|
||||
4C19E503178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C19E502178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m */; };
|
||||
4C1DDCDD1711ECEB00C98DA3 /* PasswordCreatorWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */; };
|
||||
4C22040D1746ED160054C916 /* KdbGroup+Undo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C22040C1746ED160054C916 /* KdbGroup+Undo.m */; };
|
||||
4C245B76176E1E3D0086100E /* DDData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C245A6A176E1E3C0086100E /* DDData.m */; };
|
||||
@@ -42,7 +60,7 @@
|
||||
4C2724CE1778EFB100FD8456 /* NSData+Random.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2724CD1778EFB100FD8456 /* NSData+Random.m */; };
|
||||
4C2724D11778EFE300FD8456 /* NSString+Empty.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2724D01778EFE300FD8456 /* NSString+Empty.m */; };
|
||||
4C2724D41778FA0700FD8456 /* NSDate+Packed.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2724D31778FA0700FD8456 /* NSDate+Packed.m */; };
|
||||
4C2724D71778FF1A00FD8456 /* NSUUID+KeePassLib.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2724D61778FF1A00FD8456 /* NSUUID+KeePassLib.m */; };
|
||||
4C2724D71778FF1A00FD8456 /* NSUUID+KeePassKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2724D61778FF1A00FD8456 /* NSUUID+KeePassKit.m */; };
|
||||
4C2724DA17790E7C00FD8456 /* NSMutableData+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2724D917790E7C00FD8456 /* NSMutableData+Base64.m */; };
|
||||
4C2A6134177A1D5F00C9826C /* KPLErrorCodes.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2A6133177A1D5F00C9826C /* KPLErrorCodes.m */; };
|
||||
4C2C4C2C16D3BE3700D49295 /* KdbGroup+MPTreeTools.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2C4C2B16D3BE3700D49295 /* KdbGroup+MPTreeTools.m */; };
|
||||
@@ -52,19 +70,32 @@
|
||||
4C2E381F16D11FF900037A9D /* 05_LanguagesTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C2E381C16D11FF900037A9D /* 05_LanguagesTemplate.pdf */; };
|
||||
4C2E382316D1421B00037A9D /* MPIconHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2E382216D1421B00037A9D /* MPIconHelper.m */; };
|
||||
4C2E382616D1470200037A9D /* MPViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2E382516D1470200037A9D /* MPViewController.m */; };
|
||||
4C305F36179A0BD70082334F /* KPKIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C305F35179A0BD70082334F /* KPKIcon.m */; };
|
||||
4C305F3C179A19F90082334F /* KPKIconLoading.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C305F3B179A19F90082334F /* KPKIconLoading.m */; };
|
||||
4C305F3E179A1A760082334F /* image.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C305F3D179A1A760082334F /* image.png */; };
|
||||
4C3666411787327E00B249F1 /* MPDocument+Attachments.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3666401787327E00B249F1 /* MPDocument+Attachments.m */; };
|
||||
4C366643178748F500B249F1 /* 99_HarddiskTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C366642178748F500B249F1 /* 99_HarddiskTemplate.pdf */; };
|
||||
4C36E5B4177CD4FB00152132 /* Kdb4Tree+KVOAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C36E5B3177CD4FB00152132 /* Kdb4Tree+KVOAdditions.m */; };
|
||||
4C37A6731769393300AD0A40 /* HNHTableHeaderCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C37A6721769393300AD0A40 /* HNHTableHeaderCell.m */; };
|
||||
4C37A84015B8B474005EF8EE /* MPOutlineDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C37A83F15B8B474005EF8EE /* MPOutlineDataSource.m */; };
|
||||
4C39B3F5178FEFAE0027DC7C /* KPKNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C39B3F4178FEFAE0027DC7C /* KPKNode.m */; };
|
||||
4C3BD51516D276F800389F1F /* MPToolbarDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3BD51416D276F800389F1F /* MPToolbarDelegate.m */; };
|
||||
4C3D4C0817594CA40038DAAC /* HNHSeparator.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D4C0717594CA40038DAAC /* HNHSeparator.m */; };
|
||||
4C3E1CC0177DEFB3003BD9BD /* StringField+Undo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3E1CBF177DEFB3003BD9BD /* StringField+Undo.m */; };
|
||||
4C3F28541791EDFD00703281 /* KPKErrors.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3F28531791EDFD00703281 /* KPKErrors.m */; };
|
||||
4C3FFD9E16DAF60600DF9186 /* FilterBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C3FFD9D16DAF60600DF9186 /* FilterBar.xib */; };
|
||||
4C431BCD16E2A82800700A81 /* MPPasteBoardController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C431BCC16E2A82700700A81 /* MPPasteBoardController.m */; };
|
||||
4C431BCF16E2BAB000700A81 /* OverlayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C431BCE16E2BAB000700A81 /* OverlayWindow.xib */; };
|
||||
4C4436771792BE810099E220 /* KPKFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4436761792BE810099E220 /* KPKFormat.m */; };
|
||||
4C4510091798C53700219998 /* StringField+Validation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4510081798C53700219998 /* StringField+Validation.m */; };
|
||||
4C45100C1798C65C00219998 /* Kdb4Entry+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C45100B1798C65C00219998 /* Kdb4Entry+MPAdditions.m */; };
|
||||
4C45FB1C178E09ED0010007D /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C45FB1B178E09ED0010007D /* SenTestingKit.framework */; };
|
||||
4C45FB1D178E09ED0010007D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C77E36615B84A240093A587 /* Cocoa.framework */; };
|
||||
4C45FB23178E09ED0010007D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4C45FB21178E09ED0010007D /* InfoPlist.strings */; };
|
||||
4C45FB2D178E0BCB0010007D /* MPDatabaseLoading.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C45FB2C178E0BCB0010007D /* MPDatabaseLoading.m */; };
|
||||
4C45FB30178E0CE20010007D /* MPDatabaseCreation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C45FB2F178E0CE20010007D /* MPDatabaseCreation.m */; };
|
||||
4C46B88517063A070046109A /* NSString+MPPasswordCreation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C46B88417063A070046109A /* NSString+MPPasswordCreation.m */; };
|
||||
4C46B88817063A170046109A /* NSString+MPPasswordAnalysis.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C46B88717063A170046109A /* NSString+MPPasswordAnalysis.m */; };
|
||||
4C46B88817063A170046109A /* NSString+PasswordStrength.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C46B88717063A170046109A /* NSString+PasswordStrength.m */; };
|
||||
4C46E09E17673A0A00DA62E8 /* HNHShadowBox.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C46E09D17673A0A00DA62E8 /* HNHShadowBox.m */; };
|
||||
4C4A100F176286FD00BBF2CA /* MPTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A100E176286FD00BBF2CA /* MPTableView.m */; };
|
||||
4C4A101217629DA900BBF2CA /* KdbGroup+KVOAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A101117629DA900BBF2CA /* KdbGroup+KVOAdditions.m */; };
|
||||
@@ -82,8 +113,10 @@
|
||||
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 */; };
|
||||
4C58BD4F176370B100B8178C /* HNHBadgedTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C58BD4E176370B100B8178C /* HNHBadgedTextField.m */; };
|
||||
4C591B57178F897A0080B16B /* KPKAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C591B56178F897A0080B16B /* KPKAttachment.m */; };
|
||||
4C5A11FE1708DE8700223D8A /* MPPasswordCreatorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5A11FC1708DE8700223D8A /* MPPasswordCreatorViewController.m */; };
|
||||
4C5A11FF1708DE8800223D8A /* PasswordCreatorView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C5A11FD1708DE8700223D8A /* PasswordCreatorView.xib */; };
|
||||
4C5AA591179549A1008ECAD7 /* KPKXmlTreeWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5AA590179549A1008ECAD7 /* KPKXmlTreeWriter.m */; };
|
||||
4C5BF67B175C01F300D53DF7 /* MPUppercaseStringValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5BF67A175C01F300D53DF7 /* MPUppercaseStringValueTransformer.m */; };
|
||||
4C5EC302177B700D00DA955B /* MPRootAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5EC301177B700D00DA955B /* MPRootAdapter.m */; };
|
||||
4C5FE9AE17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5FE9AD17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.m */; };
|
||||
@@ -122,11 +155,14 @@
|
||||
4C669B9F16760ED100DD0774 /* RandomStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B7516760ED100DD0774 /* RandomStream.m */; };
|
||||
4C669BA016760ED100DD0774 /* Salsa20RandomStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B7716760ED100DD0774 /* Salsa20RandomStream.m */; };
|
||||
4C669BA216760ED100DD0774 /* UUID.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B7B16760ED100DD0774 /* UUID.m */; };
|
||||
4C67D33017981A2B00A7BDFC /* HNHTokenField.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C67D32F17981A2B00A7BDFC /* HNHTokenField.m */; };
|
||||
4C67D33317981ABA00A7BDFC /* HNHTokenFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C67D33217981ABA00A7BDFC /* HNHTokenFieldCell.m */; };
|
||||
4C69A73A16D589DF00EC1B1A /* HNHGradientView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C69A73916D589DF00EC1B1A /* HNHGradientView.m */; };
|
||||
4C6D1D25178579570014C5A5 /* 48_FolderTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C6D1D24178579570014C5A5 /* 48_FolderTemplate.pdf */; };
|
||||
4C6D1D27178586CA0014C5A5 /* 99_AddFolderTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C6D1D26178586CA0014C5A5 /* 99_AddFolderTemplate.pdf */; };
|
||||
4C6D1D2B17858A250014C5A5 /* MacPass.icns in Resources */ = {isa = PBXBuildFile; fileRef = 4C6D1D2A17858A250014C5A5 /* MacPass.icns */; };
|
||||
4C701CBC178618A000581B88 /* 12_RemoteTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C701CBB178618A000581B88 /* 12_RemoteTemplate.pdf */; };
|
||||
4C70D100179092F200652EE9 /* KPKPassword.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C70D0FF179092F200652EE9 /* KPKPassword.m */; };
|
||||
4C74DD07177BD1640034A9DB /* MPCustomFieldView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C74DD06177BD1640034A9DB /* MPCustomFieldView.m */; };
|
||||
4C76155C1764C04C0015A1A6 /* GeneralSettings.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C76155E1764C04C0015A1A6 /* GeneralSettings.xib */; };
|
||||
4C7615681764C0C40015A1A6 /* PasswordInputView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C76156A1764C0C40015A1A6 /* PasswordInputView.xib */; };
|
||||
@@ -141,6 +177,7 @@
|
||||
4C77E37D15B84A240093A587 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C77E37B15B84A240093A587 /* MainMenu.xib */; };
|
||||
4C79DF2A176685870083708F /* HNHRoundedTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C79DF29176685870083708F /* HNHRoundedTextField.m */; };
|
||||
4C7F35681779DFFB00C57890 /* Errors.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4C7F356A1779DFFB00C57890 /* Errors.strings */; };
|
||||
4C801AFC179310E2002821E3 /* NSString+Hexdata.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C801AFB179310E2002821E3 /* NSString+Hexdata.m */; };
|
||||
4C80BB6F176DE06F00E5E248 /* HNHScrollDocumentViewAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C80BB6E176DE06F00E5E248 /* HNHScrollDocumentViewAdapter.m */; };
|
||||
4C811C8316ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C811C8216ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m */; };
|
||||
4C83814215BF4677001AE468 /* MPDocumentWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C83814115BF4677001AE468 /* MPDocumentWindowController.m */; };
|
||||
@@ -149,6 +186,7 @@
|
||||
4C888C9016EB6C91003D34A1 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4C888C8E16EB6C91003D34A1 /* Localizable.strings */; };
|
||||
4C888C9316EB6F5E003D34A1 /* MPToolbarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C888C9216EB6F5E003D34A1 /* MPToolbarItem.m */; };
|
||||
4C888C9716EB754B003D34A1 /* MPActionHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C888C9616EB754B003D34A1 /* MPActionHelper.m */; };
|
||||
4C8A173D1790AA41008B5C17 /* NSData+Keyfile.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8A173C1790AA41008B5C17 /* NSData+Keyfile.m */; };
|
||||
4C8FECC816D57E3200BF26CF /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C8FECC716D57E3200BF26CF /* QuartzCore.framework */; };
|
||||
4C920E2A16DCDFA00083839B /* MPLoggerProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C920E2916DCDFA00083839B /* MPLoggerProxy.m */; };
|
||||
4C9D6AA917615199001C660C /* HNHRoundedSecureTextFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C9D6AA817615199001C660C /* HNHRoundedSecureTextFieldCell.m */; };
|
||||
@@ -157,6 +195,7 @@
|
||||
4CA0B2FC15BCAF8600654E32 /* MPSettingsWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0B2FB15BCAF8600654E32 /* MPSettingsWindowController.m */; };
|
||||
4CA0E3A7176FAF99004D18CB /* MPDocumentQueryService.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0E3A6176FAF99004D18CB /* MPDocumentQueryService.m */; };
|
||||
4CA2335A176DBFE100F0B6AC /* MPLockDaemon.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA23359176DBFE100F0B6AC /* MPLockDaemon.m */; };
|
||||
4CA7C36C179A98140099C34B /* NSString+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA7C36B179A98140099C34B /* NSString+Base64.m */; };
|
||||
4CAD747B15B887FD00104512 /* DDXMLElementAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CAD745715B887FD00104512 /* DDXMLElementAdditions.m */; };
|
||||
4CAD747C15B887FD00104512 /* NSString+DDXML.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CAD745A15B887FD00104512 /* NSString+DDXML.m */; };
|
||||
4CAD747D15B887FD00104512 /* DDXMLDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CAD745D15B887FD00104512 /* DDXMLDocument.m */; };
|
||||
@@ -167,6 +206,8 @@
|
||||
4CAF62FC1763604000CD7084 /* HNHBadgedTextFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CAF62FB1763604000CD7084 /* HNHBadgedTextFieldCell.m */; };
|
||||
4CB9339916D3A0DD00A13B5D /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 4CB9339716D3A0DD00A13B5D /* Credits.rtf */; };
|
||||
4CBA2ABA17074C07006D8139 /* MPSettingsHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBA2AB917074C07006D8139 /* MPSettingsHelper.m */; };
|
||||
4CC0D2CE17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC0D2CD17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m */; };
|
||||
4CC0D2D117974A5A000B4BDA /* MPAttachmentTableViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC0D2D017974A5A000B4BDA /* MPAttachmentTableViewDelegate.m */; };
|
||||
4CC1AEBE16D4467C006D2AAB /* KdbTree+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC1AEBD16D4467C006D2AAB /* KdbTree+MPAdditions.m */; };
|
||||
4CC299FF176F99E50050C939 /* MPRequestHandlerService.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC299FE176F99E50050C939 /* MPRequestHandlerService.m */; };
|
||||
4CC29A02176F9D140050C939 /* MPTestAssociateRequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC29A01176F9D140050C939 /* MPTestAssociateRequestHandler.m */; };
|
||||
@@ -174,6 +215,12 @@
|
||||
4CC672791781D0C0006DEDCF /* KdbGroup+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC672781781D0C0006DEDCF /* KdbGroup+MPAdditions.m */; };
|
||||
4CC6727C1781D0D2006DEDCF /* KdbEntry+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6727B1781D0D2006DEDCF /* KdbEntry+MPAdditions.m */; };
|
||||
4CC7EA1B17807E7E0089D4F3 /* HNHRoundendTextFieldCellHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7EA1A17807E7E0089D4F3 /* HNHRoundendTextFieldCellHelper.m */; };
|
||||
4CCEDE2A179F203B008402BE /* MPOutlineView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCEDE29179F203B008402BE /* MPOutlineView.m */; };
|
||||
4CCEDE2E179F213B008402BE /* MPNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCEDE2D179F213B008402BE /* MPNotifications.m */; };
|
||||
4CCEDE32179F5B6C008402BE /* KPKDataStreamer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCEDE31179F5B6C008402BE /* KPKDataStreamer.m */; };
|
||||
4CD3ABBA178F71B50073F5C5 /* KPKTree.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD3ABB4178F71B50073F5C5 /* KPKTree.m */; };
|
||||
4CD3ABBF178F72610073F5C5 /* KPKEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD3ABBE178F72610073F5C5 /* KPKEntry.m */; };
|
||||
4CD3ABC2178F72720073F5C5 /* KPKGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD3ABC1178F72720073F5C5 /* KPKGroup.m */; };
|
||||
4CD5D702177A5EE400100649 /* DatabaseSettingsWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CD5D701177A5EE400100649 /* DatabaseSettingsWindow.xib */; };
|
||||
4CD5D705177A5F3300100649 /* MPDatabaseSettingsWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD5D704177A5F3300100649 /* MPDatabaseSettingsWindowController.m */; };
|
||||
4CD6C5AE1789FDE6000891F6 /* HNHRoundedSecureTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD6C5AD1789FDE6000891F6 /* HNHRoundedSecureTextField.m */; };
|
||||
@@ -183,7 +230,9 @@
|
||||
4CD78ABF16D155FF00768A1D /* 10_ContactTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CD78ABA16D155FF00768A1D /* 10_ContactTemplate.pdf */; };
|
||||
4CD78AC016D155FF00768A1D /* 11_CameraTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CD78ABB16D155FF00768A1D /* 11_CameraTemplate.pdf */; };
|
||||
4CD884B715BD47080042BBF8 /* DocumentWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CD884B615BD47080042BBF8 /* DocumentWindow.xib */; };
|
||||
4CDB5C421794AA4F0017667E /* KPKTree+Serializing.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CDB5C411794AA4F0017667E /* KPKTree+Serializing.m */; };
|
||||
4CDF01A316D1B76700D0AC08 /* MPEntryViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CDF01A216D1B76700D0AC08 /* MPEntryViewController.m */; };
|
||||
4CE298EB1795FC2A00DF7BDB /* MPEntryMenuDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE298EA1795FC2A00DF7BDB /* MPEntryMenuDelegate.m */; };
|
||||
4CE39ABF16ECE34A000FE29D /* MPIconSelectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE39ABE16ECE34A000FE29D /* MPIconSelectViewController.m */; };
|
||||
4CE39AC116ECE359000FE29D /* IconSelection.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CE39AC016ECE359000FE29D /* IconSelection.xib */; };
|
||||
4CE39AC416ECE4F7000FE29D /* MPPopupImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE39AC316ECE4F7000FE29D /* MPPopupImageView.m */; };
|
||||
@@ -192,6 +241,7 @@
|
||||
4CE8247516E2F2B900573141 /* MPOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8247416E2F2B900573141 /* MPOverlayView.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 */; };
|
||||
4CF62B86179385D700B660B6 /* KPKAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF62B85179385D700B660B6 /* KPKAttribute.m */; };
|
||||
4CF6C711176F4533007A811D /* MPStringLengthValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF6C710176F4533007A811D /* MPStringLengthValueTransformer.m */; };
|
||||
4CF6C718176F5234007A811D /* MPAssociateRequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF6C717176F5234007A811D /* MPAssociateRequestHandler.m */; };
|
||||
4CF78057176E5CFD0032EE71 /* MPConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF78056176E5CFD0032EE71 /* MPConnection.m */; };
|
||||
@@ -200,6 +250,10 @@
|
||||
4CF7805F176E75110032EE71 /* ServerSettings.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CF7805E176E75110032EE71 /* ServerSettings.xib */; };
|
||||
4CF78064176E75AD0032EE71 /* MPServerSettingsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF78063176E75AD0032EE71 /* MPServerSettingsController.m */; };
|
||||
4CFC53BF16E94729007396BE /* MPShadowBox.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFC53BE16E94729007396BE /* MPShadowBox.m */; };
|
||||
4CFC873B179DEDF3000DFC03 /* KPKMetaData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFC873A179DEDF3000DFC03 /* KPKMetaData.m */; };
|
||||
4CFC873E179DF200000DFC03 /* KPKTimeInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFC873D179DF200000DFC03 /* KPKTimeInfo.m */; };
|
||||
4CFC8743179DFD3E000DFC03 /* KPKXmlLoadingTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFC8742179DFD3E000DFC03 /* KPKXmlLoadingTest.m */; };
|
||||
4CFEB36E1799D9CF00AF1868 /* Kdb3Entry+KVOAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFEB36D1799D9CF00AF1868 /* Kdb3Entry+KVOAdditions.m */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
@@ -209,8 +263,45 @@
|
||||
4C01C2411764D8980016D5D0 /* MPContextMenuHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPContextMenuHelper.m; sourceTree = "<group>"; };
|
||||
4C01C243176500C40016D5D0 /* HNHLevelIndicatorCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHLevelIndicatorCell.h; sourceTree = "<group>"; };
|
||||
4C01C244176500C40016D5D0 /* HNHLevelIndicatorCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHLevelIndicatorCell.m; sourceTree = "<group>"; };
|
||||
4C055E72179620BF00BD2BAB /* NSString+CommandString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+CommandString.h"; sourceTree = "<group>"; };
|
||||
4C055E73179620BF00BD2BAB /* NSString+CommandString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+CommandString.m"; sourceTree = "<group>"; };
|
||||
4C10412A178CDD44001B5239 /* NSDate+Humanized.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+Humanized.h"; sourceTree = "<group>"; };
|
||||
4C10412B178CDD44001B5239 /* NSDate+Humanized.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+Humanized.m"; sourceTree = "<group>"; };
|
||||
4C16BA6017879A3C002B42BD /* MPPasswordStringFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordStringFormatter.h; sourceTree = "<group>"; };
|
||||
4C16BA6117879A3C002B42BD /* MPPasswordStringFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordStringFormatter.m; sourceTree = "<group>"; };
|
||||
4C1842A9179B027700E2F5BC /* KPKDeletedNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKDeletedNode.h; sourceTree = "<group>"; };
|
||||
4C1842AA179B027800E2F5BC /* KPKDeletedNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKDeletedNode.m; sourceTree = "<group>"; };
|
||||
4C1842AD179B211C00E2F5BC /* KPKXmlTreeReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKXmlTreeReader.h; sourceTree = "<group>"; };
|
||||
4C1842AE179B211C00E2F5BC /* KPKXmlTreeReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKXmlTreeReader.m; sourceTree = "<group>"; };
|
||||
4C1842B0179B28C400E2F5BC /* KPKLegacyTreeReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKLegacyTreeReader.h; sourceTree = "<group>"; };
|
||||
4C1842B1179B28C400E2F5BC /* KPKLegacyTreeReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKLegacyTreeReader.m; sourceTree = "<group>"; };
|
||||
4C1842B3179B28D400E2F5BC /* KPKLegacyTreeWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKLegacyTreeWriter.h; sourceTree = "<group>"; };
|
||||
4C1842B4179B28D400E2F5BC /* KPKLegacyTreeWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKLegacyTreeWriter.m; sourceTree = "<group>"; };
|
||||
4C1842B6179B348600E2F5BC /* KPKLegacyLoadingTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKLegacyLoadingTest.h; sourceTree = "<group>"; };
|
||||
4C1842B7179B348600E2F5BC /* KPKLegacyLoadingTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKLegacyLoadingTest.m; sourceTree = "<group>"; };
|
||||
4C1842B9179B3A1700E2F5BC /* KPKHeaderFields.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = KPKHeaderFields.h; path = Format/KPKHeaderFields.h; sourceTree = "<group>"; };
|
||||
4C1842BA179B434C00E2F5BC /* KPKXmlHeaderReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKXmlHeaderReader.h; sourceTree = "<group>"; };
|
||||
4C1842BB179B434C00E2F5BC /* KPKXmlHeaderReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKXmlHeaderReader.m; sourceTree = "<group>"; };
|
||||
4C1842BE179B5BFD00E2F5BC /* NSData+CommonCrypto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+CommonCrypto.h"; sourceTree = "<group>"; };
|
||||
4C1842BF179B5BFD00E2F5BC /* NSData+CommonCrypto.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+CommonCrypto.m"; sourceTree = "<group>"; };
|
||||
4C1842C1179B69E600E2F5BC /* NSData+HashedData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+HashedData.h"; sourceTree = "<group>"; };
|
||||
4C1842C2179B69E700E2F5BC /* NSData+HashedData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+HashedData.m"; sourceTree = "<group>"; };
|
||||
4C1842C4179BF51F00E2F5BC /* KPKLegacyHeaderReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKLegacyHeaderReader.h; sourceTree = "<group>"; };
|
||||
4C1842C5179BF52000E2F5BC /* KPKLegacyHeaderReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKLegacyHeaderReader.m; sourceTree = "<group>"; };
|
||||
4C1842C7179BF6A100E2F5BC /* KPKLegacyHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = KPKLegacyHeader.h; path = Format/KPKLegacyHeader.h; sourceTree = "<group>"; };
|
||||
4C1842C8179C616600E2F5BC /* KPKTreeCryptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKTreeCryptor.h; sourceTree = "<group>"; };
|
||||
4C1842C9179C616700E2F5BC /* KPKTreeCryptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKTreeCryptor.m; sourceTree = "<group>"; };
|
||||
4C1842CE179C64DC00E2F5BC /* KPKLegacyTreeCryptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKLegacyTreeCryptor.h; sourceTree = "<group>"; };
|
||||
4C1842CF179C64DD00E2F5BC /* KPKLegacyTreeCryptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKLegacyTreeCryptor.m; sourceTree = "<group>"; };
|
||||
4C1842D1179C64EF00E2F5BC /* KPKXmlTreeCryptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKXmlTreeCryptor.h; sourceTree = "<group>"; };
|
||||
4C1842D2179C64EF00E2F5BC /* KPKXmlTreeCryptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKXmlTreeCryptor.m; sourceTree = "<group>"; };
|
||||
4C1842D4179C6DE400E2F5BC /* KPKHeaderReading.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKHeaderReading.h; sourceTree = "<group>"; };
|
||||
4C1842D5179C6F1800E2F5BC /* KPKHeaderWriting.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKHeaderWriting.h; sourceTree = "<group>"; };
|
||||
4C18816B179E06920045C5B7 /* TrashBar.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TrashBar.xib; sourceTree = "<group>"; };
|
||||
4C18F9AA178E122500890BCE /* Test_Password_1234.kdb */ = {isa = PBXFileReference; lastKnownFileType = file; name = Test_Password_1234.kdb; path = Databases/Test_Password_1234.kdb; sourceTree = "<group>"; };
|
||||
4C19E4FF178E26EF002F2CD0 /* Test_Password_1234.kdbx */ = {isa = PBXFileReference; lastKnownFileType = file; name = Test_Password_1234.kdbx; path = Databases/Test_Password_1234.kdbx; sourceTree = "<group>"; };
|
||||
4C19E501178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDatabasePasswordAndKeyfile.h; sourceTree = "<group>"; };
|
||||
4C19E502178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDatabasePasswordAndKeyfile.m; sourceTree = "<group>"; };
|
||||
4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PasswordCreatorWindow.xib; sourceTree = "<group>"; };
|
||||
4C22040B1746ED160054C916 /* KdbGroup+Undo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KdbGroup+Undo.h"; sourceTree = "<group>"; };
|
||||
4C22040C1746ED160054C916 /* KdbGroup+Undo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KdbGroup+Undo.m"; sourceTree = "<group>"; };
|
||||
@@ -273,8 +364,8 @@
|
||||
4C2724D01778EFE300FD8456 /* NSString+Empty.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+Empty.m"; sourceTree = "<group>"; };
|
||||
4C2724D21778FA0700FD8456 /* NSDate+Packed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+Packed.h"; sourceTree = "<group>"; };
|
||||
4C2724D31778FA0700FD8456 /* NSDate+Packed.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+Packed.m"; sourceTree = "<group>"; };
|
||||
4C2724D51778FF1A00FD8456 /* NSUUID+KeePassLib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSUUID+KeePassLib.h"; sourceTree = "<group>"; };
|
||||
4C2724D61778FF1A00FD8456 /* NSUUID+KeePassLib.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSUUID+KeePassLib.m"; sourceTree = "<group>"; };
|
||||
4C2724D51778FF1A00FD8456 /* NSUUID+KeePassKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSUUID+KeePassKit.h"; sourceTree = "<group>"; };
|
||||
4C2724D61778FF1A00FD8456 /* NSUUID+KeePassKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSUUID+KeePassKit.m"; sourceTree = "<group>"; };
|
||||
4C2724D817790E7C00FD8456 /* NSMutableData+Base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableData+Base64.h"; sourceTree = "<group>"; };
|
||||
4C2724D917790E7C00FD8456 /* NSMutableData+Base64.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableData+Base64.m"; sourceTree = "<group>"; };
|
||||
4C2A6132177A181300C9826C /* KPLErrorCodes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPLErrorCodes.h; sourceTree = "<group>"; };
|
||||
@@ -289,6 +380,11 @@
|
||||
4C2E382216D1421B00037A9D /* MPIconHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPIconHelper.m; sourceTree = "<group>"; };
|
||||
4C2E382416D1470200037A9D /* MPViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPViewController.h; sourceTree = "<group>"; };
|
||||
4C2E382516D1470200037A9D /* MPViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPViewController.m; sourceTree = "<group>"; };
|
||||
4C305F34179A0BD70082334F /* KPKIcon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKIcon.h; sourceTree = "<group>"; };
|
||||
4C305F35179A0BD70082334F /* KPKIcon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKIcon.m; sourceTree = "<group>"; };
|
||||
4C305F3A179A19F90082334F /* KPKIconLoading.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKIconLoading.h; sourceTree = "<group>"; };
|
||||
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>"; };
|
||||
4C36E5B2177CD4FB00152132 /* Kdb4Tree+KVOAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Kdb4Tree+KVOAdditions.h"; sourceTree = "<group>"; };
|
||||
@@ -297,20 +393,39 @@
|
||||
4C37A6721769393300AD0A40 /* HNHTableHeaderCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHTableHeaderCell.m; sourceTree = "<group>"; };
|
||||
4C37A83E15B8B474005EF8EE /* MPOutlineDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOutlineDataSource.h; sourceTree = "<group>"; };
|
||||
4C37A83F15B8B474005EF8EE /* MPOutlineDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOutlineDataSource.m; sourceTree = "<group>"; };
|
||||
4C39B3F3178FEFAE0027DC7C /* KPKNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKNode.h; sourceTree = "<group>"; };
|
||||
4C39B3F4178FEFAE0027DC7C /* KPKNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKNode.m; sourceTree = "<group>"; };
|
||||
4C3BD51316D276F800389F1F /* MPToolbarDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPToolbarDelegate.h; sourceTree = "<group>"; };
|
||||
4C3BD51416D276F800389F1F /* MPToolbarDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPToolbarDelegate.m; sourceTree = "<group>"; };
|
||||
4C3D4C0617594CA40038DAAC /* HNHSeparator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHSeparator.h; sourceTree = "<group>"; };
|
||||
4C3D4C0717594CA40038DAAC /* HNHSeparator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHSeparator.m; sourceTree = "<group>"; };
|
||||
4C3E1CBE177DEFB3003BD9BD /* StringField+Undo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "StringField+Undo.h"; sourceTree = "<group>"; };
|
||||
4C3E1CBF177DEFB3003BD9BD /* StringField+Undo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "StringField+Undo.m"; sourceTree = "<group>"; };
|
||||
4C3F28521791EDE800703281 /* KPKErrors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKErrors.h; sourceTree = "<group>"; };
|
||||
4C3F28531791EDFD00703281 /* KPKErrors.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKErrors.m; sourceTree = "<group>"; };
|
||||
4C3FFD9D16DAF60600DF9186 /* FilterBar.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FilterBar.xib; sourceTree = "<group>"; };
|
||||
4C431BCB16E2A82700700A81 /* MPPasteBoardController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasteBoardController.h; sourceTree = "<group>"; };
|
||||
4C431BCC16E2A82700700A81 /* MPPasteBoardController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasteBoardController.m; sourceTree = "<group>"; };
|
||||
4C431BCE16E2BAB000700A81 /* OverlayWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = OverlayWindow.xib; sourceTree = "<group>"; };
|
||||
4C4436751792BE810099E220 /* KPKFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KPKFormat.h; path = Format/KPKFormat.h; sourceTree = "<group>"; };
|
||||
4C4436761792BE810099E220 /* KPKFormat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = KPKFormat.m; path = Format/KPKFormat.m; sourceTree = "<group>"; };
|
||||
4C4510071798C53700219998 /* StringField+Validation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "StringField+Validation.h"; sourceTree = "<group>"; };
|
||||
4C4510081798C53700219998 /* StringField+Validation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "StringField+Validation.m"; sourceTree = "<group>"; };
|
||||
4C45100A1798C65C00219998 /* Kdb4Entry+MPAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Kdb4Entry+MPAdditions.h"; sourceTree = "<group>"; };
|
||||
4C45100B1798C65C00219998 /* Kdb4Entry+MPAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Kdb4Entry+MPAdditions.m"; sourceTree = "<group>"; };
|
||||
4C45FB1A178E09ED0010007D /* MacPassTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MacPassTests.octest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
4C45FB1B178E09ED0010007D /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };
|
||||
4C45FB20178E09ED0010007D /* MacPassTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MacPassTests-Info.plist"; sourceTree = "<group>"; };
|
||||
4C45FB22178E09ED0010007D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
4C45FB27178E09ED0010007D /* MacPassTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MacPassTests-Prefix.pch"; sourceTree = "<group>"; };
|
||||
4C45FB2B178E0BCB0010007D /* MPDatabaseLoading.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDatabaseLoading.h; sourceTree = "<group>"; };
|
||||
4C45FB2C178E0BCB0010007D /* MPDatabaseLoading.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDatabaseLoading.m; sourceTree = "<group>"; };
|
||||
4C45FB2E178E0CE20010007D /* MPDatabaseCreation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDatabaseCreation.h; sourceTree = "<group>"; };
|
||||
4C45FB2F178E0CE20010007D /* MPDatabaseCreation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDatabaseCreation.m; sourceTree = "<group>"; };
|
||||
4C46B88317063A070046109A /* NSString+MPPasswordCreation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+MPPasswordCreation.h"; sourceTree = "<group>"; };
|
||||
4C46B88417063A070046109A /* NSString+MPPasswordCreation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+MPPasswordCreation.m"; sourceTree = "<group>"; };
|
||||
4C46B88617063A170046109A /* NSString+MPPasswordAnalysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+MPPasswordAnalysis.h"; sourceTree = "<group>"; };
|
||||
4C46B88717063A170046109A /* NSString+MPPasswordAnalysis.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+MPPasswordAnalysis.m"; sourceTree = "<group>"; };
|
||||
4C46B88617063A170046109A /* NSString+PasswordStrength.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+PasswordStrength.h"; sourceTree = "<group>"; };
|
||||
4C46B88717063A170046109A /* NSString+PasswordStrength.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+PasswordStrength.m"; sourceTree = "<group>"; };
|
||||
4C46E09C17673A0A00DA62E8 /* HNHShadowBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHShadowBox.h; sourceTree = "<group>"; };
|
||||
4C46E09D17673A0A00DA62E8 /* HNHShadowBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHShadowBox.m; sourceTree = "<group>"; };
|
||||
4C4A100D176286FD00BBF2CA /* MPTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPTableView.h; sourceTree = "<group>"; };
|
||||
@@ -338,9 +453,13 @@
|
||||
4C586FA116D07F6A00E7DB57 /* 02_MessageBoxWarningTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 02_MessageBoxWarningTemplate.pdf; sourceTree = "<group>"; };
|
||||
4C58BD4D176370B100B8178C /* HNHBadgedTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHBadgedTextField.h; sourceTree = "<group>"; };
|
||||
4C58BD4E176370B100B8178C /* HNHBadgedTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHBadgedTextField.m; sourceTree = "<group>"; };
|
||||
4C591B55178F897A0080B16B /* KPKAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKAttachment.h; sourceTree = "<group>"; };
|
||||
4C591B56178F897A0080B16B /* KPKAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKAttachment.m; 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>"; };
|
||||
4C5A11FD1708DE8700223D8A /* PasswordCreatorView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PasswordCreatorView.xib; sourceTree = "<group>"; };
|
||||
4C5AA58F179549A1008ECAD7 /* KPKXmlTreeWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKXmlTreeWriter.h; sourceTree = "<group>"; };
|
||||
4C5AA590179549A1008ECAD7 /* KPKXmlTreeWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKXmlTreeWriter.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>"; };
|
||||
4C5BF679175C01F300D53DF7 /* MPUppercaseStringValueTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPUppercaseStringValueTransformer.h; sourceTree = "<group>"; };
|
||||
@@ -421,12 +540,18 @@
|
||||
4C669B7716760ED100DD0774 /* Salsa20RandomStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Salsa20RandomStream.m; sourceTree = "<group>"; };
|
||||
4C669B7A16760ED100DD0774 /* UUID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UUID.h; sourceTree = "<group>"; };
|
||||
4C669B7B16760ED100DD0774 /* UUID.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UUID.m; sourceTree = "<group>"; };
|
||||
4C67D32E17981A2B00A7BDFC /* HNHTokenField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHTokenField.h; sourceTree = "<group>"; };
|
||||
4C67D32F17981A2B00A7BDFC /* HNHTokenField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHTokenField.m; sourceTree = "<group>"; };
|
||||
4C67D33117981ABA00A7BDFC /* HNHTokenFieldCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHTokenFieldCell.h; sourceTree = "<group>"; };
|
||||
4C67D33217981ABA00A7BDFC /* HNHTokenFieldCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHTokenFieldCell.m; sourceTree = "<group>"; };
|
||||
4C69A73816D589DF00EC1B1A /* HNHGradientView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHGradientView.h; sourceTree = "<group>"; };
|
||||
4C69A73916D589DF00EC1B1A /* HNHGradientView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHGradientView.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>"; };
|
||||
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>"; };
|
||||
4C70D0FF179092F200652EE9 /* KPKPassword.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKPassword.m; sourceTree = "<group>"; };
|
||||
4C74DD05177BD1640034A9DB /* MPCustomFieldView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCustomFieldView.h; sourceTree = "<group>"; };
|
||||
4C74DD06177BD1640034A9DB /* MPCustomFieldView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCustomFieldView.m; sourceTree = "<group>"; };
|
||||
4C76155F1764C0590015A1A6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/GeneralSettings.xib; sourceTree = "<group>"; };
|
||||
@@ -434,7 +559,6 @@
|
||||
4C76156B1764C0C80015A1A6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/PasswordInputView.xib; sourceTree = "<group>"; };
|
||||
4C76156C1764C0CC0015A1A6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/PasswordInputView.strings; sourceTree = "<group>"; };
|
||||
4C7615701764C0E80015A1A6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/InspectorView.xib; sourceTree = "<group>"; };
|
||||
4C7615721764C4A40015A1A6 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/GeneralSettings.strings; sourceTree = "<group>"; };
|
||||
4C7615751764C4A40015A1A6 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/PasswordInputView.strings; sourceTree = "<group>"; };
|
||||
4C7615771764C4A40015A1A6 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
4C7615781764C4A50015A1A6 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = de; path = de.lproj/Credits.rtf; sourceTree = "<group>"; };
|
||||
@@ -456,8 +580,10 @@
|
||||
4C77E37915B84A240093A587 /* MPAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPAppDelegate.m; sourceTree = "<group>"; };
|
||||
4C79DF28176685870083708F /* HNHRoundedTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHRoundedTextField.h; sourceTree = "<group>"; };
|
||||
4C79DF29176685870083708F /* HNHRoundedTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHRoundedTextField.m; sourceTree = "<group>"; };
|
||||
4C7F35691779DFFB00C57890 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Errors.strings; sourceTree = "<group>"; };
|
||||
4C7F356B1779DFFF00C57890 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Errors.strings; sourceTree = "<group>"; };
|
||||
4C7F35691779DFFB00C57890 /* en */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Errors.strings; sourceTree = "<group>"; };
|
||||
4C7F356B1779DFFF00C57890 /* de */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Errors.strings; sourceTree = "<group>"; };
|
||||
4C801AFA179310E2002821E3 /* NSString+Hexdata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+Hexdata.h"; sourceTree = "<group>"; };
|
||||
4C801AFB179310E2002821E3 /* NSString+Hexdata.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+Hexdata.m"; sourceTree = "<group>"; };
|
||||
4C80BB6D176DE06F00E5E248 /* HNHScrollDocumentViewAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHScrollDocumentViewAdapter.h; sourceTree = "<group>"; };
|
||||
4C80BB6E176DE06F00E5E248 /* HNHScrollDocumentViewAdapter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHScrollDocumentViewAdapter.m; sourceTree = "<group>"; };
|
||||
4C811C8116ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPKeyfilePathControlDelegate.h; sourceTree = "<group>"; };
|
||||
@@ -473,6 +599,8 @@
|
||||
4C888C9216EB6F5E003D34A1 /* MPToolbarItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPToolbarItem.m; sourceTree = "<group>"; };
|
||||
4C888C9516EB754B003D34A1 /* MPActionHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPActionHelper.h; sourceTree = "<group>"; };
|
||||
4C888C9616EB754B003D34A1 /* MPActionHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPActionHelper.m; sourceTree = "<group>"; };
|
||||
4C8A173B1790AA41008B5C17 /* NSData+Keyfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+Keyfile.h"; sourceTree = "<group>"; };
|
||||
4C8A173C1790AA41008B5C17 /* NSData+Keyfile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+Keyfile.m"; sourceTree = "<group>"; };
|
||||
4C8FECC716D57E3200BF26CF /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
|
||||
4C920E2816DCDFA00083839B /* MPLoggerProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPLoggerProxy.h; sourceTree = "<group>"; };
|
||||
4C920E2916DCDFA00083839B /* MPLoggerProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPLoggerProxy.m; sourceTree = "<group>"; };
|
||||
@@ -486,9 +614,10 @@
|
||||
4CA0B30D15BCB6FD00654E32 /* MPSettingsTab.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPSettingsTab.h; sourceTree = "<group>"; };
|
||||
4CA0E3A5176FAF99004D18CB /* MPDocumentQueryService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDocumentQueryService.h; sourceTree = "<group>"; };
|
||||
4CA0E3A6176FAF99004D18CB /* MPDocumentQueryService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDocumentQueryService.m; sourceTree = "<group>"; };
|
||||
4CA23357176DB8F000F0B6AC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/GeneralSettings.strings; sourceTree = "<group>"; };
|
||||
4CA23358176DBFE100F0B6AC /* MPLockDaemon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPLockDaemon.h; sourceTree = "<group>"; };
|
||||
4CA23359176DBFE100F0B6AC /* MPLockDaemon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPLockDaemon.m; sourceTree = "<group>"; };
|
||||
4CA7C36A179A98140099C34B /* NSString+Base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+Base64.h"; sourceTree = "<group>"; };
|
||||
4CA7C36B179A98140099C34B /* NSString+Base64.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+Base64.m"; sourceTree = "<group>"; };
|
||||
4CAAFDD51787AED60013FCF9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/MainMenu.strings; sourceTree = "<group>"; };
|
||||
4CAD745615B887FD00104512 /* DDXMLElementAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDXMLElementAdditions.h; sourceTree = "<group>"; };
|
||||
4CAD745715B887FD00104512 /* DDXMLElementAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDXMLElementAdditions.m; sourceTree = "<group>"; };
|
||||
@@ -509,6 +638,10 @@
|
||||
4CB9339816D3A0DD00A13B5D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = "<group>"; };
|
||||
4CBA2AB617074B59006D8139 /* MPSettingsHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSettingsHelper.h; sourceTree = "<group>"; };
|
||||
4CBA2AB917074C07006D8139 /* MPSettingsHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSettingsHelper.m; sourceTree = "<group>"; };
|
||||
4CC0D2CC17974A47000B4BDA /* MPCustomFieldTableViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCustomFieldTableViewDelegate.h; sourceTree = "<group>"; };
|
||||
4CC0D2CD17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCustomFieldTableViewDelegate.m; sourceTree = "<group>"; };
|
||||
4CC0D2CF17974A5A000B4BDA /* MPAttachmentTableViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAttachmentTableViewDelegate.h; sourceTree = "<group>"; };
|
||||
4CC0D2D017974A5A000B4BDA /* MPAttachmentTableViewDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAttachmentTableViewDelegate.m; sourceTree = "<group>"; };
|
||||
4CC1AEBC16D4467C006D2AAB /* KdbTree+MPAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KdbTree+MPAdditions.h"; sourceTree = "<group>"; };
|
||||
4CC1AEBD16D4467C006D2AAB /* KdbTree+MPAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KdbTree+MPAdditions.m"; sourceTree = "<group>"; };
|
||||
4CC299FD176F99E50050C939 /* MPRequestHandlerService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPRequestHandlerService.h; sourceTree = "<group>"; };
|
||||
@@ -523,6 +656,22 @@
|
||||
4CC6727B1781D0D2006DEDCF /* KdbEntry+MPAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KdbEntry+MPAdditions.m"; sourceTree = "<group>"; };
|
||||
4CC7EA1917807E7E0089D4F3 /* HNHRoundendTextFieldCellHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHRoundendTextFieldCellHelper.h; sourceTree = "<group>"; };
|
||||
4CC7EA1A17807E7E0089D4F3 /* HNHRoundendTextFieldCellHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHRoundendTextFieldCellHelper.m; sourceTree = "<group>"; };
|
||||
4CCA7EEC1797866F00B0B55E /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/GeneralSettings.strings; sourceTree = "<group>"; };
|
||||
4CCA7EEE1797867200B0B55E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/GeneralSettings.strings; sourceTree = "<group>"; };
|
||||
4CCEDE28179F203B008402BE /* MPOutlineView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOutlineView.h; sourceTree = "<group>"; };
|
||||
4CCEDE29179F203B008402BE /* MPOutlineView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOutlineView.m; sourceTree = "<group>"; };
|
||||
4CCEDE2C179F2122008402BE /* MPNotifications.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPNotifications.h; sourceTree = "<group>"; };
|
||||
4CCEDE2D179F213B008402BE /* MPNotifications.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPNotifications.m; sourceTree = "<group>"; };
|
||||
4CCEDE2F179F550D008402BE /* KPKTreeReading.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKTreeReading.h; sourceTree = "<group>"; };
|
||||
4CCEDE30179F5B6C008402BE /* KPKDataStreamer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKDataStreamer.h; sourceTree = "<group>"; };
|
||||
4CCEDE31179F5B6C008402BE /* KPKDataStreamer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKDataStreamer.m; sourceTree = "<group>"; };
|
||||
4CD3ABB2178F71B50073F5C5 /* KPKVersion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KPKVersion.h; path = Format/KPKVersion.h; sourceTree = "<group>"; };
|
||||
4CD3ABB3178F71B50073F5C5 /* KPKTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKTree.h; sourceTree = "<group>"; };
|
||||
4CD3ABB4178F71B50073F5C5 /* KPKTree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKTree.m; sourceTree = "<group>"; };
|
||||
4CD3ABBD178F72610073F5C5 /* KPKEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKEntry.h; sourceTree = "<group>"; };
|
||||
4CD3ABBE178F72610073F5C5 /* KPKEntry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKEntry.m; sourceTree = "<group>"; };
|
||||
4CD3ABC0178F72720073F5C5 /* KPKGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKGroup.h; sourceTree = "<group>"; };
|
||||
4CD3ABC1178F72720073F5C5 /* KPKGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKGroup.m; sourceTree = "<group>"; };
|
||||
4CD5D701177A5EE400100649 /* DatabaseSettingsWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DatabaseSettingsWindow.xib; sourceTree = "<group>"; };
|
||||
4CD5D703177A5F3300100649 /* MPDatabaseSettingsWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDatabaseSettingsWindowController.h; sourceTree = "<group>"; };
|
||||
4CD5D704177A5F3300100649 /* MPDatabaseSettingsWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDatabaseSettingsWindowController.m; sourceTree = "<group>"; };
|
||||
@@ -534,8 +683,13 @@
|
||||
4CD78ABA16D155FF00768A1D /* 10_ContactTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 10_ContactTemplate.pdf; sourceTree = "<group>"; };
|
||||
4CD78ABB16D155FF00768A1D /* 11_CameraTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 11_CameraTemplate.pdf; sourceTree = "<group>"; };
|
||||
4CD884B615BD47080042BBF8 /* DocumentWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DocumentWindow.xib; sourceTree = "<group>"; };
|
||||
4CDB5C401794AA4F0017667E /* KPKTree+Serializing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KPKTree+Serializing.h"; sourceTree = "<group>"; };
|
||||
4CDB5C411794AA4F0017667E /* KPKTree+Serializing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KPKTree+Serializing.m"; sourceTree = "<group>"; };
|
||||
4CDE28D0179C8E010036C771 /* MPDatabaseSettingsDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPDatabaseSettingsDelegate.h; sourceTree = "<group>"; };
|
||||
4CDF01A116D1B76700D0AC08 /* MPEntryViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPEntryViewController.h; sourceTree = "<group>"; };
|
||||
4CDF01A216D1B76700D0AC08 /* MPEntryViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPEntryViewController.m; sourceTree = "<group>"; };
|
||||
4CE298E91795FC2A00DF7BDB /* MPEntryMenuDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPEntryMenuDelegate.h; sourceTree = "<group>"; };
|
||||
4CE298EA1795FC2A00DF7BDB /* MPEntryMenuDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPEntryMenuDelegate.m; sourceTree = "<group>"; };
|
||||
4CE39ABD16ECE34A000FE29D /* MPIconSelectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPIconSelectViewController.h; sourceTree = "<group>"; };
|
||||
4CE39ABE16ECE34A000FE29D /* MPIconSelectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPIconSelectViewController.m; sourceTree = "<group>"; };
|
||||
4CE39AC016ECE359000FE29D /* IconSelection.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IconSelection.xib; sourceTree = "<group>"; };
|
||||
@@ -550,6 +704,8 @@
|
||||
4CF1F0C81786B37900CD920E /* NSData+Gzip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+Gzip.m"; sourceTree = "<group>"; };
|
||||
4CF1F0C91786B37900CD920E /* NSData+Gzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+Gzip.h"; sourceTree = "<group>"; };
|
||||
4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 26_FileSaveTemplate.pdf; sourceTree = "<group>"; };
|
||||
4CF62B84179385D700B660B6 /* KPKAttribute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKAttribute.h; sourceTree = "<group>"; };
|
||||
4CF62B85179385D700B660B6 /* KPKAttribute.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKAttribute.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>"; };
|
||||
4CF6C715176F5183007A811D /* MPServerRequestHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPServerRequestHandler.h; sourceTree = "<group>"; };
|
||||
@@ -566,10 +722,29 @@
|
||||
4CF78063176E75AD0032EE71 /* MPServerSettingsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPServerSettingsController.m; sourceTree = "<group>"; };
|
||||
4CFC53BD16E94729007396BE /* MPShadowBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPShadowBox.h; sourceTree = "<group>"; };
|
||||
4CFC53BE16E94729007396BE /* MPShadowBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPShadowBox.m; sourceTree = "<group>"; };
|
||||
4CFC8739179DEDF3000DFC03 /* KPKMetaData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKMetaData.h; sourceTree = "<group>"; };
|
||||
4CFC873A179DEDF3000DFC03 /* KPKMetaData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKMetaData.m; sourceTree = "<group>"; };
|
||||
4CFC873C179DF200000DFC03 /* KPKTimeInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKTimeInfo.h; sourceTree = "<group>"; };
|
||||
4CFC873D179DF200000DFC03 /* KPKTimeInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKTimeInfo.m; sourceTree = "<group>"; };
|
||||
4CFC873F179DF295000DFC03 /* KPKTimerecording.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKTimerecording.h; sourceTree = "<group>"; };
|
||||
4CFC8740179DF7A3000DFC03 /* KPKUndoing.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKUndoing.h; sourceTree = "<group>"; };
|
||||
4CFC8741179DFD3E000DFC03 /* KPKXmlLoadingTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKXmlLoadingTest.h; sourceTree = "<group>"; };
|
||||
4CFC8742179DFD3E000DFC03 /* KPKXmlLoadingTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKXmlLoadingTest.m; sourceTree = "<group>"; };
|
||||
4CFEB36C1799D9CF00AF1868 /* Kdb3Entry+KVOAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Kdb3Entry+KVOAdditions.h"; sourceTree = "<group>"; };
|
||||
4CFEB36D1799D9CF00AF1868 /* Kdb3Entry+KVOAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Kdb3Entry+KVOAdditions.m"; sourceTree = "<group>"; };
|
||||
6E719715172058BA00E4C5FC /* MPDatabaseVersion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPDatabaseVersion.h; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
4C45FB16178E09ED0010007D /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
4C45FB1C178E09ED0010007D /* SenTestingKit.framework in Frameworks */,
|
||||
4C45FB1D178E09ED0010007D /* Cocoa.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
4C77E35F15B84A240093A587 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
@@ -593,6 +768,7 @@
|
||||
4C61EA0416D2FFE200AC519E /* OutlineView.xib */,
|
||||
4CF78061176E752E0032EE71 /* PasswordInputs */,
|
||||
4C3FFD9D16DAF60600DF9186 /* FilterBar.xib */,
|
||||
4C18816B179E06920045C5B7 /* TrashBar.xib */,
|
||||
4C76156F1764C0E20015A1A6 /* InspectorView.xib */,
|
||||
4CE39AC016ECE359000FE29D /* IconSelection.xib */,
|
||||
4C2C8B331787500E009649F3 /* UnprotectedWarningView.xib */,
|
||||
@@ -610,10 +786,21 @@
|
||||
4C4FCE14177CFE6B00BBF7AE /* MPCustomFieldTableCellView.m */,
|
||||
4C5FE9AC17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.h */,
|
||||
4C5FE9AD17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.m */,
|
||||
4CCEDE28179F203B008402BE /* MPOutlineView.h */,
|
||||
4CCEDE29179F203B008402BE /* MPOutlineView.m */,
|
||||
);
|
||||
name = Views;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4C104129178CDD26001B5239 /* Categories */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4C10412A178CDD44001B5239 /* NSDate+Humanized.h */,
|
||||
4C10412B178CDD44001B5239 /* NSDate+Humanized.m */,
|
||||
);
|
||||
name = Categories;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4C16BA5F1787997E002B42BD /* ValueTransformer */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -625,6 +812,27 @@
|
||||
name = ValueTransformer;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4C1842D6179C716100E2F5BC /* Format */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4C4436751792BE810099E220 /* KPKFormat.h */,
|
||||
4C4436761792BE810099E220 /* KPKFormat.m */,
|
||||
4CD3ABB2178F71B50073F5C5 /* KPKVersion.h */,
|
||||
4C1842C7179BF6A100E2F5BC /* KPKLegacyHeader.h */,
|
||||
4C1842B9179B3A1700E2F5BC /* KPKHeaderFields.h */,
|
||||
);
|
||||
name = Format;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4C18F9AC178E123200890BCE /* Databases */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4C19E4FF178E26EF002F2CD0 /* Test_Password_1234.kdbx */,
|
||||
4C18F9AA178E122500890BCE /* Test_Password_1234.kdb */,
|
||||
);
|
||||
name = Databases;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4C245A64176E1E3C0086100E /* CocoaHTTPServer */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -780,10 +988,12 @@
|
||||
4C2724D31778FA0700FD8456 /* NSDate+Packed.m */,
|
||||
4CF1F0C81786B37900CD920E /* NSData+Gzip.m */,
|
||||
4CF1F0C91786B37900CD920E /* NSData+Gzip.h */,
|
||||
4C2724D51778FF1A00FD8456 /* NSUUID+KeePassLib.h */,
|
||||
4C2724D61778FF1A00FD8456 /* NSUUID+KeePassLib.m */,
|
||||
4C2724D817790E7C00FD8456 /* NSMutableData+Base64.h */,
|
||||
4C2724D917790E7C00FD8456 /* NSMutableData+Base64.m */,
|
||||
4C801AFA179310E2002821E3 /* NSString+Hexdata.h */,
|
||||
4C801AFB179310E2002821E3 /* NSString+Hexdata.m */,
|
||||
4CA7C36A179A98140099C34B /* NSString+Base64.h */,
|
||||
4CA7C36B179A98140099C34B /* NSString+Base64.m */,
|
||||
);
|
||||
name = Categories;
|
||||
sourceTree = "<group>";
|
||||
@@ -813,10 +1023,16 @@
|
||||
4C36E5B3177CD4FB00152132 /* Kdb4Tree+KVOAdditions.m */,
|
||||
4C4FCE16177D03D700BBF7AE /* Kdb4Entry+KVOAdditions.h */,
|
||||
4C4FCE17177D03D700BBF7AE /* Kdb4Entry+KVOAdditions.m */,
|
||||
4CFEB36C1799D9CF00AF1868 /* Kdb3Entry+KVOAdditions.h */,
|
||||
4CFEB36D1799D9CF00AF1868 /* Kdb3Entry+KVOAdditions.m */,
|
||||
4C83F4A81774B155006C5FC0 /* Kdb3Tree+NewTree.h */,
|
||||
4C83F4A91774B155006C5FC0 /* Kdb3Tree+NewTree.m */,
|
||||
4C83F4AB1774B25F006C5FC0 /* Kdb4Tree+NewTree.h */,
|
||||
4C83F4AC1774B25F006C5FC0 /* Kdb4Tree+NewTree.m */,
|
||||
4C4510071798C53700219998 /* StringField+Validation.h */,
|
||||
4C4510081798C53700219998 /* StringField+Validation.m */,
|
||||
4C45100A1798C65C00219998 /* Kdb4Entry+MPAdditions.h */,
|
||||
4C45100B1798C65C00219998 /* Kdb4Entry+MPAdditions.m */,
|
||||
);
|
||||
name = "KeePassLib Categories";
|
||||
sourceTree = "<group>";
|
||||
@@ -841,10 +1057,20 @@
|
||||
4CA23359176DBFE100F0B6AC /* MPLockDaemon.m */,
|
||||
4C16BA6017879A3C002B42BD /* MPPasswordStringFormatter.h */,
|
||||
4C16BA6117879A3C002B42BD /* MPPasswordStringFormatter.m */,
|
||||
4CCEDE2C179F2122008402BE /* MPNotifications.h */,
|
||||
4CCEDE2D179F213B008402BE /* MPNotifications.m */,
|
||||
);
|
||||
name = Helper;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4C305F3F179A1A790082334F /* Images */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4C305F3D179A1A760082334F /* image.png */,
|
||||
);
|
||||
name = Images;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4C37A84115B8B47D005EF8EE /* Delegates */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -854,6 +1080,12 @@
|
||||
4C3BD51416D276F800389F1F /* MPToolbarDelegate.m */,
|
||||
4C811C8116ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.h */,
|
||||
4C811C8216ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m */,
|
||||
4CE298E91795FC2A00DF7BDB /* MPEntryMenuDelegate.h */,
|
||||
4CE298EA1795FC2A00DF7BDB /* MPEntryMenuDelegate.m */,
|
||||
4CC0D2CC17974A47000B4BDA /* MPCustomFieldTableViewDelegate.h */,
|
||||
4CC0D2CD17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m */,
|
||||
4CC0D2CF17974A5A000B4BDA /* MPAttachmentTableViewDelegate.h */,
|
||||
4CC0D2D017974A5A000B4BDA /* MPAttachmentTableViewDelegate.m */,
|
||||
);
|
||||
name = Delegates;
|
||||
sourceTree = "<group>";
|
||||
@@ -875,13 +1107,45 @@
|
||||
name = Model;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4C45FB1E178E09ED0010007D /* MacPassTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4C305F3F179A1A790082334F /* Images */,
|
||||
4C18F9AC178E123200890BCE /* Databases */,
|
||||
4C45FB2B178E0BCB0010007D /* MPDatabaseLoading.h */,
|
||||
4C45FB2C178E0BCB0010007D /* MPDatabaseLoading.m */,
|
||||
4C45FB2E178E0CE20010007D /* MPDatabaseCreation.h */,
|
||||
4C45FB2F178E0CE20010007D /* MPDatabaseCreation.m */,
|
||||
4C19E501178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.h */,
|
||||
4C19E502178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m */,
|
||||
4C45FB1F178E09ED0010007D /* Supporting Files */,
|
||||
4C305F3A179A19F90082334F /* KPKIconLoading.h */,
|
||||
4C305F3B179A19F90082334F /* KPKIconLoading.m */,
|
||||
4C1842B6179B348600E2F5BC /* KPKLegacyLoadingTest.h */,
|
||||
4C1842B7179B348600E2F5BC /* KPKLegacyLoadingTest.m */,
|
||||
4CFC8741179DFD3E000DFC03 /* KPKXmlLoadingTest.h */,
|
||||
4CFC8742179DFD3E000DFC03 /* KPKXmlLoadingTest.m */,
|
||||
);
|
||||
path = MacPassTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4C45FB1F178E09ED0010007D /* Supporting Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4C45FB20178E09ED0010007D /* MacPassTests-Info.plist */,
|
||||
4C45FB21178E09ED0010007D /* InfoPlist.strings */,
|
||||
4C45FB27178E09ED0010007D /* MacPassTests-Prefix.pch */,
|
||||
);
|
||||
name = "Supporting Files";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4C46B8821706397A0046109A /* Security Additions */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4C46B88317063A070046109A /* NSString+MPPasswordCreation.h */,
|
||||
4C46B88417063A070046109A /* NSString+MPPasswordCreation.m */,
|
||||
4C46B88617063A170046109A /* NSString+MPPasswordAnalysis.h */,
|
||||
4C46B88717063A170046109A /* NSString+MPPasswordAnalysis.m */,
|
||||
4C46B88617063A170046109A /* NSString+PasswordStrength.h */,
|
||||
4C46B88717063A170046109A /* NSString+PasswordStrength.m */,
|
||||
);
|
||||
name = "Security Additions";
|
||||
sourceTree = "<group>";
|
||||
@@ -1009,9 +1273,11 @@
|
||||
children = (
|
||||
4C245A64176E1E3C0086100E /* CocoaHTTPServer */,
|
||||
4CC3AAB6175F4983003EF01B /* HNHUi */,
|
||||
4CD3ABAD178F71B50073F5C5 /* KeePassKit */,
|
||||
4C669B2D16760ED100DD0774 /* MiniKeePassLib */,
|
||||
4CAD745415B887FD00104512 /* KissXML */,
|
||||
4C77E36C15B84A240093A587 /* MacPass */,
|
||||
4C45FB1E178E09ED0010007D /* MacPassTests */,
|
||||
4C77E36515B84A240093A587 /* Frameworks */,
|
||||
4C77E36315B84A240093A587 /* Products */,
|
||||
);
|
||||
@@ -1021,6 +1287,7 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4C77E36215B84A240093A587 /* MacPass.app */,
|
||||
4C45FB1A178E09ED0010007D /* MacPassTests.octest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
@@ -1032,6 +1299,7 @@
|
||||
4C8FECC716D57E3200BF26CF /* QuartzCore.framework */,
|
||||
4CAD748B15B889B700104512 /* Security.framework */,
|
||||
4C77E36615B84A240093A587 /* Cocoa.framework */,
|
||||
4C45FB1B178E09ED0010007D /* SenTestingKit.framework */,
|
||||
4C77E36815B84A240093A587 /* Other Frameworks */,
|
||||
);
|
||||
name = Frameworks;
|
||||
@@ -1050,6 +1318,7 @@
|
||||
4C77E36C15B84A240093A587 /* MacPass */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4C104129178CDD26001B5239 /* Categories */,
|
||||
4C245C11176E22150086100E /* KeepassHttp */,
|
||||
4C46B8821706397A0046109A /* Security Additions */,
|
||||
4C2C4C2516D3BCEA00D49295 /* KeePassLib Categories */,
|
||||
@@ -1114,6 +1383,7 @@
|
||||
children = (
|
||||
4CF6C715176F5183007A811D /* MPServerRequestHandler.h */,
|
||||
4CA0B30D15BCB6FD00654E32 /* MPSettingsTab.h */,
|
||||
4CDE28D0179C8E010036C771 /* MPDatabaseSettingsDelegate.h */,
|
||||
);
|
||||
name = Protocolls;
|
||||
sourceTree = "<group>";
|
||||
@@ -1177,6 +1447,10 @@
|
||||
4CC3AAB9175F4983003EF01B /* HNHRoundedTextFieldCell.m */,
|
||||
4C9D6AA717615199001C660C /* HNHRoundedSecureTextFieldCell.h */,
|
||||
4C9D6AA817615199001C660C /* HNHRoundedSecureTextFieldCell.m */,
|
||||
4C67D32E17981A2B00A7BDFC /* HNHTokenField.h */,
|
||||
4C67D32F17981A2B00A7BDFC /* HNHTokenField.m */,
|
||||
4C67D33117981ABA00A7BDFC /* HNHTokenFieldCell.h */,
|
||||
4C67D33217981ABA00A7BDFC /* HNHTokenFieldCell.m */,
|
||||
4C58BD4D176370B100B8178C /* HNHBadgedTextField.h */,
|
||||
4C58BD4E176370B100B8178C /* HNHBadgedTextField.m */,
|
||||
4CAF62FA1763604000CD7084 /* HNHBadgedTextFieldCell.h */,
|
||||
@@ -1199,6 +1473,99 @@
|
||||
path = HNHUi;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4CD3ABAD178F71B50073F5C5 /* KeePassKit */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4C1842D6179C716100E2F5BC /* Format */,
|
||||
4CD3ABAF178F71B50073F5C5 /* Categories */,
|
||||
4CD3ABB1178F71B50073F5C5 /* Core */,
|
||||
4CD3ABB5178F71B50073F5C5 /* IO */,
|
||||
);
|
||||
path = KeePassKit;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4CD3ABAF178F71B50073F5C5 /* Categories */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4C1842BE179B5BFD00E2F5BC /* NSData+CommonCrypto.h */,
|
||||
4C1842BF179B5BFD00E2F5BC /* NSData+CommonCrypto.m */,
|
||||
4C2724D51778FF1A00FD8456 /* NSUUID+KeePassKit.h */,
|
||||
4C2724D61778FF1A00FD8456 /* NSUUID+KeePassKit.m */,
|
||||
4C8A173B1790AA41008B5C17 /* NSData+Keyfile.h */,
|
||||
4C8A173C1790AA41008B5C17 /* NSData+Keyfile.m */,
|
||||
4C055E72179620BF00BD2BAB /* NSString+CommandString.h */,
|
||||
4C055E73179620BF00BD2BAB /* NSString+CommandString.m */,
|
||||
4C1842C1179B69E600E2F5BC /* NSData+HashedData.h */,
|
||||
4C1842C2179B69E700E2F5BC /* NSData+HashedData.m */,
|
||||
);
|
||||
path = Categories;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4CD3ABB1178F71B50073F5C5 /* Core */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4C70D0FE179092F200652EE9 /* KPKPassword.h */,
|
||||
4C70D0FF179092F200652EE9 /* KPKPassword.m */,
|
||||
4CD3ABB3178F71B50073F5C5 /* KPKTree.h */,
|
||||
4CD3ABB4178F71B50073F5C5 /* KPKTree.m */,
|
||||
4CD3ABBD178F72610073F5C5 /* KPKEntry.h */,
|
||||
4CD3ABBE178F72610073F5C5 /* KPKEntry.m */,
|
||||
4CD3ABC0178F72720073F5C5 /* KPKGroup.h */,
|
||||
4CD3ABC1178F72720073F5C5 /* KPKGroup.m */,
|
||||
4C591B55178F897A0080B16B /* KPKAttachment.h */,
|
||||
4C591B56178F897A0080B16B /* KPKAttachment.m */,
|
||||
4C39B3F3178FEFAE0027DC7C /* KPKNode.h */,
|
||||
4C39B3F4178FEFAE0027DC7C /* KPKNode.m */,
|
||||
4C3F28521791EDE800703281 /* KPKErrors.h */,
|
||||
4C3F28531791EDFD00703281 /* KPKErrors.m */,
|
||||
4CF62B84179385D700B660B6 /* KPKAttribute.h */,
|
||||
4CF62B85179385D700B660B6 /* KPKAttribute.m */,
|
||||
4C305F34179A0BD70082334F /* KPKIcon.h */,
|
||||
4C305F35179A0BD70082334F /* KPKIcon.m */,
|
||||
4C1842A9179B027700E2F5BC /* KPKDeletedNode.h */,
|
||||
4C1842AA179B027800E2F5BC /* KPKDeletedNode.m */,
|
||||
4CFC8739179DEDF3000DFC03 /* KPKMetaData.h */,
|
||||
4CFC873A179DEDF3000DFC03 /* KPKMetaData.m */,
|
||||
4CFC873C179DF200000DFC03 /* KPKTimeInfo.h */,
|
||||
4CFC873D179DF200000DFC03 /* KPKTimeInfo.m */,
|
||||
4CFC873F179DF295000DFC03 /* KPKTimerecording.h */,
|
||||
4CFC8740179DF7A3000DFC03 /* KPKUndoing.h */,
|
||||
);
|
||||
path = Core;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4CD3ABB5178F71B50073F5C5 /* IO */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4CDB5C401794AA4F0017667E /* KPKTree+Serializing.h */,
|
||||
4CDB5C411794AA4F0017667E /* KPKTree+Serializing.m */,
|
||||
4C1842C8179C616600E2F5BC /* KPKTreeCryptor.h */,
|
||||
4C1842C9179C616700E2F5BC /* KPKTreeCryptor.m */,
|
||||
4C1842BA179B434C00E2F5BC /* KPKXmlHeaderReader.h */,
|
||||
4C1842BB179B434C00E2F5BC /* KPKXmlHeaderReader.m */,
|
||||
4C1842D1179C64EF00E2F5BC /* KPKXmlTreeCryptor.h */,
|
||||
4C1842D2179C64EF00E2F5BC /* KPKXmlTreeCryptor.m */,
|
||||
4C5AA58F179549A1008ECAD7 /* KPKXmlTreeWriter.h */,
|
||||
4C5AA590179549A1008ECAD7 /* KPKXmlTreeWriter.m */,
|
||||
4C1842AD179B211C00E2F5BC /* KPKXmlTreeReader.h */,
|
||||
4C1842AE179B211C00E2F5BC /* KPKXmlTreeReader.m */,
|
||||
4C1842B0179B28C400E2F5BC /* KPKLegacyTreeReader.h */,
|
||||
4C1842B1179B28C400E2F5BC /* KPKLegacyTreeReader.m */,
|
||||
4C1842B3179B28D400E2F5BC /* KPKLegacyTreeWriter.h */,
|
||||
4C1842B4179B28D400E2F5BC /* KPKLegacyTreeWriter.m */,
|
||||
4C1842C4179BF51F00E2F5BC /* KPKLegacyHeaderReader.h */,
|
||||
4C1842C5179BF52000E2F5BC /* KPKLegacyHeaderReader.m */,
|
||||
4C1842CE179C64DC00E2F5BC /* KPKLegacyTreeCryptor.h */,
|
||||
4C1842CF179C64DD00E2F5BC /* KPKLegacyTreeCryptor.m */,
|
||||
4C1842D4179C6DE400E2F5BC /* KPKHeaderReading.h */,
|
||||
4C1842D5179C6F1800E2F5BC /* KPKHeaderWriting.h */,
|
||||
4CCEDE2F179F550D008402BE /* KPKTreeReading.h */,
|
||||
4CCEDE30179F5B6C008402BE /* KPKDataStreamer.h */,
|
||||
4CCEDE31179F5B6C008402BE /* KPKDataStreamer.m */,
|
||||
);
|
||||
path = IO;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4CDB556616E29A8A00635918 /* Controls */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -1267,13 +1634,30 @@
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
4C45FB19178E09ED0010007D /* MacPassTests */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 4C45FB2A178E09ED0010007D /* Build configuration list for PBXNativeTarget "MacPassTests" */;
|
||||
buildPhases = (
|
||||
4C45FB15178E09ED0010007D /* Sources */,
|
||||
4C45FB16178E09ED0010007D /* Frameworks */,
|
||||
4C45FB17178E09ED0010007D /* Resources */,
|
||||
4C45FB18178E09ED0010007D /* ShellScript */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = MacPassTests;
|
||||
productName = MacPassTests;
|
||||
productReference = 4C45FB1A178E09ED0010007D /* MacPassTests.octest */;
|
||||
productType = "com.apple.product-type.bundle";
|
||||
};
|
||||
4C77E36115B84A240093A587 /* MacPass */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 4C77E38015B84A240093A587 /* Build configuration list for PBXNativeTarget "MacPass" */;
|
||||
buildPhases = (
|
||||
4C77E35E15B84A240093A587 /* Sources */,
|
||||
4C77E35F15B84A240093A587 /* Frameworks */,
|
||||
4CB9339616D3A04100A13B5D /* ShellScript */,
|
||||
4C77E36015B84A240093A587 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
@@ -1311,11 +1695,23 @@
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
4C77E36115B84A240093A587 /* MacPass */,
|
||||
4C45FB19178E09ED0010007D /* MacPassTests */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
4C45FB17178E09ED0010007D /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
4C45FB23178E09ED0010007D /* InfoPlist.strings in Resources */,
|
||||
4C18F9AB178E122500890BCE /* Test_Password_1234.kdb in Resources */,
|
||||
4C19E500178E26EF002F2CD0 /* Test_Password_1234.kdbx in Resources */,
|
||||
4C305F3E179A1A760082334F /* image.png in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
4C77E36015B84A240093A587 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
@@ -1363,13 +1759,14 @@
|
||||
4C52A88F1788628B00868229 /* 13_KeysTemplate.pdf in Resources */,
|
||||
4C52A8901788628B00868229 /* 18_DisplayTemplate.pdf in Resources */,
|
||||
4C52A892178863B000868229 /* 68_PhoneTemplate.pdf in Resources */,
|
||||
4C18816C179E06920045C5B7 /* TrashBar.xib in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
4CB9339616D3A04100A13B5D /* ShellScript */ = {
|
||||
4C45FB18178E09ED0010007D /* ShellScript */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@@ -1380,11 +1777,24 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "#!/bin/bash\nbuildNumber=$(/usr/libexec/PlistBuddy -c \"Print CFBundleVersion\" \"$INFOPLIST_FILE\")\n#buildNumber=$((0x$buildNumber))\nbuildNumber=$(($buildNumber + 1))\nbuildNumber=$(printf \"%d\" $buildNumber)\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $buildNumber\" \"$INFOPLIST_FILE\"";
|
||||
shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n";
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
4C45FB15178E09ED0010007D /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
4C45FB2D178E0BCB0010007D /* MPDatabaseLoading.m in Sources */,
|
||||
4C45FB30178E0CE20010007D /* MPDatabaseCreation.m in Sources */,
|
||||
4C19E503178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m in Sources */,
|
||||
4C305F3C179A19F90082334F /* KPKIconLoading.m in Sources */,
|
||||
4C1842B8179B348600E2F5BC /* KPKLegacyLoadingTest.m in Sources */,
|
||||
4CFC8743179DFD3E000DFC03 /* KPKXmlLoadingTest.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
4C77E35E15B84A240093A587 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
@@ -1454,7 +1864,7 @@
|
||||
4CE39ABF16ECE34A000FE29D /* MPIconSelectViewController.m in Sources */,
|
||||
4CE39AC416ECE4F7000FE29D /* MPPopupImageView.m in Sources */,
|
||||
4C46B88517063A070046109A /* NSString+MPPasswordCreation.m in Sources */,
|
||||
4C46B88817063A170046109A /* NSString+MPPasswordAnalysis.m in Sources */,
|
||||
4C46B88817063A170046109A /* NSString+PasswordStrength.m in Sources */,
|
||||
4C5A11FE1708DE8700223D8A /* MPPasswordCreatorViewController.m in Sources */,
|
||||
4CE5B54B173AFBA700207B39 /* MPDocument.m in Sources */,
|
||||
4C22040D1746ED160054C916 /* KdbGroup+Undo.m in Sources */,
|
||||
@@ -1516,7 +1926,7 @@
|
||||
4C2724CE1778EFB100FD8456 /* NSData+Random.m in Sources */,
|
||||
4C2724D11778EFE300FD8456 /* NSString+Empty.m in Sources */,
|
||||
4C2724D41778FA0700FD8456 /* NSDate+Packed.m in Sources */,
|
||||
4C2724D71778FF1A00FD8456 /* NSUUID+KeePassLib.m in Sources */,
|
||||
4C2724D71778FF1A00FD8456 /* NSUUID+KeePassKit.m in Sources */,
|
||||
4C2724DA17790E7C00FD8456 /* NSMutableData+Base64.m in Sources */,
|
||||
4C2A6134177A1D5F00C9826C /* KPLErrorCodes.m in Sources */,
|
||||
4CD5D705177A5F3300100649 /* MPDatabaseSettingsWindowController.m in Sources */,
|
||||
@@ -1535,18 +1945,67 @@
|
||||
4C3666411787327E00B249F1 /* MPDocument+Attachments.m in Sources */,
|
||||
4C16BA6217879A3C002B42BD /* MPPasswordStringFormatter.m in Sources */,
|
||||
4CD6C5AE1789FDE6000891F6 /* HNHRoundedSecureTextField.m in Sources */,
|
||||
4C10412C178CDD44001B5239 /* NSDate+Humanized.m in Sources */,
|
||||
4CD3ABBA178F71B50073F5C5 /* KPKTree.m in Sources */,
|
||||
4CD3ABBF178F72610073F5C5 /* KPKEntry.m in Sources */,
|
||||
4CD3ABC2178F72720073F5C5 /* KPKGroup.m in Sources */,
|
||||
4C591B57178F897A0080B16B /* KPKAttachment.m in Sources */,
|
||||
4C39B3F5178FEFAE0027DC7C /* KPKNode.m in Sources */,
|
||||
4C70D100179092F200652EE9 /* KPKPassword.m in Sources */,
|
||||
4C8A173D1790AA41008B5C17 /* NSData+Keyfile.m in Sources */,
|
||||
4C3F28541791EDFD00703281 /* KPKErrors.m in Sources */,
|
||||
4C4436771792BE810099E220 /* KPKFormat.m in Sources */,
|
||||
4C801AFC179310E2002821E3 /* NSString+Hexdata.m in Sources */,
|
||||
4CF62B86179385D700B660B6 /* KPKAttribute.m in Sources */,
|
||||
4CDB5C421794AA4F0017667E /* KPKTree+Serializing.m in Sources */,
|
||||
4C5AA591179549A1008ECAD7 /* KPKXmlTreeWriter.m in Sources */,
|
||||
4CE298EB1795FC2A00DF7BDB /* MPEntryMenuDelegate.m in Sources */,
|
||||
4C055E74179620BF00BD2BAB /* NSString+CommandString.m in Sources */,
|
||||
4CC0D2CE17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m in Sources */,
|
||||
4CC0D2D117974A5A000B4BDA /* MPAttachmentTableViewDelegate.m in Sources */,
|
||||
4C67D33017981A2B00A7BDFC /* HNHTokenField.m in Sources */,
|
||||
4C67D33317981ABA00A7BDFC /* HNHTokenFieldCell.m in Sources */,
|
||||
4C4510091798C53700219998 /* StringField+Validation.m in Sources */,
|
||||
4C45100C1798C65C00219998 /* Kdb4Entry+MPAdditions.m in Sources */,
|
||||
4CFEB36E1799D9CF00AF1868 /* Kdb3Entry+KVOAdditions.m in Sources */,
|
||||
4C305F36179A0BD70082334F /* KPKIcon.m in Sources */,
|
||||
4CA7C36C179A98140099C34B /* NSString+Base64.m in Sources */,
|
||||
4C1842AB179B027800E2F5BC /* KPKDeletedNode.m in Sources */,
|
||||
4C1842AF179B211C00E2F5BC /* KPKXmlTreeReader.m in Sources */,
|
||||
4C1842B2179B28C400E2F5BC /* KPKLegacyTreeReader.m in Sources */,
|
||||
4C1842B5179B28D400E2F5BC /* KPKLegacyTreeWriter.m in Sources */,
|
||||
4C1842BC179B434C00E2F5BC /* KPKXmlHeaderReader.m in Sources */,
|
||||
4C1842C0179B5BFD00E2F5BC /* NSData+CommonCrypto.m in Sources */,
|
||||
4C1842C3179B69E700E2F5BC /* NSData+HashedData.m in Sources */,
|
||||
4C1842C6179BF52100E2F5BC /* KPKLegacyHeaderReader.m in Sources */,
|
||||
4C1842CA179C616700E2F5BC /* KPKTreeCryptor.m in Sources */,
|
||||
4C1842D0179C64DD00E2F5BC /* KPKLegacyTreeCryptor.m in Sources */,
|
||||
4C1842D3179C64F000E2F5BC /* KPKXmlTreeCryptor.m in Sources */,
|
||||
4CFC873B179DEDF3000DFC03 /* KPKMetaData.m in Sources */,
|
||||
4CFC873E179DF200000DFC03 /* KPKTimeInfo.m in Sources */,
|
||||
4CCEDE2A179F203B008402BE /* MPOutlineView.m in Sources */,
|
||||
4CCEDE2E179F213B008402BE /* MPNotifications.m in Sources */,
|
||||
4CCEDE32179F5B6C008402BE /* KPKDataStreamer.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
4C45FB21178E09ED0010007D /* InfoPlist.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
4C45FB22178E09ED0010007D /* en */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4C76155E1764C04C0015A1A6 /* GeneralSettings.xib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
4C76155F1764C0590015A1A6 /* Base */,
|
||||
4C7615721764C4A40015A1A6 /* de */,
|
||||
4CA23357176DB8F000F0B6AC /* en */,
|
||||
4CCA7EEC1797866F00B0B55E /* de */,
|
||||
4CCA7EEE1797867200B0B55E /* en */,
|
||||
);
|
||||
name = GeneralSettings.xib;
|
||||
sourceTree = "<group>";
|
||||
@@ -1619,6 +2078,44 @@
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
4C45FB28178E09ED0010007D /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/MacPass.app/Contents/MacOS/MacPass";
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
FRAMEWORK_SEARCH_PATHS = "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"";
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "MacPassTests/MacPassTests-Prefix.pch";
|
||||
INFOPLIST_FILE = "MacPassTests/MacPassTests-Info.plist";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
TEST_HOST = "$(BUNDLE_LOADER)";
|
||||
WRAPPER_EXTENSION = octest;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
4C45FB29178E09ED0010007D /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/MacPass.app/Contents/MacOS/MacPass";
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
FRAMEWORK_SEARCH_PATHS = "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"";
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "MacPassTests/MacPassTests-Prefix.pch";
|
||||
INFOPLIST_FILE = "MacPassTests/MacPassTests-Info.plist";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
TEST_HOST = "$(BUNDLE_LOADER)";
|
||||
WRAPPER_EXTENSION = octest;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
4C77E37E15B84A240093A587 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
@@ -1709,6 +2206,15 @@
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
4C45FB2A178E09ED0010007D /* Build configuration list for PBXNativeTarget "MacPassTests" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
4C45FB28178E09ED0010007D /* Debug */,
|
||||
4C45FB29178E09ED0010007D /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
4C77E35C15B84A240093A587 /* Build configuration list for PBXProject "MacPass" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
|
||||
121
MacPass.xcodeproj/xcshareddata/xcschemes/MacPass.xcscheme
Normal file
@@ -0,0 +1,121 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0460"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "4C77E36115B84A240093A587"
|
||||
BuildableName = "MacPass.app"
|
||||
BlueprintName = "MacPass"
|
||||
ReferencedContainer = "container:MacPass.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
buildConfiguration = "Debug">
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "4C45FB19178E09ED0010007D"
|
||||
BuildableName = "MacPassTests.octest"
|
||||
BlueprintName = "MacPassTests"
|
||||
ReferencedContainer = "container:MacPass.xcodeproj">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "4C77E36115B84A240093A587"
|
||||
BuildableName = "MacPass.app"
|
||||
BlueprintName = "MacPass"
|
||||
ReferencedContainer = "container:MacPass.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
buildConfiguration = "Debug"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "4C77E36115B84A240093A587"
|
||||
BuildableName = "MacPass.app"
|
||||
BlueprintName = "MacPass"
|
||||
ReferencedContainer = "container:MacPass.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<CommandLineArguments>
|
||||
<CommandLineArgument
|
||||
argument = "-NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints YES"
|
||||
isEnabled = "NO">
|
||||
</CommandLineArgument>
|
||||
</CommandLineArguments>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
buildConfiguration = "Release"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "4C77E36115B84A240093A587"
|
||||
BuildableName = "MacPass.app"
|
||||
BlueprintName = "MacPass"
|
||||
ReferencedContainer = "container:MacPass.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
<PreActions>
|
||||
<ExecutionAction
|
||||
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
|
||||
<ActionContent
|
||||
title = "Run Script"
|
||||
scriptText = "PLIST_FILE=$PROJECT_DIR/$INFOPLIST_FILE VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $PLIST_FILE) VERSION=$(($VERSION + 1)) /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $VERSION" $PLIST_FILE"
|
||||
shellToInvoke = "/bin/bash">
|
||||
<EnvironmentBuildable>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "4C77E36115B84A240093A587"
|
||||
BuildableName = "MacPass.app"
|
||||
BlueprintName = "MacPass"
|
||||
ReferencedContainer = "container:MacPass.xcodeproj">
|
||||
</BuildableReference>
|
||||
</EnvironmentBuildable>
|
||||
</ActionContent>
|
||||
</ExecutionAction>
|
||||
</PreActions>
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@@ -235,6 +235,15 @@
|
||||
<reference key="NSOnImage" ref="35465992"/>
|
||||
<reference key="NSMixedImage" ref="502551668"/>
|
||||
</object>
|
||||
<object class="NSMenuItem" id="919874146">
|
||||
<reference key="NSMenu" ref="720053764"/>
|
||||
<string key="NSTitle">Lock</string>
|
||||
<string key="NSKeyEquiv">L</string>
|
||||
<int key="NSKeyEquivModMask">262144</int>
|
||||
<int key="NSMnemonicLoc">2147483647</int>
|
||||
<reference key="NSOnImage" ref="35465992"/>
|
||||
<reference key="NSMixedImage" ref="502551668"/>
|
||||
</object>
|
||||
<object class="NSMenuItem" id="776162233">
|
||||
<reference key="NSMenu" ref="720053764"/>
|
||||
<string key="NSTitle">Close</string>
|
||||
@@ -253,6 +262,24 @@
|
||||
<reference key="NSOnImage" ref="35465992"/>
|
||||
<reference key="NSMixedImage" ref="502551668"/>
|
||||
</object>
|
||||
<object class="NSMenuItem" id="663106531">
|
||||
<reference key="NSMenu" ref="720053764"/>
|
||||
<string key="NSTitle">Save As…</string>
|
||||
<string key="NSKeyEquiv">S</string>
|
||||
<int key="NSKeyEquivModMask">1048576</int>
|
||||
<int key="NSMnemonicLoc">2147483647</int>
|
||||
<reference key="NSOnImage" ref="35465992"/>
|
||||
<reference key="NSMixedImage" ref="502551668"/>
|
||||
</object>
|
||||
<object class="NSMenuItem" id="438377242">
|
||||
<reference key="NSMenu" ref="720053764"/>
|
||||
<string key="NSTitle">Export As XML…</string>
|
||||
<string key="NSKeyEquiv">E</string>
|
||||
<int key="NSKeyEquivModMask">1048576</int>
|
||||
<int key="NSMnemonicLoc">2147483647</int>
|
||||
<reference key="NSOnImage" ref="35465992"/>
|
||||
<reference key="NSMixedImage" ref="502551668"/>
|
||||
</object>
|
||||
<object class="NSMenuItem" id="579971712">
|
||||
<reference key="NSMenu" ref="720053764"/>
|
||||
<string key="NSTitle">Revert to Saved</string>
|
||||
@@ -794,6 +821,30 @@
|
||||
</object>
|
||||
<int key="connectionID">1234</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBActionConnection" key="connection">
|
||||
<string key="label">saveDocumentAs:</string>
|
||||
<reference key="source" ref="1014"/>
|
||||
<reference key="destination" ref="663106531"/>
|
||||
</object>
|
||||
<int key="connectionID">1255</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBActionConnection" key="connection">
|
||||
<string key="label">exportDatabase:</string>
|
||||
<reference key="source" ref="1014"/>
|
||||
<reference key="destination" ref="438377242"/>
|
||||
</object>
|
||||
<int key="connectionID">1260</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBActionConnection" key="connection">
|
||||
<string key="label">lock:</string>
|
||||
<reference key="source" ref="1014"/>
|
||||
<reference key="destination" ref="919874146"/>
|
||||
</object>
|
||||
<int key="connectionID">1263</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBActionConnection" key="connection">
|
||||
<string key="label">showPreferences:</string>
|
||||
@@ -896,6 +947,9 @@
|
||||
<reference ref="1010469920"/>
|
||||
<reference ref="915918141"/>
|
||||
<reference ref="544639599"/>
|
||||
<reference ref="663106531"/>
|
||||
<reference ref="438377242"/>
|
||||
<reference ref="919874146"/>
|
||||
</array>
|
||||
<reference key="parent" ref="379814623"/>
|
||||
</object>
|
||||
@@ -1226,6 +1280,21 @@
|
||||
<reference key="object" ref="544639599"/>
|
||||
<reference key="parent" ref="720053764"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">1243</int>
|
||||
<reference key="object" ref="663106531"/>
|
||||
<reference key="parent" ref="720053764"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">1259</int>
|
||||
<reference key="object" ref="438377242"/>
|
||||
<reference key="parent" ref="720053764"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">1261</int>
|
||||
<reference key="object" ref="919874146"/>
|
||||
<reference key="parent" ref="720053764"/>
|
||||
</object>
|
||||
</array>
|
||||
</object>
|
||||
<dictionary class="NSMutableDictionary" key="flattenedProperties">
|
||||
@@ -1241,8 +1310,11 @@
|
||||
<string key="1203.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="1231.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="124.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="1243.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="125.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="1259.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="126.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="1261.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
@@ -1298,7 +1370,7 @@
|
||||
<nil key="activeLocalization"/>
|
||||
<dictionary class="NSMutableDictionary" key="localizations"/>
|
||||
<nil key="sourceID"/>
|
||||
<int key="maxID">1234</int>
|
||||
<int key="maxID">1263</int>
|
||||
</object>
|
||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
@@ -1358,6 +1430,8 @@
|
||||
<string key="superclassName">NSWindowController</string>
|
||||
<dictionary class="NSMutableDictionary" key="actions">
|
||||
<string key="editPassword:">id</string>
|
||||
<string key="exportDatabase:">id</string>
|
||||
<string key="lock:">id</string>
|
||||
<string key="showDatabaseSettings:">id</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="actionInfosByName">
|
||||
@@ -1365,6 +1439,14 @@
|
||||
<string key="name">editPassword:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
<object class="IBActionInfo" key="exportDatabase:">
|
||||
<string key="name">exportDatabase:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
<object class="IBActionInfo" key="lock:">
|
||||
<string key="name">lock:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
<object class="IBActionInfo" key="showDatabaseSettings:">
|
||||
<string key="name">showDatabaseSettings:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
|
||||
@@ -286,7 +286,7 @@
|
||||
<object class="NSButton" id="769513826">
|
||||
<reference key="NSNextResponder" ref="1005"/>
|
||||
<int key="NSvFlags">268</int>
|
||||
<string key="NSFrame">{{281, 65}, {83, 32}}</string>
|
||||
<string key="NSFrame">{{320, 65}, {83, 32}}</string>
|
||||
<reference key="NSSuperview" ref="1005"/>
|
||||
<reference key="NSWindow"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
@@ -526,6 +526,22 @@
|
||||
<float key="scoringTypeFloat">24</float>
|
||||
<int key="contentType">2</int>
|
||||
</object>
|
||||
<object class="IBNSLayoutConstraint" id="875982455">
|
||||
<reference key="firstItem" ref="769513826"/>
|
||||
<int key="firstAttribute">6</int>
|
||||
<int key="relation">0</int>
|
||||
<reference key="secondItem" ref="594061862"/>
|
||||
<int key="secondAttribute">6</int>
|
||||
<float key="multiplier">1</float>
|
||||
<object class="IBLayoutConstant" key="constant">
|
||||
<double key="value">0.0</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="1005"/>
|
||||
<int key="scoringType">6</int>
|
||||
<float key="scoringTypeFloat">24</float>
|
||||
<int key="contentType">2</int>
|
||||
</object>
|
||||
<object class="IBNSLayoutConstraint" id="641552480">
|
||||
<reference key="firstItem" ref="769513826"/>
|
||||
<int key="firstAttribute">3</int>
|
||||
@@ -542,22 +558,6 @@
|
||||
<float key="scoringTypeFloat">24</float>
|
||||
<int key="contentType">3</int>
|
||||
</object>
|
||||
<object class="IBNSLayoutConstraint" id="875982455">
|
||||
<reference key="firstItem" ref="769513826"/>
|
||||
<int key="firstAttribute">6</int>
|
||||
<int key="relation">0</int>
|
||||
<reference key="secondItem" ref="1034097047"/>
|
||||
<int key="secondAttribute">6</int>
|
||||
<float key="multiplier">1</float>
|
||||
<object class="IBLayoutConstant" key="constant">
|
||||
<double key="value">0.0</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="1005"/>
|
||||
<int key="scoringType">6</int>
|
||||
<float key="scoringTypeFloat">24</float>
|
||||
<int key="contentType">2</int>
|
||||
</object>
|
||||
<object class="IBNSLayoutConstraint" id="1001566026">
|
||||
<reference key="firstItem" ref="1005"/>
|
||||
<int key="firstAttribute">4</int>
|
||||
@@ -804,9 +804,9 @@
|
||||
<reference ref="1034097047"/>
|
||||
<reference ref="333885704"/>
|
||||
<reference ref="662046682"/>
|
||||
<reference ref="769513826"/>
|
||||
<reference ref="594061862"/>
|
||||
<reference ref="660673733"/>
|
||||
<reference ref="769513826"/>
|
||||
</array>
|
||||
<reference key="parent" ref="0"/>
|
||||
</object>
|
||||
@@ -1027,11 +1027,6 @@
|
||||
<reference key="object" ref="72235716"/>
|
||||
<reference key="parent" ref="1005"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">465</int>
|
||||
<reference key="object" ref="875982455"/>
|
||||
<reference key="parent" ref="1005"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">286</int>
|
||||
<reference key="object" ref="912203343"/>
|
||||
@@ -1105,13 +1100,18 @@
|
||||
<reference key="object" ref="1041224580"/>
|
||||
<reference key="parent" ref="1005"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">496</int>
|
||||
<reference key="object" ref="875982455"/>
|
||||
<reference key="parent" ref="1005"/>
|
||||
</object>
|
||||
</array>
|
||||
</object>
|
||||
<dictionary class="NSMutableDictionary" key="flattenedProperties">
|
||||
<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<array key="1.IBNSViewMetadataConstraints">
|
||||
<array class="NSMutableArray" key="1.IBNSViewMetadataConstraints">
|
||||
<reference ref="781301592"/>
|
||||
<reference ref="335819100"/>
|
||||
<reference ref="915913759"/>
|
||||
@@ -1127,8 +1127,8 @@
|
||||
<reference ref="273022298"/>
|
||||
<reference ref="912203343"/>
|
||||
<reference ref="1001566026"/>
|
||||
<reference ref="875982455"/>
|
||||
<reference ref="641552480"/>
|
||||
<reference ref="875982455"/>
|
||||
<reference ref="466444110"/>
|
||||
<reference ref="72235716"/>
|
||||
<reference ref="1041224580"/>
|
||||
@@ -1187,7 +1187,6 @@
|
||||
<string key="456.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="459.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="462.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="465.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="476.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="478.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="479.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
@@ -1200,12 +1199,13 @@
|
||||
<string key="489.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="490.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="492.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="496.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
|
||||
<nil key="activeLocalization"/>
|
||||
<dictionary class="NSMutableDictionary" key="localizations"/>
|
||||
<nil key="sourceID"/>
|
||||
<int key="maxID">495</int>
|
||||
<int key="maxID">497</int>
|
||||
</object>
|
||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
|
||||
@@ -50,8 +50,9 @@
|
||||
<reference key="NSSuperview"/>
|
||||
<reference key="NSWindow"/>
|
||||
</object>
|
||||
<string key="NSScreenRect">{{0, 0}, {1920, 1058}}</string>
|
||||
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
|
||||
<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
|
||||
<string key="NSFrameAutosaveName">DatabaseWindow</string>
|
||||
<bool key="NSWindowIsRestorable">YES</bool>
|
||||
</object>
|
||||
<object class="NSSplitView" id="903506498">
|
||||
@@ -64,6 +65,7 @@
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<bool key="NSIsVertical">YES</bool>
|
||||
<int key="NSDividerStyle">2</int>
|
||||
<string key="NSAutosaveName"/>
|
||||
</object>
|
||||
</array>
|
||||
<object class="IBObjectContainer" key="IBDocument.Objects">
|
||||
@@ -159,6 +161,7 @@
|
||||
<string key="superclassName">NSWindowController</string>
|
||||
<dictionary class="NSMutableDictionary" key="actions">
|
||||
<string key="editPassword:">id</string>
|
||||
<string key="exportDatabase:">id</string>
|
||||
<string key="showDatabaseSettings:">id</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="actionInfosByName">
|
||||
@@ -166,6 +169,10 @@
|
||||
<string key="name">editPassword:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
<object class="IBActionInfo" key="exportDatabase:">
|
||||
<string key="name">exportDatabase:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
<object class="IBActionInfo" key="showDatabaseSettings:">
|
||||
<string key="name">showDatabaseSettings:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
|
||||
@@ -471,7 +471,7 @@
|
||||
<object class="NSTextField" id="306813103">
|
||||
<reference key="NSNextResponder" ref="788738248"/>
|
||||
<int key="NSvFlags">266</int>
|
||||
<string key="NSFrameSize">{105, 17}</string>
|
||||
<string key="NSFrameSize">{104.5, 17}</string>
|
||||
<reference key="NSSuperview" ref="788738248"/>
|
||||
<reference key="NSNextKeyView" ref="804102913"/>
|
||||
<string key="NSAntiCompressionPriority">{250, 750}</string>
|
||||
@@ -493,7 +493,7 @@
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
</object>
|
||||
</array>
|
||||
<string key="NSFrame">{{1, 1}, {105, 17}}</string>
|
||||
<string key="NSFrame">{{1, 1}, {104.5, 17}}</string>
|
||||
<reference key="NSNextKeyView" ref="306813103"/>
|
||||
</object>
|
||||
<reference key="destination" ref="306813103"/>
|
||||
@@ -562,7 +562,7 @@
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
</object>
|
||||
</array>
|
||||
<string key="NSFrame">{{109, 1}, {144, 17}}</string>
|
||||
<string key="NSFrame">{{108.5, 1}, {144, 17}}</string>
|
||||
<reference key="NSNextKeyView" ref="591921532"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
</object>
|
||||
@@ -605,7 +605,7 @@
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
</object>
|
||||
</array>
|
||||
<string key="NSFrame">{{378, 1}, {113, 17}}</string>
|
||||
<string key="NSFrame">{{377, 1}, {113, 17}}</string>
|
||||
<reference key="NSNextKeyView" ref="441850286"/>
|
||||
</object>
|
||||
<reference key="destination" ref="441850286"/>
|
||||
@@ -622,7 +622,7 @@
|
||||
<object class="NSTextField" id="1042596093">
|
||||
<reference key="NSNextResponder" ref="878614701"/>
|
||||
<int key="NSvFlags">266</int>
|
||||
<string key="NSFrameSize">{119, 17}</string>
|
||||
<string key="NSFrameSize">{118.5, 17}</string>
|
||||
<reference key="NSSuperview" ref="878614701"/>
|
||||
<reference key="NSNextKeyView" ref="542633869"/>
|
||||
<string key="NSAntiCompressionPriority">{250, 750}</string>
|
||||
@@ -639,7 +639,7 @@
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
</object>
|
||||
</array>
|
||||
<string key="NSFrame">{{256, 1}, {119, 17}}</string>
|
||||
<string key="NSFrame">{{255.5, 1}, {118.5, 17}}</string>
|
||||
<reference key="NSNextKeyView" ref="1042596093"/>
|
||||
</object>
|
||||
<reference key="destination" ref="1042596093"/>
|
||||
@@ -673,7 +673,7 @@
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
</object>
|
||||
</array>
|
||||
<string key="NSFrame">{{494, 1}, {198, 17}}</string>
|
||||
<string key="NSFrame">{{493, 1}, {198, 17}}</string>
|
||||
<reference key="NSNextKeyView" ref="488604658"/>
|
||||
</object>
|
||||
<reference key="destination" ref="488604658"/>
|
||||
@@ -1575,7 +1575,7 @@
|
||||
<reference key="parent" ref="276578969"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">834</int>
|
||||
<int key="objectID">843</int>
|
||||
<reference key="object" ref="244975730"/>
|
||||
<reference key="parent" ref="163272962"/>
|
||||
</object>
|
||||
@@ -1735,13 +1735,13 @@
|
||||
<string key="733.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="741.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="743.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="834.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="843.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
|
||||
<nil key="activeLocalization"/>
|
||||
<dictionary class="NSMutableDictionary" key="localizations"/>
|
||||
<nil key="sourceID"/>
|
||||
<int key="maxID">834</int>
|
||||
<int key="maxID">843</int>
|
||||
</object>
|
||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
@@ -1759,6 +1759,7 @@
|
||||
<dictionary class="NSMutableDictionary" key="outlets">
|
||||
<string key="addEntryButton">NSButton</string>
|
||||
<string key="bottomBar">HNHGradientView</string>
|
||||
<string key="entryCountTextField">NSTextField</string>
|
||||
<string key="entryTable">NSTableView</string>
|
||||
<string key="filterBar">NSView</string>
|
||||
<string key="filterDoneButton">NSButton</string>
|
||||
@@ -1768,6 +1769,7 @@
|
||||
<string key="filterURLButton">NSButton</string>
|
||||
<string key="filterUsernameButton">NSButton</string>
|
||||
<string key="tableToTop">NSLayoutConstraint</string>
|
||||
<string key="trashBar">HNHGradientView</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
|
||||
<object class="IBToOneOutletInfo" key="addEntryButton">
|
||||
@@ -1778,6 +1780,10 @@
|
||||
<string key="name">bottomBar</string>
|
||||
<string key="candidateClassName">HNHGradientView</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="entryCountTextField">
|
||||
<string key="name">entryCountTextField</string>
|
||||
<string key="candidateClassName">NSTextField</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="entryTable">
|
||||
<string key="name">entryTable</string>
|
||||
<string key="candidateClassName">NSTableView</string>
|
||||
@@ -1814,6 +1820,10 @@
|
||||
<string key="name">tableToTop</string>
|
||||
<string key="candidateClassName">NSLayoutConstraint</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="trashBar">
|
||||
<string key="name">trashBar</string>
|
||||
<string key="candidateClassName">HNHGradientView</string>
|
||||
</object>
|
||||
</dictionary>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
|
||||
@@ -897,18 +897,10 @@
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">MPEntryViewController</string>
|
||||
<string key="superclassName">MPViewController</string>
|
||||
<object class="NSMutableDictionary" key="actions">
|
||||
<string key="NS.key.0">_toggleFilterSpace:</string>
|
||||
<string key="NS.object.0">id</string>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="actionInfosByName">
|
||||
<string key="NS.key.0">_toggleFilterSpace:</string>
|
||||
<object class="IBActionInfo" key="NS.object.0">
|
||||
<string key="name">_toggleFilterSpace:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
</object>
|
||||
<dictionary class="NSMutableDictionary" key="outlets">
|
||||
<string key="addEntryButton">NSButton</string>
|
||||
<string key="bottomBar">HNHGradientView</string>
|
||||
<string key="entryCountTextField">NSTextField</string>
|
||||
<string key="entryTable">NSTableView</string>
|
||||
<string key="filterBar">NSView</string>
|
||||
<string key="filterDoneButton">NSButton</string>
|
||||
@@ -918,8 +910,21 @@
|
||||
<string key="filterURLButton">NSButton</string>
|
||||
<string key="filterUsernameButton">NSButton</string>
|
||||
<string key="tableToTop">NSLayoutConstraint</string>
|
||||
<string key="trashBar">HNHGradientView</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
|
||||
<object class="IBToOneOutletInfo" key="addEntryButton">
|
||||
<string key="name">addEntryButton</string>
|
||||
<string key="candidateClassName">NSButton</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="bottomBar">
|
||||
<string key="name">bottomBar</string>
|
||||
<string key="candidateClassName">HNHGradientView</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="entryCountTextField">
|
||||
<string key="name">entryCountTextField</string>
|
||||
<string key="candidateClassName">NSTextField</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="entryTable">
|
||||
<string key="name">entryTable</string>
|
||||
<string key="candidateClassName">NSTableView</string>
|
||||
@@ -956,6 +961,10 @@
|
||||
<string key="name">tableToTop</string>
|
||||
<string key="candidateClassName">NSLayoutConstraint</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="trashBar">
|
||||
<string key="name">trashBar</string>
|
||||
<string key="candidateClassName">HNHGradientView</string>
|
||||
</object>
|
||||
</dictionary>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
|
||||
18
MacPass/Kdb3Entry+KVOAdditions.h
Normal file
@@ -0,0 +1,18 @@
|
||||
//
|
||||
// Kdb3Entry+KVOAdditions.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 19.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "Kdb3Node.h"
|
||||
|
||||
@interface Kdb3Entry (KVOAdditions)
|
||||
|
||||
- (NSUInteger)countOfBinaries;
|
||||
- (id)objectInBinariesAtIndex:(NSUInteger)index;
|
||||
- (void)removeObjectFromBinariesAtIndex:(NSUInteger)index;
|
||||
- (void)insertObject:(id)binary inBinariesAtIndex:(NSUInteger)index;
|
||||
|
||||
@end
|
||||
31
MacPass/Kdb3Entry+KVOAdditions.m
Normal file
@@ -0,0 +1,31 @@
|
||||
//
|
||||
// Kdb3Entry+KVOAdditions.m
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 19.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "Kdb3Entry+KVOAdditions.h"
|
||||
|
||||
@implementation Kdb3Entry (KVOAdditions)
|
||||
|
||||
- (NSUInteger)countOfBinaries {
|
||||
return (self.binary != nil ? 1 : 0);
|
||||
}
|
||||
- (id)objectInBinariesAtIndex:(NSUInteger)index {
|
||||
return self.binary;
|
||||
}
|
||||
- (void)removeObjectFromBinariesAtIndex:(NSUInteger)index {
|
||||
if(self.binary ) {
|
||||
self.binary = nil;
|
||||
self.binaryDesc = nil;
|
||||
}
|
||||
}
|
||||
- (void)insertObject:(id)binary inBinariesAtIndex:(NSUInteger)index {
|
||||
return;//
|
||||
}
|
||||
|
||||
|
||||
|
||||
@end
|
||||
@@ -18,32 +18,32 @@
|
||||
tree.root = rootGroup;
|
||||
|
||||
KdbGroup *parentGroup = [tree createGroup:rootGroup];
|
||||
parentGroup.name = @"General";
|
||||
parentGroup.name = NSLocalizedString(@"GENERAL", "General");
|
||||
parentGroup.image = 48;
|
||||
[rootGroup addGroup:parentGroup];
|
||||
|
||||
KdbGroup *group = [tree createGroup:parentGroup];
|
||||
group.name = @"Windows";
|
||||
group.name = NSLocalizedString(@"WINDOWS", "Windows");
|
||||
group.image = 38;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
group = [tree createGroup:parentGroup];
|
||||
group.name = @"Network";
|
||||
group.name = NSLocalizedString(@"NETWORK", "Network");
|
||||
group.image = 3;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
group = [tree createGroup:parentGroup];
|
||||
group.name = @"Internet";
|
||||
group.name = NSLocalizedString(@"INTERNET", "Internet");
|
||||
group.image = 1;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
group = [tree createGroup:parentGroup];
|
||||
group.name = @"eMail";
|
||||
group.name = NSLocalizedString(@"EMAIL", "EMail");
|
||||
group.image = 19;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
group = [tree createGroup:parentGroup];
|
||||
group.name = @"Homebanking";
|
||||
group.name = NSLocalizedString(@"HOMEBANKING", "Homebanking");
|
||||
group.image = 37;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
|
||||
15
MacPass/Kdb4Entry+MPAdditions.h
Normal file
@@ -0,0 +1,15 @@
|
||||
//
|
||||
// Kdb4Entry+MPAdditions.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 19.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "Kdb4Node.h"
|
||||
|
||||
@interface Kdb4Entry (MPAdditions)
|
||||
|
||||
- (NSString *)uniqueKeyForProposal:(NSString *)key;
|
||||
|
||||
@end
|
||||
34
MacPass/Kdb4Entry+MPAdditions.m
Normal file
@@ -0,0 +1,34 @@
|
||||
//
|
||||
// Kdb4Entry+MPAdditions.m
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 19.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "Kdb4Entry+MPAdditions.h"
|
||||
|
||||
@implementation Kdb4Entry (MPAdditions)
|
||||
|
||||
- (NSString *)uniqueKeyForProposal:(NSString *)key {
|
||||
/*
|
||||
FIXME: Introduce some cachin behaviour. We iterate over after every single edit
|
||||
*/
|
||||
NSArray *defaultKeys = @[ FIELD_TITLE,
|
||||
FIELD_USER_NAME,
|
||||
FIELD_PASSWORD,
|
||||
FIELD_URL,
|
||||
FIELD_NOTES ];
|
||||
NSMutableSet *keys = [[NSMutableSet alloc] initWithArray:defaultKeys];
|
||||
for(StringField *field in self.stringFields) {
|
||||
[keys addObject:field.key];
|
||||
}
|
||||
NSUInteger counter = 1;
|
||||
NSString *base = key;
|
||||
while([keys containsObject:key]) {
|
||||
key = [NSString stringWithFormat:@"%@-%ld", base, counter++];
|
||||
}
|
||||
return key;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
Kdb4Tree *tree = [[Kdb4Tree alloc] init];
|
||||
tree.generator = @"MacPass";
|
||||
tree.databaseName = NSLocalizedString(@"NEW_DATABASE", "Name for a newly created Database");
|
||||
tree.databaseName = NSLocalizedString(@"DATABASE", "");
|
||||
tree.databaseNameChanged = currentTime;
|
||||
tree.databaseDescription = @"";
|
||||
tree.databaseDescriptionChanged = currentTime;
|
||||
@@ -42,32 +42,32 @@
|
||||
tree.lastTopVisibleGroup = [UUID nullUuid];
|
||||
|
||||
KdbGroup *parentGroup = [tree createGroup:nil];
|
||||
parentGroup.name = @"General";
|
||||
parentGroup.name = NSLocalizedString(@"GENERAL", "General");
|
||||
parentGroup.image = 48;
|
||||
tree.root = parentGroup;
|
||||
|
||||
KdbGroup *group = [tree createGroup:parentGroup];
|
||||
group.name = @"Windows";
|
||||
group.name = NSLocalizedString(@"WINDOWS", "Windows");
|
||||
group.image = 38;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
group = [tree createGroup:parentGroup];
|
||||
group.name = @"Network";
|
||||
group.name = NSLocalizedString(@"NETWORK", "Network");
|
||||
group.image = 3;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
group = [tree createGroup:parentGroup];
|
||||
group.name = @"Internet";
|
||||
group.name = NSLocalizedString(@"INTERNET", "Internet");
|
||||
group.image = 1;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
group = [tree createGroup:parentGroup];
|
||||
group.name = @"eMail";
|
||||
group.name = NSLocalizedString(@"EMAIL", "EMail");
|
||||
group.image = 19;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
group = [tree createGroup:parentGroup];
|
||||
group.name = @"Homebanking";
|
||||
group.name = NSLocalizedString(@"HOMEBANKING", "Homebanking");
|
||||
group.image = 37;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
|
||||
@@ -17,8 +17,6 @@ APPKIT_EXTERN NSString *const MPEntryNotesUndoableKey;
|
||||
|
||||
@interface KdbEntry (Undo)
|
||||
|
||||
+ (NSUndoManager *)undoManager;
|
||||
|
||||
- (NSString *)titleUndoable;
|
||||
- (NSString *)usernameUndoable;
|
||||
- (NSString *)passwordUndoable;
|
||||
@@ -31,4 +29,8 @@ APPKIT_EXTERN NSString *const MPEntryNotesUndoableKey;
|
||||
- (void)setUrlUndoable:(NSString *)url;
|
||||
- (void)setNotesUndoable:(NSString *)notes;
|
||||
|
||||
- (void)deleteUndoable;
|
||||
- (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index;
|
||||
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index;
|
||||
|
||||
@end
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
//
|
||||
|
||||
#import "KdbEntry+Undo.h"
|
||||
#import "KdbGroup+Undo.h"
|
||||
#import "KdbGroup+KVOAdditions.h"
|
||||
#import "KdbGroup+MPTreeTools.h"
|
||||
|
||||
NSString *const MPEntryTitleUndoableKey = @"titleUndoable";
|
||||
@@ -15,9 +17,16 @@ NSString *const MPEntryPasswordUndoableKey = @"passwordUndoable";
|
||||
NSString *const MPEntryUrlUndoableKey = @"urlUndoable";
|
||||
NSString *const MPEntryNotesUndoableKey = @"notesUndoable";
|
||||
|
||||
#ifndef MPSetActionName
|
||||
#define MPSetActionName(key, comment) \
|
||||
if(![[self undoManager] isUndoing]) {\
|
||||
[[self undoManager] setActionName:[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]];\
|
||||
}
|
||||
#endif
|
||||
|
||||
@implementation KdbEntry (Undo)
|
||||
|
||||
+ (NSUndoManager *)undoManager {
|
||||
- (NSUndoManager *)undoManager {
|
||||
return [[[NSDocumentController sharedDocumentController] currentDocument] undoManager];
|
||||
}
|
||||
|
||||
@@ -41,40 +50,110 @@ NSString *const MPEntryNotesUndoableKey = @"notesUndoable";
|
||||
return [self notes];
|
||||
}
|
||||
|
||||
|
||||
- (void)setTitleUndoable:(NSString *)title {
|
||||
[[KdbEntry undoManager] registerUndoWithTarget:self selector:@selector(setTitleUndoable:) object:self.title];
|
||||
[[KdbEntry undoManager] setActionName:NSLocalizedString(@"UNDO_SET_TITLE", "Undo set title")];
|
||||
[[self undoManager] registerUndoWithTarget:self selector:@selector(setTitleUndoable:) object:self.title];
|
||||
|
||||
if(![[self undoManager] isUndoing]) {
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"SET_TITLE", "Set Title")];
|
||||
}
|
||||
|
||||
[self setLastModificationTime:[NSDate date]];
|
||||
[self setTitle:title];
|
||||
}
|
||||
|
||||
- (void)setUsernameUndoable:(NSString *)username {
|
||||
[[KdbEntry undoManager] registerUndoWithTarget:self selector:@selector(setUsernameUndoable:) object:self.username];
|
||||
[[KdbEntry undoManager] setActionName:NSLocalizedString(@"UNDO_SET_USERNAME", "Undo set username")];
|
||||
[[self undoManager] registerUndoWithTarget:self selector:@selector(setUsernameUndoable:) object:self.username];
|
||||
|
||||
if(![[self undoManager] isUndoing]) {
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"SET_USERNAME", "Undo set username")];
|
||||
}
|
||||
|
||||
[self setLastModificationTime:[NSDate date]];
|
||||
[self setUsername:username];
|
||||
}
|
||||
|
||||
- (void)setPasswordUndoable:(NSString *)password {
|
||||
[[KdbEntry undoManager] registerUndoWithTarget:self selector:@selector(setPasswordUndoable:) object:self.password];
|
||||
[[KdbEntry undoManager] setActionName:NSLocalizedString(@"UNDO_SET_PASSWORT", "Undo set password")];
|
||||
[[self undoManager] registerUndoWithTarget:self selector:@selector(setPasswordUndoable:) object:self.password];
|
||||
MPSetActionName(@"SET_PASSWORT", "Undo set password");
|
||||
|
||||
if(![[self undoManager] isUndoing]) {
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"SET_TITLE", "Set Title")];
|
||||
}
|
||||
|
||||
[self setLastModificationTime:[NSDate date]];
|
||||
[self setPassword:password];
|
||||
}
|
||||
|
||||
- (void)setUrlUndoable:(NSString *)url {
|
||||
[[KdbEntry undoManager] registerUndoWithTarget:self selector:@selector(setUrlUndoable:) object:self.url];
|
||||
[[KdbEntry undoManager] setActionName:NSLocalizedString(@"UNDO_SET_URL", "Undo set URL")];
|
||||
[[self undoManager] registerUndoWithTarget:self selector:@selector(setUrlUndoable:) object:self.url];
|
||||
MPSetActionName(@"SET_URL", "Undo set URL");
|
||||
|
||||
if(![[self undoManager] isUndoing]) {
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"SET_TITLE", "Set Title")];
|
||||
}
|
||||
|
||||
[self setLastModificationTime:[NSDate date]];
|
||||
[self setUrl:url];
|
||||
}
|
||||
|
||||
- (void)setNotesUndoable:(NSString *)notes {
|
||||
[[KdbEntry undoManager] registerUndoWithTarget:self selector:@selector(setNotesUndoable:) object:self.notes];
|
||||
[[KdbEntry undoManager] setActionName:NSLocalizedString(@"UNDO_SET_NOTES", "Undo set notes")];
|
||||
[[self undoManager] registerUndoWithTarget:self selector:@selector(setNotesUndoable:) object:self.notes];
|
||||
MPSetActionName(@"SET_NOTES", "Set Notes");
|
||||
|
||||
if(![[self undoManager] isUndoing]) {
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"SET_TITLE", "Set Title")];
|
||||
}
|
||||
|
||||
[self setLastModificationTime:[NSDate date]];
|
||||
[self setNotes:notes];
|
||||
}
|
||||
|
||||
- (void)deleteUndoable {
|
||||
if(!self.parent) {
|
||||
return; // No parent to be removed from
|
||||
}
|
||||
NSUInteger oldIndex = [self.parent.entries indexOfObject:self];
|
||||
if(oldIndex == NSNotFound) {
|
||||
return; // We're not in our parents entries list
|
||||
}
|
||||
[[[self undoManager] prepareWithInvocationTarget:self.parent] addEntryUndoable:self atIndex:oldIndex];
|
||||
|
||||
if(![[self undoManager] isUndoing]) {
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"DELETE_ENTRY", "Set Title")];
|
||||
}
|
||||
|
||||
//[[NSNotificationCenter defaultCenter] postNotificationName:@"" object:self userInfo:nil];
|
||||
[self.parent removeObjectFromEntriesAtIndex:oldIndex];
|
||||
}
|
||||
|
||||
- (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index {
|
||||
[self _moveToGroup:group atIndex:index actionName:NSLocalizedString(@"MOVE_ENTRY", "Move Group")];
|
||||
}
|
||||
|
||||
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index {
|
||||
[self _moveToGroup:trash atIndex:index actionName:NSLocalizedString(@"TRASH_ENTRY", "Move Entry to Trash")];
|
||||
}
|
||||
|
||||
- (void)_moveToGroup:(KdbGroup *)group atIndex:(NSUInteger)index actionName:(NSString *)name {
|
||||
if(!group || !self.parent) {
|
||||
return; // Nothing to be moved about
|
||||
}
|
||||
NSUInteger oldIndex = [self.parent.entries indexOfObject:self];
|
||||
if(oldIndex == NSNotFound) {
|
||||
return; // Not found in entries of parent!
|
||||
}
|
||||
[[[self undoManager] prepareWithInvocationTarget:self] _moveToGroup:self.parent atIndex:oldIndex actionName:name];
|
||||
|
||||
if(![[self undoManager] isUndoing]) {
|
||||
[[self undoManager] setActionName:name];
|
||||
}
|
||||
|
||||
[self.parent removeObjectFromEntriesAtIndex:oldIndex];
|
||||
// Old indices might be wrong, correct them if necessary
|
||||
index = MIN(index, [group.entries count]);
|
||||
[group insertObject:self inEntriesAtIndex:index];
|
||||
}
|
||||
|
||||
|
||||
|
||||
@end
|
||||
@@ -20,4 +20,6 @@
|
||||
/* Returns the group with the UUID */
|
||||
- (KdbGroup *)groupForUUID:(UUID *)uuid;
|
||||
|
||||
- (BOOL)isAnchestorOfGroup:(KdbGroup *)group;
|
||||
|
||||
@end
|
||||
@@ -49,4 +49,18 @@
|
||||
return [filteredGroups lastObject];
|
||||
}
|
||||
|
||||
- (BOOL)isAnchestorOfGroup:(KdbGroup *)group {
|
||||
if(group == nil) {
|
||||
return NO;
|
||||
}
|
||||
KdbGroup *ancestor = self.parent;
|
||||
while(ancestor.parent) {
|
||||
if(group == self) {
|
||||
return YES;
|
||||
}
|
||||
ancestor = ancestor.parent;
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -17,4 +17,10 @@ APPKIT_EXTERN NSString *const MPGroupNameUndoableKey;
|
||||
- (NSString *)nameUndoable;
|
||||
- (void)setNameUndoable:(NSString *)newName;
|
||||
|
||||
- (void)deleteUndoable;
|
||||
- (void)addGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index;
|
||||
- (void)addEntryUndoable:(KdbEntry *)entry atIndex:(NSUInteger)index;
|
||||
- (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index;
|
||||
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index;
|
||||
|
||||
@end
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#import "KdbGroup+Undo.h"
|
||||
#import "KdbGroup+KVOAdditions.h"
|
||||
#import "KdbEntry+Undo.h"
|
||||
|
||||
NSString *const MPGroupNameUndoableKey = @"nameUndoable";
|
||||
|
||||
@@ -23,8 +24,85 @@ NSString *const MPGroupNameUndoableKey = @"nameUndoable";
|
||||
|
||||
- (void)setNameUndoable:(NSString *)newName {
|
||||
[[self undoManager] registerUndoWithTarget:self selector:@selector(setNameUndoable:) object:self.name];
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_SET_NAME", "Undo set name")];
|
||||
|
||||
if(![[self undoManager] isUndoing]) {
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"SET_NAME", "Set Name")];
|
||||
}
|
||||
|
||||
self.name = newName;
|
||||
}
|
||||
|
||||
- (void)deleteUndoable {
|
||||
if(!self.parent) {
|
||||
return;
|
||||
}
|
||||
NSUInteger oldIndex = [self.parent.groups indexOfObject:self];
|
||||
if(oldIndex == NSNotFound) {
|
||||
return; // Inconsistent data
|
||||
}
|
||||
[[[self undoManager] prepareWithInvocationTarget:self.parent] addGroupUndoable:self atIndex:oldIndex];
|
||||
|
||||
if(![[self undoManager] isUndoing]) {
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"DELETE_GROUP", "Delete Group")];
|
||||
}
|
||||
|
||||
[self.parent removeObjectFromGroupsAtIndex:oldIndex];
|
||||
}
|
||||
|
||||
- (void)addGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index {
|
||||
if(!group) {
|
||||
return;
|
||||
}
|
||||
|
||||
[[[self undoManager] prepareWithInvocationTarget:group] deleteUndoable];
|
||||
|
||||
if(![[self undoManager] isUndoing]) {
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"ADD_GROUP", "Add Group")];
|
||||
}
|
||||
|
||||
index = MIN(index, [group.groups count]);
|
||||
[self insertObject:group inGroupsAtIndex:index];
|
||||
}
|
||||
|
||||
- (void)addEntryUndoable:(KdbEntry *)entry atIndex:(NSUInteger)index {
|
||||
if(!entry) {
|
||||
return;
|
||||
}
|
||||
index = MIN(index, [self.entries count]);
|
||||
[[[self undoManager] prepareWithInvocationTarget:entry] deleteUndoable];
|
||||
|
||||
if(![[self undoManager] isUndoing]) {
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"ADD_ENTRY", "Add Entry")];
|
||||
}
|
||||
|
||||
[self insertObject:entry inEntriesAtIndex:index];
|
||||
}
|
||||
|
||||
- (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index {
|
||||
[self _moveToGroup:group atIndex:index actionName:NSLocalizedString(@"MOVE_GROUP", "Move Group" )];
|
||||
}
|
||||
|
||||
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index {
|
||||
[self _moveToGroup:trash atIndex:index actionName:NSLocalizedString(@"TRASH_GROUP", "Move Group to Trash")];
|
||||
}
|
||||
|
||||
- (void)_moveToGroup:(KdbGroup *)group atIndex:(NSUInteger)index actionName:(NSString *)actionName {
|
||||
if(!self.parent || !group) {
|
||||
return; // No target or origin
|
||||
}
|
||||
NSUInteger oldIndex = [self.parent.groups indexOfObject:self];
|
||||
if(oldIndex == NSNotFound) {
|
||||
return; // We aren't in our parents groups list.
|
||||
}
|
||||
[[[self undoManager] prepareWithInvocationTarget:self] moveToGroupUndoable:self.parent atIndex:oldIndex];
|
||||
|
||||
if(![[self undoManager] isUndoing]) {
|
||||
[[self undoManager] setActionName:actionName];
|
||||
}
|
||||
|
||||
[self.parent removeObjectFromGroupsAtIndex:oldIndex];
|
||||
index = MIN(index, [group.groups count]);
|
||||
[group insertObject:self inGroupsAtIndex:index];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
typedef NS_ENUM(NSUInteger, MPActionType) {
|
||||
MPUnkownAction, // Netural element to be used for returns
|
||||
MPActionAddEntry, // Add an new entry
|
||||
MPActionAddGroup, // Add a new group
|
||||
MPActionEdit, // Edit entry or group
|
||||
MPActionDelete, // Delete entry or group
|
||||
MPActionCopyUsername, // copy username to pasteboard
|
||||
MPActionCopyPassword, // copy password to pasteboard
|
||||
@@ -25,5 +25,6 @@ typedef NS_ENUM(NSUInteger, MPActionType) {
|
||||
@interface MPActionHelper : NSObject
|
||||
|
||||
+ (SEL)actionOfType:(MPActionType)type;
|
||||
+ (MPActionType)typeForAction:(SEL)action;
|
||||
|
||||
@end
|
||||
|
||||
@@ -10,25 +10,42 @@
|
||||
|
||||
@implementation MPActionHelper
|
||||
|
||||
+ (SEL)actionOfType:(MPActionType)type {
|
||||
+ (NSDictionary *)_actionDictionary {
|
||||
static NSDictionary *actionDict;
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
actionDict = @{
|
||||
@(MPActionAddEntry) : @"createEntry:",
|
||||
@(MPActionAddGroup) : @"createGroup:",
|
||||
@(MPActionCopyPassword) : @"copyPassword:",
|
||||
@(MPActionCopyURL) : @"copyURL:",
|
||||
@(MPActionCopyUsername) : @"copyUsername:",
|
||||
@(MPActionDelete) : @"deleteNode:",
|
||||
@(MPActionEdit) : @"editEntry:",
|
||||
@(MPActionOpenURL) : @"openURL:",
|
||||
@(MPActionToggleInspector) : @"toggleInspector:",
|
||||
@(MPActionLock) : @"lock:",
|
||||
@(MPActionEmptyTrash) : @"emptyTrash:"
|
||||
};
|
||||
@(MPActionAddEntry) : @"createEntry:",
|
||||
@(MPActionAddGroup) : @"createGroup:",
|
||||
@(MPActionCopyPassword) : @"copyPassword:",
|
||||
@(MPActionCopyURL) : @"copyURL:",
|
||||
@(MPActionCopyUsername) : @"copyUsername:",
|
||||
@(MPActionDelete) : @"deleteNode:",
|
||||
@(MPActionOpenURL) : @"openURL:",
|
||||
@(MPActionToggleInspector) : @"toggleInspector:",
|
||||
@(MPActionLock) : @"lock:",
|
||||
@(MPActionEmptyTrash) : @"emptyTrash:"
|
||||
};
|
||||
});
|
||||
return actionDict;
|
||||
}
|
||||
|
||||
+ (SEL)actionOfType:(MPActionType)type {
|
||||
NSDictionary *actionDict = [self _actionDictionary];
|
||||
return NSSelectorFromString(actionDict[@(type)]);
|
||||
}
|
||||
|
||||
+ (MPActionType)typeForAction:(SEL)action {
|
||||
NSString *selectorString = NSStringFromSelector(action);
|
||||
NSArray *selectors = [[self _actionDictionary] allValues];
|
||||
NSUInteger index = [selectors indexOfObject:selectorString];
|
||||
if(index == NSNotFound) {
|
||||
return MPUnkownAction;
|
||||
}
|
||||
NSArray *keys = [[self _actionDictionary] allKeysForObject:selectorString];
|
||||
NSAssert([keys count] == 1, @"There should only be one object for the specified key");
|
||||
return [[keys lastObject] integerValue];
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
||||
@@ -38,16 +38,31 @@
|
||||
[MPStringLengthValueTransformer registerTransformer];
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
}
|
||||
|
||||
- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender {
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyOpenEmptyDatabaseOnLaunch];
|
||||
}
|
||||
|
||||
|
||||
- (void)applicationWillFinishLaunching:(NSNotification *)notification {
|
||||
BOOL reopen = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyReopenLastDatabaseOnLaunch];
|
||||
if(reopen) {
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(_applicationDidFinishRestoringWindows:)
|
||||
name:NSApplicationDidFinishRestoringWindowsNotification
|
||||
object:nil];
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
- (void)applicationDidFinishLaunching:(NSNotification *)notification {
|
||||
serverDaemon = [[MPServerDaemon alloc] init];
|
||||
lockDaemon = [[MPLockDaemon alloc] init];
|
||||
}
|
||||
|
||||
|
||||
- (NSString *)applicationName {
|
||||
return [[NSBundle mainBundle] infoDictionary][@"CFBundleName"];
|
||||
}
|
||||
@@ -93,4 +108,26 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (void)_applicationDidFinishRestoringWindows:(NSNotification *)notification {
|
||||
NSDocumentController *documentController = [NSDocumentController sharedDocumentController];
|
||||
NSArray *documents = [documentController documents];
|
||||
NSArray *recentDocuments = [documentController recentDocumentURLs];
|
||||
if([documents count] > 0 ) {
|
||||
return; // There's already a document restored
|
||||
}
|
||||
NSURL *documentUrl;
|
||||
if([recentDocuments count] > 0) {
|
||||
documentUrl = recentDocuments[0];
|
||||
}
|
||||
else {
|
||||
NSString *lastPath = [[NSUserDefaults standardUserDefaults] stringForKey:kMPSettingsKeyLastDatabasePath];
|
||||
documentUrl = [NSURL URLWithString:lastPath];
|
||||
}
|
||||
if([documentUrl isFileURL]) {
|
||||
[documentController openDocumentWithContentsOfURL:documentUrl display:YES
|
||||
completionHandler:^(NSDocument *document, BOOL documentWasAlreadyOpen, NSError *error) {}];
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
17
MacPass/MPAttachmentTableViewDelegate.h
Normal file
@@ -0,0 +1,17 @@
|
||||
//
|
||||
// MPAttachmentTableViewDelegate.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 17.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@class MPInspectorViewController;
|
||||
|
||||
@interface MPAttachmentTableViewDelegate : NSObject <NSTableViewDelegate>
|
||||
|
||||
@property (nonatomic, weak) MPInspectorViewController *viewController;
|
||||
|
||||
@end
|
||||
75
MacPass/MPAttachmentTableViewDelegate.m
Normal file
@@ -0,0 +1,75 @@
|
||||
//
|
||||
// MPAttachmentTableViewDelegate.m
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 17.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MPAttachmentTableViewDelegate.h"
|
||||
|
||||
#import "MPInspectorViewController.h"
|
||||
#import "MPSelectedAttachmentTableCellView.h"
|
||||
|
||||
#import "Kdb4Node.h"
|
||||
#import "Kdb3Node.h"
|
||||
|
||||
#import "HNHTableRowView.h"
|
||||
|
||||
@implementation MPAttachmentTableViewDelegate
|
||||
|
||||
- (void)tableViewSelectionDidChange:(NSNotification *)notification {
|
||||
NSTableView *tableView = [notification object];
|
||||
NSIndexSet *allColumns = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [[tableView tableColumns] count])];
|
||||
if([self.viewController.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||
Kdb4Entry *entryv4 = (Kdb4Entry *)self.viewController.selectedEntry;
|
||||
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [entryv4.binaries count] )];
|
||||
[tableView reloadDataForRowIndexes:indexSet columnIndexes:allColumns];
|
||||
}
|
||||
if([self.viewController.selectedEntry isKindOfClass:[Kdb3Entry class]]) {
|
||||
Kdb3Entry *entryv3 = (Kdb3Entry *)self.viewController.selectedEntry;
|
||||
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, (entryv3.binary ? 1 : 0 ))];
|
||||
[tableView reloadDataForRowIndexes:indexSet columnIndexes:allColumns];
|
||||
}
|
||||
}
|
||||
|
||||
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
|
||||
/* Decide what view to use */
|
||||
NSIndexSet *selectedIndexes = [tableView selectedRowIndexes];
|
||||
NSTableCellView *view;
|
||||
if([selectedIndexes containsIndex:row]) {
|
||||
MPSelectedAttachmentTableCellView *cellView = [tableView makeViewWithIdentifier:@"SelectedCell" owner:tableView];
|
||||
[cellView.saveButton setTag:row];
|
||||
[cellView.saveButton setAction:@selector(saveAttachment:)];
|
||||
[cellView.saveButton setTarget:self.viewController];
|
||||
[cellView.removeButton setTag:row];
|
||||
[cellView.removeButton setAction:@selector(removeAttachment:)];
|
||||
[cellView.removeButton setTarget:self.viewController];
|
||||
view = cellView;
|
||||
}
|
||||
else {
|
||||
view = [tableView makeViewWithIdentifier:@"NormalCell" owner:tableView];
|
||||
}
|
||||
/* Bind view */
|
||||
if([self.viewController.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||
Kdb4Entry *entry = (Kdb4Entry *)self.viewController.selectedEntry;
|
||||
BinaryRef *binaryRef = entry.binaries[row];
|
||||
[[view textField] bind:NSValueBinding toObject:binaryRef withKeyPath:@"key" options:nil];
|
||||
[[view imageView] setImage:[[NSWorkspace sharedWorkspace] iconForFileType:[binaryRef.key pathExtension]]];
|
||||
}
|
||||
else {
|
||||
Kdb3Entry *entry= (Kdb3Entry *)self.viewController.selectedEntry;
|
||||
[[view textField] bind:NSValueBinding toObject:entry withKeyPath:@"binaryDesc" options:nil];
|
||||
[[view imageView] setImage:[[NSWorkspace sharedWorkspace] iconForFileType:[entry.binaryDesc pathExtension]]];
|
||||
}
|
||||
return view;
|
||||
}
|
||||
|
||||
- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row {
|
||||
HNHTableRowView *view = nil;
|
||||
view = [[HNHTableRowView alloc] init];
|
||||
view.selectionCornerRadius = 7;
|
||||
return view;
|
||||
}
|
||||
|
||||
@end
|
||||
17
MacPass/MPCustomFieldTableViewDelegate.h
Normal file
@@ -0,0 +1,17 @@
|
||||
//
|
||||
// MPCustomFieldTableDelegate.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 17.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@class MPInspectorViewController;
|
||||
|
||||
@interface MPCustomFieldTableViewDelegate : NSObject <NSTableViewDelegate>
|
||||
|
||||
@property (nonatomic, weak) MPInspectorViewController *viewController;
|
||||
|
||||
@end
|
||||
42
MacPass/MPCustomFieldTableViewDelegate.m
Normal file
@@ -0,0 +1,42 @@
|
||||
//
|
||||
// MPCustomFieldTableDelegate.m
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 17.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MPCustomFieldTableViewDelegate.h"
|
||||
#import "MPInspectorViewController.h"
|
||||
#import "MPCustomFieldTableCellView.h"
|
||||
|
||||
#import "Kdb4Node.h"
|
||||
#import "StringField+Undo.h"
|
||||
|
||||
@implementation MPCustomFieldTableViewDelegate
|
||||
|
||||
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
|
||||
if(![self.viewController.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||
return nil;
|
||||
}
|
||||
Kdb4Entry *entry = (Kdb4Entry *)self.viewController.selectedEntry;
|
||||
MPCustomFieldTableCellView *view = [tableView makeViewWithIdentifier:@"SelectedCell" owner:tableView];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_customFieldFrameChanged:) name:NSViewFrameDidChangeNotification object:view];
|
||||
if([self.viewController.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||
StringField *stringField = entry.stringFields[row];
|
||||
NSDictionary *validateOptions = @{ NSValidatesImmediatelyBindingOption: @YES };
|
||||
[view.labelTextField bind:NSValueBinding toObject:stringField withKeyPath:MPStringFieldKeyUndoableKey options:validateOptions];
|
||||
[view.valueTextField bind:NSValueBinding toObject:stringField withKeyPath:MPStringFieldValueUndoableKey options:nil];
|
||||
[view.removeButton setTarget:self.viewController];
|
||||
[view.removeButton setAction:@selector(removeCustomField:)];
|
||||
[view.removeButton setTag:row];
|
||||
}
|
||||
return view;
|
||||
}
|
||||
|
||||
- (void)_customFieldFrameChanged:(NSNotification *)notification {
|
||||
// NSView *sender = [notification object];
|
||||
// NSLog(@"didChangeFrameFor: %@ to: %@", sender, NSStringFromRect([sender frame]));
|
||||
}
|
||||
|
||||
@end
|
||||
17
MacPass/MPDatabaseSettingsDelegate.h
Normal file
@@ -0,0 +1,17 @@
|
||||
//
|
||||
// MPDatabaseSettingsDelegate.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 21.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@protocol MPDatabaseSettingsDelegate <NSObject>
|
||||
|
||||
@optional
|
||||
- (void)didCancelDatabaseSettings;
|
||||
- (void)didSaveDatabaseSettings;
|
||||
|
||||
@end
|
||||
@@ -7,20 +7,27 @@
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import "MPDatabaseSettingsDelegate.h"
|
||||
|
||||
typedef NS_ENUM(NSUInteger, MPDatabaseSettingsTab) {
|
||||
MPDatabaseSettingsTabGeneral,
|
||||
MPDatabaseSettingsTabPassword,
|
||||
MPDatabaseSettingsTabDisplay,
|
||||
MPDatabaseSettingsTabAdvanced
|
||||
MPDatabaseSettingsTabAdvanced,
|
||||
MPDatabaseSettingsTemplatesTab,
|
||||
};
|
||||
|
||||
@class MPDocument;
|
||||
@class HNHRoundendTextField;
|
||||
@class HNHRoundedSecureTextField;
|
||||
|
||||
@interface MPDatabaseSettingsWindowController : NSWindowController
|
||||
@interface MPDatabaseSettingsWindowController : NSWindowController <NSTextFieldDelegate, NSTabViewDelegate>
|
||||
|
||||
@property (nonatomic,weak) id<MPDatabaseSettingsDelegate> delegate;
|
||||
|
||||
@property (weak) IBOutlet NSTabView *sectionTabView;
|
||||
@property (weak) IBOutlet NSButton *saveButton;
|
||||
@property (weak) IBOutlet NSButton *cancelButton;
|
||||
|
||||
/* General Tab */
|
||||
@property (weak) IBOutlet NSTextField *databaseNameTextField;
|
||||
@@ -28,8 +35,11 @@ typedef NS_ENUM(NSUInteger, MPDatabaseSettingsTab) {
|
||||
|
||||
/* Protection */
|
||||
@property (weak) IBOutlet HNHRoundedSecureTextField *passwordTextField;
|
||||
@property (weak) IBOutlet HNHRoundedSecureTextField *passwordRepeatTextField;
|
||||
@property (weak) IBOutlet NSPathControl *keyfilePathControl;
|
||||
@property (weak) IBOutlet NSButton *togglePasswordButton;
|
||||
@property (weak) IBOutlet NSTextField *errorTextField;
|
||||
|
||||
|
||||
- (IBAction)clearKey:(id)sender;
|
||||
- (IBAction)generateKey:(id)sender;
|
||||
@@ -46,10 +56,19 @@ typedef NS_ENUM(NSUInteger, MPDatabaseSettingsTab) {
|
||||
@property (weak) IBOutlet NSButton *emptyRecycleBinOnQuitCheckButton;
|
||||
@property (weak) IBOutlet NSPopUpButton *selectRecycleBinGroupPopUpButton;
|
||||
|
||||
|
||||
/* Templates Tab */
|
||||
@property (weak) IBOutlet HNHRoundendTextField *defaultUsernameTextField;
|
||||
@property (weak) IBOutlet NSPopUpButton *templateGroupPopUpButton;
|
||||
|
||||
|
||||
- (id)initWithDocument:(MPDocument *)document;
|
||||
|
||||
- (void)showSettingsTab:(MPDatabaseSettingsTab)tab;
|
||||
|
||||
- (void)update;
|
||||
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
@@ -11,19 +11,26 @@
|
||||
#import "MPDocumentWindowController.h"
|
||||
#import "MPDatabaseVersion.h"
|
||||
#import "MPIconHelper.h"
|
||||
#import "MPSettingsHelper.h"
|
||||
|
||||
#import "HNHRoundedTextField.h"
|
||||
#import "HNHRoundedSecureTextField.h"
|
||||
|
||||
#import "NSString+Empty.h"
|
||||
|
||||
#import "Kdb.h"
|
||||
#import "Kdb4Node.h"
|
||||
#import "KdbGroup+MPAdditions.h"
|
||||
|
||||
@interface MPDatabaseSettingsWindowController () {
|
||||
MPDocument *_document;
|
||||
NSString *_missingFeature;
|
||||
}
|
||||
|
||||
@property (nonatomic,assign) BOOL trashEnabled;
|
||||
@property (nonatomic,assign) BOOL showPassword;
|
||||
@property (nonatomic,assign) BOOL hasValidPasswordOrKey;
|
||||
@property (nonatomic,weak) NSURL *keyURL;
|
||||
|
||||
@end
|
||||
|
||||
@@ -38,6 +45,8 @@
|
||||
if(self) {
|
||||
_document = document;
|
||||
_showPassword = NO;
|
||||
_hasValidPasswordOrKey = NO;
|
||||
_missingFeature = NSLocalizedString(@"KDBX_ONLX_FEATURE", "Feature only available in kdbx databases");
|
||||
}
|
||||
return self;
|
||||
}
|
||||
@@ -47,15 +56,22 @@
|
||||
|
||||
NSAssert(_document != nil, @"Document needs to be present");
|
||||
|
||||
Kdb4Tree *tree = _document.treeV4;
|
||||
if( tree ) {
|
||||
[self _setupDatabase:tree];
|
||||
[self _setupProtectionTab:tree];
|
||||
[self _setupAdvancedTab:tree];
|
||||
[self _setupPasswordTab:tree];
|
||||
}
|
||||
else {
|
||||
// Switch to KdbV3 View
|
||||
[self.saveButton bind:NSEnabledBinding toObject:self withKeyPath:@"hasValidPasswordOrKey" options:nil];
|
||||
|
||||
[self.sectionTabView setDelegate:self];
|
||||
|
||||
|
||||
[self update];
|
||||
}
|
||||
|
||||
- (void)setDelegate:(id<MPDatabaseSettingsDelegate>)delegate {
|
||||
if(_delegate != delegate) {
|
||||
if([delegate conformsToProtocol:@protocol(MPDatabaseSettingsDelegate)]) {
|
||||
_delegate = delegate;
|
||||
}
|
||||
else{
|
||||
NSAssert(NO, @"Delegate needs to conform to MPDatabaseSettingsDelegate protocoll");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,7 +80,7 @@
|
||||
/* Protection */
|
||||
_document.password = [self.passwordTextField stringValue];
|
||||
_document.key = [self.keyfilePathControl URL];
|
||||
|
||||
|
||||
/* General */
|
||||
_document.treeV4.databaseDescription = [self.databaseDescriptionTextView string];
|
||||
_document.treeV4.databaseName = [self.databaseNameTextField stringValue];
|
||||
@@ -72,89 +88,300 @@
|
||||
/* Display */
|
||||
|
||||
/* Advanced */
|
||||
_document.treeV4.recycleBinEnabled = self.trashEnabled;
|
||||
NSMenuItem *menuItem = [self.selectRecycleBinGroupPopUpButton selectedItem];
|
||||
KdbGroup *group = [menuItem representedObject];
|
||||
[_document useGroupAsTrash:group];
|
||||
_document.treeV4.recycleBinEnabled = self.trashEnabled;
|
||||
NSMenuItem *trashMenuItem = [self.selectRecycleBinGroupPopUpButton selectedItem];
|
||||
KdbGroup *trashGroup = [trashMenuItem representedObject];
|
||||
[_document useGroupAsTrash:trashGroup];
|
||||
|
||||
_document.treeV4.protectNotes = [self.protectNotesCheckButton state] == NSOnState;
|
||||
_document.treeV4.protectPassword = [self.protectPasswortCheckButton state] == NSOnState;
|
||||
_document.treeV4.protectTitle = [self.protectTitleCheckButton state] == NSOnState;
|
||||
_document.treeV4.protectUrl = [self.protectURLCheckButton state] == NSOnState;
|
||||
_document.treeV4.protectUserName = [self.protectUserNameCheckButton state] == NSOnState;
|
||||
NSMenuItem *templateMenuItem = [self.templateGroupPopUpButton selectedItem];
|
||||
KdbGroup *templateGroup = [templateMenuItem representedObject];
|
||||
[_document useGroupAsTemplate:templateGroup];
|
||||
|
||||
/* Close to finish */
|
||||
[self close:nil];
|
||||
BOOL protectNotes = [self.protectNotesCheckButton state] == NSOnState;
|
||||
BOOL protectPassword = [self.protectPasswortCheckButton state] == NSOnState;
|
||||
BOOL protectTitle = [self.protectTitleCheckButton state] == NSOnState;
|
||||
BOOL protectURL = [self.protectURLCheckButton state] == NSOnState;
|
||||
BOOL protectUsername = [self.protectUserNameCheckButton state] == NSOnState;
|
||||
|
||||
if(_document.version == MPDatabaseVersion4) {
|
||||
_document.treeV4.protectNotes = protectNotes;
|
||||
_document.treeV4.protectPassword = protectPassword;
|
||||
_document.treeV4.protectTitle = protectTitle;
|
||||
_document.treeV4.protectUrl = protectURL;
|
||||
_document.treeV4.protectUserName = protectUsername;
|
||||
|
||||
}
|
||||
else {
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
[defaults setBool:protectNotes forKey:kMPSettingsKeyLegacyHideNotes];
|
||||
[defaults setBool:protectPassword forKey:kMPSettingsKeyLegacyHidePassword];
|
||||
[defaults setBool:protectTitle forKey:kMPSettingsKeyLegacyHideTitle];
|
||||
[defaults setBool:protectURL forKey:kMPSettingsKeyLegacyHideURL];
|
||||
[defaults setBool:protectUsername forKey:kMPSettingsKeyLegacyHideUsername];
|
||||
[defaults synchronize];
|
||||
}
|
||||
[self closeDidSave:YES];
|
||||
}
|
||||
|
||||
- (IBAction)close:(id)sender {
|
||||
- (IBAction)cancel:(id)sender {
|
||||
[self closeDidSave:NO];
|
||||
}
|
||||
- (void)closeDidSave:(BOOL)didSave {
|
||||
/* Remove the window first */
|
||||
[NSApp endSheet:[self window]];
|
||||
[[self window] orderOut:nil];
|
||||
|
||||
/* Then notify the delegate */
|
||||
if(self.delegate) {
|
||||
if(didSave && [self.delegate respondsToSelector:@selector(didSaveDatabaseSettings)]) {
|
||||
[self.delegate didSaveDatabaseSettings];
|
||||
}
|
||||
else if(!didSave && [self.delegate respondsToSelector:@selector(didCancelDatabaseSettings)]) {
|
||||
[self.delegate didCancelDatabaseSettings];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void)update {
|
||||
/* Update all stuff that might have changed */
|
||||
Kdb4Tree *tree = _document.treeV4;
|
||||
if(tree) {
|
||||
[self _setupDatabase:tree];
|
||||
[self _setupProtectionTab:tree];
|
||||
[self _setupAdvancedTab:tree];
|
||||
[self _setupPasswordTab:tree];
|
||||
}
|
||||
[self _setupPasswordTab:tree];
|
||||
[self _setupDatabase:tree];
|
||||
[self _setupProtectionTab:tree];
|
||||
[self _setupAdvancedTab:tree];
|
||||
[self _setupTemplatesTab:tree];
|
||||
}
|
||||
|
||||
- (void)showSettingsTab:(MPDatabaseSettingsTab)tab {
|
||||
/*
|
||||
We need to make sure the window is loaded
|
||||
so we just call the the getter and led teh loading commence
|
||||
*/
|
||||
if(![self window]) {
|
||||
return;
|
||||
}
|
||||
self.showPassword = NO;
|
||||
NSTabViewItem *tabViewItem = [self.sectionTabView tabViewItemAtIndex:tab];
|
||||
BOOL canSelectTab = [self tabView:self.sectionTabView shouldSelectTabViewItem:tabViewItem];
|
||||
if(!canSelectTab) {
|
||||
[self.sectionTabView selectTabViewItemAtIndex:MPDatabaseSettingsTabPassword];
|
||||
}
|
||||
[self.sectionTabView selectTabViewItemAtIndex:tab];
|
||||
}
|
||||
|
||||
- (void)setShowPassword:(BOOL)showPassword {
|
||||
if(_showPassword != showPassword) {
|
||||
_showPassword = showPassword;
|
||||
|
||||
[self.passwordRepeatTextField setStringValue:@""];
|
||||
[self _verifyPasswordAndKey];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setKeyURL:(NSURL *)keyURL {
|
||||
_keyURL = keyURL;
|
||||
[self _verifyPasswordAndKey];
|
||||
}
|
||||
|
||||
#pragma mark Actions
|
||||
- (IBAction)clearKey:(id)sender {
|
||||
[self.keyfilePathControl setURL:nil];
|
||||
self.keyURL = nil;
|
||||
}
|
||||
|
||||
- (IBAction)generateKey:(id)sender {
|
||||
}
|
||||
|
||||
#pragma mark NSTextFieldDelegate
|
||||
- (void)controlTextDidChange:(NSNotification *)obj {
|
||||
[self _verifyPasswordAndKey];
|
||||
}
|
||||
|
||||
#pragma mark NSTableViewDelegate
|
||||
- (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem {
|
||||
NSUInteger index = [tabView indexOfTabViewItem:tabViewItem];
|
||||
switch ((MPDatabaseSettingsTab)index) {
|
||||
case MPDatabaseSettingsTabPassword:
|
||||
case MPDatabaseSettingsTabDisplay:
|
||||
return YES;
|
||||
|
||||
case MPDatabaseSettingsTabAdvanced:
|
||||
case MPDatabaseSettingsTabGeneral:
|
||||
case MPDatabaseSettingsTemplatesTab:
|
||||
return (_document.version == MPDatabaseVersion4);
|
||||
|
||||
default:
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark Private Helper
|
||||
- (void)_verifyPasswordAndKey {
|
||||
NSString *password = [self.passwordTextField stringValue];
|
||||
NSString *repeat = [self.passwordRepeatTextField stringValue];
|
||||
BOOL hasKey = (self.keyURL != nil);
|
||||
BOOL keyOk = YES;
|
||||
if(hasKey) {
|
||||
keyOk = [self.keyURL checkResourceIsReachableAndReturnError:nil];
|
||||
}
|
||||
BOOL hasPassword = ![NSString isEmptyString:password];
|
||||
BOOL passwordOk = YES;
|
||||
if(hasPassword ) {
|
||||
passwordOk = [password isEqualToString:repeat] || self.showPassword;
|
||||
}
|
||||
BOOL hasPasswordOrKey = (hasKey || hasPassword);
|
||||
keyOk = hasKey ? keyOk : YES;
|
||||
passwordOk = hasPassword ? passwordOk : YES;
|
||||
self.hasValidPasswordOrKey = hasPasswordOrKey && passwordOk && keyOk;
|
||||
|
||||
if(!hasPasswordOrKey) {
|
||||
[self.errorTextField setStringValue:NSLocalizedString(@"ERROR_NO_PASSWORD_OR_KEYFILE", "Missing Key or Password")];
|
||||
return; // alldone
|
||||
}
|
||||
if(!passwordOk && !keyOk ) {
|
||||
[self.errorTextField setStringValue:NSLocalizedString(@"ERROR_PASSWORD_MISSMATCH_INVALID_KEYFILE", "Passwords do not match, keyfile is invalid")];
|
||||
}
|
||||
else if(!passwordOk) {
|
||||
[self.errorTextField setStringValue:NSLocalizedString(@"ERROR_PASSWORD_MISSMATCH", "Passwords do not match")];
|
||||
}
|
||||
else {
|
||||
[self.errorTextField setStringValue:NSLocalizedString(@"ERROR_INVALID_KEYFILE", "Keyfile not valid")];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
- (void)_setupDatabase:(Kdb4Tree *)tree {
|
||||
[self.databaseNameTextField setStringValue:tree.databaseName];
|
||||
[self.databaseDescriptionTextView setString:tree.databaseDescription];
|
||||
BOOL isKdbx = (nil != tree);
|
||||
[self.databaseDescriptionTextView setEditable:isKdbx];
|
||||
[self.databaseNameTextField setEnabled:isKdbx];
|
||||
if(isKdbx) {
|
||||
[self.databaseNameTextField setStringValue:tree.databaseName];
|
||||
[self.databaseDescriptionTextView setString:tree.databaseDescription];
|
||||
}
|
||||
else {
|
||||
[self.databaseNameTextField setStringValue:_missingFeature];
|
||||
[self.databaseDescriptionTextView setString:_missingFeature];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)_setupProtectionTab:(Kdb4Tree *)tree {
|
||||
[self.protectNotesCheckButton setState:tree.protectNotes ? NSOnState : NSOffState ];
|
||||
[self.protectNotesCheckButton setState:tree.protectPassword ? NSOnState : NSOffState];
|
||||
[self.protectTitleCheckButton setState:tree.protectTitle ? NSOnState : NSOffState];
|
||||
[self.protectURLCheckButton setState:tree.protectUrl ? NSOnState : NSOffState];
|
||||
[self.protectUserNameCheckButton setState:tree.protectUserName ? NSOnState : NSOffState];
|
||||
BOOL isKdbX = (nil != tree);
|
||||
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
|
||||
BOOL protectNotes = isKdbX ? tree.protectNotes : [defaults boolForKey:kMPSettingsKeyLegacyHideNotes];
|
||||
BOOL protectPassword = isKdbX ? tree.protectPassword : [defaults boolForKey:kMPSettingsKeyLegacyHidePassword];
|
||||
BOOL protectTitle = isKdbX ? tree.protectTitle : [defaults boolForKey:kMPSettingsKeyLegacyHideTitle];
|
||||
BOOL protectUrl = isKdbX ? tree.protectUrl : [defaults boolForKey:kMPSettingsKeyLegacyHideURL];
|
||||
BOOL protectUsername = isKdbX ? tree.protectUserName : [defaults boolForKey:kMPSettingsKeyLegacyHideUsername];
|
||||
|
||||
[self.protectNotesCheckButton setState:protectNotes ? NSOnState : NSOffState ];
|
||||
[self.protectPasswortCheckButton setState:protectPassword ? NSOnState : NSOffState];
|
||||
[self.protectTitleCheckButton setState:protectTitle ? NSOnState : NSOffState];
|
||||
[self.protectURLCheckButton setState:protectUrl ? NSOnState : NSOffState];
|
||||
[self.protectUserNameCheckButton setState:protectUsername ? NSOnState : NSOffState];
|
||||
}
|
||||
|
||||
- (void)_setupAdvancedTab:(Kdb4Tree *)tree {
|
||||
self.trashEnabled = tree.recycleBinEnabled;
|
||||
BOOL isKdbX = (nil != tree);
|
||||
|
||||
self.trashEnabled = isKdbX ? tree.recycleBinEnabled : NO;
|
||||
|
||||
[self.enableRecycleBinCheckButton bind:NSValueBinding toObject:self withKeyPath:@"trashEnabled" options:nil];
|
||||
[self.enableRecycleBinCheckButton setEnabled:isKdbX];
|
||||
[self.selectRecycleBinGroupPopUpButton bind:NSEnabledBinding toObject:self withKeyPath:@"trashEnabled" options:nil];
|
||||
[self _updateTrashFolders:tree];
|
||||
if(isKdbX) {
|
||||
[self _updateTrashFolders:tree];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)_setupPasswordTab:(Kdb4Tree *)tree {
|
||||
[self.passwordTextField setStringValue:_document.password ? _document.password : @""];
|
||||
[self.keyfilePathControl setURL:_document.key];
|
||||
[self.passwordRepeatTextField setStringValue:[self.passwordTextField stringValue]];
|
||||
self.keyURL = _document.key;
|
||||
|
||||
NSDictionary *negateOption = @{ NSValueTransformerNameBindingOption : NSNegateBooleanTransformerName };
|
||||
[self.passwordTextField bind:@"showPassword" toObject:self withKeyPath:@"showPassword" options:nil];
|
||||
[self.togglePasswordButton bind:NSValueBinding toObject:self withKeyPath:@"showPassword" options:nil];
|
||||
[self.passwordRepeatTextField bind:NSEnabledBinding toObject:self withKeyPath:@"showPassword" options:negateOption];
|
||||
[self.errorTextField bind:NSHiddenBinding toObject:self withKeyPath:@"hasValidPasswordOrKey" options:nil];
|
||||
[self.keyfilePathControl bind:NSValueBinding toObject:self withKeyPath:@"keyURL" options:nil];
|
||||
|
||||
[self.passwordRepeatTextField setDelegate:self];
|
||||
[self.passwordTextField setDelegate:self];
|
||||
|
||||
/* Manually initate the first check */
|
||||
[self _verifyPasswordAndKey];
|
||||
}
|
||||
|
||||
- (void)_setupTemplatesTab:(Kdb4Tree *)tree {
|
||||
|
||||
}
|
||||
|
||||
- (void)_updateFirstResponder {
|
||||
NSTabViewItem *selected = [self.sectionTabView selectedTabViewItem];
|
||||
MPDatabaseSettingsTab tab = [[self.sectionTabView tabViewItems] indexOfObject:selected];
|
||||
|
||||
switch(tab) {
|
||||
case MPDatabaseSettingsTabAdvanced:
|
||||
[[self window] makeFirstResponder:self.databaseNameTextField];
|
||||
break;
|
||||
|
||||
case MPDatabaseSettingsTabDisplay:
|
||||
[[self window] makeFirstResponder:self.protectTitleCheckButton];
|
||||
break;
|
||||
|
||||
case MPDatabaseSettingsTabGeneral:
|
||||
[[self window] makeFirstResponder:self.databaseNameTextField];
|
||||
break;
|
||||
|
||||
case MPDatabaseSettingsTabPassword:
|
||||
[[self window] makeFirstResponder:self.passwordTextField];
|
||||
break;
|
||||
|
||||
case MPDatabaseSettingsTemplatesTab:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)_updateTrashFolders:(Kdb4Tree *)tree {
|
||||
NSMenu *menu = [self _buildTreeMenu:tree];
|
||||
NSMenu *menu = [self _buildTrashTreeMenu:tree];
|
||||
[self.selectRecycleBinGroupPopUpButton setMenu:menu];
|
||||
}
|
||||
|
||||
- (void)_updateTemplateGroup:(Kdb4Tree *)tree {
|
||||
//
|
||||
}
|
||||
|
||||
- (NSMenu *)_buildTrashTreeMenu:(Kdb4Tree *)tree {
|
||||
NSMenu *menu = [self _buildTreeMenu:tree];
|
||||
|
||||
NSMenuItem *selectItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOCREATE_TRASH_FOLDER", @"Menu item for automatic trash creation")
|
||||
action:NULL
|
||||
keyEquivalent:@""];
|
||||
[selectItem setEnabled:YES];
|
||||
[menu insertItem:selectItem atIndex:0];
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
- (NSMenu *)_buildTemplateTreeMenu:(Kdb4Tree *)tree {
|
||||
NSMenu *menu = [self _buildTreeMenu:tree];
|
||||
|
||||
NSMenuItem *selectItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"NO_TEMPLATE_GROUP", @"Menu item to reset the template groups")
|
||||
action:NULL
|
||||
keyEquivalent:@""];
|
||||
[selectItem setEnabled:YES];
|
||||
[menu insertItem:selectItem atIndex:0];
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
|
||||
- (NSMenu *)_buildTreeMenu:(Kdb4Tree *)tree {
|
||||
NSMenu *menu = [[NSMenu alloc] init];
|
||||
[menu setAutoenablesItems:NO];
|
||||
|
||||
|
||||
for(Kdb4Group *group in tree.root.groups) {
|
||||
NSMenuItem *groupItem = [[NSMenuItem alloc] init];
|
||||
[groupItem setImage:group.icon];
|
||||
@@ -166,10 +393,7 @@
|
||||
}
|
||||
[menu addItem:groupItem];
|
||||
}
|
||||
NSMenuItem *selectItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SELECT_RECYCLEBIN", @"Menu item if no reycleBin is selected") action:NULL keyEquivalent:@""];
|
||||
[selectItem setEnabled:YES];
|
||||
[menu insertItem:selectItem atIndex:0];
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#import "NSData+Gzip.h"
|
||||
|
||||
#import "Kdb3Node.h"
|
||||
#import "Kdb3Entry+KVOAdditions.h"
|
||||
#import "Kdb4Node.h"
|
||||
#import "Kdb4Entry+KVOAdditions.h"
|
||||
|
||||
@@ -31,6 +32,7 @@
|
||||
}
|
||||
entry.binary = binaryData;
|
||||
entry.binaryDesc = fileName;
|
||||
[entry insertObject:@"" inBinariesAtIndex:1];
|
||||
}
|
||||
if( [anEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||
Kdb4Entry *entry = (Kdb4Entry *)anEntry;
|
||||
@@ -68,7 +70,7 @@
|
||||
else {
|
||||
encodedData = fileData;
|
||||
}
|
||||
binary.data = [[NSString alloc] initWithData:encodedData encoding:NSASCIIStringEncoding];
|
||||
binary.data = [[NSString alloc] initWithData:encodedData encoding:NSUTF8StringEncoding];
|
||||
|
||||
[self.treeV4.binaries addObject:binary];
|
||||
BinaryRef *ref = [[BinaryRef alloc] init];
|
||||
@@ -78,17 +80,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (void)saveAttachmentFromEntry:(KdbEntry *)anEntry toLocation:(NSURL *)location {
|
||||
if([anEntry isKindOfClass:[Kdb3Entry class]]) {
|
||||
Kdb3Entry *entry = (Kdb3Entry *)anEntry;
|
||||
NSError *error = nil;
|
||||
if(! [entry.binary writeToURL:location options:NSDataWritingWithoutOverwriting error:&error] ) {
|
||||
[NSApp presentError:error];
|
||||
}
|
||||
}
|
||||
return; //
|
||||
}
|
||||
|
||||
- (void)removeAttachment:(BinaryRef *)reference fromEntry:(KdbEntry *)anEntry {
|
||||
if(self.version != MPDatabaseVersion4) {
|
||||
return; // Wrong Database version;
|
||||
@@ -103,6 +94,14 @@
|
||||
[self.treeV4.binaries removeObject:binary];
|
||||
}
|
||||
|
||||
- (void)removeAttachmentFromEntry:(KdbEntry *)anEntry {
|
||||
if(self.version != MPDatabaseVersion3) {
|
||||
return;
|
||||
}
|
||||
Kdb3Entry *entry = (Kdb3Entry *)anEntry;
|
||||
[entry removeObjectFromBinariesAtIndex:0];
|
||||
}
|
||||
|
||||
- (Binary *)findBinary:(BinaryRef *)reference {
|
||||
if(self.version != MPDatabaseVersion4) {
|
||||
return nil;
|
||||
@@ -115,22 +114,35 @@
|
||||
return [filteredBinary lastObject];
|
||||
}
|
||||
|
||||
- (void)saveAttachment:(BinaryRef *)reference toLocation:(NSURL *)location {
|
||||
Binary *binary = [self findBinary:reference];
|
||||
NSData *rawData = nil;
|
||||
if(binary) {
|
||||
if(binary.compressed) {
|
||||
rawData = [NSMutableData mutableDataWithBase64DecodedData:[binary.data dataUsingEncoding:NSASCIIStringEncoding]];
|
||||
rawData = [rawData gzipInflate];
|
||||
}
|
||||
else {
|
||||
rawData = [NSMutableData mutableDataWithBase64DecodedData:[binary.data dataUsingEncoding:NSASCIIStringEncoding]];
|
||||
}
|
||||
- (void)saveAttachmentForItem:(id)item toLocation:(NSURL *)location {
|
||||
if([item isKindOfClass:[Kdb3Entry class]]) {
|
||||
Kdb3Entry *entry = (Kdb3Entry *)item;
|
||||
NSError *error = nil;
|
||||
if( ![rawData writeToURL:location options:0 error:&error] ) {
|
||||
if(! [entry.binary writeToURL:location options:NSDataWritingAtomic error:&error] ) {
|
||||
[NSApp presentError:error];
|
||||
}
|
||||
}
|
||||
else if([item isKindOfClass:[BinaryRef class]]) {
|
||||
Binary *binary = [self findBinary:item];
|
||||
NSData *rawData = nil;
|
||||
if(binary) {
|
||||
if(binary.compressed) {
|
||||
rawData = [NSMutableData mutableDataWithBase64DecodedData:[binary.data dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
rawData = [rawData gzipInflate];
|
||||
}
|
||||
else {
|
||||
rawData = [NSMutableData mutableDataWithBase64DecodedData:[binary.data dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
}
|
||||
NSError *error = nil;
|
||||
if( ![rawData writeToURL:location options:NSDataWritingAtomic error:&error] ) {
|
||||
[NSApp presentError:error];
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
NSAssert(NO, @"Item is neither BinaryRef nor Kdb3Entry");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
- (NSUInteger)nextBinaryId {
|
||||
|
||||
@@ -11,14 +11,20 @@
|
||||
|
||||
|
||||
APPKIT_EXTERN NSString *const MPDocumentDidAddGroupNotification;
|
||||
APPKIT_EXTERN NSString *const MPDocumentWillDelteGroupNotification;
|
||||
APPKIT_EXTERN NSString *const MPDocumentDidAddEntryNotification;
|
||||
APPKIT_EXTERN NSString *const MPDocumentWillDeleteEntryNotification;
|
||||
APPKIT_EXTERN NSString *const MPDocumentDidRevertNotifiation;
|
||||
|
||||
APPKIT_EXTERN NSString *const MPDocumentEntryKey;
|
||||
APPKIT_EXTERN NSString *const MPDocumentGroupKey;
|
||||
|
||||
APPKIT_EXTERN NSString *const MPDocumentRequestPasswordSaveNotification;
|
||||
|
||||
/*
|
||||
APPKIT_EXTERN NSString *const MPDocumentDidChangeCurrentItemNotification;
|
||||
APPKIT_EXTERN NSString *const MPDocumentDidChangeCurrentGroupNotication;
|
||||
APPKIT_EXTERN NSString *const MPDocumnetDidChangeCurrentEntryNotification;
|
||||
*/
|
||||
|
||||
@class KdbGroup;
|
||||
@class KdbEntry;
|
||||
@class KdbTree;
|
||||
@@ -34,22 +40,36 @@ APPKIT_EXTERN NSString *const MPDocumentGroupKey;
|
||||
@interface MPDocument : NSDocument
|
||||
|
||||
/* true, if password and/or keyfile are set */
|
||||
@property (assign, readonly, getter = isSecured) BOOL secured;
|
||||
@property (assign, readonly) BOOL hasPasswordOrKey;
|
||||
/* true, if lock screen is present (no phyiscal locking) */
|
||||
@property (assign, getter = isLocked) BOOL locked;
|
||||
/* true, if document is loaded and decrypted (tree is loaded) */
|
||||
@property (assign, readonly, getter = isDecrypted) BOOL decrypted;
|
||||
@property (assign, nonatomic) BOOL locked;
|
||||
@property (assign, readonly) BOOL decrypted;
|
||||
|
||||
@property (strong, readonly, nonatomic) KdbTree *tree;
|
||||
@property (weak, readonly, nonatomic) KdbGroup *root;
|
||||
@property (readonly, strong) MPRootAdapter *rootAdapter;
|
||||
@property (weak, readonly) KdbGroup *trash;
|
||||
|
||||
@property (nonatomic, copy) NSString *password;
|
||||
@property (nonatomic, strong) NSURL *key;
|
||||
|
||||
@property (assign, readonly) MPDatabaseVersion version;
|
||||
@property (assign, readonly, getter = isReadOnly) BOOL readOnly;
|
||||
|
||||
|
||||
/*
|
||||
State (active group/entry)
|
||||
*/
|
||||
@property (nonatomic, weak) KdbEntry *selectedEntry;
|
||||
@property (nonatomic, weak) KdbGroup *selectedGroup;
|
||||
@property (nonatomic, weak) id selectedItem;
|
||||
|
||||
|
||||
- (id)initWithVersion:(MPDatabaseVersion)version;
|
||||
- (BOOL)decryptWithPassword:(NSString *)password keyFileURL:(NSURL *)keyFileURL;
|
||||
|
||||
#pragma mark Lock/Decrypt
|
||||
- (void)lockDatabase:(id)sender;
|
||||
- (BOOL)unlockWithPassword:(NSString *)password keyFileURL:(NSURL *)keyFileURL;
|
||||
|
||||
#pragma mark Data Lookup
|
||||
/*
|
||||
@@ -62,7 +82,12 @@ APPKIT_EXTERN NSString *const MPDocumentGroupKey;
|
||||
- (Kdb3Tree *)treeV3;
|
||||
|
||||
- (void)useGroupAsTrash:(KdbGroup *)group;
|
||||
- (void)useGroupAsTemplate:(KdbGroup *)group;
|
||||
|
||||
- (BOOL)isItemTrashed:(id)item;
|
||||
|
||||
#pragma mark Export
|
||||
- (void)writeXMLToURL:(NSURL *)url;
|
||||
|
||||
#pragma mark Undo Data Manipulation
|
||||
/* Undoable Intiialization of elements */
|
||||
@@ -74,28 +99,26 @@ APPKIT_EXTERN NSString *const MPDocumentGroupKey;
|
||||
All non-setter undoable actions
|
||||
*/
|
||||
|
||||
- (void)moveGroup:(KdbGroup *)group toGroup:(KdbGroup *)target index:(NSInteger)index;
|
||||
- (BOOL)group:(KdbGroup *)group isMoveableToGroup:(KdbGroup *)target;
|
||||
- (void)moveEntry:(KdbEntry *)entry toGroup:(KdbGroup *)target index:(NSInteger)index;
|
||||
/* TODO in UNDO auslagen */
|
||||
- (void)addStringField:(StringField *)field toEntry:(Kdb4Entry *)entry atIndex:(NSUInteger)index;
|
||||
- (void)removeStringField:(StringField *)field formEntry:(Kdb4Entry *)entry;
|
||||
|
||||
- (void)group:(KdbGroup *)group addEntry:(KdbEntry *)entry atIndex:(NSUInteger)index;
|
||||
- (void)group:(KdbGroup *)group addGroup:(KdbGroup *)aGroup atIndex:(NSUInteger)index;
|
||||
- (void)group:(KdbGroup *)group removeEntry:(KdbEntry *)entry;
|
||||
- (void)group:(KdbGroup *)group removeGroup:(KdbGroup *)aGroup;
|
||||
- (void)deleteGroup:(KdbGroup *)group;
|
||||
- (void)deleteEntry:(KdbEntry *)entry;
|
||||
|
||||
- (void)entry:(Kdb4Entry *)entry addStringField:(StringField *)field atIndex:(NSUInteger)index;
|
||||
- (void)entry:(Kdb4Entry *)entry removeStringField:(StringField *)field;
|
||||
|
||||
- (void)emptyTrash:(id)sender;
|
||||
- (IBAction)emptyTrash:(id)sender;
|
||||
|
||||
@end
|
||||
|
||||
@interface MPDocument (Attachments)
|
||||
|
||||
- (void)addAttachment:(NSURL *)location toEntry:(KdbEntry *)anEntry;
|
||||
- (void)saveAttachmentFromEntry:(KdbEntry *)anEntry toLocation:(NSURL *)location;
|
||||
- (void)saveAttachment:(BinaryRef *)reference toLocation:(NSURL *)location;
|
||||
/**
|
||||
item can be either a BinaryRef or an Kdb3Entry.
|
||||
*/
|
||||
- (void)saveAttachmentForItem:(id)item toLocation:(NSURL *)location;
|
||||
- (void)removeAttachment:(BinaryRef *)reference fromEntry:(KdbEntry *)anEntry;
|
||||
- (void)removeAttachmentFromEntry:(KdbEntry *)anEntry;
|
||||
- (NSUInteger)nextBinaryId;
|
||||
- (Binary *)findBinary:(BinaryRef *)reference;
|
||||
|
||||
|
||||
@@ -13,33 +13,45 @@
|
||||
#import "MPRootAdapter.h"
|
||||
#import "MPIconHelper.h"
|
||||
#import "MPActionHelper.h"
|
||||
#import "MPSettingsHelper.h"
|
||||
#import "MPNotifications.h"
|
||||
|
||||
#import "KdbLib.h"
|
||||
#import "Kdb3Node.h"
|
||||
#import "Kdb4Node.h"
|
||||
#import "Kdb4Persist.h"
|
||||
#import "KdbPassword.h"
|
||||
#import "KdbGroup+Undo.h"
|
||||
|
||||
#import "KdbGroup+KVOAdditions.h"
|
||||
#import "Kdb4Entry+KVOAdditions.h"
|
||||
#import "KdbGroup+MPTreeTools.h"
|
||||
#import "KdbGroup+MPAdditions.h"
|
||||
|
||||
#import "KdbEntry+Undo.h"
|
||||
#import "KdbGroup+Undo.h"
|
||||
|
||||
#import "Kdb3Tree+NewTree.h"
|
||||
#import "Kdb4Tree+NewTree.h"
|
||||
#import "Kdb4Entry+MPAdditions.h"
|
||||
#import "KdbGroup+MPTreeTools.h"
|
||||
#import "KdbGroup+MPAdditions.h"
|
||||
|
||||
NSString *const MPDocumentDidAddGroupNotification = @"com.hicknhack.macpass.MPDocumentDidAddGroupNotification";
|
||||
NSString *const MPDocumentWillDelteGroupNotification = @"com.hicknhack.macpass.MPDocumentDidDelteGroupNotification";
|
||||
NSString *const MPDocumentDidAddEntryNotification = @"com.hicknhack.macpass.MPDocumentDidAddEntryNotification";
|
||||
NSString *const MPDocumentWillDeleteEntryNotification = @"com.hicknhack.macpass.MPDocumentDidDeleteEntryNotification";
|
||||
NSString *const MPDocumentDidRevertNotifiation = @"com.hicknhack.macpass.MPDocumentDidRevertNotifiation";
|
||||
#import "DataOutputStream.h"
|
||||
|
||||
NSString *const MPDocumentEntryKey = @"MPDocumentEntryKey";
|
||||
NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
#import "DDXMLNode.h"
|
||||
|
||||
NSString *const MPDocumentDidAddGroupNotification = @"com.hicknhack.macpass.MPDocumentDidAddGroupNotification";
|
||||
NSString *const MPDocumentDidAddEntryNotification = @"com.hicknhack.macpass.MPDocumentDidAddEntryNotification";
|
||||
NSString *const MPDocumentDidRevertNotifiation = @"com.hicknhack.macpass.MPDocumentDidRevertNotifiation";
|
||||
NSString *const MPDocumentRequestPasswordSaveNotification = @"com.hicknhack.macpass.MPDocumentRequestPasswordSaveNotification";
|
||||
|
||||
|
||||
NSString *const MPDocumentEntryKey = @"MPDocumentEntryKey";
|
||||
NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
|
||||
|
||||
@interface MPDocument () {
|
||||
@private
|
||||
BOOL _didLockFile;
|
||||
NSData *_fileData;
|
||||
}
|
||||
|
||||
|
||||
@@ -48,14 +60,13 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
@property (weak, nonatomic, readonly) KdbPassword *passwordHash;
|
||||
@property (assign) MPDatabaseVersion version;
|
||||
|
||||
@property (assign, nonatomic) BOOL secured;
|
||||
@property (assign, nonatomic) BOOL hasPasswordOrKey;
|
||||
@property (assign) BOOL decrypted;
|
||||
@property (assign) BOOL readOnly;
|
||||
|
||||
@property (strong) NSURL *lockFileURL;
|
||||
|
||||
@property (readonly) BOOL useTrash;
|
||||
@property (weak, readonly) KdbGroup *trash;
|
||||
@property (strong) IBOutlet NSView *warningView;
|
||||
@property (weak) IBOutlet NSImageView *warningViewImage;
|
||||
|
||||
@@ -72,9 +83,10 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
- (id)initWithVersion:(MPDatabaseVersion)version {
|
||||
self = [super init];
|
||||
if(self) {
|
||||
_fileData = nil;
|
||||
_didLockFile = NO;
|
||||
_decrypted = YES;
|
||||
_secured = NO;
|
||||
_hasPasswordOrKey = NO;
|
||||
_locked = NO;
|
||||
_readOnly = NO;
|
||||
_rootAdapter = [[MPRootAdapter alloc] init];
|
||||
@@ -121,16 +133,21 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
|
||||
- (BOOL)readFromURL:(NSURL *)url ofType:(NSString *)typeName error:(NSError **)outError {
|
||||
/* FIXME: Logfile handling
|
||||
self.lockFileURL = [url URLByAppendingPathExtension:@"lock"];
|
||||
if([[NSFileManager defaultManager] fileExistsAtPath:[_lockFileURL path]]) {
|
||||
self.readOnly = YES;
|
||||
}
|
||||
else {
|
||||
[[NSFileManager defaultManager] createFileAtPath:[_lockFileURL path] contents:nil attributes:nil];
|
||||
_didLockFile = YES;
|
||||
self.readOnly = NO;
|
||||
}
|
||||
self.lockFileURL = [url URLByAppendingPathExtension:@"lock"];
|
||||
if([[NSFileManager defaultManager] fileExistsAtPath:[_lockFileURL path]]) {
|
||||
self.readOnly = YES;
|
||||
}
|
||||
else {
|
||||
[[NSFileManager defaultManager] createFileAtPath:[_lockFileURL path] contents:nil attributes:nil];
|
||||
_didLockFile = YES;
|
||||
self.readOnly = NO;
|
||||
}
|
||||
*/
|
||||
/*
|
||||
Delete our old Tree, and just grab the data
|
||||
*/
|
||||
self.tree = nil;
|
||||
_fileData = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:outError];
|
||||
self.decrypted = NO;
|
||||
return YES;
|
||||
}
|
||||
@@ -150,12 +167,26 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
|
||||
- (void)close {
|
||||
[self _cleanupLock];
|
||||
/*
|
||||
We store the last url. Restored windows are automatically handeld.
|
||||
If closeAllDocuments is set, all docs get this messgae
|
||||
*/
|
||||
if([[self fileURL] isFileURL]) {
|
||||
[[NSUserDefaults standardUserDefaults] setObject:[self.fileURL absoluteString] forKey:kMPSettingsKeyLastDatabasePath];
|
||||
}
|
||||
[super close];
|
||||
}
|
||||
|
||||
#pragma mark Protection
|
||||
- (void)writeXMLToURL:(NSURL *)url {
|
||||
DataOutputStream *outputStream = [[DataOutputStream alloc] init];
|
||||
Kdb4Persist *persist = [[Kdb4Persist alloc] initWithTree:self.treeV4 outputStream:outputStream randomStream:nil];
|
||||
[persist persistWithOptions:DDXMLNodeCompactEmptyElement|DDXMLNodePrettyPrint];
|
||||
[outputStream.data writeToURL:url atomically:YES];
|
||||
}
|
||||
|
||||
- (BOOL)decryptWithPassword:(NSString *)password keyFileURL:(NSURL *)keyFileURL {
|
||||
#pragma mark Lock/Unlock/Decrypt
|
||||
|
||||
- (BOOL)unlockWithPassword:(NSString *)password keyFileURL:(NSURL *)keyFileURL {
|
||||
self.key = keyFileURL;
|
||||
self.password = [password length] > 0 ? password : nil;
|
||||
@try {
|
||||
@@ -175,6 +206,15 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)lockDatabase:(id)sender {
|
||||
// Persist Tree into data
|
||||
self.tree = nil;
|
||||
self.locked = YES;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark Custom Setter
|
||||
|
||||
- (void)setPassword:(NSString *)password {
|
||||
if(![_password isEqualToString:password]) {
|
||||
_password = [password copy];
|
||||
@@ -199,17 +239,42 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)saveDocument:(id)sender {
|
||||
if(self.hasPasswordOrKey) {
|
||||
[super saveDocument:sender];
|
||||
}
|
||||
else {
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentRequestPasswordSaveNotification object:self userInfo:nil];
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)prepareSavePanel:(NSSavePanel *)savePanel {
|
||||
if(self.isSecured) {
|
||||
if(self.hasPasswordOrKey) {
|
||||
[savePanel setAccessoryView:nil];
|
||||
return YES;
|
||||
}
|
||||
if(!self.warningView) {
|
||||
[[NSBundle mainBundle] loadNibNamed:@"UnprotectedWarningView" owner:self topLevelObjects:nil];
|
||||
[self.warningViewImage setImage:[NSImage imageNamed:NSImageNameCaution]];
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)setSelectedGroup:(KdbGroup *)selectedGroup {
|
||||
if(_selectedGroup != selectedGroup) {
|
||||
_selectedGroup = selectedGroup;
|
||||
}
|
||||
self.selectedItem = _selectedGroup;
|
||||
}
|
||||
|
||||
- (void)setSelectedEntry:(KdbEntry *)selectedEntry {
|
||||
if(_selectedEntry != selectedEntry) {
|
||||
_selectedEntry = selectedEntry;
|
||||
}
|
||||
self.selectedItem = selectedEntry;
|
||||
}
|
||||
|
||||
- (void)setSelectedItem:(id)selectedItem {
|
||||
if(_selectedItem != selectedItem) {
|
||||
_selectedItem = selectedItem;
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPCurrentItemChangedNotification object:self];
|
||||
}
|
||||
[savePanel setAccessoryView:self.warningView];
|
||||
return YES;
|
||||
}
|
||||
|
||||
#pragma mark Data Accesors
|
||||
@@ -235,7 +300,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
- (Kdb3Tree *)treeV3 {
|
||||
switch (_version) {
|
||||
case MPDatabaseVersion3:
|
||||
NSAssert([self.tree isKindOfClass:[Kdb3Tree class]], @"Tree has to be Version3");
|
||||
NSAssert(self.tree == nil || [self.tree isKindOfClass:[Kdb3Tree class]], @"Tree has to be Version3");
|
||||
return (Kdb3Tree *)self.tree;
|
||||
case MPDatabaseVersion4:
|
||||
return nil;
|
||||
@@ -249,7 +314,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
case MPDatabaseVersion3:
|
||||
return nil;
|
||||
case MPDatabaseVersion4:
|
||||
NSAssert([self.tree isKindOfClass:[Kdb4Tree class]], @"Tree has to be Version4");
|
||||
NSAssert(self.tree == nil || [self.tree isKindOfClass:[Kdb4Tree class]], @"Tree has to be Version4");
|
||||
return (Kdb4Tree *)self.tree;
|
||||
default:
|
||||
return nil;
|
||||
@@ -275,6 +340,26 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (BOOL)isItemTrashed:(id)item {
|
||||
BOOL validItem = [item isKindOfClass:[KdbEntry class]] || [item isKindOfClass:[KdbGroup class]];
|
||||
if(!item) {
|
||||
return NO;
|
||||
}
|
||||
if(item == self.trash) {
|
||||
return NO; // No need to look further as this is the trashcan
|
||||
}
|
||||
if(validItem) {
|
||||
BOOL isTrashed = NO;
|
||||
id parent = [item parent];
|
||||
while( parent && !isTrashed ) {
|
||||
isTrashed = (parent == self.trash);
|
||||
parent = [parent parent];
|
||||
}
|
||||
return isTrashed;
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)useGroupAsTrash:(KdbGroup *)group {
|
||||
if(self.useTrash) {
|
||||
Kdb4Group *groupv4 = (Kdb4Group *)group;
|
||||
@@ -284,17 +369,30 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
}
|
||||
}
|
||||
|
||||
- (void)useGroupAsTemplate:(KdbGroup *)group {
|
||||
Kdb4Group *groupv4 = (Kdb4Group *)group;
|
||||
if([self.treeV4.entryTemplatesGroup isEqual:groupv4.uuid]) {
|
||||
self.treeV4.entryTemplatesGroup = groupv4.uuid;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark Data manipulation
|
||||
- (KdbEntry *)createEntry:(KdbGroup *)parent {
|
||||
if(!parent) {
|
||||
return nil; // No parent
|
||||
}
|
||||
if(parent == self.trash) {
|
||||
return nil; // no new Groups in trash
|
||||
}
|
||||
if([self isItemTrashed:parent]) {
|
||||
return nil;
|
||||
}
|
||||
KdbEntry *newEntry = [self.tree createEntry:parent];
|
||||
newEntry.title = NSLocalizedString(@"DEFAULT_ENTRY_TITLE", @"Title for a newly created entry");
|
||||
if(self.treeV4 && ([self.treeV4.defaultUserName length] > 0)) {
|
||||
newEntry.title = self.treeV4.defaultUserName;
|
||||
}
|
||||
[self group:parent addEntry:newEntry atIndex:[parent.entries count]];
|
||||
[parent addEntryUndoable:newEntry atIndex:[parent.entries count]];
|
||||
NSDictionary *userInfo = @{ MPDocumentEntryKey : newEntry };
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidAddEntryNotification object:self userInfo:userInfo];
|
||||
return newEntry;
|
||||
@@ -304,10 +402,16 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
if(!parent) {
|
||||
return nil; // no parent!
|
||||
}
|
||||
if(parent == self.trash) {
|
||||
return nil; // no new Groups in trash
|
||||
}
|
||||
if([self isItemTrashed:parent]) {
|
||||
return nil;
|
||||
}
|
||||
KdbGroup *newGroup = [self.tree createGroup:parent];
|
||||
newGroup.name = NSLocalizedString(@"DEFAULT_GROUP_NAME", @"Title for a newly created group");
|
||||
newGroup.image = MPIconFolder;
|
||||
[self group:parent addGroup:newGroup atIndex:[parent.groups count]];
|
||||
[parent addGroupUndoable:newGroup atIndex:[parent.groups count]];
|
||||
NSDictionary *userInfo = @{ MPDocumentGroupKey : newGroup };
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidAddGroupNotification object:self userInfo:userInfo];
|
||||
return newGroup;
|
||||
@@ -321,158 +425,103 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
Kdb4Entry *entryV4 = (Kdb4Entry *)entry;
|
||||
NSString *title = NSLocalizedString(@"DEFAULT_CUSTOM_FIELD_TITLE", @"Default Titel for new Custom-Fields");
|
||||
NSString *value = NSLocalizedString(@"DEFAULT_CUSTOM_FIELD_VALUE", @"Default Value for new Custom-Fields");
|
||||
title = [entryV4 uniqueKeyForProposal:title];
|
||||
StringField *newStringField = [StringField stringFieldWithKey:title andValue:value];
|
||||
[self entry:entryV4 addStringField:newStringField atIndex:[entryV4.stringFields count]];
|
||||
[self addStringField:newStringField toEntry:entryV4 atIndex:[entryV4.stringFields count]];
|
||||
return newStringField;
|
||||
}
|
||||
|
||||
|
||||
- (void)moveGroup:(KdbGroup *)group toGroup:(KdbGroup *)target index:(NSInteger)index {
|
||||
NSInteger oldIndex = [group.parent.groups indexOfObject:group];
|
||||
if(group.parent == target && oldIndex == index) {
|
||||
return; // No changes
|
||||
}
|
||||
[[[self undoManager] prepareWithInvocationTarget:self] moveGroup:group toGroup:group.parent index:oldIndex];
|
||||
if(self.trash == target) {
|
||||
[[self undoManager] setActionName:@"UNDO_DELETE_GROUP"];
|
||||
}
|
||||
else {
|
||||
[[self undoManager] setActionName:@"MOVE_GROUP"];
|
||||
}
|
||||
[group.parent removeObjectFromGroupsAtIndex:oldIndex];
|
||||
if(index < 0 || index > [target.groups count] ) {
|
||||
index = [target.groups count];
|
||||
}
|
||||
[target insertObject:group inGroupsAtIndex:index];
|
||||
}
|
||||
|
||||
- (BOOL)group:(KdbGroup *)group isMoveableToGroup:(KdbGroup *)target {
|
||||
if(target == nil) {
|
||||
return NO;
|
||||
}
|
||||
BOOL isMovable = YES;
|
||||
|
||||
KdbGroup *ancestor = target.parent;
|
||||
while(ancestor.parent) {
|
||||
if(ancestor == group) {
|
||||
isMovable = NO;
|
||||
break;
|
||||
}
|
||||
ancestor = ancestor.parent;
|
||||
}
|
||||
return isMovable;
|
||||
}
|
||||
|
||||
- (void)moveEntry:(KdbEntry *)entry toGroup:(KdbGroup *)target index:(NSInteger)index {
|
||||
NSInteger oldIndex = [entry.parent.entries indexOfObject:entry];
|
||||
if(entry.parent == target && oldIndex == index) {
|
||||
return; // No changes
|
||||
}
|
||||
[[[self undoManager] prepareWithInvocationTarget:self] moveEntry:entry toGroup:entry.parent index:oldIndex];
|
||||
if(self.trash == target || self.trash == entry.parent) {
|
||||
[[self undoManager] setActionName:@"UNDO_DELETE_ENTRY"];
|
||||
}
|
||||
else {
|
||||
[[self undoManager] setActionName:@"MOVE_ENTRY"];
|
||||
}
|
||||
[entry.parent removeObjectFromEntriesAtIndex:oldIndex];
|
||||
if(index < 0 || index > [target.groups count] ) {
|
||||
index = [target.groups count];
|
||||
}
|
||||
[target insertObject:entry inEntriesAtIndex:index];
|
||||
}
|
||||
|
||||
- (void)group:(KdbGroup *)group addEntry:(KdbEntry *)entry atIndex:(NSUInteger)index {
|
||||
[[[self undoManager] prepareWithInvocationTarget:self] group:group removeEntry:entry];
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_ADD_ENTRY", "Undo adding of entry")];
|
||||
[group insertObject:entry inEntriesAtIndex:index];
|
||||
}
|
||||
|
||||
- (void)group:(KdbGroup *)group addGroup:(KdbGroup *)aGroup atIndex:(NSUInteger)index {
|
||||
[[[self undoManager] prepareWithInvocationTarget:self] group:group removeGroup:aGroup];
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_ADD_GROUP", @"Create Group Undo")];
|
||||
[group insertObject:aGroup inGroupsAtIndex:index];
|
||||
}
|
||||
|
||||
- (void)group:(KdbGroup *)group removeEntry:(KdbEntry *)entry {
|
||||
NSInteger index = [group.entries indexOfObject:entry];
|
||||
if(NSNotFound == index) {
|
||||
return; // No object found;
|
||||
}
|
||||
- (void)deleteEntry:(KdbEntry *)entry {
|
||||
if(self.useTrash) {
|
||||
if(!self.trash) {
|
||||
[self _createTrashGroup];
|
||||
}
|
||||
[self moveEntry:entry toGroup:self.trash index:[self.trash.entries count]];
|
||||
return;
|
||||
if([self isItemTrashed:entry]) {
|
||||
return; // Entry is already trashed
|
||||
}
|
||||
[entry moveToTrashUndoable:self.trash atIndex:[self.trash.entries count]];
|
||||
}
|
||||
[[[self undoManager] prepareWithInvocationTarget:self] group:group addEntry:entry atIndex:index];
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_DELETE_ENTRY", "Undo deleting of entry")];
|
||||
[group removeObjectFromEntriesAtIndex:index];
|
||||
else {
|
||||
[entry deleteUndoable];
|
||||
}
|
||||
self.selectedEntry = nil;
|
||||
}
|
||||
|
||||
- (void)group:(KdbGroup *)group removeGroup:(KdbGroup *)aGroup {
|
||||
NSInteger index = [group.groups indexOfObject:aGroup];
|
||||
if(NSNotFound == index) {
|
||||
return; // No object found
|
||||
}
|
||||
if(self.trash == aGroup) {
|
||||
return;
|
||||
// delete Trash?
|
||||
}
|
||||
/*
|
||||
Cleaning the recyclebin is not undoable
|
||||
So we do this in a separate action
|
||||
*/
|
||||
- (void)deleteGroup:(KdbGroup *)group {
|
||||
if(self.useTrash) {
|
||||
if(!self.trash) {
|
||||
[self _createTrashGroup];
|
||||
}
|
||||
[self moveGroup:aGroup toGroup:self.trash index:[self.trash.groups count]];
|
||||
return; // Done!
|
||||
if( (group == self.trash) || [self isItemTrashed:group] ) {
|
||||
return; //Groups already trashed cannot be deleted
|
||||
}
|
||||
[group moveToTrashUndoable:self.trash atIndex:[self.trash.groups count]];
|
||||
}
|
||||
else {
|
||||
[group deleteUndoable];
|
||||
}
|
||||
[[[self undoManager] prepareWithInvocationTarget:self] group:group addGroup:aGroup atIndex:index];
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_DELETE_GROUP", @"Delete Group Undo")];
|
||||
[group removeObjectFromGroupsAtIndex:index];
|
||||
}
|
||||
|
||||
- (void)entry:(Kdb4Entry *)entry addStringField:(StringField *)field atIndex:(NSUInteger)index {
|
||||
[[[self undoManager] prepareWithInvocationTarget:self] entry:entry removeStringField:field];
|
||||
#pragma mark CustomFields
|
||||
|
||||
- (void)addStringField:(StringField *)field toEntry:(Kdb4Entry *)entry atIndex:(NSUInteger)index {
|
||||
[[[self undoManager] prepareWithInvocationTarget:self] removeStringField:field formEntry:entry];
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_ADD_STRING_FIELD", @"Add Stringfield Undo")];
|
||||
field.entry = entry;
|
||||
[entry insertObject:field inStringFieldsAtIndex:index];
|
||||
}
|
||||
|
||||
- (void)entry:(Kdb4Entry *)entry removeStringField:(StringField *)field {
|
||||
- (void)removeStringField:(StringField *)field formEntry:(Kdb4Entry *)entry {
|
||||
NSInteger index = [entry.stringFields indexOfObject:field];
|
||||
if(NSNotFound == index) {
|
||||
return; // Nothing found to be removed
|
||||
}
|
||||
[[[self undoManager] prepareWithInvocationTarget:self] entry:entry addStringField:field atIndex:index];
|
||||
[[[self undoManager] prepareWithInvocationTarget:self] addStringField:field toEntry:entry atIndex:index];
|
||||
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_DELETE_STRING_FIELD", @"Delte Stringfield undo")];
|
||||
field.entry = nil;
|
||||
[entry removeObjectFromStringFieldsAtIndex:index];
|
||||
}
|
||||
|
||||
#pragma mark Actions
|
||||
|
||||
- (void)emptyTrash:(id)sender {
|
||||
[[self undoManager] setActionIsDiscardable:YES];
|
||||
[self.trash clear];
|
||||
if(self.version != MPDatabaseVersion4) {
|
||||
return; // We have no trash on those file types
|
||||
}
|
||||
NSAlert *alert = [[NSAlert alloc] init];
|
||||
[alert setAlertStyle:NSWarningAlertStyle];
|
||||
[alert setMessageText:NSLocalizedString(@"WARNING_ON_EMPTY_TRASH_TITLE", "")];
|
||||
[alert setInformativeText:NSLocalizedString(@"WARNING_ON_EMPTY_TRASH_DESCRIPTION", "Informative Text displayed when clearing the Trash")];
|
||||
[alert addButtonWithTitle:NSLocalizedString(@"EMPTY_TRASH", "Empty Trash")];
|
||||
[alert addButtonWithTitle:NSLocalizedString(@"CANCEL", "Cancel")];
|
||||
|
||||
[[alert buttons][1] setKeyEquivalent:[NSString stringWithFormat:@"%c", 0x1b]];
|
||||
|
||||
NSWindow *window = [[self windowControllers][0] window];
|
||||
[alert beginSheetModalForWindow:window modalDelegate:self didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:NULL];
|
||||
}
|
||||
|
||||
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
|
||||
if([menuItem action] == [MPActionHelper actionOfType:MPActionEmptyTrash]) {
|
||||
- (void) alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo {
|
||||
if(returnCode == NSAlertFirstButtonReturn) {
|
||||
[self _emptyTrash];
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)anItem {
|
||||
if([anItem action] == [MPActionHelper actionOfType:MPActionEmptyTrash]) {
|
||||
BOOL hasGroups = [self.trash.groups count] > 0;
|
||||
BOOL hasEntries = [self.trash.entries count] > 0;
|
||||
return (hasEntries || hasGroups);
|
||||
}
|
||||
return YES;
|
||||
|
||||
return [super validateUserInterfaceItem:anItem];
|
||||
}
|
||||
|
||||
#pragma mark Private
|
||||
- (void)_updateIsSecured {
|
||||
BOOL securePassword = ([self.password length] > 0);
|
||||
BOOL secureKey = (nil != self.key);
|
||||
self.secured = (secureKey || securePassword);
|
||||
self.hasPasswordOrKey = (secureKey || securePassword);
|
||||
}
|
||||
|
||||
- (void)_cleanupLock {
|
||||
@@ -489,7 +538,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
}
|
||||
else if(self.version == MPDatabaseVersion4) {
|
||||
KdbGroup *trash = [self.tree createGroup:self.tree.root];
|
||||
trash.name = NSLocalizedString(@"TRASH_GROUP", @"Name for the trash group");
|
||||
trash.name = NSLocalizedString(@"TRASH", @"Name for the trash group");
|
||||
trash.image = MPIconTrash;
|
||||
[self.tree.root insertObject:trash inGroupsAtIndex:[self.tree.root.groups count]];
|
||||
self.treeV4.recycleBinUuid = ((Kdb4Group *)trash).uuid;
|
||||
@@ -501,4 +550,31 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
}
|
||||
}
|
||||
|
||||
- (void)_emptyTrash {
|
||||
for(KdbEntry *entry in [self.trash childEntries]) {
|
||||
[[self undoManager] removeAllActionsWithTarget:entry];
|
||||
}
|
||||
for(KdbGroup *group in [self.trash childGroups]) {
|
||||
[[self undoManager] removeAllActionsWithTarget:group];
|
||||
}
|
||||
[self _cleanTrashedBinaries];
|
||||
[self.trash clear];
|
||||
}
|
||||
|
||||
- (void)_cleanTrashedBinaries {
|
||||
NSMutableSet *clearKeys = [[NSMutableSet alloc] initWithCapacity:20];
|
||||
NSMutableArray *clearBinaries = [[NSMutableArray alloc] initWithCapacity:[self.treeV4.binaries count]];
|
||||
for(Kdb4Entry *entry in [self.trash childEntries]) {
|
||||
for(BinaryRef *binaryRef in entry.binaries) {
|
||||
[clearKeys addObject:@(binaryRef.ref)];
|
||||
}
|
||||
}
|
||||
for(Binary *binary in self.treeV4.binaries) {
|
||||
if([clearKeys containsObject:@(binary.binaryId)]) {
|
||||
[clearBinaries addObject:binary];
|
||||
}
|
||||
}
|
||||
[self.treeV4.binaries removeObjectsInArray:clearBinaries];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import "MPDatabaseSettingsDelegate.h"
|
||||
|
||||
@class MPViewController;
|
||||
@class MPEntryViewController;
|
||||
@@ -17,29 +18,28 @@
|
||||
@class KdbGroup;
|
||||
@class KdbEntry;
|
||||
|
||||
APPKIT_EXTERN NSString *const MPCurrentItemChangedNotification;
|
||||
|
||||
@interface MPDocumentWindowController : NSWindowController <NSWindowDelegate>
|
||||
@interface MPDocumentWindowController : NSWindowController <MPDatabaseSettingsDelegate>
|
||||
|
||||
@property (readonly, strong) MPPasswordInputController *passwordInputController;
|
||||
@property (readonly, strong) MPEntryViewController *entryViewController;
|
||||
@property (readonly, strong) MPOutlineViewController *outlineViewController;
|
||||
@property (readonly, strong) MPInspectorViewController *inspectorViewController;
|
||||
|
||||
|
||||
/* Holds the current item. That is either a KdbGroup or a KdbEntry */
|
||||
@property (readonly, unsafe_unretained) id currentItem;
|
||||
@property (readonly, unsafe_unretained) KdbGroup *currentGroup;
|
||||
@property (readonly, unsafe_unretained) KdbEntry *currentEntry;
|
||||
|
||||
/**
|
||||
@param action The action that should be validatet
|
||||
@param item The item that the action affects. Pass nil to fall back for default item
|
||||
@returns YES if the action is valid, NO otherwise
|
||||
*/
|
||||
- (BOOL)validateAction:(SEL)action forItem:(id)item;
|
||||
|
||||
- (void)showEntries;
|
||||
- (void)showPasswordInput;
|
||||
- (void)performFindPanelAction:(id)sender;
|
||||
- (IBAction)editPassword:(id)sender;
|
||||
- (IBAction)showDatabaseSettings:(id)sender;
|
||||
- (IBAction)exportDatabase:(id)sender;
|
||||
|
||||
- (void)lock:(id)sender;
|
||||
- (IBAction)lock:(id)sender;
|
||||
|
||||
- (void)createGroup:(id)sender;
|
||||
- (void)toggleInspector:(id)sender;
|
||||
|
||||
@@ -17,20 +17,17 @@
|
||||
#import "MPActionHelper.h"
|
||||
#import "MPDatabaseSettingsWindowController.h"
|
||||
#import "MPConstants.h"
|
||||
|
||||
NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCurrentItemChangedNotification";
|
||||
#import "MPSettingsHelper.h"
|
||||
|
||||
@interface MPDocumentWindowController () {
|
||||
@private
|
||||
id _firstResponder;
|
||||
BOOL _saveAfterPasswordEdit; // Flag to indicat that the document needs to be saved after password edit did finish
|
||||
}
|
||||
|
||||
@property (strong) IBOutlet NSSplitView *splitView;
|
||||
|
||||
@property (strong) NSToolbar *toolbar;
|
||||
@property (unsafe_unretained) id currentItem;
|
||||
@property (unsafe_unretained) KdbGroup *currentGroup;
|
||||
@property (unsafe_unretained) KdbEntry *currentEntry;
|
||||
|
||||
@property (strong) MPPasswordInputController *passwordInputController;
|
||||
@property (strong) MPEntryViewController *entryViewController;
|
||||
@@ -52,25 +49,20 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
||||
_outlineViewController = [[MPOutlineViewController alloc] init];
|
||||
_entryViewController = [[MPEntryViewController alloc] init];
|
||||
_inspectorViewController = [[MPInspectorViewController alloc] init];
|
||||
_currentItem = nil;
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_updateCurrentItem:) name:MPOutlineViewDidChangeGroupSelection object:_outlineViewController];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_updateCurrentItem:) name:MPDidChangeSelectedEntryNotification object:_entryViewController];
|
||||
_saveAfterPasswordEdit = NO;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
#pragma mark View Handling
|
||||
- (void)windowDidLoad {
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_didRevertDocument:) name:MPDocumentDidRevertNotifiation object:[self document]];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_setPasswordAndSave) name:MPDocumentRequestPasswordSaveNotification object:[self document]];
|
||||
|
||||
[_entryViewController setupNotifications:self];
|
||||
[_inspectorViewController setupNotifications:self];
|
||||
@@ -94,15 +86,20 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
||||
[_splitView setHoldingPriority:NSLayoutPriorityDefaultLow+2 forSubviewAtIndex:0];
|
||||
[_splitView setHoldingPriority:NSLayoutPriorityDefaultLow+1 forSubviewAtIndex:2];
|
||||
|
||||
[[self window] setDelegate:self];
|
||||
BOOL showInspector = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyShowInspector];
|
||||
if(!showInspector) {
|
||||
[inspectorView removeFromSuperview];
|
||||
}
|
||||
|
||||
MPDocument *document = [self document];
|
||||
if(!document.isDecrypted) {
|
||||
if(!document.decrypted) {
|
||||
[self showPasswordInput];
|
||||
}
|
||||
else {
|
||||
[self showEntries];
|
||||
}
|
||||
|
||||
[_splitView setAutosaveName:@"SplitView"];
|
||||
}
|
||||
|
||||
- (void)_setContentViewController:(MPViewController *)viewController {
|
||||
@@ -137,59 +134,99 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
||||
[self.window makeFirstResponder:[viewController reconmendedFirstResponder]];
|
||||
}
|
||||
|
||||
#pragma mark Notification handling
|
||||
- (void)_updateCurrentItem:(NSNotification *)notification {
|
||||
id sender = [notification object];
|
||||
|
||||
self.currentGroup = _outlineViewController.selectedGroup;
|
||||
self.currentEntry = _entryViewController.selectedEntry;
|
||||
|
||||
if( sender == _outlineViewController.outlineView || sender == _outlineViewController ) {
|
||||
self.currentItem = _outlineViewController.selectedGroup;
|
||||
}
|
||||
else if( sender == _entryViewController.entryTable || sender == _entryViewController) {
|
||||
self.currentItem = _entryViewController.selectedEntry;
|
||||
}
|
||||
else {
|
||||
return; // no notification!
|
||||
}
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPCurrentItemChangedNotification object:self];
|
||||
}
|
||||
|
||||
- (void)_didRevertDocument:(NSNotification *)notification {
|
||||
[self.outlineViewController clearSelection];
|
||||
[self showPasswordInput];
|
||||
}
|
||||
|
||||
#pragma mark Actions
|
||||
- (void)exportDatabase:(id)sender {
|
||||
NSSavePanel *savePanel = [NSSavePanel savePanel];
|
||||
[savePanel setAllowsOtherFileTypes:YES];
|
||||
[savePanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) {
|
||||
if(result == NSFileHandlingPanelOKButton) {
|
||||
[[self document] writeXMLToURL:savePanel.URL];
|
||||
}
|
||||
}];
|
||||
}
|
||||
- (void)performFindPanelAction:(id)sender {
|
||||
[self.entryViewController showFilter:sender];
|
||||
}
|
||||
|
||||
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
|
||||
MPDocument *document = [self document];
|
||||
return !( document.isLocked || document.isReadOnly );
|
||||
SEL itemAction = [menuItem action];
|
||||
if(itemAction == @selector(showDatabaseSettings:)
|
||||
|| itemAction == @selector(editPassword:)) {
|
||||
return document.decrypted && !document.isLocked;
|
||||
}
|
||||
|
||||
BOOL enabled = YES;
|
||||
if(itemAction == @selector(exportDatabase:)) {
|
||||
enabled = (nil != document.treeV4);
|
||||
}
|
||||
if(itemAction == [MPActionHelper actionOfType:MPActionDelete]) {
|
||||
enabled &= (nil != document.selectedItem) && (document.selectedItem != document.trash);
|
||||
}
|
||||
|
||||
enabled &= !( !document.decrypted || document.isLocked || document.isReadOnly );
|
||||
return enabled;
|
||||
}
|
||||
|
||||
- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem {
|
||||
MPDocument *document = [self document];
|
||||
if(document.isLocked || document.isReadOnly) {
|
||||
if(!document.decrypted || document.isLocked || document.isReadOnly) {
|
||||
return NO;
|
||||
}
|
||||
SEL itemAction = [theItem action];
|
||||
if( itemAction == [MPActionHelper actionOfType:MPActionLock]) {
|
||||
return document.isSecured;
|
||||
MPActionType actionType = [MPActionHelper typeForAction:[theItem action]];
|
||||
switch (actionType) {
|
||||
case MPActionAddGroup:
|
||||
case MPActionAddEntry:
|
||||
return (nil != document.selectedGroup);
|
||||
case MPActionDelete: {
|
||||
BOOL valid = (nil != document.selectedItem);
|
||||
valid &= (document.selectedItem != document.trash);
|
||||
valid &= ![document isItemTrashed:document.selectedItem];
|
||||
return valid;
|
||||
}
|
||||
case MPActionLock:
|
||||
return document.hasPasswordOrKey;
|
||||
|
||||
case MPActionToggleInspector:
|
||||
return (nil != [_splitView superview]);
|
||||
|
||||
default:
|
||||
return YES;
|
||||
}
|
||||
if(itemAction == [MPActionHelper actionOfType:MPActionAddEntry]) {
|
||||
return (nil != _outlineViewController.selectedGroup);
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (BOOL)validateAction:(SEL)action forItem:(id)item {
|
||||
MPDocument *document = [self document];
|
||||
if(!document.decrypted || document.isLocked || document.isReadOnly) {
|
||||
return NO;
|
||||
}
|
||||
if(itemAction == [MPActionHelper actionOfType:MPActionDelete]) {
|
||||
return (nil != _currentItem);
|
||||
MPActionType actionType = [MPActionHelper typeForAction:action];
|
||||
switch (actionType) {
|
||||
case MPActionAddGroup:
|
||||
case MPActionAddEntry:
|
||||
// test if Group is in trash
|
||||
return (nil != document.selectedGroup);
|
||||
case MPActionDelete: {
|
||||
BOOL valid = (nil != document.selectedItem);
|
||||
valid &= (document.selectedItem != document.trash);
|
||||
valid &= ![document isItemTrashed:document.selectedItem];
|
||||
return valid;
|
||||
}
|
||||
case MPActionLock:
|
||||
return document.hasPasswordOrKey;
|
||||
|
||||
case MPActionToggleInspector:
|
||||
return (nil != [_splitView superview]);
|
||||
|
||||
default:
|
||||
return YES;
|
||||
}
|
||||
if(itemAction == [MPActionHelper actionOfType:MPActionToggleInspector]) {
|
||||
return (nil != [_splitView superview]);
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
@@ -202,16 +239,16 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
||||
}
|
||||
|
||||
- (void)editPassword:(id)sender {
|
||||
[self _showDatabaseSetting:MPDatabaseSettingsTabPassword];
|
||||
[self _showDatabaseSetting:MPDatabaseSettingsTabPassword saveDocument:NO];
|
||||
}
|
||||
|
||||
- (void)showDatabaseSettings:(id)sender {
|
||||
[self _showDatabaseSetting:MPDatabaseSettingsTabGeneral];
|
||||
[self _showDatabaseSetting:MPDatabaseSettingsTabGeneral saveDocument:NO];
|
||||
}
|
||||
|
||||
- (void)lock:(id)sender {
|
||||
- (IBAction)lock:(id)sender {
|
||||
MPDocument *document = [self document];
|
||||
if(!document.isSecured) {
|
||||
if(!document.hasPasswordOrKey) {
|
||||
return; // Document needs a password/keyfile to be lockable
|
||||
}
|
||||
if(document.isLocked) {
|
||||
@@ -231,18 +268,21 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
||||
|
||||
- (void)toggleInspector:(id)sender {
|
||||
NSView *inspectorView = [_inspectorViewController view];
|
||||
BOOL inspectorVisible = NO;
|
||||
if([inspectorView superview]) {
|
||||
//[inspectorView animator]
|
||||
[inspectorView removeFromSuperview];
|
||||
}
|
||||
else {
|
||||
// Remove contraint on view removal.
|
||||
inspectorVisible = YES;
|
||||
[_splitView addSubview:inspectorView];
|
||||
[_splitView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[inspectorView(>=200)]"
|
||||
options:0
|
||||
metrics:nil
|
||||
views:NSDictionaryOfVariableBindings(inspectorView)]];
|
||||
}
|
||||
[[NSUserDefaults standardUserDefaults] setBool:inspectorVisible forKey:kMPSettingsKeyShowInspector];
|
||||
}
|
||||
|
||||
- (void)showEntries {
|
||||
@@ -254,7 +294,7 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
||||
[[contentView subviews][0] removeFromSuperviewWithoutNeedingDisplay];
|
||||
}
|
||||
[contentView addSubview:_splitView];
|
||||
[_splitView adjustSubviews];
|
||||
//[_splitView adjustSubviews];
|
||||
NSView *outlineView = [_outlineViewController view];
|
||||
NSView *inspectorView = [_inspectorViewController view];
|
||||
NSView *entryView = [_entryViewController view];
|
||||
@@ -300,7 +340,7 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
||||
if(removeInspector) {
|
||||
[inspectorView removeFromSuperview];
|
||||
}
|
||||
[contentView layout];
|
||||
[contentView layoutSubtreeIfNeeded];
|
||||
|
||||
MPDocument *document = [self document];
|
||||
document.locked = NO;
|
||||
@@ -311,28 +351,38 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
||||
[_outlineViewController showOutline];
|
||||
}
|
||||
|
||||
#pragma mark NSWindowDelegate
|
||||
- (void)windowDidUpdate:(NSNotification *)notification {
|
||||
id firstResonder = [[self window] firstResponder];
|
||||
if(_firstResponder == firstResonder) {
|
||||
return;
|
||||
}
|
||||
_firstResponder = firstResonder;
|
||||
if([_firstResponder isKindOfClass:[NSView class]]) {
|
||||
[self _updateCurrentItem:[NSNotification notificationWithName:@"dummy" object:_firstResponder ]];
|
||||
}
|
||||
#pragma mark MPDatabaseSettingsDelegate
|
||||
- (void)didCancelDatabaseSettings {
|
||||
_saveAfterPasswordEdit = NO; // Just Reset the flag
|
||||
}
|
||||
|
||||
- (void)didSaveDatabaseSettings {
|
||||
if (_saveAfterPasswordEdit) {
|
||||
_saveAfterPasswordEdit = NO;
|
||||
}
|
||||
[[self document] saveDocument:nil];
|
||||
}
|
||||
|
||||
#pragma mark Helper
|
||||
|
||||
- (void)_showDatabaseSetting:(MPDatabaseSettingsTab)tab {
|
||||
if(!self.documentSettingsWindowController) {
|
||||
_documentSettingsWindowController = [[MPDatabaseSettingsWindowController alloc] initWithDocument:[self document]];
|
||||
}
|
||||
[self.documentSettingsWindowController update];
|
||||
- (void)_setPasswordAndSave {
|
||||
_saveAfterPasswordEdit = YES;
|
||||
[self editPassword:nil];
|
||||
}
|
||||
|
||||
- (void)_showDatabaseSetting:(MPDatabaseSettingsTab)tab saveDocument:(BOOL)save{
|
||||
if(!self.documentSettingsWindowController) {
|
||||
_documentSettingsWindowController = [[MPDatabaseSettingsWindowController alloc] initWithDocument:[self document]];
|
||||
[_documentSettingsWindowController setDelegate:self];
|
||||
}
|
||||
[self.documentSettingsWindowController update];
|
||||
[self.documentSettingsWindowController showSettingsTab:tab];
|
||||
[[NSApplication sharedApplication] beginSheet:[self.documentSettingsWindowController window] modalForWindow:[self window] modalDelegate:nil didEndSelector:NULL contextInfo:NULL];
|
||||
[[NSApplication sharedApplication] beginSheet:[self.documentSettingsWindowController window]
|
||||
modalForWindow:[self window]
|
||||
modalDelegate:nil
|
||||
didEndSelector:NULL
|
||||
contextInfo:NULL];
|
||||
|
||||
}
|
||||
|
||||
- (NSSearchField *)locateToolbarSearchField {
|
||||
|
||||
16
MacPass/MPEntryMenuDelegate.h
Normal file
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// MPEntryMenuDelegate.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 17.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
@class MPEntryViewController;
|
||||
|
||||
@interface MPEntryMenuDelegate : NSObject <NSMenuDelegate>
|
||||
|
||||
@property (weak) MPEntryViewController *viewController;
|
||||
|
||||
@end
|
||||
54
MacPass/MPEntryMenuDelegate.m
Normal file
@@ -0,0 +1,54 @@
|
||||
//
|
||||
// MPEntryMenuDelegate.m
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 17.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MPEntryMenuDelegate.h"
|
||||
#import "MPEntryViewController.h"
|
||||
|
||||
#import "Kdb4Node.h"
|
||||
|
||||
static NSUInteger const kMPCustomFieldMenuItem = 1000;
|
||||
static NSUInteger const kMPAttachmentsMenuItem = 2000;
|
||||
|
||||
@implementation MPEntryMenuDelegate
|
||||
|
||||
- (void)menuNeedsUpdate:(NSMenu *)menu {
|
||||
NSMenuItem *fieldsMenu = [menu itemWithTag:kMPCustomFieldMenuItem];
|
||||
NSMenuItem *attachmentsMenu = [menu itemWithTag:kMPAttachmentsMenuItem];
|
||||
if(fieldsMenu) {
|
||||
[menu removeItem:fieldsMenu];
|
||||
}
|
||||
if(attachmentsMenu) {
|
||||
[menu removeItem:attachmentsMenu];
|
||||
}
|
||||
|
||||
NSMenuItem *lastItem = [[menu itemArray] lastObject];
|
||||
if([lastItem isSeparatorItem]) {
|
||||
[menu removeItem:lastItem];
|
||||
}
|
||||
|
||||
if([self.viewController.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||
Kdb4Entry *entry = (Kdb4Entry *)self.viewController.selectedEntry;
|
||||
if([entry.stringFields count] > 0) {
|
||||
[menu addItem:[NSMenuItem separatorItem]];
|
||||
NSMenuItem *customFieldsItem = [[NSMenuItem alloc] init];
|
||||
NSMenu *submenu = [[NSMenu alloc] initWithTitle:@"Fields"];
|
||||
[customFieldsItem setTitle:NSLocalizedString(@"COPY_CUSTOM_FIELDS", "Submenu to Copy custom fields")];
|
||||
[customFieldsItem setTag:kMPCustomFieldMenuItem];
|
||||
for (StringField *field in entry.stringFields) {
|
||||
NSString *title = [NSString stringWithFormat:NSLocalizedString(@"COPY_FIELD_%@", "Mask for title to copy field value"), field.key];
|
||||
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:title action:@selector(copyCustomField:) keyEquivalent:@""];
|
||||
[item setTag:[entry.stringFields indexOfObject:field]];
|
||||
[submenu addItem:item];
|
||||
}
|
||||
[customFieldsItem setSubmenu:submenu];
|
||||
[menu addItem:customFieldsItem];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -14,8 +14,6 @@ APPKIT_EXTERN NSString *const MPEntryTablePasswordColumnIdentifier;
|
||||
APPKIT_EXTERN NSString *const MPEntryTableParentColumnIdentifier;
|
||||
APPKIT_EXTERN NSString *const MPEntryTableURLColumnIdentifier;
|
||||
|
||||
APPKIT_EXTERN NSString *const MPDidChangeSelectedEntryNotification;
|
||||
|
||||
/* Tags to determine what to copy */
|
||||
typedef NS_ENUM( NSUInteger, MPCopyContentTypeTag) {
|
||||
MPCopyUsername,
|
||||
@@ -48,9 +46,11 @@ typedef NS_ENUM( NSUInteger, MPCopyContentTypeTag) {
|
||||
/* Copy/Paste */
|
||||
- (void)copyUsername:(id)sender;
|
||||
- (void)copyPassword:(id)sender;
|
||||
- (void)copyCustomField:(id)sender;
|
||||
- (void)copyURL:(id)sender;
|
||||
- (void)openURL:(id)sender;
|
||||
|
||||
|
||||
/* Entry Handling*/
|
||||
- (void)deleteNode:(id)sender;
|
||||
|
||||
|
||||
@@ -20,15 +20,17 @@
|
||||
#import "MPConstants.h"
|
||||
#import "MPEntryTableDataSource.h"
|
||||
#import "MPStringLengthValueTransformer.h"
|
||||
#import "MPEntryMenuDelegate.h"
|
||||
|
||||
#import "HNHTableHeaderCell.h"
|
||||
#import "HNHGradientView.h"
|
||||
|
||||
#import "Kdb4Node.h"
|
||||
#import "KdbGroup+MPTreeTools.h"
|
||||
#import "KdbGroup+Undo.h"
|
||||
#import "KdbEntry+Undo.h"
|
||||
|
||||
NSString *const MPDidChangeSelectedEntryNotification = @"com.macpass.MPDidChangeSelectedEntryNotification";
|
||||
#import "MPNotifications.h"
|
||||
|
||||
#define STATUS_BAR_ANIMATION_TIME 0.2
|
||||
|
||||
@@ -43,6 +45,7 @@ typedef NS_ENUM(NSUInteger,MPOVerlayInfoType) {
|
||||
MPOverlayInfoPassword,
|
||||
MPOverlayInfoUsername,
|
||||
MPOverlayInfoURL,
|
||||
MPOverlayInfoCustom
|
||||
};
|
||||
|
||||
NSString *const MPEntryTableUserNameColumnIdentifier = @"MPUserNameColumnIdentifier";
|
||||
@@ -59,11 +62,14 @@ NSString *const _toggleFilterURLButton = @"SearchURL";
|
||||
NSString *const _toggleFilterTitleButton = @"SearchTitle";
|
||||
NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
||||
|
||||
@interface MPEntryViewController ()
|
||||
@interface MPEntryViewController () {
|
||||
MPEntryMenuDelegate *_menuDelegate;
|
||||
}
|
||||
|
||||
@property (strong) NSArrayController *entryArrayController;
|
||||
@property (strong) NSArray *filteredEntries;
|
||||
@property (strong) IBOutlet NSView *filterBar;
|
||||
@property (strong) IBOutlet HNHGradientView *trashBar;
|
||||
@property (weak) IBOutlet NSTableView *entryTable;
|
||||
@property (strong) IBOutlet NSLayoutConstraint *tableToTop;
|
||||
@property (weak) IBOutlet NSButton *filterDoneButton;
|
||||
@@ -75,6 +81,8 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
||||
@property (weak) IBOutlet NSSearchField *filterSearchField;
|
||||
@property (weak) IBOutlet HNHGradientView *bottomBar;
|
||||
@property (weak) IBOutlet NSButton *addEntryButton;
|
||||
@property (weak) IBOutlet NSTextField *entryCountTextField;
|
||||
|
||||
|
||||
@property (weak) KdbEntry *selectedEntry;
|
||||
|
||||
@@ -97,12 +105,15 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
||||
if(self) {
|
||||
_filterMode = MPFilterTitles;
|
||||
_filterButtonToMode = @{ _toggleFilterUsernameButton : @(MPFilterUsernames),
|
||||
_toggleFilterTitleButton : @(MPFilterTitles),
|
||||
_toggleFilterURLButton : @(MPFilterUrls)
|
||||
};
|
||||
_toggleFilterTitleButton : @(MPFilterTitles),
|
||||
_toggleFilterURLButton : @(MPFilterUrls)
|
||||
};
|
||||
_entryArrayController = [[NSArrayController alloc] init];
|
||||
_dataSource = [[MPEntryTableDataSource alloc] init];
|
||||
_dataSource.viewController = self;
|
||||
_menuDelegate = [[MPEntryMenuDelegate alloc] init];
|
||||
_menuDelegate.viewController = self;
|
||||
|
||||
_selectedEntry = nil;
|
||||
}
|
||||
return self;
|
||||
@@ -124,7 +135,12 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
||||
[self.entryTable setDoubleAction:@selector(_columnDoubleClick:)];
|
||||
[self.entryTable setTarget:self];
|
||||
[self.entryTable setFloatsGroupRows:NO];
|
||||
[self.entryTable registerForDraggedTypes:@[MPPasteBoardType]];
|
||||
//[self.entryTable registerForDraggedTypes:@[MPPasteBoardType]];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(_didBecomFirstResponder:)
|
||||
name:MPDidBecomeFirstResonderNotification
|
||||
object:_entryTable];
|
||||
|
||||
[self _setupEntryMenu];
|
||||
|
||||
NSTableColumn *parentColumn = [self.entryTable tableColumns][0];
|
||||
@@ -140,6 +156,9 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
||||
[passwordColumn setIdentifier:MPEntryTablePasswordColumnIdentifier];
|
||||
[urlColumn setIdentifier:MPEntryTableURLColumnIdentifier];
|
||||
|
||||
[self.entryTable setAutosaveName:@"EntryTable"];
|
||||
[self.entryTable setAutosaveTableColumns:YES];
|
||||
|
||||
NSSortDescriptor *titleColumSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES selector:@selector(compare:)];
|
||||
NSSortDescriptor *userNameSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"username" ascending:YES selector:@selector(compare:)];
|
||||
NSSortDescriptor *urlSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"url" ascending:YES selector:@selector(compare:)];
|
||||
@@ -163,10 +182,11 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
||||
}
|
||||
|
||||
- (void)setupNotifications:(MPDocumentWindowController *)windowController {
|
||||
MPDocument *document = [windowController document];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(_didChangeCurrentItem:)
|
||||
name:MPCurrentItemChangedNotification
|
||||
object:windowController];
|
||||
object:document];
|
||||
}
|
||||
|
||||
#pragma mark NSTableViewDelgate
|
||||
@@ -214,45 +234,52 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
||||
}
|
||||
|
||||
- (void)tableViewSelectionDidChange:(NSNotification *)notification {
|
||||
MPDocument *document = [[self windowController] document];
|
||||
if([self.entryTable selectedRow] < 0 || [[_entryTable selectedRowIndexes] count] > 1) {
|
||||
self.selectedEntry = nil;
|
||||
document.selectedEntry = nil;
|
||||
}
|
||||
else {
|
||||
self.selectedEntry = [self.entryArrayController arrangedObjects][[self.entryTable selectedRow]];
|
||||
document.selectedEntry = [self.entryArrayController arrangedObjects][[self.entryTable selectedRow]];
|
||||
}
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPDidChangeSelectedEntryNotification object:self userInfo:nil];
|
||||
}
|
||||
|
||||
#pragma mark Notifications
|
||||
- (void)_didChangeCurrentItem:(NSNotification *)notification {
|
||||
if([self _showsFilterBar]) {
|
||||
//[self.filterSearchField setStringValue:@""];
|
||||
[self clearFilter:nil];
|
||||
}
|
||||
MPDocumentWindowController *sender = [notification object];
|
||||
id item = sender.currentItem;
|
||||
/*
|
||||
Filter? If no group is selected, we shouldn display a list of entries
|
||||
*/
|
||||
if(!sender.currentGroup) {
|
||||
MPDocument *document = [notification object];
|
||||
|
||||
if(!document.selectedGroup) {
|
||||
[self.entryArrayController unbind:NSContentArrayBinding];
|
||||
[self.entryArrayController setContent:nil];
|
||||
return;
|
||||
}
|
||||
/*
|
||||
If a grup is the current item, see if we already show that group
|
||||
*/
|
||||
if(item == sender.currentGroup) {
|
||||
*/
|
||||
if(document.selectedItem == document.selectedGroup) {
|
||||
/*
|
||||
If we reselct the group, or just another group
|
||||
we clear the filter and bind to the new selected group
|
||||
*/
|
||||
if([self _showsFilterBar] && ![document.selectedItem isKindOfClass:[KdbEntry class]]) {
|
||||
[self clearFilter:nil];
|
||||
[self.entryArrayController bind:NSContentArrayBinding toObject:document.selectedGroup withKeyPath:@"entries" options:nil];
|
||||
return;
|
||||
}
|
||||
if([[self.entryArrayController content] count] > 0) {
|
||||
KdbEntry *entry = [[self.entryArrayController content] lastObject];
|
||||
if(entry.parent == item) {
|
||||
if(entry.parent == document.selectedGroup) {
|
||||
return; // we are showing the correct object right now.
|
||||
}
|
||||
}
|
||||
[self.entryArrayController bind:NSContentArrayBinding toObject:item withKeyPath:@"entries" options:nil];
|
||||
[self.entryArrayController bind:NSContentArrayBinding toObject:document.selectedGroup withKeyPath:@"entries" options:nil];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)_didBecomFirstResponder:(NSNotification *)notification {
|
||||
MPDocument *document = [[self windowController] document];
|
||||
document.selectedItem = document.selectedEntry;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark Filtering
|
||||
|
||||
@@ -273,8 +300,11 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
||||
|
||||
- (void)clearFilter:(id)sender {
|
||||
self.filter = nil;
|
||||
[self.filterSearchField setStringValue:@""];
|
||||
[[self.entryTable tableColumnWithIdentifier:MPEntryTableParentColumnIdentifier] setHidden:YES];
|
||||
[self _hideFilterBarAnimated:YES];
|
||||
MPDocument *document = [[self windowController] document];
|
||||
document.selectedGroup = document.selectedGroup;
|
||||
}
|
||||
|
||||
- (void)updateFilter {
|
||||
@@ -301,6 +331,7 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
||||
self.filteredEntries = [[document.root childEntries] filteredArrayUsingPredicate:fullFilter];
|
||||
|
||||
dispatch_sync(dispatch_get_main_queue(), ^{
|
||||
document.selectedEntry = nil;
|
||||
[self.entryArrayController unbind:NSContentArrayBinding];
|
||||
[self.entryArrayController setContent:self.filteredEntries];
|
||||
[[self.entryTable tableColumnWithIdentifier:MPEntryTableParentColumnIdentifier] setHidden:NO];
|
||||
@@ -371,6 +402,7 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
||||
else {
|
||||
[self.view layoutSubtreeIfNeeded];
|
||||
}
|
||||
[[[self windowController] window] makeFirstResponder:self.filterSearchField];
|
||||
}
|
||||
|
||||
- (void)_hideFilterBarAnimated:(BOOL)animate {
|
||||
@@ -396,7 +428,7 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
||||
}
|
||||
}
|
||||
|
||||
- (void)_copyToPasteboard:(NSString *)data overlayInfo:(MPOVerlayInfoType)overlayInfoType {
|
||||
- (void)_copyToPasteboard:(NSString *)data overlayInfo:(MPOVerlayInfoType)overlayInfoType name:(NSString *)name{
|
||||
if(data) {
|
||||
[[MPPasteBoardController defaultController] copyObjects:@[ data ]];
|
||||
}
|
||||
@@ -417,10 +449,65 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
||||
infoImage = [[NSBundle mainBundle] imageForResource:@"09_IdentityTemplate"];
|
||||
infoText = NSLocalizedString(@"COPIED_USERNAME", @"Username was copied to the pasteboard");
|
||||
break;
|
||||
|
||||
case MPOverlayInfoCustom:
|
||||
infoImage = [[NSBundle mainBundle] imageForResource:@"00_PasswordTemplate"];
|
||||
infoText = [NSString stringWithFormat:NSLocalizedString(@"COPIED_FIELD_%@", "Field nam that was copied to the pasteboard"), name];
|
||||
break;
|
||||
}
|
||||
[[MPOverlayWindowController sharedController] displayOverlayImage:infoImage label:infoText atView:self.view];
|
||||
}
|
||||
|
||||
- (void)_showTrashBar {
|
||||
if([self hasFilter]) {
|
||||
[self clearFilter:nil];
|
||||
}
|
||||
if(!self.trashBar) {
|
||||
[self _setupTrashBar];
|
||||
}
|
||||
NSView *scrollView = [_entryTable enclosingScrollView];
|
||||
NSDictionary *views = NSDictionaryOfVariableBindings(scrollView, _trashBar);
|
||||
[[self view] layout];
|
||||
[[self view] removeConstraint:self.tableToTop];
|
||||
[[self view] addSubview:self.trashBar];
|
||||
[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_trashBar]|" options:0 metrics:nil views:views]];
|
||||
[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_trashBar(==30)]-0-[scrollView]" options:0 metrics:nil views:views]];
|
||||
|
||||
[NSAnimationContext runAnimationGroup:^(NSAnimationContext* context) {
|
||||
context.duration = STATUS_BAR_ANIMATION_TIME;
|
||||
context.allowsImplicitAnimation = YES;
|
||||
[[self view] layoutSubtreeIfNeeded];
|
||||
} completionHandler:nil] ;
|
||||
|
||||
|
||||
//[[self view] layoutSubtreeIfNeeded];
|
||||
|
||||
}
|
||||
|
||||
- (void)_hideTrashBar {
|
||||
if(![self.trashBar superview]) {
|
||||
return; // Trahsbar is not visible
|
||||
}
|
||||
|
||||
[self.trashBar removeFromSuperview];
|
||||
[[self view] addConstraint:self.tableToTop];
|
||||
[[self view] layoutSubtreeIfNeeded];
|
||||
}
|
||||
|
||||
- (void)_setupTrashBar {
|
||||
/* Load the bundle */
|
||||
[[NSBundle mainBundle] loadNibNamed:@"TrashBar" owner:self topLevelObjects:nil];
|
||||
NSArray *activeColors = @[
|
||||
[NSColor colorWithCalibratedWhite:0.2 alpha:1],
|
||||
[NSColor colorWithCalibratedWhite:0.4 alpha:1]
|
||||
];
|
||||
NSArray *inactiveColors = @[ [NSColor colorWithCalibratedWhite:0.3 alpha:1],
|
||||
[NSColor colorWithCalibratedWhite:0.6 alpha:1]
|
||||
];
|
||||
self.trashBar.activeGradient = [[NSGradient alloc] initWithColors:activeColors];
|
||||
self.trashBar.inactiveGradient = [[NSGradient alloc] initWithColors:inactiveColors];
|
||||
}
|
||||
|
||||
#pragma mark EntryMenu
|
||||
|
||||
- (void)_setupEntryMenu {
|
||||
@@ -430,7 +517,9 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
||||
for(NSMenuItem *item in items) {
|
||||
[menu addItem:item];
|
||||
}
|
||||
[menu setDelegate:_menuDelegate];
|
||||
[self.entryTable setMenu:menu];
|
||||
|
||||
}
|
||||
|
||||
#pragma makr Action Helper
|
||||
@@ -452,21 +541,32 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
||||
- (void)copyPassword:(id)sender {
|
||||
KdbEntry *selectedEntry = [self _clickedOrSelectedEntry];
|
||||
if(selectedEntry) {
|
||||
[self _copyToPasteboard:selectedEntry.password overlayInfo:MPOverlayInfoPassword];
|
||||
[self _copyToPasteboard:selectedEntry.password overlayInfo:MPOverlayInfoPassword name:nil];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)copyUsername:(id)sender {
|
||||
KdbEntry *selectedEntry = [self _clickedOrSelectedEntry];
|
||||
if(selectedEntry) {
|
||||
[self _copyToPasteboard:selectedEntry.username overlayInfo:MPOverlayInfoUsername];
|
||||
[self _copyToPasteboard:selectedEntry.username overlayInfo:MPOverlayInfoUsername name:nil];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)copyCustomField:(id)sender {
|
||||
KdbEntry *selectedEntry = [self _clickedOrSelectedEntry];
|
||||
if(selectedEntry && [selectedEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||
Kdb4Entry *entry = (Kdb4Entry *)selectedEntry;
|
||||
NSUInteger index = [sender tag];
|
||||
NSAssert((index >= 0) && (index < [entry.stringFields count]), @"Index for custom field needs to be valid");
|
||||
StringField *field = entry.stringFields[index];
|
||||
[self _copyToPasteboard:field.value overlayInfo:MPOverlayInfoCustom name:field.key];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)copyURL:(id)sender {
|
||||
KdbEntry *selectedEntry = [self _clickedOrSelectedEntry];
|
||||
if(selectedEntry) {
|
||||
[self _copyToPasteboard:selectedEntry.url overlayInfo:MPOverlayInfoURL];
|
||||
[self _copyToPasteboard:selectedEntry.url overlayInfo:MPOverlayInfoURL name:nil];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -481,7 +581,12 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
||||
- (void)deleteNode:(id)sender {
|
||||
KdbEntry *entry =[self _clickedOrSelectedEntry];
|
||||
MPDocument *document = [[self windowController] document];
|
||||
[document group:entry.parent removeEntry:entry];
|
||||
[document deleteEntry:entry];
|
||||
}
|
||||
|
||||
#pragma mark Validation
|
||||
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)_toggleFilterSpace:(id)sender {
|
||||
|
||||
@@ -16,5 +16,7 @@
|
||||
@property (weak) IBOutlet NSPopUpButton *clearPasteboardTimeoutPopup;
|
||||
@property (weak) IBOutlet NSPopUpButton *idleTimeOutPopup;
|
||||
@property (weak) IBOutlet NSButton *lockOnSleepCheckButton;
|
||||
@property (weak) IBOutlet NSButton *reopenLastDatabase;
|
||||
@property (weak) IBOutlet NSButton *createUntitledOnActivation;
|
||||
|
||||
@end
|
||||
|
||||
@@ -32,6 +32,8 @@ NSString *const MPGeneralSetingsIdentifier = @"GeneralSettingsTab";
|
||||
|
||||
- (void)didLoadView {
|
||||
NSUserDefaultsController *defaultsController = [NSUserDefaultsController sharedUserDefaultsController];
|
||||
NSString *reopenLastFilePath = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyReopenLastDatabaseOnLaunch];
|
||||
//NSString *createUntitledOnActivatePaht = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyOpenEmptyDatabaseOnLaunch];
|
||||
NSString *clearPasteboardKeyPath = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyClearPasteboardOnQuit];
|
||||
NSString *clearPasteboardTimeOutKeyPath = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyPasteboardClearTimeout];
|
||||
NSString *idleTimeOutKeyPath = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyIdleLockTimeOut];
|
||||
@@ -40,5 +42,8 @@ NSString *const MPGeneralSetingsIdentifier = @"GeneralSettingsTab";
|
||||
[self.clearPasteboardTimeoutPopup bind:NSSelectedTagBinding toObject:defaultsController withKeyPath:clearPasteboardTimeOutKeyPath options:nil];
|
||||
[self.lockOnSleepCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:lockOnSleepKeyPath options:nil];
|
||||
[self.idleTimeOutPopup bind:NSSelectedTagBinding toObject:defaultsController withKeyPath:idleTimeOutKeyPath options:nil];
|
||||
[self.reopenLastDatabase bind:NSValueBinding toObject:defaultsController withKeyPath:reopenLastFilePath options:nil];
|
||||
[self.createUntitledOnActivation setState:NSOffState];
|
||||
//[self.createUntitledOnActivation bind:NSValueBinding toObject:defaultsController withKeyPath:createUntitledOnActivatePaht options:nil];
|
||||
}
|
||||
@end
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
@class HNHRoundedSecureTextField;
|
||||
@class MPDocumentWindowController;
|
||||
|
||||
@interface MPInspectorViewController : MPViewController <NSPopoverDelegate, NSTableViewDelegate>
|
||||
@interface MPInspectorViewController : MPViewController <NSPopoverDelegate>
|
||||
|
||||
@property (weak) IBOutlet MPPopupImageView *itemImageView;
|
||||
@property (weak) IBOutlet NSTextField *itemNameTextfield;
|
||||
@@ -36,6 +36,9 @@
|
||||
@property (weak) IBOutlet NSButton *togglePassword;
|
||||
|
||||
|
||||
@property (weak, nonatomic, readonly) KdbEntry *selectedEntry;
|
||||
@property (weak, nonatomic, readonly) KdbGroup *selectedGroup;
|
||||
|
||||
/* Seperate call to ensure alle registered objects are in place */
|
||||
- (void)setupNotifications:(MPDocumentWindowController *)windowController;
|
||||
|
||||
|
||||
@@ -20,6 +20,11 @@
|
||||
#import "MPDatabaseVersion.h"
|
||||
#import "MPCustomFieldTableCellView.h"
|
||||
#import "MPSelectedAttachmentTableCellView.h"
|
||||
#import "MPAttachmentTableViewDelegate.h"
|
||||
#import "MPCustomFieldTableViewDelegate.h"
|
||||
#import "MPNotifications.h"
|
||||
|
||||
#import "NSDate+Humanized.h"
|
||||
|
||||
#import "KdbLib.h"
|
||||
#import "Kdb4Node.h"
|
||||
@@ -31,18 +36,22 @@
|
||||
#import "NSMutableData+Base64.h"
|
||||
|
||||
#import "HNHGradientView.h"
|
||||
#import "HNHScrollView.h"
|
||||
#import "HNHTableRowView.h"
|
||||
#import "HNHRoundedSecureTextField.h"
|
||||
|
||||
enum {
|
||||
MPGeneralTab,
|
||||
MPNotesTab,
|
||||
MPAttachmentsTab,
|
||||
MPCustomFieldsTab
|
||||
};
|
||||
|
||||
@interface MPInspectorViewController () {
|
||||
BOOL _visible;
|
||||
NSArrayController *_attachmentsController;
|
||||
NSArrayController *_customFieldsController;
|
||||
MPAttachmentTableViewDelegate *_attachmentTableDelegate;
|
||||
MPCustomFieldTableViewDelegate *_customFieldTableDelegate;
|
||||
}
|
||||
|
||||
@property (weak, nonatomic) KdbEntry *selectedEntry;
|
||||
@@ -51,21 +60,22 @@ enum {
|
||||
@property (strong) NSPopover *activePopover;
|
||||
@property (weak) IBOutlet NSButton *generatePasswordButton;
|
||||
|
||||
@property (nonatomic, weak) NSDate *modificationDate;
|
||||
@property (nonatomic, weak) NSDate *creationDate;
|
||||
@property (nonatomic, strong) NSDate *modificationDate;
|
||||
@property (nonatomic, strong) NSDate *creationDate;
|
||||
|
||||
@property (nonatomic, assign) BOOL showPassword;
|
||||
|
||||
@property (nonatomic, assign) NSUInteger activeTab;
|
||||
@property (weak) IBOutlet NSTabView *tabView;
|
||||
@property (strong) NSArrayController *attachmentsController;
|
||||
@property (strong) NSArrayController *customFieldsController;
|
||||
@property (strong) IBOutlet NSView *generalView;
|
||||
|
||||
- (IBAction)addCustomField:(id)sender;
|
||||
- (IBAction)removeCustomField:(id)sender;
|
||||
- (IBAction)saveAttachment:(id)sender;
|
||||
- (IBAction)addAttachment:(id)sender;
|
||||
- (IBAction)removeAttachment:(id)sender;
|
||||
- (IBAction)edit:(id)sender;
|
||||
- (IBAction)finishEdit:(id)sender;
|
||||
|
||||
@end
|
||||
|
||||
@@ -83,6 +93,10 @@ enum {
|
||||
_selectedGroup = nil;
|
||||
_attachmentsController = [[NSArrayController alloc] init];
|
||||
_customFieldsController = [[NSArrayController alloc] init];
|
||||
_attachmentTableDelegate = [[MPAttachmentTableViewDelegate alloc] init];
|
||||
_attachmentTableDelegate.viewController = self;
|
||||
_customFieldTableDelegate = [[MPCustomFieldTableViewDelegate alloc] init];
|
||||
_customFieldTableDelegate.viewController = self;
|
||||
_activeTab = MPGeneralTab;
|
||||
}
|
||||
return self;
|
||||
@@ -93,6 +107,38 @@ enum {
|
||||
}
|
||||
|
||||
- (void)didLoadView {
|
||||
|
||||
HNHScrollView *scrollView = [[HNHScrollView alloc] init];
|
||||
scrollView.actAsFlipped = NO;
|
||||
[scrollView setHasVerticalScroller:YES];
|
||||
[scrollView setDrawsBackground:NO];
|
||||
[scrollView setTranslatesAutoresizingMaskIntoConstraints:NO];
|
||||
NSView *clipView = [scrollView contentView];
|
||||
|
||||
NSView *tabView = [[self.tabView tabViewItemAtIndex:MPGeneralTab] view];
|
||||
/*
|
||||
DO NEVER SET setTranslatesAutoresizingMaskIntoConstraints on NSTabViewItem's view
|
||||
[tabView setTranslatesAutoresizingMaskIntoConstraints:NO];
|
||||
*/
|
||||
[scrollView setDocumentView:self.generalView];
|
||||
[tabView addSubview:scrollView];
|
||||
|
||||
NSDictionary *views = NSDictionaryOfVariableBindings(_generalView, scrollView);
|
||||
[[scrollView superview] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|"
|
||||
options:0
|
||||
metrics:nil
|
||||
views:views ]];
|
||||
[[scrollView superview] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-3-[scrollView]-50-|"
|
||||
options:0
|
||||
metrics:nil
|
||||
views:views]];
|
||||
[clipView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_generalView]|"
|
||||
options:0
|
||||
metrics:nil
|
||||
views:views]];
|
||||
[[self view] layoutSubtreeIfNeeded];
|
||||
|
||||
|
||||
//[self.scrollContentView setAutoresizingMask:NSViewWidthSizable];
|
||||
[[self.itemImageView cell] setBackgroundStyle:NSBackgroundStyleRaised];
|
||||
[self.itemImageView setTarget:self];
|
||||
@@ -103,12 +149,12 @@ enum {
|
||||
|
||||
/* Set background to clearcolor so we can draw in the scrollview */
|
||||
[_attachmentTableView setBackgroundColor:[NSColor clearColor]];
|
||||
[_attachmentTableView bind:NSContentBinding toObject:self.attachmentsController withKeyPath:@"arrangedObjects" options:nil];
|
||||
[_attachmentTableView setDelegate:self];
|
||||
[_attachmentTableView bind:NSContentBinding toObject:_attachmentsController withKeyPath:@"arrangedObjects" options:nil];
|
||||
[_attachmentTableView setDelegate:_attachmentTableDelegate];
|
||||
/* Set background to clearcolor so we can draw in the scrollview */
|
||||
[_customFieldsTableView setBackgroundColor:[NSColor clearColor]];
|
||||
[_customFieldsTableView bind:NSContentBinding toObject:self.customFieldsController withKeyPath:@"arrangedObjects" options:nil];
|
||||
[_customFieldsTableView setDelegate:self];
|
||||
[_customFieldsTableView bind:NSContentBinding toObject:_customFieldsController withKeyPath:@"arrangedObjects" options:nil];
|
||||
[_customFieldsTableView setDelegate:_customFieldTableDelegate];
|
||||
|
||||
[self.passwordTextField bind:@"showPassword" toObject:self withKeyPath:@"showPassword" options:nil];
|
||||
[self.togglePassword bind:NSValueBinding toObject:self withKeyPath:@"showPassword" options:nil];
|
||||
@@ -117,29 +163,40 @@ enum {
|
||||
}
|
||||
|
||||
- (void)setupNotifications:(MPDocumentWindowController *)windowController {
|
||||
/* Register for Entry selection */
|
||||
MPDocument *document = [windowController document];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(_didChangeCurrentItem:)
|
||||
name:MPCurrentItemChangedNotification
|
||||
object:windowController];
|
||||
object:document];
|
||||
}
|
||||
|
||||
- (void)setModificationDate:(NSDate *)modificationDate {
|
||||
NSString *modificationString = [NSDateFormatter localizedStringFromDate:modificationDate
|
||||
dateStyle:NSDateFormatterShortStyle
|
||||
timeStyle:NSDateFormatterShortStyle];
|
||||
NSString *modifedAtTemplate = NSLocalizedString(@"MODIFED_AT_%@", @"Modifed at template string. %@ is replaced by locaized date and time");
|
||||
[self.modifiedTextField setStringValue:[NSString stringWithFormat:modifedAtTemplate, modificationString]];
|
||||
|
||||
_modificationDate = modificationDate;
|
||||
[self _updateDateStrings];
|
||||
}
|
||||
|
||||
- (void)setCreationDate:(NSDate *)creationDate {
|
||||
NSString *creationString = [NSDateFormatter localizedStringFromDate:creationDate
|
||||
dateStyle:NSDateFormatterShortStyle
|
||||
timeStyle:NSDateFormatterShortStyle];
|
||||
_creationDate = creationDate;
|
||||
[self _updateDateStrings];
|
||||
}
|
||||
|
||||
- (void)_updateDateStrings {
|
||||
|
||||
if(!self.creationDate || !self.modificationDate ) {
|
||||
[self.modifiedTextField setStringValue:@""];
|
||||
[self.createdTextField setStringValue:@""];
|
||||
return; // No dates, just clear
|
||||
}
|
||||
|
||||
NSString *creationString = [self.creationDate humanized];
|
||||
NSString *modificationString = [self.modificationDate humanized];
|
||||
|
||||
NSString *modifedAtTemplate = NSLocalizedString(@"MODIFED_AT_%@", @"Modifed at template string. %@ is replaced by locaized date and time");
|
||||
NSString *createdAtTemplate = NSLocalizedString(@"CREATED_AT_%@", @"Created at template string. %@ is replaced by locaized date and time");
|
||||
|
||||
[self.modifiedTextField setStringValue:[NSString stringWithFormat:modifedAtTemplate, modificationString]];
|
||||
[self.createdTextField setStringValue:[NSString stringWithFormat:createdAtTemplate, creationString]];
|
||||
|
||||
}
|
||||
|
||||
- (void)_updateContent {
|
||||
@@ -159,26 +216,26 @@ enum {
|
||||
- (void)_updateAttachments {
|
||||
if(self.selectedEntry) {
|
||||
if([self.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||
[self.attachmentsController bind:NSContentArrayBinding toObject:self.selectedEntry withKeyPath:@"binaries" options:nil];
|
||||
[_attachmentsController bind:NSContentArrayBinding toObject:self.selectedEntry withKeyPath:@"binaries" options:nil];
|
||||
}
|
||||
else {
|
||||
/* Use binary from Kdb3Entry */
|
||||
[_attachmentsController bind:NSContentArrayBinding toObject:self.selectedEntry withKeyPath:@"binaries" options:nil];
|
||||
}
|
||||
}
|
||||
else if([self.attachmentsController content] != nil){
|
||||
[self.attachmentsController unbind:NSContentArrayBinding];
|
||||
[self.attachmentsController setContent:nil];
|
||||
else if([_attachmentsController content] != nil){
|
||||
[_attachmentsController unbind:NSContentArrayBinding];
|
||||
[_attachmentsController setContent:nil];
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
- (void)_updateCustomFields {
|
||||
if(self.selectedEntry && [self.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||
[self.customFieldsController bind:NSContentArrayBinding toObject:self.selectedEntry withKeyPath:@"stringFields" options:nil];
|
||||
[_customFieldsController bind:NSContentArrayBinding toObject:self.selectedEntry withKeyPath:@"stringFields" options:nil];
|
||||
}
|
||||
else if([self.customFieldsController content] != nil){
|
||||
[self.customFieldsController unbind:NSContentArrayBinding];
|
||||
[self.customFieldsController setContent:nil];
|
||||
else if([_customFieldsController content] != nil){
|
||||
[_customFieldsController unbind:NSContentArrayBinding];
|
||||
[_customFieldsController setContent:nil];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -267,7 +324,6 @@ enum {
|
||||
[self.URLTextField setEnabled:enabled];
|
||||
[self.generatePasswordButton setEnabled:enabled];
|
||||
|
||||
[self.infoTabControl setEnabled:enabled forSegment:MPNotesTab];
|
||||
[self.infoTabControl setEnabled:enabled forSegment:MPAttachmentsTab];
|
||||
|
||||
enabled &= [self.selectedEntry isKindOfClass:[Kdb4Entry class]];
|
||||
@@ -323,22 +379,30 @@ enum {
|
||||
MPDocument *document = [[self windowController] document];
|
||||
NSUInteger index = [sender tag];
|
||||
Kdb4Entry *entry = (Kdb4Entry *)self.selectedEntry;
|
||||
[document entry:entry removeStringField:(entry.stringFields)[index]];
|
||||
[document removeStringField:(entry.stringFields)[index] formEntry:entry];
|
||||
}
|
||||
|
||||
- (IBAction)saveAttachment:(id)sender {
|
||||
Kdb4Entry *entry = (Kdb4Entry *)self.selectedEntry;
|
||||
BinaryRef *reference = entry.binaries[[sender tag]];
|
||||
|
||||
BOOL isVersion4 = [self.selectedEntry isKindOfClass:[Kdb4Entry class]];
|
||||
id item = self.selectedEntry;
|
||||
NSString *fileName = nil;
|
||||
if(isVersion4) {
|
||||
Kdb4Entry *entry= (Kdb4Entry *)self.selectedEntry;
|
||||
item = entry.binaries[[sender tag]];
|
||||
fileName = ((BinaryRef *)item).key;
|
||||
}
|
||||
else {
|
||||
fileName = ((Kdb3Entry *)item).binaryDesc;
|
||||
}
|
||||
|
||||
NSSavePanel *savePanel = [NSSavePanel savePanel];
|
||||
[savePanel setCanCreateDirectories:YES];
|
||||
[savePanel setNameFieldStringValue:reference.key];
|
||||
[savePanel setNameFieldStringValue:fileName];
|
||||
|
||||
[savePanel beginSheetModalForWindow:[[self windowController] window] completionHandler:^(NSInteger result) {
|
||||
if(result == NSFileHandlingPanelOKButton) {
|
||||
MPDocument *document = [[self windowController] document];
|
||||
[document saveAttachment:reference toLocation:[savePanel URL]];
|
||||
[document saveAttachmentForItem:item toLocation:[savePanel URL]];
|
||||
}
|
||||
}];
|
||||
}
|
||||
@@ -361,106 +425,56 @@ enum {
|
||||
- (IBAction)removeAttachment:(id)sender {
|
||||
MPDocument *document = [[self windowController] document];
|
||||
if(document.version == MPDatabaseVersion3) {
|
||||
// Uhhhh :D
|
||||
[document removeAttachmentFromEntry:self.selectedEntry];
|
||||
}
|
||||
if(document.version == MPDatabaseVersion4) {
|
||||
else if(document.version == MPDatabaseVersion4) {
|
||||
Kdb4Entry *entry = (Kdb4Entry *)self.selectedEntry;
|
||||
BinaryRef *reference = entry.binaries[[sender tag]];
|
||||
[document removeAttachment:reference fromEntry:self.selectedEntry];
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)edit:(id)sender {
|
||||
[self.titleTextField setEditable:YES];
|
||||
[self.usernameTextField setEditable:YES];
|
||||
[[[[self windowController] document] undoManager] beginUndoGrouping];
|
||||
}
|
||||
|
||||
- (IBAction)finishEdit:(id)sender {
|
||||
NSUndoManager *undoManger = [[[self windowController] document] undoManager];
|
||||
if([undoManger canUndo]) {
|
||||
[undoManger setActionName:@"Edit"];
|
||||
}
|
||||
[undoManger endUndoGrouping];
|
||||
[self.titleTextField setEditable:NO];
|
||||
[self.titleTextField setSelectable:YES];
|
||||
[self.usernameTextField setEditable:NO];
|
||||
[self.usernameTextField setSelectable:YES];
|
||||
|
||||
}
|
||||
|
||||
#pragma mark Notificiations
|
||||
- (void)_didChangeCurrentItem:(NSNotification *)notification {
|
||||
MPDocumentWindowController *sender = [notification object];
|
||||
id item = sender.currentItem;
|
||||
if(!item) {
|
||||
/**
|
||||
Remove double handling.
|
||||
Just call for documents properties when neede
|
||||
*/
|
||||
MPDocument *document = [[self windowController] document];
|
||||
if(!document.selectedItem) {
|
||||
self.selectedGroup = nil;
|
||||
self.selectedEntry = nil;
|
||||
}
|
||||
if([item isKindOfClass:[KdbGroup class]]) {
|
||||
BOOL isGroup = document.selectedItem == document.selectedGroup;
|
||||
BOOL isEntry = document.selectedItem == document.selectedEntry;
|
||||
if(isGroup) {
|
||||
self.selectedEntry = nil;
|
||||
self.selectedGroup = sender.currentItem;
|
||||
self.selectedGroup = document.selectedItem;
|
||||
}
|
||||
else if([item isKindOfClass:[KdbEntry class]]) {
|
||||
else if(isEntry) {
|
||||
self.selectedGroup = nil;
|
||||
self.selectedEntry = sender.currentItem;
|
||||
self.selectedEntry = document.selectedItem;
|
||||
}
|
||||
[self _updateContent];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark NSTableViewDelegate
|
||||
/* TODO: Divide this into single delegates */
|
||||
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
|
||||
if(tableView == self.attachmentTableView) {
|
||||
return [self _viewForAttachmentTableColumn:tableColumn row:row];
|
||||
}
|
||||
return [self _viewForCustomFieldTableColumn:tableColumn row:row];
|
||||
}
|
||||
|
||||
- (void)tableViewSelectionDidChange:(NSNotification *)notification {
|
||||
if([notification object] == self.attachmentTableView) {
|
||||
NSIndexSet *allColumns = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [[self.attachmentTableView tableColumns] count])];
|
||||
Kdb4Entry *entryv4 = (Kdb4Entry *)self.selectedEntry;
|
||||
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [entryv4.binaries count] )];
|
||||
[self.attachmentTableView reloadDataForRowIndexes:indexSet columnIndexes:allColumns];
|
||||
}
|
||||
}
|
||||
|
||||
- (NSView *)_viewForAttachmentTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
|
||||
/* Decide what view to use */
|
||||
NSIndexSet *selectedIndexes = [self.attachmentTableView selectedRowIndexes];
|
||||
NSTableCellView *view;
|
||||
if([selectedIndexes containsIndex:row]) {
|
||||
MPSelectedAttachmentTableCellView *cellView = [_attachmentTableView makeViewWithIdentifier:@"SelectedCell" owner:_attachmentTableView];
|
||||
[cellView.saveButton setTag:row];
|
||||
[cellView.saveButton setAction:@selector(saveAttachment:)];
|
||||
[cellView.saveButton setTarget:self];
|
||||
[cellView.removeButton setTag:row];
|
||||
[cellView.removeButton setAction:@selector(removeAttachment:)];
|
||||
[cellView.removeButton setTarget:self];
|
||||
view = cellView;
|
||||
}
|
||||
else {
|
||||
view = [_attachmentTableView makeViewWithIdentifier:@"NormalCell" owner:_attachmentTableView];
|
||||
}
|
||||
/* Bind view */
|
||||
if([self.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||
Kdb4Entry *entry = (Kdb4Entry *)self.selectedEntry;
|
||||
BinaryRef *binaryRef = entry.binaries[row];
|
||||
[[view textField] bind:NSValueBinding toObject:binaryRef withKeyPath:@"key" options:nil];
|
||||
[[view imageView] setImage:[[NSWorkspace sharedWorkspace] iconForFileType:[binaryRef.key pathExtension]]];
|
||||
}
|
||||
return view;
|
||||
}
|
||||
- (NSView *)_viewForCustomFieldTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
|
||||
MPCustomFieldTableCellView *view = [_customFieldsTableView makeViewWithIdentifier:[tableColumn identifier] owner:_customFieldsTableView];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_customFieldFrameChanged:) name:NSViewFrameDidChangeNotification object:view];
|
||||
if([self.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||
Kdb4Entry *entry = (Kdb4Entry *)self.selectedEntry;
|
||||
StringField *stringField = entry.stringFields[row];
|
||||
[view.labelTextField bind:NSValueBinding toObject:stringField withKeyPath:MPStringFieldKeyUndoableKey options:nil];
|
||||
[view.valueTextField bind:NSValueBinding toObject:stringField withKeyPath:MPStringFieldValueUndoableKey options:nil];
|
||||
[view.removeButton setTarget:self];
|
||||
[view.removeButton setAction:@selector(removeCustomField:)];
|
||||
[view.removeButton setTag:row];
|
||||
}
|
||||
return view;
|
||||
}
|
||||
|
||||
- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row {
|
||||
HNHTableRowView *view = nil;
|
||||
if(tableView == self.attachmentTableView) {
|
||||
view = [[HNHTableRowView alloc] init];
|
||||
view.selectionCornerRadius = 7;
|
||||
}
|
||||
return view;
|
||||
}
|
||||
|
||||
- (void)_customFieldFrameChanged:(NSNotification *)notification {
|
||||
// NSView *sender = [notification object];
|
||||
// NSLog(@"didChangeFrameFor: %@ to: %@", sender, NSStringFromRect([sender frame]));
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
17
MacPass/MPNotifications.h
Normal file
@@ -0,0 +1,17 @@
|
||||
//
|
||||
// MPNotifications.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 23.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#ifndef MacPass_MPNotifications_h
|
||||
#define MacPass_MPNotifications_h
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
FOUNDATION_EXPORT NSString *const MPDidBecomeFirstResonderNotification;
|
||||
FOUNDATION_EXPORT NSString *const MPCurrentItemChangedNotification;
|
||||
|
||||
#endif
|
||||
12
MacPass/MPNotifications.m
Normal file
@@ -0,0 +1,12 @@
|
||||
//
|
||||
// MPNotifications.m
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 23.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MPNotifications.h"
|
||||
|
||||
NSString *const MPDidBecomeFirstResonderNotification = @"com.hicknhack.macpass.MPDidBecomeFirstResonderNotification";
|
||||
NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCurrentItemChangedNotification";
|
||||
@@ -13,6 +13,7 @@
|
||||
|
||||
#import "KdbLib.h"
|
||||
#import "KdbGroup+Undo.h"
|
||||
#import "KdbEntry+Undo.h"
|
||||
#import "KdbGroup+MPTreeTools.h"
|
||||
#import "KdbEntry+MPTreeTools.h"
|
||||
|
||||
@@ -76,10 +77,9 @@
|
||||
accepted &= index != NSOutlineViewDropOnItemIndex;
|
||||
accepted &= index != [_draggedItem.parent.groups indexOfObject:_draggedItem];
|
||||
}
|
||||
MPDocument *document = [[[outlineView window] windowController] document];
|
||||
accepted = [document group:_draggedItem isMoveableToGroup:target];
|
||||
accepted = ![_draggedItem isAnchestorOfGroup:target];
|
||||
if( accepted ) {
|
||||
[document moveGroup:_draggedItem toGroup:target index:index];
|
||||
[_draggedItem moveToGroupUndoable:target atIndex:index];
|
||||
}
|
||||
info.animatesToDestination = !accepted;
|
||||
return accepted;
|
||||
@@ -94,7 +94,7 @@
|
||||
KdbEntry *draggedEntry = [rootGroup entryForUUID:uuid];
|
||||
if(draggedEntry) {
|
||||
if(draggedEntry.parent != target && index == NSOutlineViewDropOnItemIndex) {
|
||||
[document moveEntry:draggedEntry toGroup:target index:index];
|
||||
[draggedEntry moveToGroupUndoable:target atIndex:index];
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
|
||||
13
MacPass/MPOutlineView.h
Normal file
@@ -0,0 +1,13 @@
|
||||
//
|
||||
// MPOutlineView.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 23.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@interface MPOutlineView : NSOutlineView
|
||||
|
||||
@end
|
||||
21
MacPass/MPOutlineView.m
Normal file
@@ -0,0 +1,21 @@
|
||||
//
|
||||
// MPOutlineView.m
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 23.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MPOutlineView.h"
|
||||
#import "MPNotifications.h"
|
||||
|
||||
@implementation MPOutlineView
|
||||
|
||||
- (BOOL)becomeFirstResponder {
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPDidBecomeFirstResonderNotification
|
||||
object:self
|
||||
userInfo:nil];
|
||||
return YES;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -17,9 +17,8 @@ APPKIT_EXTERN NSString *const MPOutlineViewDidChangeGroupSelection;
|
||||
|
||||
@interface MPOutlineViewController : MPViewController <NSOutlineViewDelegate>
|
||||
|
||||
@property (readonly, weak) NSOutlineView *outlineView;
|
||||
|
||||
@property (weak) IBOutlet HNHGradientView *bottomBar;
|
||||
@property (weak, readonly) KdbGroup *selectedGroup;
|
||||
|
||||
- (void)clearSelection;
|
||||
- (void)showOutline;
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#import "MPIconHelper.h"
|
||||
#import "MPUppercaseStringValueTransformer.h"
|
||||
#import "MPRootAdapter.h"
|
||||
#import "MPNotifications.h"
|
||||
|
||||
#import "KdbLib.h"
|
||||
#import "Kdb4Node.h"
|
||||
@@ -33,12 +34,13 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
|
||||
}
|
||||
@property (weak) IBOutlet NSOutlineView *outlineView;
|
||||
@property (weak) IBOutlet NSButton *addGroupButton;
|
||||
@property (weak) KdbGroup *selectedGroup;
|
||||
|
||||
@property (strong) NSTreeController *treeController;
|
||||
@property (strong) MPOutlineDataSource *datasource;
|
||||
@property (strong) NSMenu *menu;
|
||||
|
||||
@property (copy, nonatomic) NSString *databaseNameWrapper;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MPOutlineViewController
|
||||
@@ -53,6 +55,7 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
|
||||
_treeController = [[NSTreeController alloc] init];
|
||||
_bindingEstablished = NO;
|
||||
_datasource = [[MPOutlineDataSource alloc] init];
|
||||
_databaseNameWrapper = NSLocalizedString(@"NEW_DATABASE", "Name for a newly created Database");
|
||||
}
|
||||
|
||||
return self;
|
||||
@@ -64,10 +67,15 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
|
||||
[_outlineView setMenu:[self _contextMenu]];
|
||||
[_outlineView setAllowsEmptySelection:YES];
|
||||
[_outlineView setFloatsGroupRows:NO];
|
||||
[_outlineView registerForDraggedTypes:@[ MPPasteBoardType ]];
|
||||
//[_outlineView registerForDraggedTypes:@[ MPPasteBoardType ]];
|
||||
[_outlineView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:YES];
|
||||
[_bottomBar setBorderType:HNHBorderTop];
|
||||
[_addGroupButton setAction:[MPActionHelper actionOfType:MPActionAddGroup]];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(_didBecomeFirstResponder:)
|
||||
name:MPDidBecomeFirstResonderNotification
|
||||
object:_outlineView];
|
||||
}
|
||||
|
||||
- (void)showOutline {
|
||||
@@ -76,6 +84,9 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
|
||||
[_treeController setChildrenKeyPath:@"groups"];
|
||||
[_treeController bind:NSContentBinding toObject:document withKeyPath:@"rootAdapter" options:nil];
|
||||
[_outlineView bind:NSContentBinding toObject:_treeController withKeyPath:@"arrangedObjects" options:nil];
|
||||
if([document.tree respondsToSelector:@selector(databaseName)]) {
|
||||
[self bind:@"databaseNameWrapper" toObject:document.tree withKeyPath:@"databaseName" options:nil];
|
||||
}
|
||||
[_outlineView setDataSource:self.datasource];
|
||||
_bindingEstablished = YES;
|
||||
}
|
||||
@@ -83,7 +94,19 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
|
||||
[_outlineView expandItem:node expandChildren:YES];
|
||||
}
|
||||
|
||||
#pragma makr Notifications
|
||||
#pragma mark Custom Setter/Getter
|
||||
- (void)setDatabaseNameWrapper:(NSString *)databaseNameWrapper {
|
||||
if(![_databaseNameWrapper isEqualToString:databaseNameWrapper]) {
|
||||
if([databaseNameWrapper length] == 0) {
|
||||
_databaseNameWrapper = NSLocalizedString(@"DATABASE", "Default name database");
|
||||
}
|
||||
else {
|
||||
_databaseNameWrapper= [databaseNameWrapper copy];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark Notifications
|
||||
- (void)setupNotifications:(MPDocumentWindowController *)windowController {
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_didCreateGroup:) name:MPDocumentDidAddGroupNotification object:[windowController document]];
|
||||
}
|
||||
@@ -99,7 +122,6 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
|
||||
if( selectedRow == -1) {
|
||||
MPDocument *document = [[self windowController] document];
|
||||
indexSet = [NSIndexSet indexSetWithIndex:[document.root.groups count]];
|
||||
//TODO: Find out why selection is not set (treeUpdate?)
|
||||
}
|
||||
else {
|
||||
id item = [_outlineView itemAtRow:selectedRow];
|
||||
@@ -108,6 +130,37 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
|
||||
}
|
||||
}
|
||||
|
||||
- (void)_didBecomeFirstResponder:(NSNotification *)notification {
|
||||
if( [notification object] != _outlineView ) {
|
||||
return; // Nothing we need to worry about
|
||||
}
|
||||
MPDocument *document = [[self windowController] document];
|
||||
document.selectedItem = document.selectedGroup;
|
||||
}
|
||||
|
||||
#pragma mark Validation
|
||||
|
||||
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
|
||||
MPActionType actionType = [MPActionHelper typeForAction:[menuItem action]];
|
||||
switch(actionType) {
|
||||
case MPActionAddEntry:
|
||||
case MPActionAddGroup:
|
||||
case MPActionDelete: {
|
||||
MPDocument *document = [[self windowController] document];
|
||||
id selected = [self _clickedOrSelectedGroup];
|
||||
if(!selected) {
|
||||
return NO;
|
||||
}
|
||||
if(selected == document.trash) {
|
||||
return NO;
|
||||
}
|
||||
return ![document isItemTrashed:selected];
|
||||
}
|
||||
default:
|
||||
return YES; // We are only validated for three targets
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Actions
|
||||
|
||||
@@ -121,18 +174,12 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
|
||||
}
|
||||
|
||||
- (void)createEntry:(id)sender {
|
||||
KdbGroup *group = [self _clickedOrSelectedGroup];
|
||||
if(group) {
|
||||
MPDocument *document = [[self windowController] document];
|
||||
[document createEntry:group];
|
||||
}
|
||||
MPDocument *document = [[self windowController] document];
|
||||
[document createEntry:[self _clickedOrSelectedGroup]];
|
||||
}
|
||||
|
||||
- (void)deleteNode:(id)sender {
|
||||
KdbGroup *group = [self _clickedOrSelectedGroup];
|
||||
if(group && group.parent) {
|
||||
[[[self windowController] document] group:group.parent removeGroup:group];
|
||||
}
|
||||
[[[self windowController] document] deleteGroup:[self _clickedOrSelectedGroup]];
|
||||
}
|
||||
|
||||
#pragma mark NSOutlineViewDelegate
|
||||
@@ -141,13 +188,7 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
|
||||
if( [self _itemIsRootNodeAdapter:item] ) {
|
||||
//NSDictionary *options = @{ NSValueTransformerBindingOption : [NSValueTransformer valueTransformerForName:MPUppsercaseStringValueTransformerName] };
|
||||
view = [outlineView makeViewWithIdentifier:_MPOutlinveViewHeaderViewIdentifier owner:self];
|
||||
MPRootAdapter *rootNode = [item representedObject];
|
||||
if([rootNode.tree respondsToSelector:@selector(databaseName)]) {
|
||||
[view.textField bind:NSValueBinding toObject:rootNode.tree withKeyPath:@"databaseName" options:nil];
|
||||
}
|
||||
else {
|
||||
[view.textField setStringValue:NSLocalizedString(@"GROUPS", @"")];
|
||||
}
|
||||
[view.textField bind:NSValueBinding toObject:self withKeyPath:@"databaseNameWrapper" options:nil];
|
||||
}
|
||||
else {
|
||||
KdbGroup *group = [item representedObject];
|
||||
@@ -172,8 +213,8 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
|
||||
- (void)outlineViewSelectionDidChange:(NSNotification *)notification {
|
||||
NSTreeNode *treeNode = [_outlineView itemAtRow:[_outlineView selectedRow]];
|
||||
KdbGroup *selectedGroup = [treeNode representedObject];
|
||||
self.selectedGroup = selectedGroup;
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPOutlineViewDidChangeGroupSelection object:self userInfo:nil];
|
||||
MPDocument *document = [[self windowController] document];
|
||||
document.selectedGroup = selectedGroup;
|
||||
}
|
||||
|
||||
- (BOOL)outlineView:(NSOutlineView *)outlineView shouldShowOutlineCellForItem:(id)item {
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
MPDocument *document = [windowController document];
|
||||
if(document) {
|
||||
BOOL isOk = NO;
|
||||
if(document.isDecrypted) {
|
||||
if(document.decrypted) {
|
||||
// TODO: Fix unlocking to actually test
|
||||
BOOL noPassword = !document.password && [[self.passwordTextField stringValue] length] == 0;
|
||||
BOOL passwordOk = [document.password isEqualToString:[self.passwordTextField stringValue]];
|
||||
@@ -69,7 +69,7 @@
|
||||
isOk = (noPassword || passwordOk) && (noKey || keyOk);
|
||||
}
|
||||
else {
|
||||
isOk = [document decryptWithPassword:[self.passwordTextField stringValue] keyFileURL:[self.keyPathControl URL]];
|
||||
isOk = [document unlockWithPassword:[self.passwordTextField stringValue] keyFileURL:[self.keyPathControl URL]];
|
||||
}
|
||||
if(!isOk) {
|
||||
[self _showError];
|
||||
|
||||
@@ -21,7 +21,12 @@
|
||||
- (void)setTree:(KdbTree *)tree {
|
||||
if(_tree != tree) {
|
||||
_tree = tree;
|
||||
self.groups = @[_tree.root];
|
||||
if(_tree) {
|
||||
self.groups = @[_tree.root];
|
||||
}
|
||||
else {
|
||||
self.groups = nil;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ APPKIT_EXTERN NSString *const kMPSettingsKeyClearPasteboardOnQuit;
|
||||
/* Behaviour */
|
||||
APPKIT_EXTERN NSString *const kMPSettingsKeyPasswordEncoding;
|
||||
APPKIT_EXTERN NSString *const kMPSettingsKeyOpenEmptyDatabaseOnLaunch;
|
||||
APPKIT_EXTERN NSString *const kMPSettingsKeyReopenLastDatabaseOnLaunch;
|
||||
|
||||
/* Server Settings */
|
||||
APPKIT_EXTERN NSString *const kMPSettingsKeyHttpPort;
|
||||
@@ -25,6 +26,22 @@ APPKIT_EXTERN NSString *const kMPSettingsKeyShowMenuItem;
|
||||
APPKIT_EXTERN NSString *const kMPSettingsKeyLockOnSleep;
|
||||
APPKIT_EXTERN NSString *const kMPSettingsKeyIdleLockTimeOut;
|
||||
|
||||
/* Autosaving states */
|
||||
APPKIT_EXTERN NSString *const kMPSettingsKeyShowInspector;
|
||||
|
||||
/* Kdb Hide/Show settings */
|
||||
APPKIT_EXTERN NSString *const kMPSettingsKeyLegacyHideTitle;
|
||||
APPKIT_EXTERN NSString *const kMPSettingsKeyLegacyHideUsername;
|
||||
APPKIT_EXTERN NSString *const kMPSettingsKeyLegacyHidePassword;
|
||||
APPKIT_EXTERN NSString *const kMPSettingsKeyLegacyHideNotes;
|
||||
APPKIT_EXTERN NSString *const kMPSettingsKeyLegacyHideURL;
|
||||
|
||||
/* Document/Key Location store */
|
||||
APPKIT_EXTERN NSString *const kMPSettingsKeyLastDatabasePath;
|
||||
/*
|
||||
APPKIT_EXTERN NSString *const kMPSettingsKeyLastKeyURL;
|
||||
APPKIT_EXTERN NSString *const kMPSettingsKeyRememberLastKey;
|
||||
*/
|
||||
|
||||
typedef NS_ENUM(NSUInteger, MPPasswordEncoding) {
|
||||
MPPasswordEncodingUTF8,
|
||||
|
||||
@@ -11,11 +11,21 @@
|
||||
NSString *const kMPSettingsKeyPasteboardClearTimeout = @"ClipboardClearTimeout";
|
||||
NSString *const kMPSettingsKeyClearPasteboardOnQuit = @"ClearClipboardOnQuit";
|
||||
NSString *const kMPSettingsKeyOpenEmptyDatabaseOnLaunch = @"OpenEmptyDatabaseOnLaunch";
|
||||
NSString *const kMPSettingsKeyReopenLastDatabaseOnLaunch = @"ReopenLastDatabaseOnLaunch";
|
||||
NSString *const kMPSettingsKeyHttpPort =@"HttpPort";
|
||||
NSString *const kMPSettingsKeyEnableHttpServer = @"EnableHttpServer";
|
||||
NSString *const kMPSettingsKeyShowMenuItem = @"ShowMenuItem";
|
||||
NSString *const kMPSettingsKeyLockOnSleep = @"LockOnSleep";
|
||||
NSString *const kMPSettingsKeyIdleLockTimeOut = @"IdleLockTimeOut";
|
||||
NSString *const kMPSettingsKeyShowInspector = @"ShowInspector";
|
||||
|
||||
NSString *const kMPSettingsKeyLegacyHideTitle = @"LegacyHideTitle";
|
||||
NSString *const kMPSettingsKeyLegacyHideUsername = @"LegacyHideUsername ";
|
||||
NSString *const kMPSettingsKeyLegacyHidePassword = @"LegacyHidePassword";
|
||||
NSString *const kMPSettingsKeyLegacyHideNotes = @"LegacyHideNotes";
|
||||
NSString *const kMPSettingsKeyLegacyHideURL = @"LegacyHideURL";
|
||||
|
||||
NSString *const kMPSettingsKeyLastDatabasePath = @"MPLastDatabasePath";
|
||||
|
||||
@implementation MPSettingsHelper
|
||||
|
||||
@@ -25,14 +35,21 @@ NSString *const kMPSettingsKeyIdleLockTimeOut = @"IdleLockTimeOut";
|
||||
|
||||
+ (NSDictionary *)_standardDefaults {
|
||||
return @{
|
||||
kMPSettingsKeyShowInspector: @YES, // Show the Inspector by default
|
||||
kMPSettingsKeyPasteboardClearTimeout: @30, // 30 seconds
|
||||
kMPSettingsKeyClearPasteboardOnQuit: @YES,
|
||||
kMPSettingsKeyOpenEmptyDatabaseOnLaunch: @YES,
|
||||
kMPSettingsKeyOpenEmptyDatabaseOnLaunch: @NO,
|
||||
kMPSettingsKeyReopenLastDatabaseOnLaunch: @YES,
|
||||
kMPSettingsKeyHttpPort: @19455,
|
||||
kMPSettingsKeyEnableHttpServer: @NO,
|
||||
kMPSettingsKeyShowMenuItem: @YES,
|
||||
kMPSettingsKeyLockOnSleep: @YES,
|
||||
kMPSettingsKeyIdleLockTimeOut: @0 // 5 minutes
|
||||
kMPSettingsKeyIdleLockTimeOut: @0, // 5 minutes
|
||||
kMPSettingsKeyLegacyHideNotes: @NO,
|
||||
kMPSettingsKeyLegacyHidePassword: @YES,
|
||||
kMPSettingsKeyLegacyHideTitle: @NO,
|
||||
kMPSettingsKeyLegacyHideURL: @NO,
|
||||
kMPSettingsKeyLegacyHideUsername: @NO
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -7,9 +7,17 @@
|
||||
//
|
||||
|
||||
#import "MPTableView.h"
|
||||
#import "MPNotifications.h"
|
||||
|
||||
@implementation MPTableView
|
||||
|
||||
- (BOOL)becomeFirstResponder {
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPDidBecomeFirstResonderNotification
|
||||
object:self
|
||||
userInfo:nil];
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)drawBackgroundInClipRect:(NSRect)clipRect {
|
||||
/*
|
||||
We need to clear the outer areas
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
NSString *const MPToolbarItemLock = @"TOOLBAR_LOCK";
|
||||
NSString *const MPToolbarItemAddGroup = @"TOOLBAR_ADD_GROUP";
|
||||
NSString *const MPToolbarItemAddEntry = @"TOOLBAR_ADD_ENTRY";
|
||||
NSString *const MPToolbarItemEdit = @"TOOLBAR_EDIT";
|
||||
NSString *const MPToolbarItemDelete =@"TOOLBAR_DELETE";
|
||||
NSString *const MPToolbarItemAction = @"TOOLBAR_ACTION";
|
||||
NSString *const MPToolbarItemInspector = @"TOOLBAR_INSPECTOR";
|
||||
@@ -135,7 +134,6 @@ NSString *const MPToolbarItemInspector = @"TOOLBAR_INSPECTOR";
|
||||
MPToolbarItemAddEntry: NSLocalizedString(@"ADD_ENTRY", @""),
|
||||
MPToolbarItemAddGroup: NSLocalizedString(@"ADD_GROUP", @""),
|
||||
MPToolbarItemDelete: NSLocalizedString(@"DELETE", @""),
|
||||
MPToolbarItemEdit: NSLocalizedString(@"EDIT", @""),
|
||||
MPToolbarItemInspector: NSLocalizedString(@"INSPECTOR", @"")
|
||||
};
|
||||
return labelDict[identifier];
|
||||
@@ -146,7 +144,6 @@ NSString *const MPToolbarItemInspector = @"TOOLBAR_INSPECTOR";
|
||||
MPToolbarItemAddEntry: @(MPActionAddEntry),
|
||||
MPToolbarItemAddGroup: @(MPActionAddGroup),
|
||||
MPToolbarItemDelete: @(MPActionDelete),
|
||||
MPToolbarItemEdit: @(MPActionEdit),
|
||||
MPToolbarItemInspector: @(MPActionToggleInspector)
|
||||
};
|
||||
MPActionType actionType = (MPActionType)[actionDict[identifier] integerValue];
|
||||
|
||||
@@ -44,11 +44,11 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>0.3.1</string>
|
||||
<string>0.3.8</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>2301</string>
|
||||
<string>2524</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
|
||||
16
MacPass/NSDate+Humanized.h
Normal file
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// NSDate+Humanized.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 10.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface NSDate (Humanized)
|
||||
|
||||
+ (NSString *)humanizedDate:(NSDate *)date;
|
||||
- (NSString *)humanized;
|
||||
|
||||
@end
|
||||
62
MacPass/NSDate+Humanized.m
Normal file
@@ -0,0 +1,62 @@
|
||||
//
|
||||
// NSDate+Humanized.m
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 10.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "NSDate+Humanized.h"
|
||||
|
||||
@implementation NSDate (Humanized)
|
||||
|
||||
+ (NSString *)humanizedDate:(NSDate *)date {
|
||||
return [date humanized];
|
||||
}
|
||||
|
||||
- (NSString *)humanized {
|
||||
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
|
||||
NSDateComponents *components = [calendar components:NSMinuteCalendarUnit|NSHourCalendarUnit|NSDayCalendarUnit|NSWeekCalendarUnit|NSMonthCalendarUnit fromDate:self toDate:[NSDate date] options:0];
|
||||
/* More than one month in the past, give full date */
|
||||
if([components month] > 1) {
|
||||
return [NSDateFormatter localizedStringFromDate:self
|
||||
dateStyle:NSDateFormatterShortStyle
|
||||
timeStyle:NSDateFormatterShortStyle];
|
||||
}
|
||||
NSUInteger weeks = [components week];
|
||||
/* More than one week, less than a month */
|
||||
if(weeks > 1) {
|
||||
NSString *weekTemplate = NSLocalizedString(@"%ld_WEEKS_AGO", "% Weeks ago");
|
||||
return [NSString stringWithFormat:weekTemplate, weeks];
|
||||
}
|
||||
/* One week or more */
|
||||
if( weeks == 1) {
|
||||
return NSLocalizedString(@"ONE_WEEK_AGO", "one week ago");
|
||||
}
|
||||
/* Last week */
|
||||
NSUInteger days = [components day];
|
||||
if(days > 3) {
|
||||
return NSLocalizedString(@"LAST_WEEK", "last week");
|
||||
}
|
||||
/* 1-3 days */
|
||||
if(days > 1 ) {
|
||||
NSString *daysTemplate = NSLocalizedString(@"%ld_DAYS_AGO", "% days ago");
|
||||
return [NSString stringWithFormat:daysTemplate, days];
|
||||
}
|
||||
/* Yesterday */
|
||||
if(days == 1) {
|
||||
return NSLocalizedString(@"YESTERDAY", "Yesterday");
|
||||
}
|
||||
/* Hours ago */
|
||||
if([components hour] > 1) {
|
||||
NSString *hourTemplate = NSLocalizedString(@"%ld_HOURS_AGO", "% Hours ago");
|
||||
return [NSString stringWithFormat:hourTemplate, [components hour]];
|
||||
}
|
||||
NSInteger minutes = [components minute];
|
||||
if(minutes > 1) {
|
||||
NSString *minuteTemplate = NSLocalizedString(@"%ld_MINUTES_AGO", "% Minutes ago");
|
||||
return [NSString stringWithFormat:minuteTemplate, minutes];
|
||||
}
|
||||
return NSLocalizedString(@"JUST_NOW", "Just now");
|
||||
}
|
||||
@end
|
||||
@@ -1,23 +0,0 @@
|
||||
//
|
||||
// NSString+MPPasswordAnalysis.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 29.03.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
typedef NS_ENUM(NSUInteger, MPPasswordStrength) {
|
||||
MPPasswordWeak,
|
||||
MPPasswordOK,
|
||||
MPPasswordGood,
|
||||
MPPasswordStrong,
|
||||
MPPasswordExcelent,
|
||||
};
|
||||
|
||||
@interface NSString (MPPasswordAnalysis)
|
||||
|
||||
- (MPPasswordStrength)passwordStrenght;
|
||||
|
||||
@end
|
||||
17
MacPass/NSString+PasswordStrength.h
Normal file
@@ -0,0 +1,17 @@
|
||||
//
|
||||
// NSString+MPPasswordAnalysis.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 29.03.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
|
||||
@interface NSString (PasswordStrenght)
|
||||
|
||||
- (NSUInteger)passwordStrenght;
|
||||
|
||||
|
||||
@end
|
||||
@@ -6,12 +6,12 @@
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "NSString+MPPasswordAnalysis.h"
|
||||
#import "NSString+PasswordStrength.h"
|
||||
|
||||
@implementation NSString (MPPasswordAnalysis)
|
||||
@implementation NSString (PasswordStrenght)
|
||||
|
||||
- (MPPasswordStrength)passwordStrenght {
|
||||
return MPPasswordOK;
|
||||
- (NSUInteger)passwordStrenght {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1054,6 +1054,7 @@
|
||||
<string key="196.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<boolean value="NO" key="227.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
||||
<string key="227.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="228.CustomClassName">MPOutlineView</string>
|
||||
<string key="228.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<boolean value="YES" key="228.ibExternalAutomaticallyCalculatesRowSizeFromViewHeight"/>
|
||||
<string key="229.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
@@ -1163,6 +1164,14 @@
|
||||
<string key="minorKey">./Classes/HNHGradientView.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">MPOutlineView</string>
|
||||
<string key="superclassName">NSOutlineView</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">./Classes/MPOutlineView.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">MPOutlineViewController</string>
|
||||
<string key="superclassName">MPViewController</string>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
|
||||
<data>
|
||||
<int key="IBDocument.SystemTarget">1070</int>
|
||||
<int key="IBDocument.SystemTarget">1080</int>
|
||||
<string key="IBDocument.SystemVersion">12E55</string>
|
||||
<string key="IBDocument.InterfaceBuilderVersion">3084</string>
|
||||
<string key="IBDocument.AppKitVersion">1187.39</string>
|
||||
@@ -381,8 +381,8 @@
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSTextFieldCell" key="NSCell" id="608946496">
|
||||
<int key="NSCellFlags">-1804599231</int>
|
||||
<int key="NSCellFlags2">272630784</int>
|
||||
<int key="NSCellFlags">-2075131840</int>
|
||||
<int key="NSCellFlags2">-1874852864</int>
|
||||
<string key="NSContents"/>
|
||||
<reference key="NSSupport" ref="510117885"/>
|
||||
<string key="NSCellIdentifier">_NS:9</string>
|
||||
@@ -1189,6 +1189,7 @@
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">183</int>
|
||||
<reference key="object" ref="608946496"/>
|
||||
<array class="NSMutableArray" key="children"/>
|
||||
<reference key="parent" ref="240019321"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
@@ -1987,7 +1988,7 @@
|
||||
<nil key="activeLocalization"/>
|
||||
<dictionary class="NSMutableDictionary" key="localizations"/>
|
||||
<nil key="sourceID"/>
|
||||
<int key="maxID">623</int>
|
||||
<int key="maxID">626</int>
|
||||
</object>
|
||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
@@ -2003,11 +2004,16 @@
|
||||
<string key="className">MPPasswordCreatorViewController</string>
|
||||
<string key="superclassName">MPViewController</string>
|
||||
<dictionary class="NSMutableDictionary" key="actions">
|
||||
<string key="_cancel:">id</string>
|
||||
<string key="_generatePassword:">id</string>
|
||||
<string key="_toggleCharacters:">id</string>
|
||||
<string key="_usePassword:">id</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="actionInfosByName">
|
||||
<object class="IBActionInfo" key="_cancel:">
|
||||
<string key="name">_cancel:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
<object class="IBActionInfo" key="_generatePassword:">
|
||||
<string key="name">_generatePassword:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
@@ -2022,7 +2028,6 @@
|
||||
</object>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="outlets">
|
||||
<string key="_cancel">NSButton</string>
|
||||
<string key="addPasswordToPasteboardButton">NSButton</string>
|
||||
<string key="customButton">NSButton</string>
|
||||
<string key="customCharactersTextField">NSTextField</string>
|
||||
@@ -2035,10 +2040,6 @@
|
||||
<string key="upperCaseButton">NSButton</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
|
||||
<object class="IBToOneOutletInfo" key="_cancel">
|
||||
<string key="name">_cancel</string>
|
||||
<string key="candidateClassName">NSButton</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="addPasswordToPasteboardButton">
|
||||
<string key="name">addPasswordToPasteboardButton</string>
|
||||
<string key="candidateClassName">NSButton</string>
|
||||
@@ -2105,9 +2106,9 @@
|
||||
</object>
|
||||
<int key="IBDocument.localizationMode">0</int>
|
||||
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
|
||||
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
|
||||
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
|
||||
<integer value="1070" key="NS.object.0"/>
|
||||
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
|
||||
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
|
||||
<real value="4600" key="NS.object.0"/>
|
||||
</object>
|
||||
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
|
||||
<int key="IBDocument.defaultPropertyAccessControl">3</int>
|
||||
|
||||
13
MacPass/StringField+Validation.h
Normal file
@@ -0,0 +1,13 @@
|
||||
//
|
||||
// StringField+Validation.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 19.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "Kdb4Node.h"
|
||||
|
||||
@interface StringField (Validation)
|
||||
|
||||
@end
|
||||
19
MacPass/StringField+Validation.m
Normal file
@@ -0,0 +1,19 @@
|
||||
//
|
||||
// StringField+Validation.m
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 19.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "StringField+Validation.h"
|
||||
#import "Kdb4Entry+MPAdditions.h"
|
||||
|
||||
@implementation StringField (Validation)
|
||||
|
||||
- (BOOL)validateValue:(inout __autoreleasing id *)ioValue forKey:(NSString *)inKey error:(out NSError *__autoreleasing *)outError {
|
||||
*ioValue = [self.entry uniqueKeyForProposal:*ioValue];
|
||||
return YES;
|
||||
}
|
||||
|
||||
@end
|
||||
377
MacPass/TrashBar.xib
Normal file
@@ -0,0 +1,377 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
|
||||
<data>
|
||||
<int key="IBDocument.SystemTarget">1080</int>
|
||||
<string key="IBDocument.SystemVersion">12E55</string>
|
||||
<string key="IBDocument.InterfaceBuilderVersion">3084</string>
|
||||
<string key="IBDocument.AppKitVersion">1187.39</string>
|
||||
<string key="IBDocument.HIToolboxVersion">626.00</string>
|
||||
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
|
||||
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="NS.object.0">3084</string>
|
||||
</object>
|
||||
<array key="IBDocument.IntegratedClassDependencies">
|
||||
<string>IBNSLayoutConstraint</string>
|
||||
<string>NSButton</string>
|
||||
<string>NSButtonCell</string>
|
||||
<string>NSCustomObject</string>
|
||||
<string>NSCustomView</string>
|
||||
</array>
|
||||
<array key="IBDocument.PluginDependencies">
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
</array>
|
||||
<object class="NSMutableDictionary" key="IBDocument.Metadata">
|
||||
<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
|
||||
<integer value="1" key="NS.object.0"/>
|
||||
</object>
|
||||
<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
|
||||
<object class="NSCustomObject" id="1001">
|
||||
<string key="NSClassName">MPEntryViewController</string>
|
||||
</object>
|
||||
<object class="NSCustomObject" id="1003">
|
||||
<string key="NSClassName">FirstResponder</string>
|
||||
</object>
|
||||
<object class="NSCustomObject" id="1004">
|
||||
<string key="NSClassName">NSApplication</string>
|
||||
</object>
|
||||
<object class="NSCustomView" id="1005">
|
||||
<reference key="NSNextResponder"/>
|
||||
<int key="NSvFlags">268</int>
|
||||
<array class="NSMutableArray" key="NSSubviews">
|
||||
<object class="NSButton" id="277872291">
|
||||
<reference key="NSNextResponder" ref="1005"/>
|
||||
<int key="NSvFlags">268</int>
|
||||
<string key="NSFrame">{{71, 5}, {87, 19}}</string>
|
||||
<reference key="NSSuperview" ref="1005"/>
|
||||
<reference key="NSWindow"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSButtonCell" key="NSCell" id="337475579">
|
||||
<int key="NSCellFlags">-2080374784</int>
|
||||
<int key="NSCellFlags2">134217728</int>
|
||||
<string key="NSContents">Empty Trash</string>
|
||||
<object class="NSFont" key="NSSupport">
|
||||
<string key="NSName">LucidaGrande</string>
|
||||
<double key="NSSize">12</double>
|
||||
<int key="NSfFlags">16</int>
|
||||
</object>
|
||||
<string key="NSCellIdentifier">_NS:9</string>
|
||||
<reference key="NSControlView" ref="277872291"/>
|
||||
<int key="NSButtonFlags">-2038153216</int>
|
||||
<int key="NSButtonFlags2">164</int>
|
||||
<string key="NSAlternateContents"/>
|
||||
<string key="NSKeyEquivalent"/>
|
||||
<int key="NSPeriodicDelay">400</int>
|
||||
<int key="NSPeriodicInterval">75</int>
|
||||
</object>
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
</object>
|
||||
</array>
|
||||
<string key="NSFrameSize">{178, 30}</string>
|
||||
<reference key="NSSuperview"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="277872291"/>
|
||||
<string key="NSClassName">HNHGradientView</string>
|
||||
</object>
|
||||
</array>
|
||||
<object class="IBObjectContainer" key="IBDocument.Objects">
|
||||
<array class="NSMutableArray" key="connectionRecords">
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBOutletConnection" key="connection">
|
||||
<string key="label">trashBar</string>
|
||||
<reference key="source" ref="1001"/>
|
||||
<reference key="destination" ref="1005"/>
|
||||
</object>
|
||||
<int key="connectionID">22</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBActionConnection" key="connection">
|
||||
<string key="label">emptyTrash:</string>
|
||||
<reference key="source" ref="1003"/>
|
||||
<reference key="destination" ref="277872291"/>
|
||||
</object>
|
||||
<int key="connectionID">23</int>
|
||||
</object>
|
||||
</array>
|
||||
<object class="IBMutableOrderedSet" key="objectRecords">
|
||||
<array key="orderedObjects">
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">0</int>
|
||||
<array key="object" id="0"/>
|
||||
<reference key="children" ref="1000"/>
|
||||
<nil key="parent"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-2</int>
|
||||
<reference key="object" ref="1001"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">File's Owner</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-1</int>
|
||||
<reference key="object" ref="1003"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">First Responder</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-3</int>
|
||||
<reference key="object" ref="1004"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">Application</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">1</int>
|
||||
<reference key="object" ref="1005"/>
|
||||
<array class="NSMutableArray" key="children">
|
||||
<object class="IBNSLayoutConstraint" id="120765898">
|
||||
<reference key="firstItem" ref="277872291"/>
|
||||
<int key="firstAttribute">5</int>
|
||||
<int key="relation">1</int>
|
||||
<reference key="secondItem" ref="1005"/>
|
||||
<int key="secondAttribute">5</int>
|
||||
<float key="multiplier">1</float>
|
||||
<object class="IBNSLayoutSymbolicConstant" key="constant">
|
||||
<double key="value">20</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="1005"/>
|
||||
<int key="scoringType">9</int>
|
||||
<float key="scoringTypeFloat">40</float>
|
||||
<int key="contentType">3</int>
|
||||
</object>
|
||||
<object class="IBNSLayoutConstraint" id="546131096">
|
||||
<reference key="firstItem" ref="1005"/>
|
||||
<int key="firstAttribute">6</int>
|
||||
<int key="relation">0</int>
|
||||
<reference key="secondItem" ref="277872291"/>
|
||||
<int key="secondAttribute">6</int>
|
||||
<float key="multiplier">1</float>
|
||||
<object class="IBNSLayoutSymbolicConstant" key="constant">
|
||||
<double key="value">20</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="1005"/>
|
||||
<int key="scoringType">9</int>
|
||||
<float key="scoringTypeFloat">40</float>
|
||||
<int key="contentType">3</int>
|
||||
</object>
|
||||
<object class="IBNSLayoutConstraint" id="879298244">
|
||||
<reference key="firstItem" ref="277872291"/>
|
||||
<int key="firstAttribute">10</int>
|
||||
<int key="relation">0</int>
|
||||
<reference key="secondItem" ref="1005"/>
|
||||
<int key="secondAttribute">10</int>
|
||||
<float key="multiplier">1</float>
|
||||
<object class="IBLayoutConstant" key="constant">
|
||||
<double key="value">0.0</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="1005"/>
|
||||
<int key="scoringType">5</int>
|
||||
<float key="scoringTypeFloat">22</float>
|
||||
<int key="contentType">2</int>
|
||||
</object>
|
||||
<reference ref="277872291"/>
|
||||
</array>
|
||||
<reference key="parent" ref="0"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">13</int>
|
||||
<reference key="object" ref="277872291"/>
|
||||
<array class="NSMutableArray" key="children">
|
||||
<reference ref="337475579"/>
|
||||
</array>
|
||||
<reference key="parent" ref="1005"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">14</int>
|
||||
<reference key="object" ref="337475579"/>
|
||||
<reference key="parent" ref="277872291"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">18</int>
|
||||
<reference key="object" ref="879298244"/>
|
||||
<reference key="parent" ref="1005"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">20</int>
|
||||
<reference key="object" ref="546131096"/>
|
||||
<reference key="parent" ref="1005"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">21</int>
|
||||
<reference key="object" ref="120765898"/>
|
||||
<reference key="parent" ref="1005"/>
|
||||
</object>
|
||||
</array>
|
||||
</object>
|
||||
<dictionary class="NSMutableDictionary" key="flattenedProperties">
|
||||
<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<array key="1.IBNSViewMetadataConstraints">
|
||||
<reference ref="879298244"/>
|
||||
<reference ref="546131096"/>
|
||||
<reference ref="120765898"/>
|
||||
</array>
|
||||
<boolean value="NO" key="1.IBNSViewMetadataLastInspectedTranslatesAutoresizingMaskIntoConstraints"/>
|
||||
<boolean value="NO" key="1.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
||||
<string key="1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<boolean value="NO" key="13.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
||||
<string key="13.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="14.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="18.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="20.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="21.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
|
||||
<nil key="activeLocalization"/>
|
||||
<dictionary class="NSMutableDictionary" key="localizations"/>
|
||||
<nil key="sourceID"/>
|
||||
<int key="maxID">23</int>
|
||||
</object>
|
||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">HNHGradientView</string>
|
||||
<string key="superclassName">NSView</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">./Classes/HNHGradientView.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">MPDocument</string>
|
||||
<string key="superclassName">NSDocument</string>
|
||||
<object class="NSMutableDictionary" key="actions">
|
||||
<string key="NS.key.0">emptyTrash:</string>
|
||||
<string key="NS.object.0">id</string>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="actionInfosByName">
|
||||
<string key="NS.key.0">emptyTrash:</string>
|
||||
<object class="IBActionInfo" key="NS.object.0">
|
||||
<string key="name">emptyTrash:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
</object>
|
||||
<dictionary class="NSMutableDictionary" key="outlets">
|
||||
<string key="warningView">NSView</string>
|
||||
<string key="warningViewImage">NSImageView</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
|
||||
<object class="IBToOneOutletInfo" key="warningView">
|
||||
<string key="name">warningView</string>
|
||||
<string key="candidateClassName">NSView</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="warningViewImage">
|
||||
<string key="name">warningViewImage</string>
|
||||
<string key="candidateClassName">NSImageView</string>
|
||||
</object>
|
||||
</dictionary>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">./Classes/MPDocument.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">MPEntryViewController</string>
|
||||
<string key="superclassName">MPViewController</string>
|
||||
<dictionary class="NSMutableDictionary" key="outlets">
|
||||
<string key="addEntryButton">NSButton</string>
|
||||
<string key="bottomBar">HNHGradientView</string>
|
||||
<string key="entryCountTextField">NSTextField</string>
|
||||
<string key="entryTable">NSTableView</string>
|
||||
<string key="filterBar">NSView</string>
|
||||
<string key="filterDoneButton">NSButton</string>
|
||||
<string key="filterLabelTextField">NSTextField</string>
|
||||
<string key="filterSearchField">NSSearchField</string>
|
||||
<string key="filterTitleButton">NSButton</string>
|
||||
<string key="filterURLButton">NSButton</string>
|
||||
<string key="filterUsernameButton">NSButton</string>
|
||||
<string key="tableToTop">NSLayoutConstraint</string>
|
||||
<string key="trashBar">HNHGradientView</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
|
||||
<object class="IBToOneOutletInfo" key="addEntryButton">
|
||||
<string key="name">addEntryButton</string>
|
||||
<string key="candidateClassName">NSButton</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="bottomBar">
|
||||
<string key="name">bottomBar</string>
|
||||
<string key="candidateClassName">HNHGradientView</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="entryCountTextField">
|
||||
<string key="name">entryCountTextField</string>
|
||||
<string key="candidateClassName">NSTextField</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="entryTable">
|
||||
<string key="name">entryTable</string>
|
||||
<string key="candidateClassName">NSTableView</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="filterBar">
|
||||
<string key="name">filterBar</string>
|
||||
<string key="candidateClassName">NSView</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="filterDoneButton">
|
||||
<string key="name">filterDoneButton</string>
|
||||
<string key="candidateClassName">NSButton</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="filterLabelTextField">
|
||||
<string key="name">filterLabelTextField</string>
|
||||
<string key="candidateClassName">NSTextField</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="filterSearchField">
|
||||
<string key="name">filterSearchField</string>
|
||||
<string key="candidateClassName">NSSearchField</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="filterTitleButton">
|
||||
<string key="name">filterTitleButton</string>
|
||||
<string key="candidateClassName">NSButton</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="filterURLButton">
|
||||
<string key="name">filterURLButton</string>
|
||||
<string key="candidateClassName">NSButton</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="filterUsernameButton">
|
||||
<string key="name">filterUsernameButton</string>
|
||||
<string key="candidateClassName">NSButton</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="tableToTop">
|
||||
<string key="name">tableToTop</string>
|
||||
<string key="candidateClassName">NSLayoutConstraint</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="trashBar">
|
||||
<string key="name">trashBar</string>
|
||||
<string key="candidateClassName">HNHGradientView</string>
|
||||
</object>
|
||||
</dictionary>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">./Classes/MPEntryViewController.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">MPViewController</string>
|
||||
<string key="superclassName">NSViewController</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">./Classes/MPViewController.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSLayoutConstraint</string>
|
||||
<string key="superclassName">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">./Classes/NSLayoutConstraint.h</string>
|
||||
</object>
|
||||
</object>
|
||||
</array>
|
||||
</object>
|
||||
<int key="IBDocument.localizationMode">0</int>
|
||||
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
|
||||
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
|
||||
<int key="IBDocument.defaultPropertyAccessControl">3</int>
|
||||
<bool key="IBDocument.UseAutolayout">YES</bool>
|
||||
</data>
|
||||
</archive>
|
||||
@@ -1,7 +1,7 @@
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
|
||||
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;\red52\green110\blue183;\red38\green38\blue38;}
|
||||
\paperw11900\paperh16840\vieww28040\viewh7240\viewkind0
|
||||
\paperw11900\paperh16840\vieww19440\viewh14240\viewkind0
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
|
||||
|
||||
\f0\b\fs24 \cf0 Projekt Webseite:\
|
||||
@@ -37,6 +37,7 @@ You should have received a copy of the GNU General Public License along with thi
|
||||
\b0 \cf3 \
|
||||
Copyright \'a9 2012 Robbie Hanson. Alle Rechte vorbehalten.\
|
||||
\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
|
||||
{\field{\*\fldinst{HYPERLINK "https://github.com/MiniKeePass/MiniKeePass"}}{\fldrslt \cf2 MiniKeePass}}\
|
||||
Copyright \'a9 2011 Jason Rush und John Flanagan. Alle Rechte vorbehalten.\
|
||||
\
|
||||
@@ -50,9 +51,20 @@ Copyright \'a9 2011, Alex Rozanski. Alle Rechte vorbehalten.\
|
||||
\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
|
||||
{\field{\*\fldinst{HYPERLINK "http://stackoverflow.com/questions/11386876/how-to-encode-and-decode-files-as-base64-in-cocoa-objective-c"}}{\fldrslt \cf3 Base64 Encoding Category}}\
|
||||
Copyright @2013, {\field{\*\fldinst{HYPERLINK "http://stackoverflow.com/users/200321/denis2342"}}{\fldrslt denis2342}}\
|
||||
Copyright \'a92013, {\field{\*\fldinst{HYPERLINK "http://stackoverflow.com/users/200321/denis2342"}}{\fldrslt denis2342}}\
|
||||
\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
|
||||
{\field{\*\fldinst{HYPERLINK "http://www.cocoadev.com/index.pl?NSDataCategory"}}{\fldrslt \cf3 NSData+Gzip}}\
|
||||
Basierend auf dem Code im CocoaDev Wiki\
|
||||
}
|
||||
\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
|
||||
{\field{\*\fldinst{HYPERLINK "https://github.com/karelia/SecurityInterface"}}{\fldrslt \cf3 KSPasswordField}}\cf3 \kerning1\expnd0\expndtw3
|
||||
\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
|
||||
\cf3 \kerning1\expnd0\expndtw0 Quelltext wird in HNHRoundedSecureTextField verwendet\cf3 \kerning1\expnd0\expndtw3
|
||||
\
|
||||
\cf3 \kerning1\expnd0\expndtw0 Copyright \'a92012 Mike Abdullah, Karelia Software. Alle Rechte vorbehalten.\
|
||||
\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
|
||||
{\field{\*\fldinst{HYPERLINK "https://github.com/AlanQuatermain/aqtoolkit"}}{\fldrslt \cf3 NSData+CommonCrypto}}\
|
||||
Copyright \'a92008-2009 Jim Dovey, Alle Rechte vorbehalten.}
|
||||
@@ -1,30 +1,48 @@
|
||||
|
||||
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "421"; */
|
||||
"421.title" = "OtherViews";
|
||||
/* Class = "NSMenu"; title = "ClipboardClearInterval"; ObjectID = "421"; */
|
||||
"421.title" = "ClipboardClearInterval";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "10 Seconds"; ObjectID = "422"; */
|
||||
"422.title" = "10 Sekunden";
|
||||
/* Class = "NSMenuItem"; title = "after 10 Seconds"; ObjectID = "422"; */
|
||||
"422.title" = "nach 10 Sekunden";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "30 Seconds"; ObjectID = "423"; */
|
||||
"423.title" = "30 Sekunden";
|
||||
/* Class = "NSMenuItem"; title = "after 30 Seconds"; ObjectID = "423"; */
|
||||
"423.title" = "nach 30 Sekunden";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "1 Minute"; ObjectID = "424"; */
|
||||
"424.title" = "1 Minute";
|
||||
/* Class = "NSMenuItem"; title = "after 1 Minute"; ObjectID = "424"; */
|
||||
"424.title" = "nach 1 Minute";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Never"; ObjectID = "429"; */
|
||||
"429.title" = "Nie";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Clear Copied Items"; ObjectID = "432"; */
|
||||
"432.title" = "Zwischenablage Leere";
|
||||
"432.title" = "Leere Zwischenablage";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Clear Clipboard on Quit"; ObjectID = "448"; */
|
||||
"448.title" = "Zwischenablage beim Beenden leeren";
|
||||
|
||||
/* Class = "NSBox"; title = "Clipboard"; ObjectID = "465"; */
|
||||
"465.title" = "Zwischenablage";
|
||||
/* Class = "NSBox"; title = "Security"; ObjectID = "465"; */
|
||||
"465.title" = "Sicherheit";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Open empty database on launch"; ObjectID = "527"; */
|
||||
"527.title" = "Leere Datenbank beim Programmstart öffnen";
|
||||
/* Class = "NSButtonCell"; title = "Reopen last Database after Launch"; ObjectID = "531"; */
|
||||
"531.title" = "Letzte Datenbank beim Start wieder öffnen";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Open empty database on activate"; ObjectID = "531"; */
|
||||
"531.title" = "Lerre Datenbank beim Aktiveren öffnen";
|
||||
/* Class = "NSMenu"; title = "LockTimes"; ObjectID = "586"; */
|
||||
"586.title" = "LockTimes";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "for 1 Minute"; ObjectID = "588"; */
|
||||
"588.title" = "für 1 Minute";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "for 5 Minutes"; ObjectID = "589"; */
|
||||
"589.title" = "für 5 Minuten";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "for 15 Minutes"; ObjectID = "603"; */
|
||||
"603.title" = "für 15 Minuten";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Lock after sleep"; ObjectID = "631"; */
|
||||
"631.title" = "Datenbank im Ruhezustand sperren";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Never"; ObjectID = "804"; */
|
||||
"804.title" = "Nie";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Lock while idle"; ObjectID = "806"; */
|
||||
"806.title" = "Sperren nach Inaktivität";
|
||||
|
||||
@@ -40,6 +40,7 @@ You should have received a copy of the GNU General Public License along with thi
|
||||
{\field{\*\fldinst{HYPERLINK "https://github.com/robbiehanson/KissXML"}}{\fldrslt \cf2 KissXML}}\cf3 \
|
||||
Copyright \'a9 2012 Robbie Hanson. All rights reserved.\
|
||||
\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
|
||||
{\field{\*\fldinst{HYPERLINK "https://github.com/MiniKeePass/MiniKeePass"}}{\fldrslt \cf2 MiniKeePass}}\
|
||||
Copyright \'a9 2011 Jason Rush and John Flanagan. All rights reserved.\
|
||||
\
|
||||
@@ -53,9 +54,17 @@ Copyright \'a9 2011, Alex Rozanski. All rights reserved.\
|
||||
\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
|
||||
{\field{\*\fldinst{HYPERLINK "http://stackoverflow.com/questions/11386876/how-to-encode-and-decode-files-as-base64-in-cocoa-objective-c"}}{\fldrslt \cf3 NSData+Base64}}\
|
||||
Copyright @2013, {\field{\*\fldinst{HYPERLINK "http://stackoverflow.com/users/200321/denis2342"}}{\fldrslt denis2342}}\
|
||||
Copyright \'a92013, {\field{\*\fldinst{HYPERLINK "http://stackoverflow.com/users/200321/denis2342"}}{\fldrslt denis2342}}\
|
||||
\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
|
||||
{\field{\*\fldinst{HYPERLINK "http://www.cocoadev.com/index.pl?NSDataCategory"}}{\fldrslt \cf3 NSData+Gzip}}\
|
||||
Extracted from code on the CocoaDev Wiki\
|
||||
}
|
||||
\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
|
||||
{\field{\*\fldinst{HYPERLINK "https://github.com/karelia/SecurityInterface"}}{\fldrslt \cf3 KSPasswordField}}\
|
||||
Code reused in HNHRoundedSecureTextField\
|
||||
Copyright \'a92012 Mike Abdullah, Karelia Software. All rights reserved.\
|
||||
\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
|
||||
{\field{\*\fldinst{HYPERLINK "https://github.com/AlanQuatermain/aqtoolkit"}}{\fldrslt \cf3 NSData+CommonCrypto}}\
|
||||
Copyright \'a92008-2009 Jim Dovey, All rights reserved.}
|
||||
@@ -2,14 +2,14 @@
|
||||
/* Class = "NSMenu"; title = "ClipboardClearInterval"; ObjectID = "421"; */
|
||||
"421.title" = "ClipboardClearInterval";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "10 Seconds"; ObjectID = "422"; */
|
||||
"422.title" = "10 Seconds";
|
||||
/* Class = "NSMenuItem"; title = "after 10 Seconds"; ObjectID = "422"; */
|
||||
"422.title" = "after 10 Seconds";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "30 Seconds"; ObjectID = "423"; */
|
||||
"423.title" = "30 Seconds";
|
||||
/* Class = "NSMenuItem"; title = "after 30 Seconds"; ObjectID = "423"; */
|
||||
"423.title" = "after 30 Seconds";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "1 Minute"; ObjectID = "424"; */
|
||||
"424.title" = "1 Minute";
|
||||
/* Class = "NSMenuItem"; title = "after 1 Minute"; ObjectID = "424"; */
|
||||
"424.title" = "after 1 Minute";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Never"; ObjectID = "429"; */
|
||||
"429.title" = "Never";
|
||||
@@ -23,26 +23,26 @@
|
||||
/* Class = "NSBox"; title = "Security"; ObjectID = "465"; */
|
||||
"465.title" = "Security";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Open empty database on launch"; ObjectID = "527"; */
|
||||
"527.title" = "Open empty database on launch";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Open empty database on activate"; ObjectID = "531"; */
|
||||
"531.title" = "Open empty database on activate";
|
||||
/* Class = "NSButtonCell"; title = "Reopen last Database after Launch"; ObjectID = "531"; */
|
||||
"531.title" = "Reopen last Database after Launch";
|
||||
|
||||
/* Class = "NSMenu"; title = "LockTimes"; ObjectID = "586"; */
|
||||
"586.title" = "LockTimes";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "1 Minute"; ObjectID = "588"; */
|
||||
"588.title" = "1 Minute";
|
||||
/* Class = "NSMenuItem"; title = "for 1 Minute"; ObjectID = "588"; */
|
||||
"588.title" = "for 1 Minute";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "5 Minutes"; ObjectID = "589"; */
|
||||
"589.title" = "5 Minutes";
|
||||
/* Class = "NSMenuItem"; title = "for 5 Minutes"; ObjectID = "589"; */
|
||||
"589.title" = "for 5 Minutes";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "15 Minutes"; ObjectID = "603"; */
|
||||
"603.title" = "15 Minutes";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Lock while idle for"; ObjectID = "606"; */
|
||||
"606.title" = "Lock while idle for";
|
||||
/* Class = "NSMenuItem"; title = "for 15 Minutes"; ObjectID = "603"; */
|
||||
"603.title" = "for 15 Minutes";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Lock after sleep"; ObjectID = "631"; */
|
||||
"631.title" = "Lock after sleep";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Never"; ObjectID = "804"; */
|
||||
"804.title" = "Never";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Lock while idle"; ObjectID = "806"; */
|
||||
"806.title" = "Lock while idle";
|
||||
|
||||
BIN
MacPassTests/Databases/CustomIcon_Password_1234.kdbx
Normal file
150
MacPassTests/Databases/CustomIcon_Password_1234.xml
Normal file
@@ -0,0 +1,150 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<KeePassFile>
|
||||
<Meta>
|
||||
<Generator>KeePassX</Generator>
|
||||
<DatabaseName/>
|
||||
<DatabaseNameChanged>2013-07-15T19:35:54Z</DatabaseNameChanged>
|
||||
<DatabaseDescription/>
|
||||
<DatabaseDescriptionChanged>2013-07-15T19:35:54Z</DatabaseDescriptionChanged>
|
||||
<DefaultUserName/>
|
||||
<DefaultUserNameChanged>2013-07-15T19:35:54Z</DefaultUserNameChanged>
|
||||
<MaintenanceHistoryDays>365</MaintenanceHistoryDays>
|
||||
<Color/>
|
||||
<MasterKeyChanged>2013-07-15T19:36:02Z</MasterKeyChanged>
|
||||
<MasterKeyChangeRec>-1</MasterKeyChangeRec>
|
||||
<MasterKeyChangeForce>-1</MasterKeyChangeForce>
|
||||
<MemoryProtection>
|
||||
<ProtectTitle>False</ProtectTitle>
|
||||
<ProtectUserName>False</ProtectUserName>
|
||||
<ProtectPassword>True</ProtectPassword>
|
||||
<ProtectURL>False</ProtectURL>
|
||||
<ProtectNotes>False</ProtectNotes>
|
||||
</MemoryProtection>
|
||||
<CustomIcons>
|
||||
<Icon>
|
||||
<UUID>RaP8u/B18ngIutqc2B5c9g==</UUID>
|
||||
<Data>iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAsSAAALEgHS3X78AAACHUlEQVQokV2SzUtUYRTGn/Pe915HZyIwJ0FDEsqCXORGaBFYLWoR7foDglZt+xuCFu76G9q0iFBKMgQhhUhIhIRM7EuHq+N8ODN37uf7ntNCR249q7P4wfOccx4SEfRkwY4oEIyVNAoLJVdZTxxD0KeMQk4OKxCSKF5893KgJEkkcAyJzjOQnJiZRSp7P01rh4Ot+devjFjLeUT+cQCJyez3zRVH2sTd+/euB60O0T+IEjAACAAWIwfNg5lrZ5HWkNZxtL24NEcCgCEnVM+BACjlYG9jFU5HzCFnR+Duw1vjQdTpAUyAolyqSqU2PbGPqLrwYXf+/VdYH40vywtz1vZiCTR6s8mi0eK21Npg7NZ9sQWElLC+MymNuj9UHiFSICgc7wA0age8u0CpWLt/6VzxwlCfZK2+NHTT/eWltxADAGB9vEoUhmVnh6KqQb+WdPpKod6o0e+P1loNmSmO+od3R86PQZQGFEm2tbU+5c9K/Ed321BUGrx4Rg1mnZZrGZbKvPFpfW749iPxigowzSCbLG2nvzak6SPu2m61k4zFXHQ7KQIgDhAXJiovmkGsJaHM8I+11YmVm/CAzAOlrPHm21U/bD2ZqoIsGcWKlcHm5dnxB08pC41ee24/P3NsZPVJbYgoX8rjF7e5nDze0bFSCjoZvmGUUr2LAaAcnyrX4ywxxX6XiVkobTbR77H5r7yncjnp6tIA2z6v8BeUfknGrtTw7gAAAABJRU5ErkJggg==</Data>
|
||||
</Icon>
|
||||
</CustomIcons>
|
||||
<RecycleBinEnabled>True</RecycleBinEnabled>
|
||||
<RecycleBinUUID>AAAAAAAAAAAAAAAAAAAAAA==</RecycleBinUUID>
|
||||
<RecycleBinChanged>2013-07-15T19:35:54Z</RecycleBinChanged>
|
||||
<EntryTemplatesGroup>AAAAAAAAAAAAAAAAAAAAAA==</EntryTemplatesGroup>
|
||||
<EntryTemplatesGroupChanged>2013-07-15T19:35:54Z</EntryTemplatesGroupChanged>
|
||||
<HistoryMaxItems>10</HistoryMaxItems>
|
||||
<HistoryMaxSize>6291456</HistoryMaxSize>
|
||||
<LastSelectedGroup>AAAAAAAAAAAAAAAAAAAAAA==</LastSelectedGroup>
|
||||
<LastTopVisibleGroup>AAAAAAAAAAAAAAAAAAAAAA==</LastTopVisibleGroup>
|
||||
<Binaries/>
|
||||
<CustomData/>
|
||||
</Meta>
|
||||
<Root>
|
||||
<Group>
|
||||
<UUID>8XPXLHyIoM9KLqrjDHjsZQ==</UUID>
|
||||
<Name>Root</Name>
|
||||
<Notes/>
|
||||
<IconID>48</IconID>
|
||||
<Times>
|
||||
<LastModificationTime>2013-07-15T19:35:54Z</LastModificationTime>
|
||||
<CreationTime>2013-07-15T19:35:54Z</CreationTime>
|
||||
<LastAccessTime>2013-07-15T19:35:54Z</LastAccessTime>
|
||||
<ExpiryTime>2013-07-15T19:35:54Z</ExpiryTime>
|
||||
<Expires>False</Expires>
|
||||
<UsageCount>0</UsageCount>
|
||||
<LocationChanged>2013-07-15T19:35:54Z</LocationChanged>
|
||||
</Times>
|
||||
<IsExpanded>True</IsExpanded>
|
||||
<DefaultAutoTypeSequence/>
|
||||
<EnableAutoType>null</EnableAutoType>
|
||||
<EnableSearching>null</EnableSearching>
|
||||
<LastTopVisibleEntry>AAAAAAAAAAAAAAAAAAAAAA==</LastTopVisibleEntry>
|
||||
<Entry>
|
||||
<UUID>XW1C9XAjxqVKt4bJsOpgRQ==</UUID>
|
||||
<IconID>0</IconID>
|
||||
<CustomIconUUID>RaP8u/B18ngIutqc2B5c9g==</CustomIconUUID>
|
||||
<ForegroundColor/>
|
||||
<BackgroundColor/>
|
||||
<OverrideURL/>
|
||||
<Tags/>
|
||||
<Times>
|
||||
<LastModificationTime>2013-07-15T19:37:38Z</LastModificationTime>
|
||||
<CreationTime>2013-07-15T19:36:04Z</CreationTime>
|
||||
<LastAccessTime>2013-07-15T19:37:38Z</LastAccessTime>
|
||||
<ExpiryTime>2013-07-15T19:36:04Z</ExpiryTime>
|
||||
<Expires>False</Expires>
|
||||
<UsageCount>0</UsageCount>
|
||||
<LocationChanged>2013-07-15T19:36:08Z</LocationChanged>
|
||||
</Times>
|
||||
<String>
|
||||
<Key>Title</Key>
|
||||
<Value>CustomIcon</Value>
|
||||
</String>
|
||||
<String>
|
||||
<Key>UserName</Key>
|
||||
<Value/>
|
||||
</String>
|
||||
<String>
|
||||
<Key>Password</Key>
|
||||
<Value Protected="True"/>
|
||||
</String>
|
||||
<String>
|
||||
<Key>URL</Key>
|
||||
<Value/>
|
||||
</String>
|
||||
<String>
|
||||
<Key>Notes</Key>
|
||||
<Value/>
|
||||
</String>
|
||||
<AutoType>
|
||||
<Enabled>True</Enabled>
|
||||
<DataTransferObfuscation>0</DataTransferObfuscation>
|
||||
<DefaultSequence/>
|
||||
</AutoType>
|
||||
<History>
|
||||
<Entry>
|
||||
<UUID>XW1C9XAjxqVKt4bJsOpgRQ==</UUID>
|
||||
<IconID>0</IconID>
|
||||
<ForegroundColor/>
|
||||
<BackgroundColor/>
|
||||
<OverrideURL/>
|
||||
<Tags/>
|
||||
<Times>
|
||||
<LastModificationTime>2013-07-15T19:36:08Z</LastModificationTime>
|
||||
<CreationTime>2013-07-15T19:36:04Z</CreationTime>
|
||||
<LastAccessTime>2013-07-15T19:36:08Z</LastAccessTime>
|
||||
<ExpiryTime>2013-07-15T19:36:04Z</ExpiryTime>
|
||||
<Expires>False</Expires>
|
||||
<UsageCount>0</UsageCount>
|
||||
<LocationChanged>2013-07-15T19:36:08Z</LocationChanged>
|
||||
</Times>
|
||||
<String>
|
||||
<Key>Title</Key>
|
||||
<Value>CustomIcon</Value>
|
||||
</String>
|
||||
<String>
|
||||
<Key>UserName</Key>
|
||||
<Value/>
|
||||
</String>
|
||||
<String>
|
||||
<Key>Password</Key>
|
||||
<Value Protected="True"/>
|
||||
</String>
|
||||
<String>
|
||||
<Key>URL</Key>
|
||||
<Value/>
|
||||
</String>
|
||||
<String>
|
||||
<Key>Notes</Key>
|
||||
<Value/>
|
||||
</String>
|
||||
<AutoType>
|
||||
<Enabled>True</Enabled>
|
||||
<DataTransferObfuscation>0</DataTransferObfuscation>
|
||||
<DefaultSequence/>
|
||||
</AutoType>
|
||||
</Entry>
|
||||
</History>
|
||||
</Entry>
|
||||
</Group>
|
||||
</Root>
|
||||
</KeePassFile>
|
||||
BIN
MacPassTests/Databases/Test_Password_1234.kdb
Normal file
BIN
MacPassTests/Databases/Test_Password_1234.kdbx
Normal file
BIN
MacPassTests/Images/image.png
Normal file
|
After Width: | Height: | Size: 803 B |
16
MacPassTests/KPKIconLoading.h
Normal file
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// KPKIconLoading.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 20.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import <SenTestingKit/SenTestingKit.h>
|
||||
|
||||
@interface KPKIconLoading : SenTestCase {
|
||||
NSImage *_image;
|
||||
NSData *_imageData;
|
||||
}
|
||||
|
||||
@end
|
||||
43
MacPassTests/KPKIconLoading.m
Normal file
@@ -0,0 +1,43 @@
|
||||
//
|
||||
// KPKIconLoading.m
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 20.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "KPKIconLoading.h"
|
||||
#import "KPKIcon.h"
|
||||
|
||||
@implementation KPKIconLoading
|
||||
|
||||
- (void)setUp {
|
||||
NSBundle *myBundle = [NSBundle bundleForClass:[self class]];
|
||||
_image = [myBundle imageForResource:@"image.png"];
|
||||
_imageData = [[[_image representations] lastObject] representationUsingType:NSPNGFileType properties:nil];
|
||||
}
|
||||
|
||||
- (void)tearDown {
|
||||
_image = nil;
|
||||
_imageData = nil;
|
||||
}
|
||||
|
||||
- (void)testLoading {
|
||||
NSBundle *myBundle = [NSBundle bundleForClass:[self class]];
|
||||
NSURL *imageURL = [myBundle URLForImageResource:@"image.png"];
|
||||
KPKIcon *icon = [[KPKIcon alloc] initWithImageAtURL:imageURL];
|
||||
STAssertNotNil(icon, @"Icon should have been loaded");
|
||||
NSString *iconString = [icon encodedString];
|
||||
KPKIcon *iconFromString = [[KPKIcon alloc] initWithUUID:[NSUUID UUID] encodedString:iconString];
|
||||
STAssertTrue([iconString isEqualToString:[iconFromString encodedString]], @"Encoding and Decoding should result in the same string");
|
||||
Class repClass = [NSBitmapImageRep class];
|
||||
NSImageRep *imageRep = [[icon.image representations] lastObject];
|
||||
STAssertNotNil(imageRep, @"One image rep shoudl be there");
|
||||
STAssertTrue([imageRep isKindOfClass:repClass], @"Representation should be bitmap");
|
||||
NSBitmapImageRep *bitmapRep = (NSBitmapImageRep *)imageRep;
|
||||
NSData *pngData = [bitmapRep representationUsingType:NSPNGFileType properties:nil];
|
||||
STAssertTrue([pngData isEqualToData:_imageData], @"Image and PNG data shoudl be identical");
|
||||
|
||||
}
|
||||
|
||||
@end
|
||||
19
MacPassTests/KPKLegacyLoadingTest.h
Normal file
@@ -0,0 +1,19 @@
|
||||
//
|
||||
// KPKTreeLoadingTest.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 20.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import <SenTestingKit/SenTestingKit.h>
|
||||
|
||||
@class KPKPassword;
|
||||
|
||||
@interface KPKLegacyLoadingTest : SenTestCase {
|
||||
@private
|
||||
NSData *_data;
|
||||
KPKPassword *_password;
|
||||
}
|
||||
|
||||
@end
|
||||
33
MacPassTests/KPKLegacyLoadingTest.m
Normal file
@@ -0,0 +1,33 @@
|
||||
//
|
||||
// KPKTreeLoadingTest.m
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 20.07.13.
|
||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "KPKLegacyLoadingTest.h"
|
||||
#import "KPKTreeCryptor.h"
|
||||
#import "KPKPassword.h"
|
||||
|
||||
@implementation KPKLegacyLoadingTest
|
||||
|
||||
- (void)setUp {
|
||||
NSBundle *myBundle = [NSBundle bundleForClass:[self class]];
|
||||
NSURL *url = [myBundle URLForResource:@"Test_Password_1234" withExtension:@"kdb"];
|
||||
_data = [NSData dataWithContentsOfURL:url];
|
||||
_password = [[KPKPassword alloc] initWithPassword:@"1234" key:nil];
|
||||
}
|
||||
|
||||
- (void)tearDown {
|
||||
_data = nil;
|
||||
_password = nil;
|
||||
}
|
||||
|
||||
- (void)testLoading {
|
||||
KPKTreeCryptor *cryptor = [KPKTreeCryptor treeCryptorWithData:_data password:_password];
|
||||
KPKTree *tree = [cryptor decryptTree:NULL];
|
||||
STAssertNotNil(tree, @"Loading should result in a tree object");
|
||||
}
|
||||
|
||||
@end
|
||||