25 Commits

Author SHA1 Message Date
michael starke
1f94a626bb Create new on activate disabled. There's a annoying bug in there :( 2013-07-21 14:22:44 +02:00
michael starke
a6afe0bcf4 Fixed #29 Application now stores the last open database by itself. If window restoration in OS X is disabled, the app also reopens the last db. 2013-07-21 14:14:05 +02:00
michael starke
1fd89bfab6 Updated submodules 2013-07-21 04:29:22 +02:00
michael starke
db0640840f Updated Submodules 2013-07-21 01:01:23 +02:00
michael starke
fb735d9e41 Reduced PDF file sizes 2013-07-21 00:54:19 +02:00
michael starke
862cbe839e Updated Submodule 2013-07-20 20:00:16 +02:00
michael starke
cb5a71dfee Updated submodule 2013-07-20 19:46:31 +02:00
michael starke
30697648b9 Updated localization
Fixed an issue that automatically set the first group to be the trashcan
2013-07-20 17:04:13 +02:00
michael starke
e5e8d01dff Removed unused Code 2013-07-20 16:42:35 +02:00
michael starke
030dbd5be7 Fixed #46 Binaries get now deleted when entries are delete on trans cleaning
MenuEntries are validated and disabled to fix #58. Model still doesn't do any testing
2013-07-20 16:31:20 +02:00
michael starke
e306b2b3f2 Updated submodule 2013-07-20 12:26:53 +02:00
michael starke
0fe99cda97 Updated Submodules 2013-07-20 12:23:19 +02:00
michael starke
c207b2b24a Experiments with token filed in Inspector 2013-07-20 03:23:18 +02:00
michael starke
dc51c60c19 Attachments on Kdb1 Entries are now supported. Saving not implemented. Attach/detach works. 2013-07-19 23:30:45 +02:00
michael starke
86d983f776 Subbed Kdb3 Entry attachment handling. 2013-07-19 22:45:04 +02:00
michael starke
efa727eaba Settings now work with KDB1 Files and do not trap the Application in the modal dialog
Added user base settings to hide/show passwords at KDB1 field. The settings are stored but not considered ;)
2013-07-19 22:25:40 +02:00
michael starke
5e6d2bed3d Removed commented code 2013-07-19 18:42:18 +02:00
michael starke
5e6e31fb47 Fixed Issue with non-initalized password repeat filed on first load of the databaseSettings window 2013-07-19 18:26:42 +02:00
michael starke
8d34f77a1f Bumped Version
Updated Credits
2013-07-19 03:21:47 +02:00
michael starke
859fe5ede8 Default fields are now respected too in validation 2013-07-19 03:14:41 +02:00
michael starke
fef291df88 Added custom string field validation. Still needs testing for default keys 2013-07-19 03:06:29 +02:00
michael starke
c1b47bdb77 Enhanced password input to check and verify
Added repeat password input in settings
New databases without password request on (it's not changed on file until the saved)
2013-07-19 01:39:52 +02:00
michael starke
0e102d3f0f Saving last state of Inspector (last document wins) 2013-07-18 21:23:32 +02:00
michael starke
d4c7d49d6f Fixed issue with window restoration 2013-07-18 21:16:56 +02:00
michael starke
0144e3c21f Bumped Build number 2013-07-18 04:36:45 +02:00
55 changed files with 2865 additions and 676 deletions

2
HNHUi

Submodule HNHUi updated: 32be9c7cea...c32f87da30

View File

@@ -13,6 +13,15 @@
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 /* KPKBinaryTreeReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842B1179B28C400E2F5BC /* KPKBinaryTreeReader.m */; };
4C1842B5179B28D400E2F5BC /* KPKBinaryTreeWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842B4179B28D400E2F5BC /* KPKBinaryTreeWriter.m */; };
4C1842B8179B348600E2F5BC /* KPKTreeLoadingTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842B7179B348600E2F5BC /* KPKTreeLoadingTest.m */; };
4C1842BC179B434C00E2F5BC /* KPKXmlCipherInformation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842BB179B434C00E2F5BC /* KPKXmlCipherInformation.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 /* KPKBinaryCipherInformation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1842C5179BF52000E2F5BC /* KPKBinaryCipherInformation.m */; };
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 */; };
@@ -57,6 +66,9 @@
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 */; };
@@ -72,6 +84,8 @@
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 */; };
@@ -138,12 +152,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 */; };
4C70D0FD1790924700652EE9 /* KPKParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C70D0FC1790924700652EE9 /* KPKParser.m */; };
4C70D0FD1790924700652EE9 /* KPKTreeLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C70D0FC1790924700652EE9 /* KPKTreeLoader.m */; };
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 */; };
@@ -177,6 +193,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 */; };
@@ -228,6 +245,7 @@
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 */; };
4CFEB36E1799D9CF00AF1868 /* Kdb3Entry+KVOAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFEB36D1799D9CF00AF1868 /* Kdb3Entry+KVOAdditions.m */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@@ -243,6 +261,26 @@
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 /* KPKBinaryTreeReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKBinaryTreeReader.h; sourceTree = "<group>"; };
4C1842B1179B28C400E2F5BC /* KPKBinaryTreeReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKBinaryTreeReader.m; sourceTree = "<group>"; };
4C1842B3179B28D400E2F5BC /* KPKBinaryTreeWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKBinaryTreeWriter.h; sourceTree = "<group>"; };
4C1842B4179B28D400E2F5BC /* KPKBinaryTreeWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKBinaryTreeWriter.m; sourceTree = "<group>"; };
4C1842B6179B348600E2F5BC /* KPKTreeLoadingTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKTreeLoadingTest.h; sourceTree = "<group>"; };
4C1842B7179B348600E2F5BC /* KPKTreeLoadingTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKTreeLoadingTest.m; sourceTree = "<group>"; };
4C1842B9179B3A1700E2F5BC /* KPKHeaderFields.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKHeaderFields.h; sourceTree = "<group>"; };
4C1842BA179B434C00E2F5BC /* KPKXmlCipherInformation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKXmlCipherInformation.h; sourceTree = "<group>"; };
4C1842BB179B434C00E2F5BC /* KPKXmlCipherInformation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKXmlCipherInformation.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 /* KPKBinaryCipherInformation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKBinaryCipherInformation.h; sourceTree = "<group>"; };
4C1842C5179BF52000E2F5BC /* KPKBinaryCipherInformation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKBinaryCipherInformation.m; sourceTree = "<group>"; };
4C1842C7179BF6A100E2F5BC /* KPKKdbHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKKdbHeader.h; 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>"; };
@@ -325,6 +363,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>"; };
@@ -350,6 +393,10 @@
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; path = KPKFormat.h; sourceTree = "<group>"; };
4C4436761792BE810099E220 /* KPKFormat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = 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>"; };
@@ -477,14 +524,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>"; };
4C70D0FB1790924700652EE9 /* KPKParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKParser.h; sourceTree = "<group>"; };
4C70D0FC1790924700652EE9 /* KPKParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKParser.m; sourceTree = "<group>"; };
4C70D0FB1790924700652EE9 /* KPKTreeLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKTreeLoader.h; sourceTree = "<group>"; };
4C70D0FC1790924700652EE9 /* KPKTreeLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKTreeLoader.m; 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>"; };
@@ -551,6 +602,8 @@
4CA0E3A6176FAF99004D18CB /* MPDocumentQueryService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDocumentQueryService.m; 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>"; };
@@ -609,8 +662,8 @@
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; name = "KPKTree+Serializing.h"; path = "../Core/KPKTree+Serializing.h"; sourceTree = "<group>"; };
4CDB5C411794AA4F0017667E /* KPKTree+Serializing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "KPKTree+Serializing.m"; path = "../Core/KPKTree+Serializing.m"; 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>"; };
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>"; };
@@ -647,6 +700,8 @@
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>"; };
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 */
@@ -892,6 +947,8 @@
4C2724D917790E7C00FD8456 /* NSMutableData+Base64.m */,
4C801AFA179310E2002821E3 /* NSString+Hexdata.h */,
4C801AFB179310E2002821E3 /* NSString+Hexdata.m */,
4CA7C36A179A98140099C34B /* NSString+Base64.h */,
4CA7C36B179A98140099C34B /* NSString+Base64.m */,
);
name = Categories;
sourceTree = "<group>";
@@ -921,10 +978,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>";
@@ -953,6 +1016,14 @@
name = Helper;
sourceTree = "<group>";
};
4C305F3F179A1A790082334F /* Images */ = {
isa = PBXGroup;
children = (
4C305F3D179A1A760082334F /* image.png */,
);
name = Images;
sourceTree = "<group>";
};
4C37A84115B8B47D005EF8EE /* Delegates */ = {
isa = PBXGroup;
children = (
@@ -1000,6 +1071,7 @@
4C45FB1E178E09ED0010007D /* MacPassTests */ = {
isa = PBXGroup;
children = (
4C305F3F179A1A790082334F /* Images */,
4C18F9AC178E123200890BCE /* Databases */,
4C45FB2B178E0BCB0010007D /* MPDatabaseLoading.h */,
4C45FB2C178E0BCB0010007D /* MPDatabaseLoading.m */,
@@ -1008,6 +1080,10 @@
4C19E501178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.h */,
4C19E502178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m */,
4C45FB1F178E09ED0010007D /* Supporting Files */,
4C305F3A179A19F90082334F /* KPKIconLoading.h */,
4C305F3B179A19F90082334F /* KPKIconLoading.m */,
4C1842B6179B348600E2F5BC /* KPKTreeLoadingTest.h */,
4C1842B7179B348600E2F5BC /* KPKTreeLoadingTest.m */,
);
path = MacPassTests;
sourceTree = "<group>";
@@ -1329,6 +1405,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 */,
@@ -1365,14 +1445,16 @@
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 */,
4CDB5C401794AA4F0017667E /* KPKTree+Serializing.h */,
4CDB5C411794AA4F0017667E /* KPKTree+Serializing.m */,
4C055E72179620BF00BD2BAB /* NSString+CommandString.h */,
4C055E73179620BF00BD2BAB /* NSString+CommandString.m */,
4C1842C1179B69E600E2F5BC /* NSData+HashedData.h */,
4C1842C2179B69E700E2F5BC /* NSData+HashedData.m */,
);
path = Categories;
sourceTree = "<group>";
@@ -1382,8 +1464,6 @@
children = (
4C70D0FE179092F200652EE9 /* KPKPassword.h */,
4C70D0FF179092F200652EE9 /* KPKPassword.m */,
4C70D0FB1790924700652EE9 /* KPKParser.h */,
4C70D0FC1790924700652EE9 /* KPKParser.m */,
4C4436751792BE810099E220 /* KPKFormat.h */,
4C4436761792BE810099E220 /* KPKFormat.m */,
4CD3ABB2178F71B50073F5C5 /* KPKVersion.h */,
@@ -1401,8 +1481,11 @@
4C3F28531791EDFD00703281 /* KPKErrors.m */,
4CF62B84179385D700B660B6 /* KPKAttribute.h */,
4CF62B85179385D700B660B6 /* KPKAttribute.m */,
4C5AA58F179549A1008ECAD7 /* KPKXmlTreeWriter.h */,
4C5AA590179549A1008ECAD7 /* KPKXmlTreeWriter.m */,
4C305F34179A0BD70082334F /* KPKIcon.h */,
4C305F35179A0BD70082334F /* KPKIcon.m */,
4C1842A9179B027700E2F5BC /* KPKDeletedNode.h */,
4C1842AA179B027800E2F5BC /* KPKDeletedNode.m */,
4C1842C7179BF6A100E2F5BC /* KPKKdbHeader.h */,
);
path = Core;
sourceTree = "<group>";
@@ -1410,6 +1493,23 @@
4CD3ABB5178F71B50073F5C5 /* IO */ = {
isa = PBXGroup;
children = (
4C70D0FB1790924700652EE9 /* KPKTreeLoader.h */,
4C70D0FC1790924700652EE9 /* KPKTreeLoader.m */,
4CDB5C401794AA4F0017667E /* KPKTree+Serializing.h */,
4CDB5C411794AA4F0017667E /* KPKTree+Serializing.m */,
4C5AA58F179549A1008ECAD7 /* KPKXmlTreeWriter.h */,
4C5AA590179549A1008ECAD7 /* KPKXmlTreeWriter.m */,
4C1842AD179B211C00E2F5BC /* KPKXmlTreeReader.h */,
4C1842AE179B211C00E2F5BC /* KPKXmlTreeReader.m */,
4C1842B0179B28C400E2F5BC /* KPKBinaryTreeReader.h */,
4C1842B1179B28C400E2F5BC /* KPKBinaryTreeReader.m */,
4C1842B3179B28D400E2F5BC /* KPKBinaryTreeWriter.h */,
4C1842B4179B28D400E2F5BC /* KPKBinaryTreeWriter.m */,
4C1842B9179B3A1700E2F5BC /* KPKHeaderFields.h */,
4C1842BA179B434C00E2F5BC /* KPKXmlCipherInformation.h */,
4C1842BB179B434C00E2F5BC /* KPKXmlCipherInformation.m */,
4C1842C4179BF51F00E2F5BC /* KPKBinaryCipherInformation.h */,
4C1842C5179BF52000E2F5BC /* KPKBinaryCipherInformation.m */,
);
path = IO;
sourceTree = "<group>";
@@ -1556,6 +1656,7 @@
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;
};
@@ -1636,6 +1737,8 @@
4C45FB2D178E0BCB0010007D /* MPDatabaseLoading.m in Sources */,
4C45FB30178E0CE20010007D /* MPDatabaseCreation.m in Sources */,
4C19E503178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m in Sources */,
4C305F3C179A19F90082334F /* KPKIconLoading.m in Sources */,
4C1842B8179B348600E2F5BC /* KPKTreeLoadingTest.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1795,7 +1898,7 @@
4CD3ABC2178F72720073F5C5 /* KPKGroup.m in Sources */,
4C591B57178F897A0080B16B /* KPKAttachment.m in Sources */,
4C39B3F5178FEFAE0027DC7C /* KPKNode.m in Sources */,
4C70D0FD1790924700652EE9 /* KPKParser.m in Sources */,
4C70D0FD1790924700652EE9 /* KPKTreeLoader.m in Sources */,
4C70D100179092F200652EE9 /* KPKPassword.m in Sources */,
4C8A173D1790AA41008B5C17 /* NSData+Keyfile.m in Sources */,
4C3F28541791EDFD00703281 /* KPKErrors.m in Sources */,
@@ -1808,6 +1911,21 @@
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 /* KPKBinaryTreeReader.m in Sources */,
4C1842B5179B28D400E2F5BC /* KPKBinaryTreeWriter.m in Sources */,
4C1842BC179B434C00E2F5BC /* KPKXmlCipherInformation.m in Sources */,
4C1842C0179B5BFD00E2F5BC /* NSData+CommonCrypto.m in Sources */,
4C1842C3179B69E700E2F5BC /* NSData+HashedData.m in Sources */,
4C1842C6179BF52100E2F5BC /* KPKBinaryCipherInformation.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View File

@@ -45,42 +45,121 @@
<reference key="NSNextResponder"/>
<int key="NSvFlags">268</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSButton" id="145041823">
<object class="NSBox" id="996160987">
<reference key="NSNextResponder" ref="1005"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{18, 177}, {241, 18}}</string>
<int key="NSvFlags">12</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSView" id="589191611">
<reference key="NSNextResponder" ref="996160987"/>
<int key="NSvFlags">274</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSButton" id="145041823">
<reference key="NSNextResponder" ref="589191611"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 12}, {241, 18}}</string>
<reference key="NSSuperview" ref="589191611"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="60918609"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<string key="NSHuggingPriority">{250, 252}</string>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="168279901">
<int key="NSCellFlags">-2080374784</int>
<int key="NSCellFlags2">268435456</int>
<string key="NSContents">Reopen last Database after Launch</string>
<object class="NSFont" key="NSSupport" id="874940307">
<string key="NSName">LucidaGrande</string>
<double key="NSSize">13</double>
<int key="NSfFlags">1044</int>
</object>
<string key="NSCellIdentifier">_NS:9</string>
<reference key="NSControlView" ref="145041823"/>
<int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">2</int>
<object class="NSCustomResource" key="NSNormalImage" id="125685135">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSSwitch</string>
</object>
<object class="NSButtonImageSource" key="NSAlternateImage" id="765261007">
<string key="NSImageName">NSSwitch</string>
</object>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="366343837">
<reference key="NSNextResponder" ref="589191611"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 32}, {228, 18}}</string>
<reference key="NSSuperview" ref="589191611"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="145041823"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<string key="NSHuggingPriority">{250, 252}</string>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="480309686">
<int key="NSCellFlags">-1543503872</int>
<int key="NSCellFlags2">268435456</int>
<string key="NSContents">Create new Database if activated</string>
<reference key="NSSupport" ref="874940307"/>
<string key="NSCellIdentifier">_NS:9</string>
<reference key="NSControlView" ref="366343837"/>
<int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="125685135"/>
<reference key="NSAlternateImage" ref="765261007"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
</array>
<string key="NSFrame">{{1, 1}, {364, 58}}</string>
<reference key="NSSuperview" ref="996160987"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="366343837"/>
<string key="NSReuseIdentifierKey">_NS:11</string>
</object>
</array>
<string key="NSFrame">{{17, 157}, {366, 74}}</string>
<reference key="NSSuperview" ref="1005"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="60918609"/>
<reference key="NSNextKeyView" ref="589191611"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<string key="NSHuggingPriority">{250, 252}</string>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="168279901">
<int key="NSCellFlags">-2080374784</int>
<int key="NSCellFlags2">268435456</int>
<string key="NSContents">Reopen last Database after Launch</string>
<object class="NSFont" key="NSSupport" id="874940307">
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
<int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Startup</string>
<object class="NSFont" key="NSSupport" id="26">
<string key="NSName">LucidaGrande</string>
<double key="NSSize">13</double>
<int key="NSfFlags">1044</int>
<double key="NSSize">11</double>
<int key="NSfFlags">3100</int>
</object>
<string key="NSCellIdentifier">_NS:9</string>
<reference key="NSControlView" ref="145041823"/>
<int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">2</int>
<object class="NSCustomResource" key="NSNormalImage" id="125685135">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSSwitch</string>
<object class="NSColor" key="NSBackgroundColor" id="116323791">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">textBackgroundColor</string>
<object class="NSColor" key="NSColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MQA</bytes>
</object>
</object>
<object class="NSButtonImageSource" key="NSAlternateImage" id="765261007">
<string key="NSImageName">NSSwitch</string>
<object class="NSColor" key="NSTextColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes>
</object>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<reference key="NSContentView" ref="589191611"/>
<int key="NSBorderType">1</int>
<int key="NSBoxType">0</int>
<int key="NSTitlePosition">2</int>
<bool key="NSTransparent">NO</bool>
</object>
<object class="NSBox" id="60918609">
<reference key="NSNextResponder" ref="1005"/>
@@ -93,7 +172,7 @@
<object class="NSTextField" id="958810247">
<reference key="NSNextResponder" ref="731672371"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{15, 96}, {124, 17}}</string>
<string key="NSFrame">{{15, 93}, {124, 17}}</string>
<reference key="NSSuperview" ref="731672371"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="222890410"/>
@@ -130,7 +209,7 @@
<object class="NSPopUpButton" id="222890410">
<reference key="NSNextResponder" ref="731672371"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{179, 92}, {170, 23}}</string>
<string key="NSFrame">{{179, 90}, {170, 22}}</string>
<reference key="NSSuperview" ref="731672371"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="326334884"/>
@@ -220,7 +299,7 @@
<object class="NSButton" id="326334884">
<reference key="NSNextResponder" ref="731672371"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{31, 72}, {172, 18}}</string>
<string key="NSFrame">{{31, 69}, {172, 18}}</string>
<reference key="NSSuperview" ref="731672371"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="982397212"/>
@@ -377,14 +456,14 @@
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
</array>
<string key="NSFrame">{{1, 1}, {364, 124}}</string>
<string key="NSFrame">{{1, 1}, {364, 121}}</string>
<reference key="NSSuperview" ref="60918609"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="958810247"/>
<string key="NSReuseIdentifierKey">_NS:11</string>
</object>
</array>
<string key="NSFrame">{{17, 16}, {366, 140}}</string>
<string key="NSFrame">{{17, 16}, {366, 137}}</string>
<reference key="NSSuperview" ref="1005"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="731672371"/>
@@ -396,20 +475,8 @@
<int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Security</string>
<object class="NSFont" key="NSSupport">
<string key="NSName">LucidaGrande</string>
<double key="NSSize">11</double>
<int key="NSfFlags">3100</int>
</object>
<object class="NSColor" key="NSBackgroundColor">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">textBackgroundColor</string>
<object class="NSColor" key="NSColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MQA</bytes>
</object>
</object>
<reference key="NSSupport" ref="26"/>
<reference key="NSBackgroundColor" ref="116323791"/>
<object class="NSColor" key="NSTextColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes>
@@ -422,10 +489,10 @@
<bool key="NSTransparent">NO</bool>
</object>
</array>
<string key="NSFrameSize">{400, 230}</string>
<string key="NSFrameSize">{400, 251}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="145041823"/>
<reference key="NSNextKeyView" ref="996160987"/>
<string key="NSClassName">NSView</string>
</object>
</array>
@@ -479,6 +546,14 @@
</object>
<int key="connectionID">878</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">createUntitledOnActivation</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="366343837"/>
</object>
<int key="connectionID">920</int>
</object>
</array>
<object class="IBMutableOrderedSet" key="objectRecords">
<array key="orderedObjects">
@@ -510,22 +585,6 @@
<int key="objectID">1</int>
<reference key="object" ref="1005"/>
<array class="NSMutableArray" key="children">
<object class="IBNSLayoutConstraint" id="505875569">
<reference key="firstItem" ref="60918609"/>
<int key="firstAttribute">3</int>
<int key="relation">0</int>
<reference key="secondItem" ref="1005"/>
<int key="secondAttribute">3</int>
<float key="multiplier">1</float>
<object class="IBLayoutConstant" key="constant">
<double key="value">74</double>
</object>
<float key="priority">1000</float>
<reference key="containingView" ref="1005"/>
<int key="scoringType">3</int>
<float key="scoringTypeFloat">9</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="213536579">
<reference key="firstItem" ref="1005"/>
<int key="firstAttribute">4</int>
@@ -542,6 +601,22 @@
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="871081113">
<reference key="firstItem" ref="60918609"/>
<int key="firstAttribute">3</int>
<int key="relation">0</int>
<reference key="secondItem" ref="996160987"/>
<int key="secondAttribute">4</int>
<float key="multiplier">1</float>
<object class="IBNSLayoutSymbolicConstant" key="constant">
<double key="value">8</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="484547610">
<reference key="firstItem" ref="1005"/>
<int key="firstAttribute">6</int>
@@ -574,24 +649,40 @@
<float key="scoringTypeFloat">40</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="119736576">
<reference key="firstItem" ref="145041823"/>
<object class="IBNSLayoutConstraint" id="198070882">
<reference key="firstItem" ref="996160987"/>
<int key="firstAttribute">3</int>
<int key="relation">0</int>
<reference key="secondItem" ref="1005"/>
<int key="secondAttribute">3</int>
<float key="multiplier">1</float>
<object class="IBLayoutConstant" key="constant">
<double key="value">37</double>
<object class="IBNSLayoutSymbolicConstant" key="constant">
<double key="value">20</double>
</object>
<float key="priority">1000</float>
<reference key="containingView" ref="1005"/>
<int key="scoringType">3</int>
<float key="scoringTypeFloat">9</float>
<int key="scoringType">9</int>
<float key="scoringTypeFloat">40</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="689860785">
<reference key="firstItem" ref="1005"/>
<int key="firstAttribute">6</int>
<int key="relation">0</int>
<reference key="secondItem" ref="996160987"/>
<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">8</int>
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="1065146703">
<reference key="firstItem" ref="145041823"/>
<reference key="firstItem" ref="996160987"/>
<int key="firstAttribute">5</int>
<int key="relation">0</int>
<reference key="secondItem" ref="1005"/>
@@ -606,7 +697,7 @@
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="250630005">
<object class="IBNSLayoutConstraint" id="557216379">
<reference key="firstItem" ref="1005"/>
<int key="firstAttribute">8</int>
<int key="relation">0</int>
@@ -614,7 +705,7 @@
<int key="secondAttribute">0</int>
<float key="multiplier">1</float>
<object class="IBLayoutConstant" key="constant">
<double key="value">230</double>
<double key="value">251</double>
</object>
<float key="priority">1000</float>
<reference key="containingView" ref="1005"/>
@@ -638,8 +729,8 @@
<float key="scoringTypeFloat">40</float>
<int key="contentType">1</int>
</object>
<reference ref="996160987"/>
<reference ref="60918609"/>
<reference ref="145041823"/>
</array>
<reference key="parent" ref="0"/>
</object>
@@ -679,6 +770,22 @@
<float key="scoringTypeFloat">9</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="217416544">
<reference key="firstItem" ref="222890410"/>
<int key="firstAttribute">4</int>
<int key="relation">0</int>
<reference key="secondItem" ref="958810247"/>
<int key="secondAttribute">4</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="60918609"/>
<int key="scoringType">6</int>
<float key="scoringTypeFloat">24</float>
<int key="contentType">2</int>
</object>
<object class="IBNSLayoutConstraint" id="459585909">
<reference key="firstItem" ref="222890410"/>
<int key="firstAttribute">5</int>
@@ -855,22 +962,6 @@
<float key="scoringTypeFloat">9</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="1014678196">
<reference key="firstItem" ref="958810247"/>
<int key="firstAttribute">10</int>
<int key="relation">0</int>
<reference key="secondItem" ref="222890410"/>
<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="60918609"/>
<int key="scoringType">6</int>
<float key="scoringTypeFloat">24</float>
<int key="contentType">2</int>
</object>
<object class="IBNSLayoutConstraint" id="891799107">
<reference key="firstItem" ref="958810247"/>
<int key="firstAttribute">5</int>
@@ -1027,24 +1118,6 @@
<reference key="object" ref="891799107"/>
<reference key="parent" ref="60918609"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">530</int>
<reference key="object" ref="145041823"/>
<array class="NSMutableArray" key="children">
<reference ref="168279901"/>
</array>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">531</int>
<reference key="object" ref="168279901"/>
<reference key="parent" ref="145041823"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">532</int>
<reference key="object" ref="1065146703"/>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">584</int>
<reference key="object" ref="272904029"/>
@@ -1105,11 +1178,6 @@
<reference key="object" ref="871797750"/>
<reference key="parent" ref="326334884"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">784</int>
<reference key="object" ref="1014678196"/>
<reference key="parent" ref="60918609"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">789</int>
<reference key="object" ref="311160635"/>
@@ -1125,11 +1193,6 @@
<reference key="object" ref="484547610"/>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">798</int>
<reference key="object" ref="1063893674"/>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">801</int>
<reference key="object" ref="806133159"/>
@@ -1163,26 +1226,6 @@
<reference key="object" ref="772519144"/>
<reference key="parent" ref="60918609"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">840</int>
<reference key="object" ref="213536579"/>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">845</int>
<reference key="object" ref="119736576"/>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">846</int>
<reference key="object" ref="505875569"/>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">847</int>
<reference key="object" ref="250630005"/>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">861</int>
<reference key="object" ref="1037442692"/>
@@ -1233,6 +1276,186 @@
<reference key="object" ref="777025190"/>
<reference key="parent" ref="222890410"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">888</int>
<reference key="object" ref="996160987"/>
<array class="NSMutableArray" key="children">
<object class="IBNSLayoutConstraint" id="680904412">
<reference key="firstItem" ref="996160987"/>
<int key="firstAttribute">4</int>
<int key="relation">0</int>
<reference key="secondItem" ref="145041823"/>
<int key="secondAttribute">4</int>
<float key="multiplier">1</float>
<object class="IBLayoutConstant" key="constant">
<double key="value">11</double>
</object>
<float key="priority">1000</float>
<reference key="containingView" ref="996160987"/>
<int key="scoringType">9</int>
<float key="scoringTypeFloat">40</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="700397535">
<reference key="firstItem" ref="145041823"/>
<int key="firstAttribute">3</int>
<int key="relation">0</int>
<reference key="secondItem" ref="366343837"/>
<int key="secondAttribute">4</int>
<float key="multiplier">1</float>
<object class="IBNSLayoutSymbolicConstant" key="constant">
<double key="value">6</double>
</object>
<float key="priority">1000</float>
<reference key="containingView" ref="996160987"/>
<int key="scoringType">9</int>
<float key="scoringTypeFloat">40</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="32139976">
<reference key="firstItem" ref="145041823"/>
<int key="firstAttribute">5</int>
<int key="relation">0</int>
<reference key="secondItem" ref="996160987"/>
<int key="secondAttribute">5</int>
<float key="multiplier">1</float>
<object class="IBLayoutConstant" key="constant">
<double key="value">16</double>
</object>
<float key="priority">1000</float>
<reference key="containingView" ref="996160987"/>
<int key="scoringType">8</int>
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="255254776">
<reference key="firstItem" ref="366343837"/>
<int key="firstAttribute">5</int>
<int key="relation">0</int>
<reference key="secondItem" ref="996160987"/>
<int key="secondAttribute">5</int>
<float key="multiplier">1</float>
<object class="IBLayoutConstant" key="constant">
<double key="value">16</double>
</object>
<float key="priority">1000</float>
<reference key="containingView" ref="996160987"/>
<int key="scoringType">8</int>
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="650293569">
<reference key="firstItem" ref="366343837"/>
<int key="firstAttribute">3</int>
<int key="relation">0</int>
<reference key="secondItem" ref="996160987"/>
<int key="secondAttribute">3</int>
<float key="multiplier">1</float>
<object class="IBLayoutConstant" key="constant">
<double key="value">25</double>
</object>
<float key="priority">1000</float>
<reference key="containingView" ref="996160987"/>
<int key="scoringType">9</int>
<float key="scoringTypeFloat">40</float>
<int key="contentType">3</int>
</object>
<reference ref="366343837"/>
<reference ref="145041823"/>
</array>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">891</int>
<reference key="object" ref="1065146703"/>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">893</int>
<reference key="object" ref="689860785"/>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">530</int>
<reference key="object" ref="145041823"/>
<array class="NSMutableArray" key="children">
<reference ref="168279901"/>
</array>
<reference key="parent" ref="996160987"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">531</int>
<reference key="object" ref="168279901"/>
<reference key="parent" ref="145041823"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">894</int>
<reference key="object" ref="32139976"/>
<reference key="parent" ref="996160987"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">879</int>
<reference key="object" ref="366343837"/>
<array class="NSMutableArray" key="children">
<reference ref="480309686"/>
</array>
<reference key="parent" ref="996160987"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">880</int>
<reference key="object" ref="480309686"/>
<reference key="parent" ref="366343837"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">896</int>
<reference key="object" ref="650293569"/>
<reference key="parent" ref="996160987"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">897</int>
<reference key="object" ref="255254776"/>
<reference key="parent" ref="996160987"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">903</int>
<reference key="object" ref="198070882"/>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">901</int>
<reference key="object" ref="680904412"/>
<reference key="parent" ref="996160987"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">898</int>
<reference key="object" ref="700397535"/>
<reference key="parent" ref="996160987"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">906</int>
<reference key="object" ref="871081113"/>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">916</int>
<reference key="object" ref="217416544"/>
<reference key="parent" ref="60918609"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">917</int>
<reference key="object" ref="213536579"/>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">918</int>
<reference key="object" ref="1063893674"/>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">919</int>
<reference key="object" ref="557216379"/>
<reference key="parent" ref="1005"/>
</object>
</array>
</object>
<dictionary class="NSMutableDictionary" key="flattenedProperties">
@@ -1241,13 +1464,14 @@
<string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<array key="1.IBNSViewMetadataConstraints">
<reference ref="1063893674"/>
<reference ref="250630005"/>
<reference ref="557216379"/>
<reference ref="1065146703"/>
<reference ref="119736576"/>
<reference ref="689860785"/>
<reference ref="198070882"/>
<reference ref="989429017"/>
<reference ref="484547610"/>
<reference ref="871081113"/>
<reference ref="213536579"/>
<reference ref="505875569"/>
</array>
<boolean value="NO" key="1.IBNSViewMetadataLastInspectedTranslatesAutoresizingMaskIntoConstraints"/>
<boolean value="NO" key="1.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
@@ -1275,9 +1499,8 @@
<boolean value="NO" key="447.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
<string key="447.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="448.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<array key="465.IBNSViewMetadataConstraints">
<array class="NSMutableArray" key="465.IBNSViewMetadataConstraints">
<reference ref="891799107"/>
<reference ref="1014678196"/>
<reference ref="432174165"/>
<reference ref="933426524"/>
<reference ref="236685633"/>
@@ -1289,6 +1512,7 @@
<reference ref="311160635"/>
<reference ref="437525640"/>
<reference ref="459585909"/>
<reference ref="217416544"/>
<reference ref="920770187"/>
<reference ref="771059501"/>
</array>
@@ -1300,7 +1524,6 @@
<boolean value="NO" key="530.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
<string key="530.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="531.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="532.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="NO" key="584.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
<string key="584.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="585.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -1312,21 +1535,15 @@
<string key="630.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="631.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="773.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="784.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="788.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="789.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="792.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="798.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="801.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="803.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="804.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="NO" key="805.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
<string key="805.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="806.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="840.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="845.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="846.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="847.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="861.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="862.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="867.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -1337,12 +1554,37 @@
<string key="875.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="876.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="877.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="NO" key="879.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
<string key="879.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="880.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<array key="888.IBNSViewMetadataConstraints">
<reference ref="650293569"/>
<reference ref="255254776"/>
<reference ref="32139976"/>
<reference ref="700397535"/>
<reference ref="680904412"/>
</array>
<boolean value="NO" key="888.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
<string key="888.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="891.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="893.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="894.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="896.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="897.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="898.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="901.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="903.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="906.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="916.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="917.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="918.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="919.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">878</int>
<int key="maxID">920</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -1352,6 +1594,7 @@
<dictionary class="NSMutableDictionary" key="outlets">
<string key="clearPasteboardOnQuitCheckButton">NSButton</string>
<string key="clearPasteboardTimeoutPopup">NSPopUpButton</string>
<string key="createUntitledOnActivation">NSButton</string>
<string key="idleTimeOutPopup">NSPopUpButton</string>
<string key="lockOnSleepCheckButton">NSButton</string>
<string key="reopenLastDatabase">NSButton</string>
@@ -1365,6 +1608,10 @@
<string key="name">clearPasteboardTimeoutPopup</string>
<string key="candidateClassName">NSPopUpButton</string>
</object>
<object class="IBToOneOutletInfo" key="createUntitledOnActivation">
<string key="name">createUntitledOnActivation</string>
<string key="candidateClassName">NSButton</string>
</object>
<object class="IBToOneOutletInfo" key="idleTimeOutPopup">
<string key="name">idleTimeOutPopup</string>
<string key="candidateClassName">NSPopUpButton</string>

View File

@@ -32,6 +32,8 @@
<string>NSTextField</string>
<string>NSTextFieldCell</string>
<string>NSTextView</string>
<string>NSTokenField</string>
<string>NSTokenFieldCell</string>
<string>NSView</string>
</array>
<array key="IBDocument.PluginDependencies">
@@ -202,13 +204,13 @@
<string key="NSFrame">{{0, 31}, {293, 399}}</string>
<reference key="NSSuperview" ref="87082330"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="177600245"/>
<reference key="NSNextKeyView" ref="726109125"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<array class="NSMutableArray" key="NSTabViewItems">
<object class="NSTabViewItem" id="1002013291">
<string key="NSIdentifier">1</string>
<object class="NSView" key="NSView" id="726109125">
<nil key="NSNextResponder"/>
<reference key="NSNextResponder" ref="166081160"/>
<int key="NSvFlags">256</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSTextField" id="734056912">
@@ -216,6 +218,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 365}, {35, 14}}</string>
<reference key="NSSuperview" ref="726109125"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="909883915"/>
<string key="NSReuseIdentifierKey">_NS:1535</string>
<bool key="NSEnabled">YES</bool>
@@ -248,6 +251,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{20, 335}, {253, 22}}</string>
<reference key="NSSuperview" ref="726109125"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="328122838"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
@@ -282,6 +286,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 313}, {58, 14}}</string>
<reference key="NSSuperview" ref="726109125"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="800408621"/>
<string key="NSReuseIdentifierKey">_NS:1535</string>
<bool key="NSEnabled">YES</bool>
@@ -302,6 +307,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{20, 283}, {253, 22}}</string>
<reference key="NSSuperview" ref="726109125"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="428053603"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
@@ -323,6 +329,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{20, 231}, {253, 22}}</string>
<reference key="NSSuperview" ref="726109125"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="279643156"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
@@ -344,6 +351,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 261}, {25, 14}}</string>
<reference key="NSSuperview" ref="726109125"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="484293743"/>
<string key="NSReuseIdentifierKey">_NS:1535</string>
<bool key="NSEnabled">YES</bool>
@@ -364,6 +372,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 209}, {58, 14}}</string>
<reference key="NSSuperview" ref="726109125"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="685310174"/>
<string key="NSReuseIdentifierKey">_NS:1535</string>
<bool key="NSEnabled">YES</bool>
@@ -384,7 +393,8 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{20, 152}, {253, 19}}</string>
<reference key="NSSuperview" ref="726109125"/>
<reference key="NSNextKeyView" ref="13391205"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1027186598"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<string key="NSHuggingPriority">{250, 750}</string>
<bool key="NSEnabled">YES</bool>
@@ -413,6 +423,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 35}, {259, 11}}</string>
<reference key="NSSuperview" ref="726109125"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="212627618"/>
<string key="NSReuseIdentifierKey">_NS:1535</string>
<bool key="NSEnabled">YES</bool>
@@ -437,7 +448,8 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 16}, {259, 11}}</string>
<reference key="NSSuperview" ref="726109125"/>
<reference key="NSNextKeyView" ref="816254670"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="894571713"/>
<string key="NSReuseIdentifierKey">_NS:1535</string>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="72260846">
@@ -457,6 +469,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{20, 179}, {214, 22}}</string>
<reference key="NSSuperview" ref="726109125"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1035439471"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
@@ -481,6 +494,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{242, 177}, {31, 25}}</string>
<reference key="NSSuperview" ref="726109125"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="172507372"/>
<string key="NSReuseIdentifierKey">_NS:22</string>
<bool key="NSEnabled">YES</bool>
@@ -504,8 +518,58 @@
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTokenField" id="908063476">
<reference key="NSNextResponder" ref="726109125"/>
<int key="NSvFlags">268</int>
<set class="NSMutableSet" key="NSDragTypes">
<string>NSStringPboardType</string>
</set>
<string key="NSFrame">{{20, 73}, {253, 50}}</string>
<reference key="NSSuperview" ref="726109125"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="13391205"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
<object class="NSTokenFieldCell" key="NSCell" id="416219844">
<int key="NSCellFlags">337641472</int>
<int key="NSCellFlags2">32768</int>
<reference key="NSSupport" ref="323604925"/>
<string key="NSCellIdentifier">_NS:9</string>
<reference key="NSControlView" ref="908063476"/>
<reference key="NSBackgroundColor" ref="955209345"/>
<reference key="NSTextColor" ref="345368012"/>
<reference key="NSDelegate" ref="908063476"/>
<double key="NSCompletionDelay">0.0</double>
<int key="NSTokenStyle">0</int>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<int key="NSTokenFieldVersion">2</int>
</object>
<object class="NSTextField" id="1027186598">
<reference key="NSNextResponder" ref="726109125"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 131}, {38, 14}}</string>
<reference key="NSSuperview" ref="726109125"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="908063476"/>
<string key="NSReuseIdentifierKey">_NS:1535</string>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="391470272">
<int key="NSCellFlags">68157504</int>
<int key="NSCellFlags2">272761856</int>
<string key="NSContents">Tags</string>
<reference key="NSSupport" ref="26"/>
<string key="NSCellIdentifier">_NS:1535</string>
<reference key="NSControlView" ref="1027186598"/>
<reference key="NSBackgroundColor" ref="533509460"/>
<reference key="NSTextColor" ref="1062890562"/>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
</array>
<string key="NSFrameSize">{293, 399}</string>
<reference key="NSSuperview" ref="166081160"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="734056912"/>
<string key="NSReuseIdentifierKey">_NS:11</string>
</object>
@@ -624,7 +688,6 @@
<int key="NSvFlags">256</int>
<string key="NSFrame">{{236, 1}, {16, 332}}</string>
<reference key="NSSuperview" ref="850153963"/>
<reference key="NSNextKeyView" ref="816254670"/>
<string key="NSReuseIdentifierKey">_NS:83</string>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<reference key="NSTarget" ref="850153963"/>
@@ -893,7 +956,7 @@
</object>
<object class="NSTabViewItem" id="800410412">
<object class="NSView" key="NSView" id="177600245">
<reference key="NSNextResponder" ref="166081160"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSButton" id="966066653">
@@ -901,7 +964,6 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{241, 362}, {32, 19}}</string>
<reference key="NSSuperview" ref="177600245"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="892620201"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
@@ -927,7 +989,6 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 365}, {80, 14}}</string>
<reference key="NSSuperview" ref="177600245"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="966066653"/>
<string key="NSReuseIdentifierKey">_NS:1535</string>
<bool key="NSEnabled">YES</bool>
@@ -957,7 +1018,6 @@
<array class="NSMutableArray" key="NSSubviews"/>
<string key="NSFrameSize">{259, 333}</string>
<reference key="NSSuperview" ref="236190992"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="291769955"/>
<string key="NSReuseIdentifierKey">_NS:13</string>
<bool key="NSEnabled">YES</bool>
@@ -1020,7 +1080,6 @@
</array>
<string key="NSFrame">{{1, 1}, {259, 333}}</string>
<reference key="NSSuperview" ref="892620201"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="441697535"/>
<string key="NSReuseIdentifierKey">_NS:11</string>
<reference key="NSDocView" ref="441697535"/>
@@ -1032,7 +1091,6 @@
<int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{224, 17}, {15, 102}}</string>
<reference key="NSSuperview" ref="892620201"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1045948787"/>
<string key="NSReuseIdentifierKey">_NS:58</string>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
@@ -1045,8 +1103,6 @@
<int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{1, 119}, {223, 15}}</string>
<reference key="NSSuperview" ref="892620201"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="894571713"/>
<string key="NSReuseIdentifierKey">_NS:60</string>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<int key="NSsFlags">1</int>
@@ -1057,7 +1113,6 @@
</array>
<string key="NSFrame">{{16, 20}, {261, 335}}</string>
<reference key="NSSuperview" ref="177600245"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="236190992"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<int key="NSsFlags">133681</int>
@@ -1071,8 +1126,6 @@
</object>
</array>
<string key="NSFrameSize">{293, 399}</string>
<reference key="NSSuperview" ref="166081160"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="40836012"/>
</object>
<string key="NSLabel">Fields</string>
@@ -1080,13 +1133,13 @@
<reference key="NSTabView" ref="166081160"/>
</object>
</array>
<reference key="NSSelectedTabViewItem" ref="800410412"/>
<reference key="NSSelectedTabViewItem" ref="1002013291"/>
<reference key="NSFont" ref="308723166"/>
<int key="NSTvFlags">6</int>
<bool key="NSAllowTruncatedLabels">YES</bool>
<bool key="NSDrawsBackground">YES</bool>
<array class="NSMutableArray" key="NSSubviews">
<reference ref="177600245"/>
<reference ref="726109125"/>
</array>
</object>
</array>
@@ -2279,7 +2332,7 @@
<reference key="firstItem" ref="13391205"/>
<int key="firstAttribute">3</int>
<int key="relation">1</int>
<reference key="secondItem" ref="172507372"/>
<reference key="secondItem" ref="908063476"/>
<int key="secondAttribute">4</int>
<float key="multiplier">1</float>
<object class="IBNSLayoutSymbolicConstant" key="constant">
@@ -2355,6 +2408,86 @@
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="1016066557">
<reference key="firstItem" ref="908063476"/>
<int key="firstAttribute">3</int>
<int key="relation">0</int>
<reference key="secondItem" ref="1027186598"/>
<int key="secondAttribute">4</int>
<float key="multiplier">1</float>
<object class="IBNSLayoutSymbolicConstant" key="constant">
<double key="value">8</double>
</object>
<float key="priority">1000</float>
<reference key="containingView" ref="726109125"/>
<int key="scoringType">6</int>
<float key="scoringTypeFloat">24</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="565410329">
<reference key="firstItem" ref="908063476"/>
<int key="firstAttribute">5</int>
<int key="relation">0</int>
<reference key="secondItem" ref="726109125"/>
<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="726109125"/>
<int key="scoringType">8</int>
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="20584493">
<reference key="firstItem" ref="726109125"/>
<int key="firstAttribute">6</int>
<int key="relation">0</int>
<reference key="secondItem" ref="908063476"/>
<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="726109125"/>
<int key="scoringType">8</int>
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="833644028">
<reference key="firstItem" ref="1027186598"/>
<int key="firstAttribute">3</int>
<int key="relation">0</int>
<reference key="secondItem" ref="172507372"/>
<int key="secondAttribute">4</int>
<float key="multiplier">1</float>
<object class="IBNSLayoutSymbolicConstant" key="constant">
<double key="value">8</double>
</object>
<float key="priority">1000</float>
<reference key="containingView" ref="726109125"/>
<int key="scoringType">6</int>
<float key="scoringTypeFloat">24</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="517799648">
<reference key="firstItem" ref="1027186598"/>
<int key="firstAttribute">5</int>
<int key="relation">0</int>
<reference key="secondItem" ref="726109125"/>
<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="726109125"/>
<int key="scoringType">8</int>
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
</object>
<object class="IBNSLayoutConstraint" id="319543535">
<reference key="firstItem" ref="172507372"/>
<int key="firstAttribute">3</int>
@@ -2751,6 +2884,8 @@
<reference ref="212627618"/>
<reference ref="1035439471"/>
<reference ref="685310174"/>
<reference ref="1027186598"/>
<reference ref="908063476"/>
</array>
<reference key="parent" ref="1002013291"/>
</object>
@@ -4624,11 +4759,6 @@
<reference key="object" ref="849686715"/>
<reference key="parent" ref="726109125"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2322</int>
<reference key="object" ref="775474818"/>
<reference key="parent" ref="726109125"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2345</int>
<reference key="object" ref="511009648"/>
@@ -4874,6 +5004,104 @@
<reference key="object" ref="346165127"/>
<reference key="parent" ref="511009648"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2371</int>
<reference key="object" ref="908063476"/>
<array class="NSMutableArray" key="children">
<reference ref="416219844"/>
<object class="IBNSLayoutConstraint" id="462547709">
<reference key="firstItem" ref="908063476"/>
<int key="firstAttribute">8</int>
<int key="relation">0</int>
<nil key="secondItem"/>
<int key="secondAttribute">0</int>
<float key="multiplier">1</float>
<object class="IBLayoutConstant" key="constant">
<double key="value">50</double>
</object>
<float key="priority">1000</float>
<reference key="containingView" ref="908063476"/>
<int key="scoringType">3</int>
<float key="scoringTypeFloat">9</float>
<int key="contentType">1</int>
</object>
</array>
<reference key="parent" ref="726109125"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2372</int>
<reference key="object" ref="416219844"/>
<reference key="parent" ref="908063476"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2380</int>
<reference key="object" ref="775474818"/>
<reference key="parent" ref="726109125"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2384</int>
<reference key="object" ref="1027186598"/>
<array class="NSMutableArray" key="children">
<reference ref="391470272"/>
<object class="IBNSLayoutConstraint" id="707273412">
<reference key="firstItem" ref="1027186598"/>
<int key="firstAttribute">7</int>
<int key="relation">0</int>
<nil key="secondItem"/>
<int key="secondAttribute">0</int>
<float key="multiplier">1</float>
<object class="IBLayoutConstant" key="constant">
<double key="value">32</double>
</object>
<float key="priority">1000</float>
<reference key="containingView" ref="1027186598"/>
<int key="scoringType">3</int>
<float key="scoringTypeFloat">9</float>
<int key="contentType">1</int>
</object>
</array>
<reference key="parent" ref="726109125"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2385</int>
<reference key="object" ref="391470272"/>
<reference key="parent" ref="1027186598"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2388</int>
<reference key="object" ref="20584493"/>
<reference key="parent" ref="726109125"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2389</int>
<reference key="object" ref="565410329"/>
<reference key="parent" ref="726109125"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2391</int>
<reference key="object" ref="707273412"/>
<reference key="parent" ref="1027186598"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2397</int>
<reference key="object" ref="517799648"/>
<reference key="parent" ref="726109125"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2398</int>
<reference key="object" ref="833644028"/>
<reference key="parent" ref="726109125"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2400</int>
<reference key="object" ref="1016066557"/>
<reference key="parent" ref="726109125"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2401</int>
<reference key="object" ref="462547709"/>
<reference key="parent" ref="908063476"/>
</object>
</array>
</object>
<dictionary class="NSMutableDictionary" key="flattenedProperties">
@@ -4955,6 +5183,11 @@
<reference ref="806657697"/>
<reference ref="404436173"/>
<reference ref="319543535"/>
<reference ref="517799648"/>
<reference ref="833644028"/>
<reference ref="20584493"/>
<reference ref="565410329"/>
<reference ref="1016066557"/>
<reference ref="1048935945"/>
<reference ref="849686715"/>
<reference ref="989194529"/>
@@ -5253,7 +5486,6 @@
<string key="2275.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2276.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2278.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2322.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2345.CustomClassName">MPCustomFieldTableCellView</string>
<array key="2345.IBNSViewMetadataConstraints">
<reference ref="283957064"/>
@@ -5290,6 +5522,26 @@
<string key="2362.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<array class="NSMutableArray" key="2371.IBNSViewMetadataConstraints">
<reference ref="462547709"/>
</array>
<boolean value="NO" key="2371.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
<string key="2371.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2372.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2380.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<array key="2384.IBNSViewMetadataConstraints">
<reference ref="707273412"/>
</array>
<boolean value="NO" key="2384.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
<string key="2384.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2385.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2388.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2389.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2391.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2397.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2398.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2400.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2401.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<array key="455.IBNSViewMetadataConstraints">
<reference ref="222939184"/>
<reference ref="1058743908"/>
@@ -5336,7 +5588,7 @@
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">2370</int>
<int key="maxID">2401</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">

View File

@@ -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>
@@ -828,6 +837,14 @@
</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>
@@ -932,6 +949,7 @@
<reference ref="544639599"/>
<reference ref="663106531"/>
<reference ref="438377242"/>
<reference ref="919874146"/>
</array>
<reference key="parent" ref="379814623"/>
</object>
@@ -1272,6 +1290,11 @@
<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">
@@ -1291,6 +1314,7 @@
<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>
@@ -1346,7 +1370,7 @@
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">1260</int>
<int key="maxID">1263</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -1407,6 +1431,7 @@
<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">
@@ -1418,6 +1443,10 @@
<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>

File diff suppressed because it is too large Load Diff

View File

@@ -50,7 +50,7 @@
<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>
@@ -65,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">

Binary file not shown.

Binary file not shown.

Binary file not shown.

View 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

View 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

View 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

View 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

View File

@@ -20,4 +20,6 @@
/* Returns the group with the UUID */
- (KdbGroup *)groupForUUID:(UUID *)uuid;
- (BOOL)isAnchestorOfGroup:(KdbGroup *)group;
@end

View File

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

View File

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

View File

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

View File

@@ -112,11 +112,21 @@
NSDocumentController *documentController = [NSDocumentController sharedDocumentController];
NSArray *documents = [documentController documents];
NSArray *recentDocuments = [documentController recentDocumentURLs];
if([documents count] == 0 && [recentDocuments count] > 0) {
NSURL *url = recentDocuments[0];
[documentController openDocumentWithContentsOfURL:url display:YES completionHandler:^(NSDocument *document, BOOL documentWasAlreadyOpen, NSError *error) {
// do nothing
}];
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) {}];
}
}

View File

@@ -12,6 +12,7 @@
#import "MPSelectedAttachmentTableCellView.h"
#import "Kdb4Node.h"
#import "Kdb3Node.h"
#import "HNHTableRowView.h"
@@ -20,9 +21,16 @@
- (void)tableViewSelectionDidChange:(NSNotification *)notification {
NSTableView *tableView = [notification object];
NSIndexSet *allColumns = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [[tableView tableColumns] count])];
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:[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 {
@@ -50,7 +58,9 @@
[[view imageView] setImage:[[NSWorkspace sharedWorkspace] iconForFileType:[binaryRef.key pathExtension]]];
}
else {
// Create view to support only one binary!
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;
}

View File

@@ -24,7 +24,8 @@
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_customFieldFrameChanged:) name:NSViewFrameDidChangeNotification object:view];
if([self.viewController.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
StringField *stringField = entry.stringFields[row];
[view.labelTextField bind:NSValueBinding toObject:stringField withKeyPath:MPStringFieldKeyUndoableKey options:nil];
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 File

@@ -12,15 +12,19 @@ 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 (weak) IBOutlet NSTabView *sectionTabView;
@property (weak) IBOutlet NSButton *saveButton;
@property (weak) IBOutlet NSButton *cancelButton;
/* General Tab */
@property (weak) IBOutlet NSTextField *databaseNameTextField;
@@ -28,8 +32,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,6 +53,12 @@ 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;

View File

@@ -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,16 +56,13 @@
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.cancelButton bind:NSEnabledBinding toObject:self withKeyPath:@"hasValidPasswordOrKey" options:nil];
[self.sectionTabView setDelegate:self];
[self update];
}
- (IBAction)save:(id)sender {
@@ -64,7 +70,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,16 +78,38 @@
/* 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];
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];
}
/* Close to finish */
[self close:nil];
@@ -96,65 +124,216 @@
- (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)_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 +345,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

View File

@@ -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];
@@ -103,6 +105,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;
@@ -120,11 +130,11 @@
NSData *rawData = nil;
if(binary) {
if(binary.compressed) {
rawData = [NSMutableData mutableDataWithBase64DecodedData:[binary.data dataUsingEncoding:NSASCIIStringEncoding]];
rawData = [NSMutableData mutableDataWithBase64DecodedData:[binary.data dataUsingEncoding:NSUTF8StringEncoding]];
rawData = [rawData gzipInflate];
}
else {
rawData = [NSMutableData mutableDataWithBase64DecodedData:[binary.data dataUsingEncoding:NSASCIIStringEncoding]];
rawData = [NSMutableData mutableDataWithBase64DecodedData:[binary.data dataUsingEncoding:NSUTF8StringEncoding]];
}
NSError *error = nil;
if( ![rawData writeToURL:location options:0 error:&error] ) {

View File

@@ -42,6 +42,7 @@ APPKIT_EXTERN NSString *const MPDocumentGroupKey;
@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;
@@ -66,6 +67,9 @@ 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;
@@ -79,7 +83,6 @@ APPKIT_EXTERN NSString *const MPDocumentGroupKey;
/*
All non-setter undoable actions
*/
- (BOOL)group:(KdbGroup *)group isMoveableToGroup:(KdbGroup *)target;
/* TODO in UNDO auslagen */
- (void)addStringField:(StringField *)field toEntry:(Kdb4Entry *)entry atIndex:(NSUInteger)index;
@@ -98,6 +101,7 @@ APPKIT_EXTERN NSString *const MPDocumentGroupKey;
- (void)saveAttachmentFromEntry:(KdbEntry *)anEntry toLocation:(NSURL *)location;
- (void)saveAttachment:(BinaryRef *)reference toLocation:(NSURL *)location;
- (void)removeAttachment:(BinaryRef *)reference fromEntry:(KdbEntry *)anEntry;
- (void)removeAttachmentFromEntry:(KdbEntry *)anEntry;
- (NSUInteger)nextBinaryId;
- (Binary *)findBinary:(BinaryRef *)reference;

View File

@@ -13,20 +13,25 @@
#import "MPRootAdapter.h"
#import "MPIconHelper.h"
#import "MPActionHelper.h"
#import "MPSettingsHelper.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"
#import "DataOutputStream.h"
@@ -61,7 +66,6 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
@property (strong) NSURL *lockFileURL;
@property (readonly) BOOL useTrash;
@property (weak, readonly) KdbGroup *trash;
@property (strong) IBOutlet NSView *warningView;
@property (weak) IBOutlet NSImageView *warningViewImage;
@@ -162,6 +166,13 @@ 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];
}
@@ -303,6 +314,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;
@@ -312,11 +343,24 @@ 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)) {
@@ -332,6 +376,12 @@ 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;
@@ -349,52 +399,20 @@ 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 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)deleteEntry:(KdbEntry *)entry {
if(self.useTrash) {
if(!self.trash) {
[self _createTrashGroup];
}
if([self isItemTrashed:entry]) {
return; // Entry is already trashed
}
[entry moveToTrashUndoable:self.trash atIndex:[self.trash.entries count]];
}
else {
@@ -407,6 +425,9 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
if(!self.trash) {
[self _createTrashGroup];
}
if( (group == self.trash) || [self isItemTrashed:group] ) {
return; //Groups already trashed cannot be deleted
}
[group moveToTrashUndoable:self.trash atIndex:[self.trash.groups count]];
}
else {
@@ -419,6 +440,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
- (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];
}
@@ -429,12 +451,16 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
}
[[[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 {
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", "")];
@@ -460,6 +486,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
BOOL hasEntries = [self.trash.entries count] > 0;
return (hasEntries || hasGroups);
}
return [super validateUserInterfaceItem:anItem];
}
@@ -503,7 +530,24 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
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

View File

@@ -32,6 +32,12 @@ APPKIT_EXTERN NSString *const MPCurrentItemChangedNotification;
@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;
@@ -40,7 +46,7 @@ APPKIT_EXTERN NSString *const MPCurrentItemChangedNotification;
- (IBAction)showDatabaseSettings:(id)sender;
- (IBAction)exportDatabase:(id)sender;
- (void)lock:(id)sender;
- (IBAction)lock:(id)sender;
- (void)createGroup:(id)sender;
- (void)toggleInspector:(id)sender;

View File

@@ -17,6 +17,7 @@
#import "MPActionHelper.h"
#import "MPDatabaseSettingsWindowController.h"
#import "MPConstants.h"
#import "MPSettingsHelper.h"
NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCurrentItemChangedNotification";
@@ -62,9 +63,6 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
#pragma mark View Handling
@@ -94,6 +92,11 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
[_splitView setHoldingPriority:NSLayoutPriorityDefaultLow+2 forSubviewAtIndex:0];
[_splitView setHoldingPriority:NSLayoutPriorityDefaultLow+1 forSubviewAtIndex:2];
BOOL showInspector = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyShowInspector];
if(!showInspector) {
[inspectorView removeFromSuperview];
}
[[self window] setDelegate:self];
MPDocument *document = [self document];
@@ -103,6 +106,8 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
else {
[self showEntries];
}
[_splitView setAutosaveName:@"SplitView"];
}
- (void)_setContentViewController:(MPViewController *)viewController {
@@ -187,6 +192,9 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
if(itemAction == @selector(exportDatabase:)) {
enabled = (nil != document.treeV4);
}
if(itemAction == [MPActionHelper actionOfType:MPActionDelete]) {
enabled &= (nil != _currentItem) && (_currentItem != document.trash);
}
enabled &= !( !document.decrypted || document.isLocked || document.isReadOnly );
return enabled;
@@ -197,20 +205,55 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
if(!document.decrypted || document.isLocked || document.isReadOnly) {
return NO;
}
SEL itemAction = [theItem action];
if( itemAction == [MPActionHelper actionOfType:MPActionLock]) {
return document.hasPasswordOrKey;
MPActionType actionType = [MPActionHelper typeForAction:[theItem action]];
switch (actionType) {
case MPActionAddGroup:
case MPActionAddEntry:
return (nil != _outlineViewController.selectedGroup);
case MPActionDelete: {
BOOL valid = (nil != _currentItem);
valid &= (_currentItem != document.trash);
valid &= ![document isItemTrashed:_currentItem];
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 != _outlineViewController.selectedGroup);
case MPActionDelete: {
BOOL valid = (nil != _currentItem);
valid &= (_currentItem != document.trash);
valid &= ![document isItemTrashed:_currentItem];
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;
}
@@ -230,7 +273,7 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
[self _showDatabaseSetting:MPDatabaseSettingsTabGeneral];
}
- (void)lock:(id)sender {
- (IBAction)lock:(id)sender {
MPDocument *document = [self document];
if(!document.hasPasswordOrKey) {
return; // Document needs a password/keyfile to be lockable
@@ -252,18 +295,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 {
@@ -275,7 +321,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];
@@ -321,7 +367,7 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
if(removeInspector) {
[inspectorView removeFromSuperview];
}
[contentView layout];
[contentView layoutSubtreeIfNeeded];
MPDocument *document = [self document];
document.locked = NO;
@@ -332,6 +378,7 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
[_outlineViewController showOutline];
}
#pragma mark NSWindowDelegate
- (void)windowDidUpdate:(NSNotification *)notification {
id firstResonder = [[self window] firstResponder];
@@ -344,16 +391,22 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
}
}
- (void)windowDidBecomeKey:(NSNotification *)notification {
MPDocument *document = [self document];
if(!document.hasPasswordOrKey && document.decrypted) {
[self performSelector:@selector(editPassword:) withObject:nil afterDelay:0.5];
}
}
#pragma mark Helper
- (void)_showDatabaseSetting:(MPDatabaseSettingsTab)tab {
if(!self.documentSettingsWindowController) {
_documentSettingsWindowController = [[MPDatabaseSettingsWindowController alloc] initWithDocument:[self document]];
}
[self.documentSettingsWindowController update];
if(!self.documentSettingsWindowController) {
_documentSettingsWindowController = [[MPDatabaseSettingsWindowController alloc] initWithDocument:[self document]];
}
[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 {

View File

@@ -513,6 +513,11 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
[document deleteEntry:entry];
}
#pragma mark Validation
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
return YES;
}
- (void)_toggleFilterSpace:(id)sender {
NSButton *button = sender;
NSNumber *value = self.filterButtonToMode[[button identifier]];

View File

@@ -17,5 +17,6 @@
@property (weak) IBOutlet NSPopUpButton *idleTimeOutPopup;
@property (weak) IBOutlet NSButton *lockOnSleepCheckButton;
@property (weak) IBOutlet NSButton *reopenLastDatabase;
@property (weak) IBOutlet NSButton *createUntitledOnActivation;
@end

View File

@@ -33,6 +33,7 @@ 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];
@@ -42,5 +43,7 @@ NSString *const MPGeneralSetingsIdentifier = @"GeneralSettingsTab";
[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

View File

@@ -59,8 +59,8 @@ 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;
@@ -137,25 +137,32 @@ enum {
}
- (void)setModificationDate:(NSDate *)modificationDate {
NSString *modificationString = [NSDateFormatter localizedStringFromDate:modificationDate
dateStyle:NSDateFormatterShortStyle
timeStyle:NSDateFormatterShortStyle];
modificationString = [modificationDate humanized];
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];
creationString = [creationDate humanized];
_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 {
@@ -178,7 +185,7 @@ enum {
[_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([_attachmentsController content] != nil){
@@ -377,9 +384,9 @@ 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];

View File

@@ -77,8 +77,7 @@
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 ) {
[_draggedItem moveToGroupUndoable:target atIndex:index];
}

View File

@@ -19,7 +19,7 @@ APPKIT_EXTERN NSString *const MPOutlineViewDidChangeGroupSelection;
@property (readonly, weak) NSOutlineView *outlineView;
@property (weak) IBOutlet HNHGradientView *bottomBar;
@property (weak, readonly) KdbGroup *selectedGroup;
@property (weak, readonly, nonatomic) KdbGroup *selectedGroup;
- (void)clearSelection;
- (void)showOutline;

View File

@@ -33,7 +33,7 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
}
@property (weak) IBOutlet NSOutlineView *outlineView;
@property (weak) IBOutlet NSButton *addGroupButton;
@property (weak) KdbGroup *selectedGroup;
@property (nonatomic, weak) KdbGroup *selectedGroup;
@property (strong) NSTreeController *treeController;
@property (strong) MPOutlineDataSource *datasource;
@@ -89,6 +89,29 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
[_outlineView expandItem:node expandChildren:YES];
}
#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];
}
}
}
//- (void)setSelectedGroup:(KdbGroup *)selectedGroup {
// if(_selectedGroup != selectedGroup) {
// _selectedGroup = selectedGroup;
// if([selectedGroup isKindOfClass:[Kdb4Group class]]) {
// MPDocument *document = [[self windowController] document];
// document.treeV4.lastSelectedGroup = ((Kdb4Group *)selectedGroup).uuid;
// }
// }
//}
#pragma mark Notifications
- (void)setupNotifications:(MPDocumentWindowController *)windowController {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_didCreateGroup:) name:MPDocumentDidAddGroupNotification object:[windowController document]];
@@ -114,14 +137,26 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
}
}
- (void)setDatabaseNameWrapper:(NSString *)databaseNameWrapper {
if(![_databaseNameWrapper isEqualToString:databaseNameWrapper]) {
if([databaseNameWrapper length] == 0) {
_databaseNameWrapper = NSLocalizedString(@"DATABASE", "Default name database");
}
else {
_databaseNameWrapper= [databaseNameWrapper copy];
#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
}
}

View File

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

View File

@@ -17,6 +17,15 @@ 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
@@ -26,6 +35,7 @@ NSString *const kMPSettingsKeyIdleLockTimeOut = @"IdleLockTimeOut";
+ (NSDictionary *)_standardDefaults {
return @{
kMPSettingsKeyShowInspector: @YES, // Show the Inspector by default
kMPSettingsKeyPasteboardClearTimeout: @30, // 30 seconds
kMPSettingsKeyClearPasteboardOnQuit: @YES,
kMPSettingsKeyOpenEmptyDatabaseOnLaunch: @NO,
@@ -34,7 +44,12 @@ NSString *const kMPSettingsKeyIdleLockTimeOut = @"IdleLockTimeOut";
kMPSettingsKeyEnableHttpServer: @NO,
kMPSettingsKeyShowMenuItem: @YES,
kMPSettingsKeyLockOnSleep: @YES,
kMPSettingsKeyIdleLockTimeOut: @0 // 5 minutes
kMPSettingsKeyIdleLockTimeOut: @0, // 5 minutes
kMPSettingsKeyLegacyHideNotes: @NO,
kMPSettingsKeyLegacyHidePassword: @YES,
kMPSettingsKeyLegacyHideTitle: @NO,
kMPSettingsKeyLegacyHideURL: @NO,
kMPSettingsKeyLegacyHideUsername: @NO
};
}

View File

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

View File

@@ -44,11 +44,11 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.3.3</string>
<string>0.3.6</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>2508</string>
<string>2517</string>
<key>LSMinimumSystemVersion</key>
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
<key>NSHumanReadableCopyright</key>

View File

@@ -16,15 +16,38 @@
- (NSString *)humanized {
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:NSMinuteCalendarUnit|NSHourCalendarUnit|NSDayCalendarUnit fromDate:self toDate:[NSDate date] options:0];
if([components day] > 1) {
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];
}
if([components day] == 1) {
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]];

View 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

View 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

View File

@@ -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,16 @@ 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}}\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\kerning1\expnd0\expndtw3
\
\kerning1\expnd0\expndtw0 Copyright \'a92012 Mike Abdullah, Karelia Software. Alle Rechte vorbehalten.}

Binary file not shown.

View File

@@ -11,8 +11,9 @@
\b \
License:\
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
\b0 MacPass KeePass compatible client for OS X\
\b0 \cf0 MacPass KeePass compatible client for OS X\
Copyright (c) 2012-2013 Michael Starke, HicknHack Software GmbH\
\
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by\
@@ -40,6 +41,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 +55,13 @@ 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.}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 803 B

View 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

View 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

View 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 KPKTreeLoadingTest : SenTestCase {
@private
NSData *_data;
KPKPassword *_password;
}
@end

View 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 "KPKTreeLoadingTest.h"
#import "KPKTreeLoader.h"
#import "KPKPassword.h"
@implementation KPKTreeLoadingTest
- (void)setUp {
NSBundle *myBundle = [NSBundle bundleForClass:[self class]];
NSURL *url = [myBundle URLForResource:@"Test_Password_1234" withExtension:@"kdbx"];
_data = [NSData dataWithContentsOfURL:url];
_password = [[KPKPassword alloc] initWithPassword:@"1234" key:nil];
}
- (void)tearDown {
_data = nil;
_password = nil;
}
- (void)testLoading {
KPKTreeLoader *loader = [[KPKTreeLoader alloc] initWithData:_data password:_password];
KPKTree *tree = [loader loadTree:NULL];
STAssertNil(tree, @"Loading should broken");
}
@end