Started Move to KeePassKit - Project compiles but does NOT work properly

Removed MiniKeePass Categories.
Moved Random streams form MiniKeePass to KeePassKit
Changed MacPass to use KeePassKit
This commit is contained in:
michael starke
2013-09-01 02:16:27 +02:00
parent 319d165141
commit 5e4254b45f
70 changed files with 498 additions and 2521 deletions

View File

@@ -9,7 +9,6 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
4C0104BB17C37BFC00173EF3 /* KPKLegacyHeaderUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0104BA17C37BFC00173EF3 /* KPKLegacyHeaderUtility.m */; }; 4C0104BB17C37BFC00173EF3 /* KPKLegacyHeaderUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0104BA17C37BFC00173EF3 /* KPKLegacyHeaderUtility.m */; };
4C0104BE17C37DA400173EF3 /* KPKXmlUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0104BD17C37DA400173EF3 /* KPKXmlUtilities.m */; }; 4C0104BE17C37DA400173EF3 /* KPKXmlUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0104BD17C37DA400173EF3 /* KPKXmlUtilities.m */; };
4C01C23F1764D2980016D5D0 /* KdbEntry+Undo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C01C23E1764D2980016D5D0 /* KdbEntry+Undo.m */; };
4C01C2421764D8980016D5D0 /* MPContextMenuHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C01C2411764D8980016D5D0 /* MPContextMenuHelper.m */; }; 4C01C2421764D8980016D5D0 /* MPContextMenuHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C01C2411764D8980016D5D0 /* MPContextMenuHelper.m */; };
4C01C245176500C40016D5D0 /* HNHLevelIndicatorCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C01C244176500C40016D5D0 /* HNHLevelIndicatorCell.m */; }; 4C01C245176500C40016D5D0 /* HNHLevelIndicatorCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C01C244176500C40016D5D0 /* HNHLevelIndicatorCell.m */; };
4C055E74179620BF00BD2BAB /* NSString+Reference.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C055E73179620BF00BD2BAB /* NSString+Reference.m */; }; 4C055E74179620BF00BD2BAB /* NSString+Reference.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C055E73179620BF00BD2BAB /* NSString+Reference.m */; };
@@ -37,7 +36,6 @@
4C19E500178E26EF002F2CD0 /* Test_Password_1234.kdbx in Resources */ = {isa = PBXBuildFile; fileRef = 4C19E4FF178E26EF002F2CD0 /* Test_Password_1234.kdbx */; }; 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 */; }; 4C19E503178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C19E502178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m */; };
4C1DDCDD1711ECEB00C98DA3 /* PasswordCreatorWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */; }; 4C1DDCDD1711ECEB00C98DA3 /* PasswordCreatorWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */; };
4C22040D1746ED160054C916 /* KdbGroup+Undo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C22040C1746ED160054C916 /* KdbGroup+Undo.m */; };
4C245B76176E1E3D0086100E /* DDData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C245A6A176E1E3C0086100E /* DDData.m */; }; 4C245B76176E1E3D0086100E /* DDData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C245A6A176E1E3C0086100E /* DDData.m */; };
4C245B77176E1E3D0086100E /* DDNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C245A6C176E1E3C0086100E /* DDNumber.m */; }; 4C245B77176E1E3D0086100E /* DDNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C245A6C176E1E3C0086100E /* DDNumber.m */; };
4C245B78176E1E3D0086100E /* DDRange.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C245A6E176E1E3C0086100E /* DDRange.m */; }; 4C245B78176E1E3D0086100E /* DDRange.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C245A6E176E1E3C0086100E /* DDRange.m */; };
@@ -65,13 +63,7 @@
4C245BF1176E1E3D0086100E /* DispatchQueueLogFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C245B72176E1E3D0086100E /* DispatchQueueLogFormatter.m */; }; 4C245BF1176E1E3D0086100E /* DispatchQueueLogFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C245B72176E1E3D0086100E /* DispatchQueueLogFormatter.m */; };
4C25D58716CF0FAA00F6806C /* EntryView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C25D58616CF0FAA00F6806C /* EntryView.xib */; }; 4C25D58716CF0FAA00F6806C /* EntryView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C25D58616CF0FAA00F6806C /* EntryView.xib */; };
4C2671AD17A7D8FC00F3A645 /* HNHColorWell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2671AC17A7D8FC00F3A645 /* HNHColorWell.m */; }; 4C2671AD17A7D8FC00F3A645 /* HNHColorWell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2671AC17A7D8FC00F3A645 /* HNHColorWell.m */; };
4C2724CE1778EFB100FD8456 /* NSData+Random.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2724CD1778EFB100FD8456 /* NSData+Random.m */; };
4C2724D11778EFE300FD8456 /* NSString+Empty.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2724D01778EFE300FD8456 /* NSString+Empty.m */; };
4C2724D41778FA0700FD8456 /* NSDate+Packed.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2724D31778FA0700FD8456 /* NSDate+Packed.m */; };
4C2724D71778FF1A00FD8456 /* NSUUID+KeePassKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2724D61778FF1A00FD8456 /* NSUUID+KeePassKit.m */; }; 4C2724D71778FF1A00FD8456 /* NSUUID+KeePassKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2724D61778FF1A00FD8456 /* NSUUID+KeePassKit.m */; };
4C2724DA17790E7C00FD8456 /* NSMutableData+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2724D917790E7C00FD8456 /* NSMutableData+Base64.m */; };
4C2A6134177A1D5F00C9826C /* KPLErrorCodes.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2A6133177A1D5F00C9826C /* KPLErrorCodes.m */; };
4C2C4C2C16D3BE3700D49295 /* KdbGroup+MPTreeTools.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C2C4C2B16D3BE3700D49295 /* KdbGroup+MPTreeTools.m */; };
4C2C8B341787500E009649F3 /* UnprotectedWarningView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C2C8B331787500E009649F3 /* UnprotectedWarningView.xib */; }; 4C2C8B341787500E009649F3 /* UnprotectedWarningView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C2C8B331787500E009649F3 /* UnprotectedWarningView.xib */; };
4C2E381D16D11FF900037A9D /* 03_ServerTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C2E381A16D11FF900037A9D /* 03_ServerTemplate.pdf */; }; 4C2E381D16D11FF900037A9D /* 03_ServerTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C2E381A16D11FF900037A9D /* 03_ServerTemplate.pdf */; };
4C2E381E16D11FF900037A9D /* 04_KlipperTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C2E381B16D11FF900037A9D /* 04_KlipperTemplate.pdf */; }; 4C2E381E16D11FF900037A9D /* 04_KlipperTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C2E381B16D11FF900037A9D /* 04_KlipperTemplate.pdf */; };
@@ -83,20 +75,16 @@
4C305F3E179A1A760082334F /* image.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C305F3D179A1A760082334F /* image.png */; }; 4C305F3E179A1A760082334F /* image.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C305F3D179A1A760082334F /* image.png */; };
4C3666411787327E00B249F1 /* MPDocument+Attachments.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3666401787327E00B249F1 /* MPDocument+Attachments.m */; }; 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 */; }; 4C366643178748F500B249F1 /* 99_HarddiskTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C366642178748F500B249F1 /* 99_HarddiskTemplate.pdf */; };
4C36E5B4177CD4FB00152132 /* Kdb4Tree+KVOAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C36E5B3177CD4FB00152132 /* Kdb4Tree+KVOAdditions.m */; };
4C37A6731769393300AD0A40 /* HNHTableHeaderCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C37A6721769393300AD0A40 /* HNHTableHeaderCell.m */; }; 4C37A6731769393300AD0A40 /* HNHTableHeaderCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C37A6721769393300AD0A40 /* HNHTableHeaderCell.m */; };
4C37A84015B8B474005EF8EE /* MPOutlineDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C37A83F15B8B474005EF8EE /* MPOutlineDataSource.m */; }; 4C37A84015B8B474005EF8EE /* MPOutlineDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C37A83F15B8B474005EF8EE /* MPOutlineDataSource.m */; };
4C39B3F5178FEFAE0027DC7C /* KPKNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C39B3F4178FEFAE0027DC7C /* KPKNode.m */; }; 4C39B3F5178FEFAE0027DC7C /* KPKNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C39B3F4178FEFAE0027DC7C /* KPKNode.m */; };
4C3BD51516D276F800389F1F /* MPToolbarDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3BD51416D276F800389F1F /* MPToolbarDelegate.m */; }; 4C3BD51516D276F800389F1F /* MPToolbarDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3BD51416D276F800389F1F /* MPToolbarDelegate.m */; };
4C3D4C0817594CA40038DAAC /* HNHSeparator.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D4C0717594CA40038DAAC /* HNHSeparator.m */; }; 4C3D4C0817594CA40038DAAC /* HNHSeparator.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D4C0717594CA40038DAAC /* HNHSeparator.m */; };
4C3E1CC0177DEFB3003BD9BD /* StringField+Undo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3E1CBF177DEFB3003BD9BD /* StringField+Undo.m */; };
4C3F28541791EDFD00703281 /* KPKErrors.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3F28531791EDFD00703281 /* KPKErrors.m */; }; 4C3F28541791EDFD00703281 /* KPKErrors.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3F28531791EDFD00703281 /* KPKErrors.m */; };
4C3FFD9E16DAF60600DF9186 /* FilterBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C3FFD9D16DAF60600DF9186 /* FilterBar.xib */; }; 4C3FFD9E16DAF60600DF9186 /* FilterBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C3FFD9D16DAF60600DF9186 /* FilterBar.xib */; };
4C431BCD16E2A82800700A81 /* MPPasteBoardController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C431BCC16E2A82700700A81 /* MPPasteBoardController.m */; }; 4C431BCD16E2A82800700A81 /* MPPasteBoardController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C431BCC16E2A82700700A81 /* MPPasteBoardController.m */; };
4C431BCF16E2BAB000700A81 /* OverlayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C431BCE16E2BAB000700A81 /* OverlayWindow.xib */; }; 4C431BCF16E2BAB000700A81 /* OverlayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C431BCE16E2BAB000700A81 /* OverlayWindow.xib */; };
4C4436771792BE810099E220 /* KPKFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4436761792BE810099E220 /* KPKFormat.m */; }; 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 */; }; 4C45FB1C178E09ED0010007D /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C45FB1B178E09ED0010007D /* SenTestingKit.framework */; };
4C45FB1D178E09ED0010007D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C77E36615B84A240093A587 /* Cocoa.framework */; }; 4C45FB1D178E09ED0010007D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C77E36615B84A240093A587 /* Cocoa.framework */; };
4C45FB23178E09ED0010007D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4C45FB21178E09ED0010007D /* InfoPlist.strings */; }; 4C45FB23178E09ED0010007D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4C45FB21178E09ED0010007D /* InfoPlist.strings */; };
@@ -105,7 +93,6 @@
4C46B88517063A070046109A /* NSString+MPPasswordCreation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C46B88417063A070046109A /* NSString+MPPasswordCreation.m */; }; 4C46B88517063A070046109A /* NSString+MPPasswordCreation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C46B88417063A070046109A /* NSString+MPPasswordCreation.m */; };
4C46E09E17673A0A00DA62E8 /* HNHShadowBox.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C46E09D17673A0A00DA62E8 /* HNHShadowBox.m */; }; 4C46E09E17673A0A00DA62E8 /* HNHShadowBox.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C46E09D17673A0A00DA62E8 /* HNHShadowBox.m */; };
4C4A100F176286FD00BBF2CA /* MPTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A100E176286FD00BBF2CA /* MPTableView.m */; }; 4C4A100F176286FD00BBF2CA /* MPTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A100E176286FD00BBF2CA /* MPTableView.m */; };
4C4A101217629DA900BBF2CA /* KdbGroup+KVOAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A101117629DA900BBF2CA /* KdbGroup+KVOAdditions.m */; };
4C4B7EE917A45EC6000234C7 /* MPDatePickingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B7EE717A45EC5000234C7 /* MPDatePickingViewController.m */; }; 4C4B7EE917A45EC6000234C7 /* MPDatePickingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B7EE717A45EC5000234C7 /* MPDatePickingViewController.m */; };
4C4B7EEA17A45EC6000234C7 /* DatePickingView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C4B7EE817A45EC5000234C7 /* DatePickingView.xib */; }; 4C4B7EEA17A45EC6000234C7 /* DatePickingView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C4B7EE817A45EC5000234C7 /* DatePickingView.xib */; };
4C4B7EEE17A467E1000234C7 /* MPGroupInspectorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B7EEC17A467E1000234C7 /* MPGroupInspectorViewController.m */; }; 4C4B7EEE17A467E1000234C7 /* MPGroupInspectorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B7EEC17A467E1000234C7 /* MPGroupInspectorViewController.m */; };
@@ -114,7 +101,6 @@
4C4B7EF417A467FC000234C7 /* EntryInspectorView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C4B7EF217A467FC000234C7 /* EntryInspectorView.xib */; }; 4C4B7EF417A467FC000234C7 /* EntryInspectorView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C4B7EF217A467FC000234C7 /* EntryInspectorView.xib */; };
4C4B7EF817A4B335000234C7 /* MPUniqueCharactersFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B7EF717A4B335000234C7 /* MPUniqueCharactersFormatter.m */; }; 4C4B7EF817A4B335000234C7 /* MPUniqueCharactersFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B7EF717A4B335000234C7 /* MPUniqueCharactersFormatter.m */; };
4C4FCE15177CFE6B00BBF7AE /* MPCustomFieldTableCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4FCE14177CFE6B00BBF7AE /* MPCustomFieldTableCellView.m */; }; 4C4FCE15177CFE6B00BBF7AE /* MPCustomFieldTableCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4FCE14177CFE6B00BBF7AE /* MPCustomFieldTableCellView.m */; };
4C4FCE18177D03D700BBF7AE /* Kdb4Entry+KVOAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4FCE17177D03D700BBF7AE /* Kdb4Entry+KVOAdditions.m */; };
4C52A244177D7B9F0000D88F /* HNHScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C52A243177D7B9F0000D88F /* HNHScrollView.m */; }; 4C52A244177D7B9F0000D88F /* HNHScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C52A243177D7B9F0000D88F /* HNHScrollView.m */; };
4C52A88E1788628B00868229 /* 06_BlockDeviceTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C52A88B1788628B00868229 /* 06_BlockDeviceTemplate.pdf */; }; 4C52A88E1788628B00868229 /* 06_BlockDeviceTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C52A88B1788628B00868229 /* 06_BlockDeviceTemplate.pdf */; };
4C52A88F1788628B00868229 /* 13_KeysTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C52A88C1788628B00868229 /* 13_KeysTemplate.pdf */; }; 4C52A88F1788628B00868229 /* 13_KeysTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C52A88C1788628B00868229 /* 13_KeysTemplate.pdf */; };
@@ -123,7 +109,6 @@
4C5426F317BEEA8700A4424C /* Autotype_test.kdbx in Resources */ = {isa = PBXBuildFile; fileRef = 4C5426F217BEEA8700A4424C /* Autotype_test.kdbx */; }; 4C5426F317BEEA8700A4424C /* Autotype_test.kdbx in Resources */ = {isa = PBXBuildFile; fileRef = 4C5426F217BEEA8700A4424C /* Autotype_test.kdbx */; };
4C569D9E17652B0600595B62 /* MPConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C569D9D17652B0600595B62 /* MPConstants.m */; }; 4C569D9E17652B0600595B62 /* MPConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C569D9D17652B0600595B62 /* MPConstants.m */; };
4C569DA117652BFE00595B62 /* MPEntryTableDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C569DA017652BFE00595B62 /* MPEntryTableDataSource.m */; }; 4C569DA117652BFE00595B62 /* MPEntryTableDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C569DA017652BFE00595B62 /* MPEntryTableDataSource.m */; };
4C569DA417653F3500595B62 /* KdbEntry+MPTreeTools.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C569DA317653F3500595B62 /* KdbEntry+MPTreeTools.m */; };
4C57AE1417BA422B00CA4F34 /* MPSegmentedContextCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C57AE1317BA422B00CA4F34 /* MPSegmentedContextCell.m */; }; 4C57AE1417BA422B00CA4F34 /* MPSegmentedContextCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C57AE1317BA422B00CA4F34 /* MPSegmentedContextCell.m */; };
4C586F9E16D07ABD00E7DB57 /* 00_PasswordTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C586F9D16D07ABD00E7DB57 /* 00_PasswordTemplate.pdf */; }; 4C586F9E16D07ABD00E7DB57 /* 00_PasswordTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C586F9D16D07ABD00E7DB57 /* 00_PasswordTemplate.pdf */; };
4C586FA016D07D7200E7DB57 /* 01_PackageNetworkTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C586F9F16D07D7200E7DB57 /* 01_PackageNetworkTemplate.pdf */; }; 4C586FA016D07D7200E7DB57 /* 01_PackageNetworkTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C586F9F16D07D7200E7DB57 /* 01_PackageNetworkTemplate.pdf */; };
@@ -134,7 +119,15 @@
4C5A11FF1708DE8800223D8A /* PasswordCreatorView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C5A11FD1708DE8700223D8A /* PasswordCreatorView.xib */; }; 4C5A11FF1708DE8800223D8A /* PasswordCreatorView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C5A11FD1708DE8700223D8A /* PasswordCreatorView.xib */; };
4C5AA591179549A1008ECAD7 /* KPKXmlTreeWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5AA590179549A1008ECAD7 /* KPKXmlTreeWriter.m */; }; 4C5AA591179549A1008ECAD7 /* KPKXmlTreeWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5AA590179549A1008ECAD7 /* KPKXmlTreeWriter.m */; };
4C5BF67B175C01F300D53DF7 /* MPUppercaseStringValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5BF67A175C01F300D53DF7 /* MPUppercaseStringValueTransformer.m */; }; 4C5BF67B175C01F300D53DF7 /* MPUppercaseStringValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5BF67A175C01F300D53DF7 /* MPUppercaseStringValueTransformer.m */; };
4C5EC302177B700D00DA955B /* MPRootAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5EC301177B700D00DA955B /* MPRootAdapter.m */; }; 4C5CD35517D15DBD000B7F38 /* NSData+Gzip.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5CD34A17D15DBD000B7F38 /* NSData+Gzip.m */; };
4C5CD35617D15DBD000B7F38 /* NSData+Random.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5CD34C17D15DBD000B7F38 /* NSData+Random.m */; };
4C5CD35717D15DBD000B7F38 /* NSDate+Packed.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5CD34E17D15DBD000B7F38 /* NSDate+Packed.m */; };
4C5CD35817D15DBD000B7F38 /* NSMutableData+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5CD35017D15DBD000B7F38 /* NSMutableData+Base64.m */; };
4C5CD35917D15DBD000B7F38 /* NSString+Empty.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5CD35217D15DBD000B7F38 /* NSString+Empty.m */; };
4C5CD35A17D15DBD000B7F38 /* NSString+Hexdata.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5CD35417D15DBD000B7F38 /* NSString+Hexdata.m */; };
4C5CD36117D15DCA000B7F38 /* KPKArc4RandomStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5CD35C17D15DCA000B7F38 /* KPKArc4RandomStream.m */; };
4C5CD36217D15DCA000B7F38 /* KPKRandomStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5CD35E17D15DCA000B7F38 /* KPKRandomStream.m */; };
4C5CD36317D15DCA000B7F38 /* KPKSalsa20RandomStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5CD36017D15DCA000B7F38 /* KPKSalsa20RandomStream.m */; };
4C5FA86D17A5F26800C781C9 /* KPKDataStreamWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5FA86C17A5F26800C781C9 /* KPKDataStreamWriter.m */; }; 4C5FA86D17A5F26800C781C9 /* KPKDataStreamWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5FA86C17A5F26800C781C9 /* KPKDataStreamWriter.m */; };
4C5FE9AE17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5FE9AD17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.m */; }; 4C5FE9AE17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5FE9AD17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.m */; };
4C61EA0316D2FD0800AC519E /* MPOutlineViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C61EA0216D2FD0800AC519E /* MPOutlineViewController.m */; }; 4C61EA0316D2FD0800AC519E /* MPOutlineViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C61EA0216D2FD0800AC519E /* MPOutlineViewController.m */; };
@@ -147,37 +140,6 @@
4C63B8FB17A3154D0091BD72 /* MPContextToolbarButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C63B8FA17A3154D0091BD72 /* MPContextToolbarButton.m */; }; 4C63B8FB17A3154D0091BD72 /* MPContextToolbarButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C63B8FA17A3154D0091BD72 /* MPContextToolbarButton.m */; };
4C65C79C16DD283900E32CFF /* MPToolbarButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C65C79B16DD283900E32CFF /* MPToolbarButton.m */; }; 4C65C79C16DD283900E32CFF /* MPToolbarButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C65C79B16DD283900E32CFF /* MPToolbarButton.m */; };
4C65FAE916D16DDB006E0577 /* MPPasswordInputController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C65FAE716D16DDB006E0577 /* MPPasswordInputController.m */; }; 4C65FAE916D16DDB006E0577 /* MPPasswordInputController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C65FAE716D16DDB006E0577 /* MPPasswordInputController.m */; };
4C669B7F16760ED100DD0774 /* AesInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B3116760ED100DD0774 /* AesInputStream.m */; };
4C669B8016760ED100DD0774 /* AesOutputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B3316760ED100DD0774 /* AesOutputStream.m */; };
4C669B8116760ED100DD0774 /* Arc4RandomStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B3516760ED100DD0774 /* Arc4RandomStream.m */; };
4C669B8216760ED100DD0774 /* DataInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B3716760ED100DD0774 /* DataInputStream.m */; };
4C669B8316760ED100DD0774 /* DataOutputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B3916760ED100DD0774 /* DataOutputStream.m */; };
4C669B8416760ED100DD0774 /* FileInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B3B16760ED100DD0774 /* FileInputStream.m */; };
4C669B8516760ED100DD0774 /* FileOutputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B3D16760ED100DD0774 /* FileOutputStream.m */; };
4C669B8616760ED100DD0774 /* GZipInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B3F16760ED100DD0774 /* GZipInputStream.m */; };
4C669B8716760ED100DD0774 /* GZipOutputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B4116760ED100DD0774 /* GZipOutputStream.m */; };
4C669B8816760ED100DD0774 /* HashedInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B4316760ED100DD0774 /* HashedInputStream.m */; };
4C669B8916760ED100DD0774 /* HashedOutputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B4516760ED100DD0774 /* HashedOutputStream.m */; };
4C669B8A16760ED100DD0774 /* InputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B4716760ED100DD0774 /* InputStream.m */; };
4C669B8B16760ED100DD0774 /* OutputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B4916760ED100DD0774 /* OutputStream.m */; };
4C669B8C16760ED100DD0774 /* Sha256OutputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B4B16760ED100DD0774 /* Sha256OutputStream.m */; };
4C669B9016760ED100DD0774 /* DDXMLElement+MKPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B5416760ED100DD0774 /* DDXMLElement+MKPAdditions.m */; };
4C669B9116760ED100DD0774 /* Kdb.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B5616760ED100DD0774 /* Kdb.m */; };
4C669B9316760ED100DD0774 /* Kdb3Node.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B5A16760ED100DD0774 /* Kdb3Node.m */; };
4C669B9416760ED100DD0774 /* Kdb3Reader.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B5C16760ED100DD0774 /* Kdb3Reader.m */; };
4C669B9516760ED100DD0774 /* Kdb3Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B5E16760ED100DD0774 /* Kdb3Utils.m */; };
4C669B9616760ED100DD0774 /* Kdb3Writer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B6016760ED100DD0774 /* Kdb3Writer.m */; };
4C669B9716760ED100DD0774 /* Kdb4Node.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B6216760ED100DD0774 /* Kdb4Node.m */; };
4C669B9816760ED100DD0774 /* Kdb4Parser.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B6416760ED100DD0774 /* Kdb4Parser.m */; };
4C669B9916760ED100DD0774 /* Kdb4Persist.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B6616760ED100DD0774 /* Kdb4Persist.m */; };
4C669B9A16760ED100DD0774 /* Kdb4Reader.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B6816760ED100DD0774 /* Kdb4Reader.m */; };
4C669B9B16760ED100DD0774 /* Kdb4Writer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B6A16760ED100DD0774 /* Kdb4Writer.m */; };
4C669B9C16760ED100DD0774 /* KdbPassword.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B6D16760ED100DD0774 /* KdbPassword.m */; };
4C669B9D16760ED100DD0774 /* KdbReaderFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B7016760ED100DD0774 /* KdbReaderFactory.m */; };
4C669B9E16760ED100DD0774 /* KdbWriterFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B7316760ED100DD0774 /* KdbWriterFactory.m */; };
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 */; }; 4C67D33017981A2B00A7BDFC /* HNHTokenField.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C67D32F17981A2B00A7BDFC /* HNHTokenField.m */; };
4C67D33317981ABA00A7BDFC /* HNHTokenFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C67D33217981ABA00A7BDFC /* HNHTokenFieldCell.m */; }; 4C67D33317981ABA00A7BDFC /* HNHTokenFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C67D33217981ABA00A7BDFC /* HNHTokenFieldCell.m */; };
4C68456A17BC21DD00FCDBFC /* KPKAutotype.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C68456917BC21DD00FCDBFC /* KPKAutotype.m */; }; 4C68456A17BC21DD00FCDBFC /* KPKAutotype.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C68456917BC21DD00FCDBFC /* KPKAutotype.m */; };
@@ -215,12 +177,9 @@
4C7ABA4C17BAEC6700FF5799 /* 20_MiscTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C7ABA4717BAEC6700FF5799 /* 20_MiscTemplate.pdf */; }; 4C7ABA4C17BAEC6700FF5799 /* 20_MiscTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C7ABA4717BAEC6700FF5799 /* 20_MiscTemplate.pdf */; };
4C7ABA4E17BAEC7000FF5799 /* addEntryTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C7ABA4D17BAEC7000FF5799 /* addEntryTemplate.pdf */; }; 4C7ABA4E17BAEC7000FF5799 /* addEntryTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C7ABA4D17BAEC7000FF5799 /* addEntryTemplate.pdf */; };
4C7F35681779DFFB00C57890 /* Errors.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4C7F356A1779DFFB00C57890 /* Errors.strings */; }; 4C7F35681779DFFB00C57890 /* Errors.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4C7F356A1779DFFB00C57890 /* Errors.strings */; };
4C801AFC179310E2002821E3 /* NSString+Hexdata.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C801AFB179310E2002821E3 /* NSString+Hexdata.m */; };
4C80BB6F176DE06F00E5E248 /* HNHScrollDocumentViewAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C80BB6E176DE06F00E5E248 /* HNHScrollDocumentViewAdapter.m */; }; 4C80BB6F176DE06F00E5E248 /* HNHScrollDocumentViewAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C80BB6E176DE06F00E5E248 /* HNHScrollDocumentViewAdapter.m */; };
4C811C8316ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C811C8216ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m */; }; 4C811C8316ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C811C8216ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m */; };
4C83814215BF4677001AE468 /* MPDocumentWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C83814115BF4677001AE468 /* MPDocumentWindowController.m */; }; 4C83814215BF4677001AE468 /* MPDocumentWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C83814115BF4677001AE468 /* MPDocumentWindowController.m */; };
4C83F4AA1774B155006C5FC0 /* Kdb3Tree+NewTree.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C83F4A91774B155006C5FC0 /* Kdb3Tree+NewTree.m */; };
4C83F4AD1774B25F006C5FC0 /* Kdb4Tree+NewTree.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C83F4AC1774B25F006C5FC0 /* Kdb4Tree+NewTree.m */; };
4C888C9016EB6C91003D34A1 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4C888C8E16EB6C91003D34A1 /* Localizable.strings */; }; 4C888C9016EB6C91003D34A1 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4C888C8E16EB6C91003D34A1 /* Localizable.strings */; };
4C888C9316EB6F5E003D34A1 /* MPToolbarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C888C9216EB6F5E003D34A1 /* MPToolbarItem.m */; }; 4C888C9316EB6F5E003D34A1 /* MPToolbarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C888C9216EB6F5E003D34A1 /* MPToolbarItem.m */; };
4C888C9716EB754B003D34A1 /* MPActionHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C888C9616EB754B003D34A1 /* MPActionHelper.m */; }; 4C888C9716EB754B003D34A1 /* MPActionHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C888C9616EB754B003D34A1 /* MPActionHelper.m */; };
@@ -252,12 +211,11 @@
4CBA561617C2EA4900CE13D3 /* KPKTestXmlWriting.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBA561517C2EA4900CE13D3 /* KPKTestXmlWriting.m */; }; 4CBA561617C2EA4900CE13D3 /* KPKTestXmlWriting.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBA561517C2EA4900CE13D3 /* KPKTestXmlWriting.m */; };
4CC0D2CE17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC0D2CD17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m */; }; 4CC0D2CE17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC0D2CD17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m */; };
4CC0D2D117974A5A000B4BDA /* MPAttachmentTableViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC0D2D017974A5A000B4BDA /* MPAttachmentTableViewDelegate.m */; }; 4CC0D2D117974A5A000B4BDA /* MPAttachmentTableViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC0D2D017974A5A000B4BDA /* MPAttachmentTableViewDelegate.m */; };
4CC1AEBE16D4467C006D2AAB /* KdbTree+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC1AEBD16D4467C006D2AAB /* KdbTree+MPAdditions.m */; };
4CC299FF176F99E50050C939 /* MPRequestHandlerService.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC299FE176F99E50050C939 /* MPRequestHandlerService.m */; }; 4CC299FF176F99E50050C939 /* MPRequestHandlerService.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC299FE176F99E50050C939 /* MPRequestHandlerService.m */; };
4CC29A02176F9D140050C939 /* MPTestAssociateRequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC29A01176F9D140050C939 /* MPTestAssociateRequestHandler.m */; }; 4CC29A02176F9D140050C939 /* MPTestAssociateRequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC29A01176F9D140050C939 /* MPTestAssociateRequestHandler.m */; };
4CC3AABD175F4983003EF01B /* HNHRoundedTextFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC3AAB9175F4983003EF01B /* HNHRoundedTextFieldCell.m */; }; 4CC3AABD175F4983003EF01B /* HNHRoundedTextFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC3AAB9175F4983003EF01B /* HNHRoundedTextFieldCell.m */; };
4CC672791781D0C0006DEDCF /* KdbGroup+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC672781781D0C0006DEDCF /* KdbGroup+MPAdditions.m */; }; 4CC6DB7A17D23719002C6091 /* KPKNode+IconImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6DB7917D23719002C6091 /* KPKNode+IconImage.m */; };
4CC6727C1781D0D2006DEDCF /* KdbEntry+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6727B1781D0D2006DEDCF /* KdbEntry+MPAdditions.m */; }; 4CC6DB7D17D23DCE002C6091 /* KPKUTIs.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6DB7C17D23DCE002C6091 /* KPKUTIs.m */; };
4CC7EA1B17807E7E0089D4F3 /* HNHRoundedTextFieldCellHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7EA1A17807E7E0089D4F3 /* HNHRoundedTextFieldCellHelper.m */; }; 4CC7EA1B17807E7E0089D4F3 /* HNHRoundedTextFieldCellHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7EA1A17807E7E0089D4F3 /* HNHRoundedTextFieldCellHelper.m */; };
4CCEDE2A179F203B008402BE /* MPOutlineView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCEDE29179F203B008402BE /* MPOutlineView.m */; }; 4CCEDE2A179F203B008402BE /* MPOutlineView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCEDE29179F203B008402BE /* MPOutlineView.m */; };
4CCEDE2E179F213B008402BE /* MPNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCEDE2D179F213B008402BE /* MPNotifications.m */; }; 4CCEDE2E179F213B008402BE /* MPNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCEDE2D179F213B008402BE /* MPNotifications.m */; };
@@ -291,9 +249,7 @@
4CEAF85717BA9B1D001307A6 /* Keepass2Key.xml in Resources */ = {isa = PBXBuildFile; fileRef = 4CEAF85617BA9B1D001307A6 /* Keepass2Key.xml */; }; 4CEAF85717BA9B1D001307A6 /* Keepass2Key.xml in Resources */ = {isa = PBXBuildFile; fileRef = 4CEAF85617BA9B1D001307A6 /* Keepass2Key.xml */; };
4CEAF85B17BA9B44001307A6 /* KPKTestKeyfileParsing.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEAF85A17BA9B44001307A6 /* KPKTestKeyfileParsing.m */; }; 4CEAF85B17BA9B44001307A6 /* KPKTestKeyfileParsing.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEAF85A17BA9B44001307A6 /* KPKTestKeyfileParsing.m */; };
4CECB31717AC326D00EAFB0F /* KPKTestLegacyWriting.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CECB31617AC326D00EAFB0F /* KPKTestLegacyWriting.m */; }; 4CECB31717AC326D00EAFB0F /* KPKTestLegacyWriting.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CECB31617AC326D00EAFB0F /* KPKTestLegacyWriting.m */; };
4CF1F0CA1786B37900CD920E /* NSData+Gzip.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF1F0C81786B37900CD920E /* NSData+Gzip.m */; };
4CF29BF417879D0000851B60 /* 26_FileSaveTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */; }; 4CF29BF417879D0000851B60 /* 26_FileSaveTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */; };
4CF4FEE017AEA4A400712774 /* UUID+Pasterboard.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF4FEDF17AEA4A400712774 /* UUID+Pasterboard.m */; };
4CF62B86179385D700B660B6 /* KPKAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF62B85179385D700B660B6 /* KPKAttribute.m */; }; 4CF62B86179385D700B660B6 /* KPKAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF62B85179385D700B660B6 /* KPKAttribute.m */; };
4CF6C711176F4533007A811D /* MPStringLengthValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF6C710176F4533007A811D /* MPStringLengthValueTransformer.m */; }; 4CF6C711176F4533007A811D /* MPStringLengthValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF6C710176F4533007A811D /* MPStringLengthValueTransformer.m */; };
4CF6C718176F5234007A811D /* MPAssociateRequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF6C717176F5234007A811D /* MPAssociateRequestHandler.m */; }; 4CF6C718176F5234007A811D /* MPAssociateRequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF6C717176F5234007A811D /* MPAssociateRequestHandler.m */; };
@@ -302,12 +258,10 @@
4CF7805D176E71170032EE71 /* MPServerDaemon.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF7805C176E71170032EE71 /* MPServerDaemon.m */; }; 4CF7805D176E71170032EE71 /* MPServerDaemon.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF7805C176E71170032EE71 /* MPServerDaemon.m */; };
4CF7805F176E75110032EE71 /* ServerSettings.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CF7805E176E75110032EE71 /* ServerSettings.xib */; }; 4CF7805F176E75110032EE71 /* ServerSettings.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CF7805E176E75110032EE71 /* ServerSettings.xib */; };
4CF78064176E75AD0032EE71 /* MPServerSettingsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF78063176E75AD0032EE71 /* MPServerSettingsController.m */; }; 4CF78064176E75AD0032EE71 /* MPServerSettingsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF78063176E75AD0032EE71 /* MPServerSettingsController.m */; };
4CFB5E9F17AAD20200D9B10C /* Kdb4Group+Undo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFB5E9E17AAD20200D9B10C /* Kdb4Group+Undo.m */; };
4CFC53BF16E94729007396BE /* MPShadowBox.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFC53BE16E94729007396BE /* MPShadowBox.m */; }; 4CFC53BF16E94729007396BE /* MPShadowBox.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFC53BE16E94729007396BE /* MPShadowBox.m */; };
4CFC873B179DEDF3000DFC03 /* KPKMetaData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFC873A179DEDF3000DFC03 /* KPKMetaData.m */; }; 4CFC873B179DEDF3000DFC03 /* KPKMetaData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFC873A179DEDF3000DFC03 /* KPKMetaData.m */; };
4CFC873E179DF200000DFC03 /* KPKTimeInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFC873D179DF200000DFC03 /* KPKTimeInfo.m */; }; 4CFC873E179DF200000DFC03 /* KPKTimeInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFC873D179DF200000DFC03 /* KPKTimeInfo.m */; };
4CFC8743179DFD3E000DFC03 /* KPKTestXmlLoading.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFC8742179DFD3E000DFC03 /* KPKTestXmlLoading.m */; }; 4CFC8743179DFD3E000DFC03 /* KPKTestXmlLoading.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFC8742179DFD3E000DFC03 /* KPKTestXmlLoading.m */; };
4CFEB36E1799D9CF00AF1868 /* Kdb3Entry+KVOAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFEB36D1799D9CF00AF1868 /* Kdb3Entry+KVOAdditions.m */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
@@ -316,8 +270,6 @@
4C0104BC17C37C2B00173EF3 /* KPKXmlUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKXmlUtilities.h; sourceTree = "<group>"; }; 4C0104BC17C37C2B00173EF3 /* KPKXmlUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKXmlUtilities.h; sourceTree = "<group>"; };
4C0104BD17C37DA400173EF3 /* KPKXmlUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKXmlUtilities.m; sourceTree = "<group>"; }; 4C0104BD17C37DA400173EF3 /* KPKXmlUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKXmlUtilities.m; sourceTree = "<group>"; };
4C0104BF17C37DFC00173EF3 /* KPKTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKTypes.h; sourceTree = "<group>"; }; 4C0104BF17C37DFC00173EF3 /* KPKTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKTypes.h; sourceTree = "<group>"; };
4C01C23D1764D2980016D5D0 /* KdbEntry+Undo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KdbEntry+Undo.h"; sourceTree = "<group>"; };
4C01C23E1764D2980016D5D0 /* KdbEntry+Undo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KdbEntry+Undo.m"; sourceTree = "<group>"; };
4C01C2401764D8980016D5D0 /* MPContextMenuHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPContextMenuHelper.h; sourceTree = "<group>"; }; 4C01C2401764D8980016D5D0 /* MPContextMenuHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPContextMenuHelper.h; sourceTree = "<group>"; };
4C01C2411764D8980016D5D0 /* MPContextMenuHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPContextMenuHelper.m; sourceTree = "<group>"; }; 4C01C2411764D8980016D5D0 /* MPContextMenuHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPContextMenuHelper.m; sourceTree = "<group>"; };
4C01C243176500C40016D5D0 /* HNHLevelIndicatorCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHLevelIndicatorCell.h; sourceTree = "<group>"; }; 4C01C243176500C40016D5D0 /* HNHLevelIndicatorCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHLevelIndicatorCell.h; sourceTree = "<group>"; };
@@ -372,8 +324,6 @@
4C19E501178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDatabasePasswordAndKeyfile.h; sourceTree = "<group>"; }; 4C19E501178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDatabasePasswordAndKeyfile.h; sourceTree = "<group>"; };
4C19E502178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDatabasePasswordAndKeyfile.m; sourceTree = "<group>"; }; 4C19E502178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDatabasePasswordAndKeyfile.m; sourceTree = "<group>"; };
4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PasswordCreatorWindow.xib; sourceTree = "<group>"; }; 4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PasswordCreatorWindow.xib; sourceTree = "<group>"; };
4C22040B1746ED160054C916 /* KdbGroup+Undo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KdbGroup+Undo.h"; sourceTree = "<group>"; };
4C22040C1746ED160054C916 /* KdbGroup+Undo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KdbGroup+Undo.m"; sourceTree = "<group>"; };
4C245A69176E1E3C0086100E /* DDData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDData.h; sourceTree = "<group>"; }; 4C245A69176E1E3C0086100E /* DDData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDData.h; sourceTree = "<group>"; };
4C245A6A176E1E3C0086100E /* DDData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDData.m; sourceTree = "<group>"; }; 4C245A6A176E1E3C0086100E /* DDData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDData.m; sourceTree = "<group>"; };
4C245A6B176E1E3C0086100E /* DDNumber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDNumber.h; sourceTree = "<group>"; }; 4C245A6B176E1E3C0086100E /* DDNumber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDNumber.h; sourceTree = "<group>"; };
@@ -429,20 +379,8 @@
4C25D58616CF0FAA00F6806C /* EntryView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = EntryView.xib; sourceTree = "<group>"; }; 4C25D58616CF0FAA00F6806C /* EntryView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = EntryView.xib; sourceTree = "<group>"; };
4C2671AB17A7D8FC00F3A645 /* HNHColorWell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHColorWell.h; sourceTree = "<group>"; }; 4C2671AB17A7D8FC00F3A645 /* HNHColorWell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHColorWell.h; sourceTree = "<group>"; };
4C2671AC17A7D8FC00F3A645 /* HNHColorWell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHColorWell.m; sourceTree = "<group>"; }; 4C2671AC17A7D8FC00F3A645 /* HNHColorWell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHColorWell.m; sourceTree = "<group>"; };
4C2724CC1778EFB100FD8456 /* NSData+Random.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+Random.h"; sourceTree = "<group>"; };
4C2724CD1778EFB100FD8456 /* NSData+Random.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+Random.m"; sourceTree = "<group>"; };
4C2724CF1778EFE300FD8456 /* NSString+Empty.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+Empty.h"; sourceTree = "<group>"; };
4C2724D01778EFE300FD8456 /* NSString+Empty.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+Empty.m"; sourceTree = "<group>"; };
4C2724D21778FA0700FD8456 /* NSDate+Packed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+Packed.h"; sourceTree = "<group>"; };
4C2724D31778FA0700FD8456 /* NSDate+Packed.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+Packed.m"; sourceTree = "<group>"; };
4C2724D51778FF1A00FD8456 /* NSUUID+KeePassKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSUUID+KeePassKit.h"; sourceTree = "<group>"; }; 4C2724D51778FF1A00FD8456 /* NSUUID+KeePassKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSUUID+KeePassKit.h"; sourceTree = "<group>"; };
4C2724D61778FF1A00FD8456 /* NSUUID+KeePassKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSUUID+KeePassKit.m"; sourceTree = "<group>"; }; 4C2724D61778FF1A00FD8456 /* NSUUID+KeePassKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSUUID+KeePassKit.m"; sourceTree = "<group>"; };
4C2724D817790E7C00FD8456 /* NSMutableData+Base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableData+Base64.h"; sourceTree = "<group>"; };
4C2724D917790E7C00FD8456 /* NSMutableData+Base64.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableData+Base64.m"; sourceTree = "<group>"; };
4C2A6132177A181300C9826C /* KPLErrorCodes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPLErrorCodes.h; sourceTree = "<group>"; };
4C2A6133177A1D5F00C9826C /* KPLErrorCodes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPLErrorCodes.m; sourceTree = "<group>"; };
4C2C4C2A16D3BE3700D49295 /* KdbGroup+MPTreeTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KdbGroup+MPTreeTools.h"; sourceTree = "<group>"; };
4C2C4C2B16D3BE3700D49295 /* KdbGroup+MPTreeTools.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KdbGroup+MPTreeTools.m"; sourceTree = "<group>"; };
4C2C8B331787500E009649F3 /* UnprotectedWarningView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UnprotectedWarningView.xib; sourceTree = "<group>"; }; 4C2C8B331787500E009649F3 /* UnprotectedWarningView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UnprotectedWarningView.xib; sourceTree = "<group>"; };
4C2E381A16D11FF900037A9D /* 03_ServerTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 03_ServerTemplate.pdf; sourceTree = "<group>"; }; 4C2E381A16D11FF900037A9D /* 03_ServerTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 03_ServerTemplate.pdf; sourceTree = "<group>"; };
4C2E381B16D11FF900037A9D /* 04_KlipperTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 04_KlipperTemplate.pdf; sourceTree = "<group>"; }; 4C2E381B16D11FF900037A9D /* 04_KlipperTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 04_KlipperTemplate.pdf; sourceTree = "<group>"; };
@@ -458,8 +396,6 @@
4C305F3D179A1A760082334F /* image.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = image.png; path = Images/image.png; 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>"; }; 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; name = 99_HarddiskTemplate.pdf; path = Icons/99_HarddiskTemplate.pdf; sourceTree = "<group>"; }; 4C366642178748F500B249F1 /* 99_HarddiskTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = 99_HarddiskTemplate.pdf; path = Icons/99_HarddiskTemplate.pdf; sourceTree = "<group>"; };
4C36E5B2177CD4FB00152132 /* Kdb4Tree+KVOAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Kdb4Tree+KVOAdditions.h"; sourceTree = "<group>"; };
4C36E5B3177CD4FB00152132 /* Kdb4Tree+KVOAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Kdb4Tree+KVOAdditions.m"; sourceTree = "<group>"; };
4C37A6711769393300AD0A40 /* HNHTableHeaderCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHTableHeaderCell.h; sourceTree = "<group>"; }; 4C37A6711769393300AD0A40 /* HNHTableHeaderCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHTableHeaderCell.h; sourceTree = "<group>"; };
4C37A6721769393300AD0A40 /* HNHTableHeaderCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHTableHeaderCell.m; sourceTree = "<group>"; }; 4C37A6721769393300AD0A40 /* HNHTableHeaderCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHTableHeaderCell.m; sourceTree = "<group>"; };
4C37A83E15B8B474005EF8EE /* MPOutlineDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOutlineDataSource.h; sourceTree = "<group>"; }; 4C37A83E15B8B474005EF8EE /* MPOutlineDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOutlineDataSource.h; sourceTree = "<group>"; };
@@ -470,8 +406,6 @@
4C3BD51416D276F800389F1F /* MPToolbarDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPToolbarDelegate.m; sourceTree = "<group>"; }; 4C3BD51416D276F800389F1F /* MPToolbarDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPToolbarDelegate.m; sourceTree = "<group>"; };
4C3D4C0617594CA40038DAAC /* HNHSeparator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHSeparator.h; sourceTree = "<group>"; }; 4C3D4C0617594CA40038DAAC /* HNHSeparator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHSeparator.h; sourceTree = "<group>"; };
4C3D4C0717594CA40038DAAC /* HNHSeparator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHSeparator.m; sourceTree = "<group>"; }; 4C3D4C0717594CA40038DAAC /* HNHSeparator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHSeparator.m; sourceTree = "<group>"; };
4C3E1CBE177DEFB3003BD9BD /* StringField+Undo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "StringField+Undo.h"; sourceTree = "<group>"; };
4C3E1CBF177DEFB3003BD9BD /* StringField+Undo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "StringField+Undo.m"; sourceTree = "<group>"; };
4C3F28521791EDE800703281 /* KPKErrors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKErrors.h; sourceTree = "<group>"; }; 4C3F28521791EDE800703281 /* KPKErrors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKErrors.h; sourceTree = "<group>"; };
4C3F28531791EDFD00703281 /* KPKErrors.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKErrors.m; sourceTree = "<group>"; }; 4C3F28531791EDFD00703281 /* KPKErrors.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKErrors.m; sourceTree = "<group>"; };
4C3FFD9D16DAF60600DF9186 /* FilterBar.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FilterBar.xib; sourceTree = "<group>"; }; 4C3FFD9D16DAF60600DF9186 /* FilterBar.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FilterBar.xib; sourceTree = "<group>"; };
@@ -480,10 +414,6 @@
4C431BCE16E2BAB000700A81 /* OverlayWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = OverlayWindow.xib; sourceTree = "<group>"; }; 4C431BCE16E2BAB000700A81 /* OverlayWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = OverlayWindow.xib; sourceTree = "<group>"; };
4C4436751792BE810099E220 /* KPKFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KPKFormat.h; path = Format/KPKFormat.h; sourceTree = "<group>"; }; 4C4436751792BE810099E220 /* KPKFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KPKFormat.h; path = Format/KPKFormat.h; sourceTree = "<group>"; };
4C4436761792BE810099E220 /* KPKFormat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = KPKFormat.m; path = Format/KPKFormat.m; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 4C4436761792BE810099E220 /* KPKFormat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = KPKFormat.m; path = Format/KPKFormat.m; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
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; }; 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; }; 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>"; }; 4C45FB20178E09ED0010007D /* MacPassTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MacPassTests-Info.plist"; sourceTree = "<group>"; };
@@ -499,8 +429,6 @@
4C46E09D17673A0A00DA62E8 /* HNHShadowBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHShadowBox.m; sourceTree = "<group>"; }; 4C46E09D17673A0A00DA62E8 /* HNHShadowBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHShadowBox.m; sourceTree = "<group>"; };
4C4A100D176286FD00BBF2CA /* MPTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPTableView.h; sourceTree = "<group>"; }; 4C4A100D176286FD00BBF2CA /* MPTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPTableView.h; sourceTree = "<group>"; };
4C4A100E176286FD00BBF2CA /* MPTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTableView.m; sourceTree = "<group>"; }; 4C4A100E176286FD00BBF2CA /* MPTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTableView.m; sourceTree = "<group>"; };
4C4A101017629DA900BBF2CA /* KdbGroup+KVOAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KdbGroup+KVOAdditions.h"; sourceTree = "<group>"; };
4C4A101117629DA900BBF2CA /* KdbGroup+KVOAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KdbGroup+KVOAdditions.m"; sourceTree = "<group>"; };
4C4B7EE617A45EC5000234C7 /* MPDatePickingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDatePickingViewController.h; sourceTree = "<group>"; }; 4C4B7EE617A45EC5000234C7 /* MPDatePickingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDatePickingViewController.h; sourceTree = "<group>"; };
4C4B7EE717A45EC5000234C7 /* MPDatePickingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDatePickingViewController.m; sourceTree = "<group>"; }; 4C4B7EE717A45EC5000234C7 /* MPDatePickingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDatePickingViewController.m; sourceTree = "<group>"; };
4C4B7EE817A45EC5000234C7 /* DatePickingView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DatePickingView.xib; sourceTree = "<group>"; }; 4C4B7EE817A45EC5000234C7 /* DatePickingView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DatePickingView.xib; sourceTree = "<group>"; };
@@ -514,8 +442,6 @@
4C4B7EF717A4B335000234C7 /* MPUniqueCharactersFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPUniqueCharactersFormatter.m; sourceTree = "<group>"; }; 4C4B7EF717A4B335000234C7 /* MPUniqueCharactersFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPUniqueCharactersFormatter.m; sourceTree = "<group>"; };
4C4FCE13177CFE6B00BBF7AE /* MPCustomFieldTableCellView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCustomFieldTableCellView.h; sourceTree = "<group>"; }; 4C4FCE13177CFE6B00BBF7AE /* MPCustomFieldTableCellView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCustomFieldTableCellView.h; sourceTree = "<group>"; };
4C4FCE14177CFE6B00BBF7AE /* MPCustomFieldTableCellView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCustomFieldTableCellView.m; sourceTree = "<group>"; }; 4C4FCE14177CFE6B00BBF7AE /* MPCustomFieldTableCellView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCustomFieldTableCellView.m; sourceTree = "<group>"; };
4C4FCE16177D03D700BBF7AE /* Kdb4Entry+KVOAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Kdb4Entry+KVOAdditions.h"; sourceTree = "<group>"; };
4C4FCE17177D03D700BBF7AE /* Kdb4Entry+KVOAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Kdb4Entry+KVOAdditions.m"; sourceTree = "<group>"; };
4C52A242177D7B9F0000D88F /* HNHScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHScrollView.h; sourceTree = "<group>"; }; 4C52A242177D7B9F0000D88F /* HNHScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHScrollView.h; sourceTree = "<group>"; };
4C52A243177D7B9F0000D88F /* HNHScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHScrollView.m; sourceTree = "<group>"; }; 4C52A243177D7B9F0000D88F /* HNHScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHScrollView.m; sourceTree = "<group>"; };
4C52A88B1788628B00868229 /* 06_BlockDeviceTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 06_BlockDeviceTemplate.pdf; sourceTree = "<group>"; }; 4C52A88B1788628B00868229 /* 06_BlockDeviceTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 06_BlockDeviceTemplate.pdf; sourceTree = "<group>"; };
@@ -527,8 +453,6 @@
4C569D9D17652B0600595B62 /* MPConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPConstants.m; sourceTree = "<group>"; }; 4C569D9D17652B0600595B62 /* MPConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPConstants.m; sourceTree = "<group>"; };
4C569D9F17652BFE00595B62 /* MPEntryTableDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPEntryTableDataSource.h; sourceTree = "<group>"; }; 4C569D9F17652BFE00595B62 /* MPEntryTableDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPEntryTableDataSource.h; sourceTree = "<group>"; };
4C569DA017652BFE00595B62 /* MPEntryTableDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPEntryTableDataSource.m; sourceTree = "<group>"; }; 4C569DA017652BFE00595B62 /* MPEntryTableDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPEntryTableDataSource.m; sourceTree = "<group>"; };
4C569DA217653F3500595B62 /* KdbEntry+MPTreeTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KdbEntry+MPTreeTools.h"; sourceTree = "<group>"; };
4C569DA317653F3500595B62 /* KdbEntry+MPTreeTools.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KdbEntry+MPTreeTools.m"; sourceTree = "<group>"; };
4C57AE1217BA422B00CA4F34 /* MPSegmentedContextCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSegmentedContextCell.h; sourceTree = "<group>"; }; 4C57AE1217BA422B00CA4F34 /* MPSegmentedContextCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSegmentedContextCell.h; sourceTree = "<group>"; };
4C57AE1317BA422B00CA4F34 /* MPSegmentedContextCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSegmentedContextCell.m; sourceTree = "<group>"; }; 4C57AE1317BA422B00CA4F34 /* MPSegmentedContextCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSegmentedContextCell.m; sourceTree = "<group>"; };
4C586F9D16D07ABD00E7DB57 /* 00_PasswordTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 00_PasswordTemplate.pdf; sourceTree = "<group>"; }; 4C586F9D16D07ABD00E7DB57 /* 00_PasswordTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 00_PasswordTemplate.pdf; sourceTree = "<group>"; };
@@ -556,8 +480,24 @@
4C5CD34617D15912000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/MainMenu.strings; sourceTree = "<group>"; }; 4C5CD34617D15912000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/MainMenu.strings; sourceTree = "<group>"; };
4C5CD34717D1591A000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/PasswordInputView.strings; sourceTree = "<group>"; }; 4C5CD34717D1591A000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/PasswordInputView.strings; sourceTree = "<group>"; };
4C5CD34817D15920000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InspectorView.strings; sourceTree = "<group>"; }; 4C5CD34817D15920000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InspectorView.strings; sourceTree = "<group>"; };
4C5EC300177B700D00DA955B /* MPRootAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPRootAdapter.h; sourceTree = "<group>"; }; 4C5CD34917D15DBD000B7F38 /* NSData+Gzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+Gzip.h"; sourceTree = "<group>"; };
4C5EC301177B700D00DA955B /* MPRootAdapter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPRootAdapter.m; sourceTree = "<group>"; }; 4C5CD34A17D15DBD000B7F38 /* NSData+Gzip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+Gzip.m"; sourceTree = "<group>"; };
4C5CD34B17D15DBD000B7F38 /* NSData+Random.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+Random.h"; sourceTree = "<group>"; };
4C5CD34C17D15DBD000B7F38 /* NSData+Random.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+Random.m"; sourceTree = "<group>"; };
4C5CD34D17D15DBD000B7F38 /* NSDate+Packed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+Packed.h"; sourceTree = "<group>"; };
4C5CD34E17D15DBD000B7F38 /* NSDate+Packed.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+Packed.m"; sourceTree = "<group>"; };
4C5CD34F17D15DBD000B7F38 /* NSMutableData+Base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableData+Base64.h"; sourceTree = "<group>"; };
4C5CD35017D15DBD000B7F38 /* NSMutableData+Base64.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableData+Base64.m"; sourceTree = "<group>"; };
4C5CD35117D15DBD000B7F38 /* NSString+Empty.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+Empty.h"; sourceTree = "<group>"; };
4C5CD35217D15DBD000B7F38 /* NSString+Empty.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+Empty.m"; sourceTree = "<group>"; };
4C5CD35317D15DBD000B7F38 /* NSString+Hexdata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+Hexdata.h"; sourceTree = "<group>"; };
4C5CD35417D15DBD000B7F38 /* NSString+Hexdata.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+Hexdata.m"; sourceTree = "<group>"; };
4C5CD35B17D15DCA000B7F38 /* KPKArc4RandomStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKArc4RandomStream.h; sourceTree = "<group>"; };
4C5CD35C17D15DCA000B7F38 /* KPKArc4RandomStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKArc4RandomStream.m; sourceTree = "<group>"; };
4C5CD35D17D15DCA000B7F38 /* KPKRandomStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKRandomStream.h; sourceTree = "<group>"; };
4C5CD35E17D15DCA000B7F38 /* KPKRandomStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKRandomStream.m; sourceTree = "<group>"; };
4C5CD35F17D15DCA000B7F38 /* KPKSalsa20RandomStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKSalsa20RandomStream.h; sourceTree = "<group>"; };
4C5CD36017D15DCA000B7F38 /* KPKSalsa20RandomStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKSalsa20RandomStream.m; sourceTree = "<group>"; };
4C5FA86B17A5F26800C781C9 /* KPKDataStreamWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKDataStreamWriter.h; sourceTree = "<group>"; }; 4C5FA86B17A5F26800C781C9 /* KPKDataStreamWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKDataStreamWriter.h; sourceTree = "<group>"; };
4C5FA86C17A5F26800C781C9 /* KPKDataStreamWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKDataStreamWriter.m; sourceTree = "<group>"; }; 4C5FA86C17A5F26800C781C9 /* KPKDataStreamWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKDataStreamWriter.m; sourceTree = "<group>"; };
4C5FE9AC17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSelectedAttachmentTableCellView.h; sourceTree = "<group>"; }; 4C5FE9AC17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSelectedAttachmentTableCellView.h; sourceTree = "<group>"; };
@@ -578,71 +518,6 @@
4C65C79B16DD283900E32CFF /* MPToolbarButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPToolbarButton.m; sourceTree = "<group>"; }; 4C65C79B16DD283900E32CFF /* MPToolbarButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPToolbarButton.m; sourceTree = "<group>"; };
4C65FAE616D16DDB006E0577 /* MPPasswordInputController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordInputController.h; sourceTree = "<group>"; }; 4C65FAE616D16DDB006E0577 /* MPPasswordInputController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordInputController.h; sourceTree = "<group>"; };
4C65FAE716D16DDB006E0577 /* MPPasswordInputController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordInputController.m; sourceTree = "<group>"; }; 4C65FAE716D16DDB006E0577 /* MPPasswordInputController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordInputController.m; sourceTree = "<group>"; };
4C669B3016760ED100DD0774 /* AesInputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AesInputStream.h; sourceTree = "<group>"; };
4C669B3116760ED100DD0774 /* AesInputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AesInputStream.m; sourceTree = "<group>"; };
4C669B3216760ED100DD0774 /* AesOutputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AesOutputStream.h; sourceTree = "<group>"; };
4C669B3316760ED100DD0774 /* AesOutputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AesOutputStream.m; sourceTree = "<group>"; };
4C669B3416760ED100DD0774 /* Arc4RandomStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Arc4RandomStream.h; sourceTree = "<group>"; };
4C669B3516760ED100DD0774 /* Arc4RandomStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Arc4RandomStream.m; sourceTree = "<group>"; };
4C669B3616760ED100DD0774 /* DataInputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataInputStream.h; sourceTree = "<group>"; };
4C669B3716760ED100DD0774 /* DataInputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DataInputStream.m; sourceTree = "<group>"; };
4C669B3816760ED100DD0774 /* DataOutputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataOutputStream.h; sourceTree = "<group>"; };
4C669B3916760ED100DD0774 /* DataOutputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DataOutputStream.m; sourceTree = "<group>"; };
4C669B3A16760ED100DD0774 /* FileInputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileInputStream.h; sourceTree = "<group>"; };
4C669B3B16760ED100DD0774 /* FileInputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FileInputStream.m; sourceTree = "<group>"; };
4C669B3C16760ED100DD0774 /* FileOutputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileOutputStream.h; sourceTree = "<group>"; };
4C669B3D16760ED100DD0774 /* FileOutputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FileOutputStream.m; sourceTree = "<group>"; };
4C669B3E16760ED100DD0774 /* GZipInputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GZipInputStream.h; sourceTree = "<group>"; };
4C669B3F16760ED100DD0774 /* GZipInputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GZipInputStream.m; sourceTree = "<group>"; };
4C669B4016760ED100DD0774 /* GZipOutputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GZipOutputStream.h; sourceTree = "<group>"; };
4C669B4116760ED100DD0774 /* GZipOutputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GZipOutputStream.m; sourceTree = "<group>"; };
4C669B4216760ED100DD0774 /* HashedInputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HashedInputStream.h; sourceTree = "<group>"; };
4C669B4316760ED100DD0774 /* HashedInputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HashedInputStream.m; sourceTree = "<group>"; };
4C669B4416760ED100DD0774 /* HashedOutputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HashedOutputStream.h; sourceTree = "<group>"; };
4C669B4516760ED100DD0774 /* HashedOutputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HashedOutputStream.m; sourceTree = "<group>"; };
4C669B4616760ED100DD0774 /* InputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputStream.h; sourceTree = "<group>"; };
4C669B4716760ED100DD0774 /* InputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InputStream.m; sourceTree = "<group>"; };
4C669B4816760ED100DD0774 /* OutputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OutputStream.h; sourceTree = "<group>"; };
4C669B4916760ED100DD0774 /* OutputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OutputStream.m; sourceTree = "<group>"; };
4C669B4A16760ED100DD0774 /* Sha256OutputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sha256OutputStream.h; sourceTree = "<group>"; };
4C669B4B16760ED100DD0774 /* Sha256OutputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Sha256OutputStream.m; sourceTree = "<group>"; };
4C669B5316760ED100DD0774 /* DDXMLElement+MKPAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "DDXMLElement+MKPAdditions.h"; sourceTree = "<group>"; };
4C669B5416760ED100DD0774 /* DDXMLElement+MKPAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "DDXMLElement+MKPAdditions.m"; sourceTree = "<group>"; };
4C669B5516760ED100DD0774 /* Kdb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Kdb.h; sourceTree = "<group>"; };
4C669B5616760ED100DD0774 /* Kdb.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Kdb.m; sourceTree = "<group>"; };
4C669B5916760ED100DD0774 /* Kdb3Node.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Kdb3Node.h; sourceTree = "<group>"; };
4C669B5A16760ED100DD0774 /* Kdb3Node.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Kdb3Node.m; sourceTree = "<group>"; };
4C669B5B16760ED100DD0774 /* Kdb3Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Kdb3Reader.h; sourceTree = "<group>"; };
4C669B5C16760ED100DD0774 /* Kdb3Reader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Kdb3Reader.m; sourceTree = "<group>"; };
4C669B5D16760ED100DD0774 /* Kdb3Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Kdb3Utils.h; sourceTree = "<group>"; };
4C669B5E16760ED100DD0774 /* Kdb3Utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Kdb3Utils.m; sourceTree = "<group>"; };
4C669B5F16760ED100DD0774 /* Kdb3Writer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Kdb3Writer.h; sourceTree = "<group>"; };
4C669B6016760ED100DD0774 /* Kdb3Writer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Kdb3Writer.m; sourceTree = "<group>"; };
4C669B6116760ED100DD0774 /* Kdb4Node.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Kdb4Node.h; sourceTree = "<group>"; };
4C669B6216760ED100DD0774 /* Kdb4Node.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Kdb4Node.m; sourceTree = "<group>"; };
4C669B6316760ED100DD0774 /* Kdb4Parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Kdb4Parser.h; sourceTree = "<group>"; };
4C669B6416760ED100DD0774 /* Kdb4Parser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Kdb4Parser.m; sourceTree = "<group>"; };
4C669B6516760ED100DD0774 /* Kdb4Persist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Kdb4Persist.h; sourceTree = "<group>"; };
4C669B6616760ED100DD0774 /* Kdb4Persist.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Kdb4Persist.m; sourceTree = "<group>"; };
4C669B6716760ED100DD0774 /* Kdb4Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Kdb4Reader.h; sourceTree = "<group>"; };
4C669B6816760ED100DD0774 /* Kdb4Reader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Kdb4Reader.m; sourceTree = "<group>"; };
4C669B6916760ED100DD0774 /* Kdb4Writer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Kdb4Writer.h; sourceTree = "<group>"; };
4C669B6A16760ED100DD0774 /* Kdb4Writer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Kdb4Writer.m; sourceTree = "<group>"; };
4C669B6B16760ED100DD0774 /* KdbLib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KdbLib.h; sourceTree = "<group>"; };
4C669B6C16760ED100DD0774 /* KdbPassword.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KdbPassword.h; sourceTree = "<group>"; };
4C669B6D16760ED100DD0774 /* KdbPassword.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KdbPassword.m; sourceTree = "<group>"; };
4C669B6E16760ED100DD0774 /* KdbReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KdbReader.h; sourceTree = "<group>"; };
4C669B6F16760ED100DD0774 /* KdbReaderFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KdbReaderFactory.h; sourceTree = "<group>"; };
4C669B7016760ED100DD0774 /* KdbReaderFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KdbReaderFactory.m; sourceTree = "<group>"; };
4C669B7116760ED100DD0774 /* KdbWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KdbWriter.h; sourceTree = "<group>"; };
4C669B7216760ED100DD0774 /* KdbWriterFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KdbWriterFactory.h; sourceTree = "<group>"; };
4C669B7316760ED100DD0774 /* KdbWriterFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KdbWriterFactory.m; sourceTree = "<group>"; };
4C669B7416760ED100DD0774 /* RandomStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RandomStream.h; sourceTree = "<group>"; };
4C669B7516760ED100DD0774 /* RandomStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RandomStream.m; sourceTree = "<group>"; };
4C669B7616760ED100DD0774 /* Salsa20RandomStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Salsa20RandomStream.h; sourceTree = "<group>"; };
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>"; }; 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>"; }; 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>"; }; 4C67D33117981ABA00A7BDFC /* HNHTokenFieldCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHTokenFieldCell.h; sourceTree = "<group>"; };
@@ -708,18 +583,12 @@
4C7ABA4D17BAEC7000FF5799 /* addEntryTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = addEntryTemplate.pdf; path = Icons/addEntryTemplate.pdf; sourceTree = "<group>"; }; 4C7ABA4D17BAEC7000FF5799 /* addEntryTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = addEntryTemplate.pdf; path = Icons/addEntryTemplate.pdf; sourceTree = "<group>"; };
4C7F35691779DFFB00C57890 /* en */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Errors.strings; sourceTree = "<group>"; }; 4C7F35691779DFFB00C57890 /* en */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Errors.strings; sourceTree = "<group>"; };
4C7F356B1779DFFF00C57890 /* de */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Errors.strings; sourceTree = "<group>"; }; 4C7F356B1779DFFF00C57890 /* de */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Errors.strings; sourceTree = "<group>"; };
4C801AFA179310E2002821E3 /* NSString+Hexdata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+Hexdata.h"; sourceTree = "<group>"; };
4C801AFB179310E2002821E3 /* NSString+Hexdata.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+Hexdata.m"; sourceTree = "<group>"; };
4C80BB6D176DE06F00E5E248 /* HNHScrollDocumentViewAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHScrollDocumentViewAdapter.h; sourceTree = "<group>"; }; 4C80BB6D176DE06F00E5E248 /* HNHScrollDocumentViewAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHScrollDocumentViewAdapter.h; sourceTree = "<group>"; };
4C80BB6E176DE06F00E5E248 /* HNHScrollDocumentViewAdapter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHScrollDocumentViewAdapter.m; sourceTree = "<group>"; }; 4C80BB6E176DE06F00E5E248 /* HNHScrollDocumentViewAdapter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHScrollDocumentViewAdapter.m; sourceTree = "<group>"; };
4C811C8116ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPKeyfilePathControlDelegate.h; sourceTree = "<group>"; }; 4C811C8116ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPKeyfilePathControlDelegate.h; sourceTree = "<group>"; };
4C811C8216ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPKeyfilePathControlDelegate.m; sourceTree = "<group>"; }; 4C811C8216ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPKeyfilePathControlDelegate.m; sourceTree = "<group>"; };
4C83814015BF4677001AE468 /* MPDocumentWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDocumentWindowController.h; sourceTree = "<group>"; }; 4C83814015BF4677001AE468 /* MPDocumentWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDocumentWindowController.h; sourceTree = "<group>"; };
4C83814115BF4677001AE468 /* MPDocumentWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDocumentWindowController.m; sourceTree = "<group>"; }; 4C83814115BF4677001AE468 /* MPDocumentWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDocumentWindowController.m; sourceTree = "<group>"; };
4C83F4A81774B155006C5FC0 /* Kdb3Tree+NewTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Kdb3Tree+NewTree.h"; sourceTree = "<group>"; };
4C83F4A91774B155006C5FC0 /* Kdb3Tree+NewTree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Kdb3Tree+NewTree.m"; sourceTree = "<group>"; };
4C83F4AB1774B25F006C5FC0 /* Kdb4Tree+NewTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Kdb4Tree+NewTree.h"; sourceTree = "<group>"; };
4C83F4AC1774B25F006C5FC0 /* Kdb4Tree+NewTree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Kdb4Tree+NewTree.m"; sourceTree = "<group>"; };
4C888C8F16EB6C91003D34A1 /* en */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; }; 4C888C8F16EB6C91003D34A1 /* en */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
4C888C9116EB6F5E003D34A1 /* MPToolbarItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPToolbarItem.h; sourceTree = "<group>"; }; 4C888C9116EB6F5E003D34A1 /* MPToolbarItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPToolbarItem.h; sourceTree = "<group>"; };
4C888C9216EB6F5E003D34A1 /* MPToolbarItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPToolbarItem.m; sourceTree = "<group>"; }; 4C888C9216EB6F5E003D34A1 /* MPToolbarItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPToolbarItem.m; sourceTree = "<group>"; };
@@ -778,18 +647,16 @@
4CC0D2CD17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCustomFieldTableViewDelegate.m; sourceTree = "<group>"; }; 4CC0D2CD17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCustomFieldTableViewDelegate.m; sourceTree = "<group>"; };
4CC0D2CF17974A5A000B4BDA /* MPAttachmentTableViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAttachmentTableViewDelegate.h; sourceTree = "<group>"; }; 4CC0D2CF17974A5A000B4BDA /* MPAttachmentTableViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAttachmentTableViewDelegate.h; sourceTree = "<group>"; };
4CC0D2D017974A5A000B4BDA /* MPAttachmentTableViewDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAttachmentTableViewDelegate.m; sourceTree = "<group>"; }; 4CC0D2D017974A5A000B4BDA /* MPAttachmentTableViewDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAttachmentTableViewDelegate.m; sourceTree = "<group>"; };
4CC1AEBC16D4467C006D2AAB /* KdbTree+MPAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KdbTree+MPAdditions.h"; sourceTree = "<group>"; };
4CC1AEBD16D4467C006D2AAB /* KdbTree+MPAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KdbTree+MPAdditions.m"; sourceTree = "<group>"; };
4CC299FD176F99E50050C939 /* MPRequestHandlerService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPRequestHandlerService.h; sourceTree = "<group>"; }; 4CC299FD176F99E50050C939 /* MPRequestHandlerService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPRequestHandlerService.h; sourceTree = "<group>"; };
4CC299FE176F99E50050C939 /* MPRequestHandlerService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPRequestHandlerService.m; sourceTree = "<group>"; }; 4CC299FE176F99E50050C939 /* MPRequestHandlerService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPRequestHandlerService.m; sourceTree = "<group>"; };
4CC29A00176F9D140050C939 /* MPTestAssociateRequestHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPTestAssociateRequestHandler.h; sourceTree = "<group>"; }; 4CC29A00176F9D140050C939 /* MPTestAssociateRequestHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPTestAssociateRequestHandler.h; sourceTree = "<group>"; };
4CC29A01176F9D140050C939 /* MPTestAssociateRequestHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTestAssociateRequestHandler.m; sourceTree = "<group>"; }; 4CC29A01176F9D140050C939 /* MPTestAssociateRequestHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTestAssociateRequestHandler.m; sourceTree = "<group>"; };
4CC3AAB8175F4983003EF01B /* HNHRoundedTextFieldCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHRoundedTextFieldCell.h; sourceTree = "<group>"; }; 4CC3AAB8175F4983003EF01B /* HNHRoundedTextFieldCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHRoundedTextFieldCell.h; sourceTree = "<group>"; };
4CC3AAB9175F4983003EF01B /* HNHRoundedTextFieldCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHRoundedTextFieldCell.m; sourceTree = "<group>"; }; 4CC3AAB9175F4983003EF01B /* HNHRoundedTextFieldCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHRoundedTextFieldCell.m; sourceTree = "<group>"; };
4CC672771781D0C0006DEDCF /* KdbGroup+MPAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KdbGroup+MPAdditions.h"; sourceTree = "<group>"; }; 4CC6DB7817D23719002C6091 /* KPKNode+IconImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KPKNode+IconImage.h"; sourceTree = "<group>"; };
4CC672781781D0C0006DEDCF /* KdbGroup+MPAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KdbGroup+MPAdditions.m"; sourceTree = "<group>"; }; 4CC6DB7917D23719002C6091 /* KPKNode+IconImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KPKNode+IconImage.m"; sourceTree = "<group>"; };
4CC6727A1781D0D2006DEDCF /* KdbEntry+MPAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KdbEntry+MPAdditions.h"; sourceTree = "<group>"; }; 4CC6DB7B17D23DCE002C6091 /* KPKUTIs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKUTIs.h; sourceTree = "<group>"; };
4CC6727B1781D0D2006DEDCF /* KdbEntry+MPAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KdbEntry+MPAdditions.m"; sourceTree = "<group>"; }; 4CC6DB7C17D23DCE002C6091 /* KPKUTIs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKUTIs.m; sourceTree = "<group>"; };
4CC7EA1917807E7E0089D4F3 /* HNHRoundedTextFieldCellHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHRoundedTextFieldCellHelper.h; sourceTree = "<group>"; }; 4CC7EA1917807E7E0089D4F3 /* HNHRoundedTextFieldCellHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHRoundedTextFieldCellHelper.h; sourceTree = "<group>"; };
4CC7EA1A17807E7E0089D4F3 /* HNHRoundedTextFieldCellHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHRoundedTextFieldCellHelper.m; sourceTree = "<group>"; }; 4CC7EA1A17807E7E0089D4F3 /* HNHRoundedTextFieldCellHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHRoundedTextFieldCellHelper.m; sourceTree = "<group>"; };
4CCA7EEC1797866F00B0B55E /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/GeneralSettings.strings; sourceTree = "<group>"; }; 4CCA7EEC1797866F00B0B55E /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/GeneralSettings.strings; sourceTree = "<group>"; };
@@ -851,11 +718,7 @@
4CEAF85A17BA9B44001307A6 /* KPKTestKeyfileParsing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKTestKeyfileParsing.m; sourceTree = "<group>"; }; 4CEAF85A17BA9B44001307A6 /* KPKTestKeyfileParsing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKTestKeyfileParsing.m; sourceTree = "<group>"; };
4CECB31517AC326D00EAFB0F /* KPKTestLegacyWriting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKTestLegacyWriting.h; sourceTree = "<group>"; }; 4CECB31517AC326D00EAFB0F /* KPKTestLegacyWriting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKTestLegacyWriting.h; sourceTree = "<group>"; };
4CECB31617AC326D00EAFB0F /* KPKTestLegacyWriting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKTestLegacyWriting.m; sourceTree = "<group>"; }; 4CECB31617AC326D00EAFB0F /* KPKTestLegacyWriting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKTestLegacyWriting.m; sourceTree = "<group>"; };
4CF1F0C81786B37900CD920E /* NSData+Gzip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+Gzip.m"; sourceTree = "<group>"; };
4CF1F0C91786B37900CD920E /* NSData+Gzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+Gzip.h"; sourceTree = "<group>"; };
4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 26_FileSaveTemplate.pdf; sourceTree = "<group>"; }; 4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 26_FileSaveTemplate.pdf; sourceTree = "<group>"; };
4CF4FEDE17AEA4A400712774 /* UUID+Pasterboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UUID+Pasterboard.h"; sourceTree = "<group>"; };
4CF4FEDF17AEA4A400712774 /* UUID+Pasterboard.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UUID+Pasterboard.m"; sourceTree = "<group>"; };
4CF62B84179385D700B660B6 /* KPKAttribute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKAttribute.h; sourceTree = "<group>"; }; 4CF62B84179385D700B660B6 /* KPKAttribute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKAttribute.h; sourceTree = "<group>"; };
4CF62B85179385D700B660B6 /* KPKAttribute.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKAttribute.m; sourceTree = "<group>"; }; 4CF62B85179385D700B660B6 /* KPKAttribute.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKAttribute.m; sourceTree = "<group>"; };
4CF6C70F176F4533007A811D /* MPStringLengthValueTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPStringLengthValueTransformer.h; sourceTree = "<group>"; }; 4CF6C70F176F4533007A811D /* MPStringLengthValueTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPStringLengthValueTransformer.h; sourceTree = "<group>"; };
@@ -872,8 +735,6 @@
4CF7805E176E75110032EE71 /* ServerSettings.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ServerSettings.xib; sourceTree = "<group>"; }; 4CF7805E176E75110032EE71 /* ServerSettings.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ServerSettings.xib; sourceTree = "<group>"; };
4CF78062176E75AD0032EE71 /* MPServerSettingsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPServerSettingsController.h; sourceTree = "<group>"; }; 4CF78062176E75AD0032EE71 /* MPServerSettingsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPServerSettingsController.h; sourceTree = "<group>"; };
4CF78063176E75AD0032EE71 /* MPServerSettingsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPServerSettingsController.m; sourceTree = "<group>"; }; 4CF78063176E75AD0032EE71 /* MPServerSettingsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPServerSettingsController.m; sourceTree = "<group>"; };
4CFB5E9D17AAD20200D9B10C /* Kdb4Group+Undo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Kdb4Group+Undo.h"; sourceTree = "<group>"; };
4CFB5E9E17AAD20200D9B10C /* Kdb4Group+Undo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Kdb4Group+Undo.m"; sourceTree = "<group>"; };
4CFC53BD16E94729007396BE /* MPShadowBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPShadowBox.h; 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>"; }; 4CFC53BE16E94729007396BE /* MPShadowBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPShadowBox.m; sourceTree = "<group>"; };
4CFC8739179DEDF3000DFC03 /* KPKMetaData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKMetaData.h; sourceTree = "<group>"; }; 4CFC8739179DEDF3000DFC03 /* KPKMetaData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKMetaData.h; sourceTree = "<group>"; };
@@ -881,11 +742,8 @@
4CFC873C179DF200000DFC03 /* KPKTimeInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKTimeInfo.h; sourceTree = "<group>"; }; 4CFC873C179DF200000DFC03 /* KPKTimeInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKTimeInfo.h; sourceTree = "<group>"; };
4CFC873D179DF200000DFC03 /* KPKTimeInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKTimeInfo.m; sourceTree = "<group>"; }; 4CFC873D179DF200000DFC03 /* KPKTimeInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKTimeInfo.m; sourceTree = "<group>"; };
4CFC873F179DF295000DFC03 /* KPKTimerecording.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKTimerecording.h; sourceTree = "<group>"; }; 4CFC873F179DF295000DFC03 /* KPKTimerecording.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKTimerecording.h; sourceTree = "<group>"; };
4CFC8740179DF7A3000DFC03 /* KPKUndoing.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KPKUndoing.h; sourceTree = "<group>"; };
4CFC8741179DFD3E000DFC03 /* KPKTestXmlLoading.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKTestXmlLoading.h; sourceTree = "<group>"; }; 4CFC8741179DFD3E000DFC03 /* KPKTestXmlLoading.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPKTestXmlLoading.h; sourceTree = "<group>"; };
4CFC8742179DFD3E000DFC03 /* KPKTestXmlLoading.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKTestXmlLoading.m; sourceTree = "<group>"; }; 4CFC8742179DFD3E000DFC03 /* KPKTestXmlLoading.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKTestXmlLoading.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>"; }; 6E719715172058BA00E4C5FC /* MPDatabaseVersion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPDatabaseVersion.h; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
@@ -921,6 +779,8 @@
4C0104BC17C37C2B00173EF3 /* KPKXmlUtilities.h */, 4C0104BC17C37C2B00173EF3 /* KPKXmlUtilities.h */,
4C0104BD17C37DA400173EF3 /* KPKXmlUtilities.m */, 4C0104BD17C37DA400173EF3 /* KPKXmlUtilities.m */,
4C0104BF17C37DFC00173EF3 /* KPKTypes.h */, 4C0104BF17C37DFC00173EF3 /* KPKTypes.h */,
4CC6DB7B17D23DCE002C6091 /* KPKUTIs.h */,
4CC6DB7C17D23DCE002C6091 /* KPKUTIs.m */,
); );
path = Utilites; path = Utilites;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -967,6 +827,8 @@
4C46B88417063A070046109A /* NSString+MPPasswordCreation.m */, 4C46B88417063A070046109A /* NSString+MPPasswordCreation.m */,
4C10412A178CDD44001B5239 /* NSDate+Humanized.h */, 4C10412A178CDD44001B5239 /* NSDate+Humanized.h */,
4C10412B178CDD44001B5239 /* NSDate+Humanized.m */, 4C10412B178CDD44001B5239 /* NSDate+Humanized.m */,
4CC6DB7817D23719002C6091 /* KPKNode+IconImage.h */,
4CC6DB7917D23719002C6091 /* KPKNode+IconImage.m */,
); );
name = Categories; name = Categories;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -1150,70 +1012,6 @@
name = KeepassHttp; name = KeepassHttp;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
4C2724CB1778EF8E00FD8456 /* Categories */ = {
isa = PBXGroup;
children = (
4C669B5316760ED100DD0774 /* DDXMLElement+MKPAdditions.h */,
4C669B5416760ED100DD0774 /* DDXMLElement+MKPAdditions.m */,
4C2724CC1778EFB100FD8456 /* NSData+Random.h */,
4C2724CD1778EFB100FD8456 /* NSData+Random.m */,
4C2724CF1778EFE300FD8456 /* NSString+Empty.h */,
4C2724D01778EFE300FD8456 /* NSString+Empty.m */,
4C2724D21778FA0700FD8456 /* NSDate+Packed.h */,
4C2724D31778FA0700FD8456 /* NSDate+Packed.m */,
4CF1F0C81786B37900CD920E /* NSData+Gzip.m */,
4CF1F0C91786B37900CD920E /* NSData+Gzip.h */,
4C2724D817790E7C00FD8456 /* NSMutableData+Base64.h */,
4C2724D917790E7C00FD8456 /* NSMutableData+Base64.m */,
4C801AFA179310E2002821E3 /* NSString+Hexdata.h */,
4C801AFB179310E2002821E3 /* NSString+Hexdata.m */,
);
name = Categories;
sourceTree = "<group>";
};
4C2C4C2516D3BCEA00D49295 /* KeePassLib Categories */ = {
isa = PBXGroup;
children = (
4C569DA217653F3500595B62 /* KdbEntry+MPTreeTools.h */,
4C569DA317653F3500595B62 /* KdbEntry+MPTreeTools.m */,
4C2C4C2A16D3BE3700D49295 /* KdbGroup+MPTreeTools.h */,
4C2C4C2B16D3BE3700D49295 /* KdbGroup+MPTreeTools.m */,
4CC1AEBC16D4467C006D2AAB /* KdbTree+MPAdditions.h */,
4CC1AEBD16D4467C006D2AAB /* KdbTree+MPAdditions.m */,
4CC672771781D0C0006DEDCF /* KdbGroup+MPAdditions.h */,
4CC672781781D0C0006DEDCF /* KdbGroup+MPAdditions.m */,
4CC6727A1781D0D2006DEDCF /* KdbEntry+MPAdditions.h */,
4CC6727B1781D0D2006DEDCF /* KdbEntry+MPAdditions.m */,
4C01C23D1764D2980016D5D0 /* KdbEntry+Undo.h */,
4C01C23E1764D2980016D5D0 /* KdbEntry+Undo.m */,
4C22040B1746ED160054C916 /* KdbGroup+Undo.h */,
4C22040C1746ED160054C916 /* KdbGroup+Undo.m */,
4C3E1CBE177DEFB3003BD9BD /* StringField+Undo.h */,
4C3E1CBF177DEFB3003BD9BD /* StringField+Undo.m */,
4C4A101017629DA900BBF2CA /* KdbGroup+KVOAdditions.h */,
4C4A101117629DA900BBF2CA /* KdbGroup+KVOAdditions.m */,
4C36E5B2177CD4FB00152132 /* Kdb4Tree+KVOAdditions.h */,
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 */,
4CFB5E9D17AAD20200D9B10C /* Kdb4Group+Undo.h */,
4CFB5E9E17AAD20200D9B10C /* Kdb4Group+Undo.m */,
4CF4FEDE17AEA4A400712774 /* UUID+Pasterboard.h */,
4CF4FEDF17AEA4A400712774 /* UUID+Pasterboard.m */,
);
name = "KeePassLib Categories";
sourceTree = "<group>";
};
4C2E382016D141F700037A9D /* Helper */ = { 4C2E382016D141F700037A9D /* Helper */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -1286,8 +1084,6 @@
6E719715172058BA00E4C5FC /* MPDatabaseVersion.h */, 6E719715172058BA00E4C5FC /* MPDatabaseVersion.h */,
4CE5B548173AFBA700207B39 /* MPDocument.h */, 4CE5B548173AFBA700207B39 /* MPDocument.h */,
4CE5B549173AFBA700207B39 /* MPDocument.m */, 4CE5B549173AFBA700207B39 /* MPDocument.m */,
4C5EC300177B700D00DA955B /* MPRootAdapter.h */,
4C5EC301177B700D00DA955B /* MPRootAdapter.m */,
4C3666401787327E00B249F1 /* MPDocument+Attachments.m */, 4C3666401787327E00B249F1 /* MPDocument+Attachments.m */,
); );
name = Model; name = Model;
@@ -1386,102 +1182,12 @@
path = Icons; path = Icons;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
4C669B2D16760ED100DD0774 /* MiniKeePassLib */ = {
isa = PBXGroup;
children = (
4C669B2F16760ED100DD0774 /* IOStream */,
4C669B4C16760ED100DD0774 /* KeePassLib */,
);
path = MiniKeePassLib;
sourceTree = "<group>";
};
4C669B2F16760ED100DD0774 /* IOStream */ = {
isa = PBXGroup;
children = (
4C669B3016760ED100DD0774 /* AesInputStream.h */,
4C669B3116760ED100DD0774 /* AesInputStream.m */,
4C669B3216760ED100DD0774 /* AesOutputStream.h */,
4C669B3316760ED100DD0774 /* AesOutputStream.m */,
4C669B3416760ED100DD0774 /* Arc4RandomStream.h */,
4C669B3516760ED100DD0774 /* Arc4RandomStream.m */,
4C669B3616760ED100DD0774 /* DataInputStream.h */,
4C669B3716760ED100DD0774 /* DataInputStream.m */,
4C669B3816760ED100DD0774 /* DataOutputStream.h */,
4C669B3916760ED100DD0774 /* DataOutputStream.m */,
4C669B3A16760ED100DD0774 /* FileInputStream.h */,
4C669B3B16760ED100DD0774 /* FileInputStream.m */,
4C669B3C16760ED100DD0774 /* FileOutputStream.h */,
4C669B3D16760ED100DD0774 /* FileOutputStream.m */,
4C669B3E16760ED100DD0774 /* GZipInputStream.h */,
4C669B3F16760ED100DD0774 /* GZipInputStream.m */,
4C669B4016760ED100DD0774 /* GZipOutputStream.h */,
4C669B4116760ED100DD0774 /* GZipOutputStream.m */,
4C669B4216760ED100DD0774 /* HashedInputStream.h */,
4C669B4316760ED100DD0774 /* HashedInputStream.m */,
4C669B4416760ED100DD0774 /* HashedOutputStream.h */,
4C669B4516760ED100DD0774 /* HashedOutputStream.m */,
4C669B4616760ED100DD0774 /* InputStream.h */,
4C669B4716760ED100DD0774 /* InputStream.m */,
4C669B4816760ED100DD0774 /* OutputStream.h */,
4C669B4916760ED100DD0774 /* OutputStream.m */,
4C669B4A16760ED100DD0774 /* Sha256OutputStream.h */,
4C669B4B16760ED100DD0774 /* Sha256OutputStream.m */,
);
path = IOStream;
sourceTree = "<group>";
};
4C669B4C16760ED100DD0774 /* KeePassLib */ = {
isa = PBXGroup;
children = (
4C2724CB1778EF8E00FD8456 /* Categories */,
4C669B5516760ED100DD0774 /* Kdb.h */,
4C669B5616760ED100DD0774 /* Kdb.m */,
4C669B5916760ED100DD0774 /* Kdb3Node.h */,
4C669B5A16760ED100DD0774 /* Kdb3Node.m */,
4C669B5B16760ED100DD0774 /* Kdb3Reader.h */,
4C669B5C16760ED100DD0774 /* Kdb3Reader.m */,
4C669B5D16760ED100DD0774 /* Kdb3Utils.h */,
4C669B5E16760ED100DD0774 /* Kdb3Utils.m */,
4C669B5F16760ED100DD0774 /* Kdb3Writer.h */,
4C669B6016760ED100DD0774 /* Kdb3Writer.m */,
4C669B6116760ED100DD0774 /* Kdb4Node.h */,
4C669B6216760ED100DD0774 /* Kdb4Node.m */,
4C669B6316760ED100DD0774 /* Kdb4Parser.h */,
4C669B6416760ED100DD0774 /* Kdb4Parser.m */,
4C669B6516760ED100DD0774 /* Kdb4Persist.h */,
4C669B6616760ED100DD0774 /* Kdb4Persist.m */,
4C669B6716760ED100DD0774 /* Kdb4Reader.h */,
4C669B6816760ED100DD0774 /* Kdb4Reader.m */,
4C669B6916760ED100DD0774 /* Kdb4Writer.h */,
4C669B6A16760ED100DD0774 /* Kdb4Writer.m */,
4C669B6B16760ED100DD0774 /* KdbLib.h */,
4C669B6C16760ED100DD0774 /* KdbPassword.h */,
4C669B6D16760ED100DD0774 /* KdbPassword.m */,
4C669B6E16760ED100DD0774 /* KdbReader.h */,
4C669B6F16760ED100DD0774 /* KdbReaderFactory.h */,
4C669B7016760ED100DD0774 /* KdbReaderFactory.m */,
4C669B7116760ED100DD0774 /* KdbWriter.h */,
4C669B7216760ED100DD0774 /* KdbWriterFactory.h */,
4C669B7316760ED100DD0774 /* KdbWriterFactory.m */,
4C669B7416760ED100DD0774 /* RandomStream.h */,
4C669B7516760ED100DD0774 /* RandomStream.m */,
4C669B7616760ED100DD0774 /* Salsa20RandomStream.h */,
4C669B7716760ED100DD0774 /* Salsa20RandomStream.m */,
4C669B7A16760ED100DD0774 /* UUID.h */,
4C669B7B16760ED100DD0774 /* UUID.m */,
4C2A6132177A181300C9826C /* KPLErrorCodes.h */,
4C2A6133177A1D5F00C9826C /* KPLErrorCodes.m */,
);
path = KeePassLib;
sourceTree = "<group>";
};
4C77E35715B84A240093A587 = { 4C77E35715B84A240093A587 = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
4C245A64176E1E3C0086100E /* CocoaHTTPServer */, 4C245A64176E1E3C0086100E /* CocoaHTTPServer */,
4CC3AAB6175F4983003EF01B /* HNHUi */, 4CC3AAB6175F4983003EF01B /* HNHUi */,
4CD3ABAD178F71B50073F5C5 /* KeePassKit */, 4CD3ABAD178F71B50073F5C5 /* KeePassKit */,
4C669B2D16760ED100DD0774 /* MiniKeePassLib */,
4CAD745415B887FD00104512 /* KissXML */, 4CAD745415B887FD00104512 /* KissXML */,
4C77E36C15B84A240093A587 /* MacPass */, 4C77E36C15B84A240093A587 /* MacPass */,
4C45FB1E178E09ED0010007D /* MacPassTests */, 4C45FB1E178E09ED0010007D /* MacPassTests */,
@@ -1530,7 +1236,6 @@
4C217D8E17A32BCF00609FAA /* Common */, 4C217D8E17A32BCF00609FAA /* Common */,
4C104129178CDD26001B5239 /* Categories */, 4C104129178CDD26001B5239 /* Categories */,
4C245C11176E22150086100E /* KeepassHttp */, 4C245C11176E22150086100E /* KeepassHttp */,
4C2C4C2516D3BCEA00D49295 /* KeePassLib Categories */,
4C2E382016D141F700037A9D /* Helper */, 4C2E382016D141F700037A9D /* Helper */,
4CE88B9317BA64DB0042E078 /* Icons */, 4CE88B9317BA64DB0042E078 /* Icons */,
4C586F9C16D07ABD00E7DB57 /* Database Icons */, 4C586F9C16D07ABD00E7DB57 /* Database Icons */,
@@ -1709,6 +1414,18 @@
4CD3ABAF178F71B50073F5C5 /* Categories */ = { 4CD3ABAF178F71B50073F5C5 /* Categories */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
4C5CD34917D15DBD000B7F38 /* NSData+Gzip.h */,
4C5CD34A17D15DBD000B7F38 /* NSData+Gzip.m */,
4C5CD34B17D15DBD000B7F38 /* NSData+Random.h */,
4C5CD34C17D15DBD000B7F38 /* NSData+Random.m */,
4C5CD34D17D15DBD000B7F38 /* NSDate+Packed.h */,
4C5CD34E17D15DBD000B7F38 /* NSDate+Packed.m */,
4C5CD34F17D15DBD000B7F38 /* NSMutableData+Base64.h */,
4C5CD35017D15DBD000B7F38 /* NSMutableData+Base64.m */,
4C5CD35117D15DBD000B7F38 /* NSString+Empty.h */,
4C5CD35217D15DBD000B7F38 /* NSString+Empty.m */,
4C5CD35317D15DBD000B7F38 /* NSString+Hexdata.h */,
4C5CD35417D15DBD000B7F38 /* NSString+Hexdata.m */,
4C1842BE179B5BFD00E2F5BC /* NSData+CommonCrypto.h */, 4C1842BE179B5BFD00E2F5BC /* NSData+CommonCrypto.h */,
4C1842BF179B5BFD00E2F5BC /* NSData+CommonCrypto.m */, 4C1842BF179B5BFD00E2F5BC /* NSData+CommonCrypto.m */,
4C2724D51778FF1A00FD8456 /* NSUUID+KeePassKit.h */, 4C2724D51778FF1A00FD8456 /* NSUUID+KeePassKit.h */,
@@ -1757,7 +1474,6 @@
4CFC873C179DF200000DFC03 /* KPKTimeInfo.h */, 4CFC873C179DF200000DFC03 /* KPKTimeInfo.h */,
4CFC873D179DF200000DFC03 /* KPKTimeInfo.m */, 4CFC873D179DF200000DFC03 /* KPKTimeInfo.m */,
4CFC873F179DF295000DFC03 /* KPKTimerecording.h */, 4CFC873F179DF295000DFC03 /* KPKTimerecording.h */,
4CFC8740179DF7A3000DFC03 /* KPKUndoing.h */,
4C68456817BC21DD00FCDBFC /* KPKAutotype.h */, 4C68456817BC21DD00FCDBFC /* KPKAutotype.h */,
4C68456917BC21DD00FCDBFC /* KPKAutotype.m */, 4C68456917BC21DD00FCDBFC /* KPKAutotype.m */,
4C68456B17BC227B00FCDBFC /* KPKWindowAssociation.h */, 4C68456B17BC227B00FCDBFC /* KPKWindowAssociation.h */,
@@ -1769,6 +1485,12 @@
4CD3ABB5178F71B50073F5C5 /* IO */ = { 4CD3ABB5178F71B50073F5C5 /* IO */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
4C5CD35B17D15DCA000B7F38 /* KPKArc4RandomStream.h */,
4C5CD35C17D15DCA000B7F38 /* KPKArc4RandomStream.m */,
4C5CD35D17D15DCA000B7F38 /* KPKRandomStream.h */,
4C5CD35E17D15DCA000B7F38 /* KPKRandomStream.m */,
4C5CD35F17D15DCA000B7F38 /* KPKSalsa20RandomStream.h */,
4C5CD36017D15DCA000B7F38 /* KPKSalsa20RandomStream.m */,
4CDB5C401794AA4F0017667E /* KPKTree+Serializing.h */, 4CDB5C401794AA4F0017667E /* KPKTree+Serializing.h */,
4CDB5C411794AA4F0017667E /* KPKTree+Serializing.m */, 4CDB5C411794AA4F0017667E /* KPKTree+Serializing.m */,
4C1842BA179B434C00E2F5BC /* KPKXmlHeaderReader.h */, 4C1842BA179B434C00E2F5BC /* KPKXmlHeaderReader.h */,
@@ -2112,45 +1834,12 @@
4CA0B2F915BCAF6700654E32 /* MPGeneralSettingsController.m in Sources */, 4CA0B2F915BCAF6700654E32 /* MPGeneralSettingsController.m in Sources */,
4CA0B2FC15BCAF8600654E32 /* MPSettingsWindowController.m in Sources */, 4CA0B2FC15BCAF8600654E32 /* MPSettingsWindowController.m in Sources */,
4C83814215BF4677001AE468 /* MPDocumentWindowController.m in Sources */, 4C83814215BF4677001AE468 /* MPDocumentWindowController.m in Sources */,
4C669B7F16760ED100DD0774 /* AesInputStream.m in Sources */,
4C669B8016760ED100DD0774 /* AesOutputStream.m in Sources */,
4C669B8116760ED100DD0774 /* Arc4RandomStream.m in Sources */,
4C669B8216760ED100DD0774 /* DataInputStream.m in Sources */,
4C669B8316760ED100DD0774 /* DataOutputStream.m in Sources */,
4C669B8416760ED100DD0774 /* FileInputStream.m in Sources */,
4C669B8516760ED100DD0774 /* FileOutputStream.m in Sources */,
4C669B8616760ED100DD0774 /* GZipInputStream.m in Sources */,
4C669B8716760ED100DD0774 /* GZipOutputStream.m in Sources */,
4C669B8816760ED100DD0774 /* HashedInputStream.m in Sources */,
4C669B8916760ED100DD0774 /* HashedOutputStream.m in Sources */,
4C669B8A16760ED100DD0774 /* InputStream.m in Sources */,
4C669B8B16760ED100DD0774 /* OutputStream.m in Sources */,
4C669B8C16760ED100DD0774 /* Sha256OutputStream.m in Sources */,
4C669B9016760ED100DD0774 /* DDXMLElement+MKPAdditions.m in Sources */,
4C669B9116760ED100DD0774 /* Kdb.m in Sources */,
4C669B9316760ED100DD0774 /* Kdb3Node.m in Sources */,
4C669B9416760ED100DD0774 /* Kdb3Reader.m in Sources */,
4C669B9516760ED100DD0774 /* Kdb3Utils.m in Sources */,
4C669B9616760ED100DD0774 /* Kdb3Writer.m in Sources */,
4C669B9716760ED100DD0774 /* Kdb4Node.m in Sources */,
4C669B9816760ED100DD0774 /* Kdb4Parser.m in Sources */,
4C669B9916760ED100DD0774 /* Kdb4Persist.m in Sources */,
4C669B9A16760ED100DD0774 /* Kdb4Reader.m in Sources */,
4C669B9B16760ED100DD0774 /* Kdb4Writer.m in Sources */,
4C669B9C16760ED100DD0774 /* KdbPassword.m in Sources */,
4C669B9D16760ED100DD0774 /* KdbReaderFactory.m in Sources */,
4C669B9E16760ED100DD0774 /* KdbWriterFactory.m in Sources */,
4C669B9F16760ED100DD0774 /* RandomStream.m in Sources */,
4C669BA016760ED100DD0774 /* Salsa20RandomStream.m in Sources */,
4C669BA216760ED100DD0774 /* UUID.m in Sources */,
4C2E382316D1421B00037A9D /* MPIconHelper.m in Sources */, 4C2E382316D1421B00037A9D /* MPIconHelper.m in Sources */,
4C2E382616D1470200037A9D /* MPViewController.m in Sources */, 4C2E382616D1470200037A9D /* MPViewController.m in Sources */,
4C65FAE916D16DDB006E0577 /* MPPasswordInputController.m in Sources */, 4C65FAE916D16DDB006E0577 /* MPPasswordInputController.m in Sources */,
4CDF01A316D1B76700D0AC08 /* MPEntryViewController.m in Sources */, 4CDF01A316D1B76700D0AC08 /* MPEntryViewController.m in Sources */,
4C3BD51516D276F800389F1F /* MPToolbarDelegate.m in Sources */, 4C3BD51516D276F800389F1F /* MPToolbarDelegate.m in Sources */,
4C61EA0316D2FD0800AC519E /* MPOutlineViewController.m in Sources */, 4C61EA0316D2FD0800AC519E /* MPOutlineViewController.m in Sources */,
4C2C4C2C16D3BE3700D49295 /* KdbGroup+MPTreeTools.m in Sources */,
4CC1AEBE16D4467C006D2AAB /* KdbTree+MPAdditions.m in Sources */,
4C69A73A16D589DF00EC1B1A /* HNHGradientView.m in Sources */, 4C69A73A16D589DF00EC1B1A /* HNHGradientView.m in Sources */,
4C65C79C16DD283900E32CFF /* MPToolbarButton.m in Sources */, 4C65C79C16DD283900E32CFF /* MPToolbarButton.m in Sources */,
4C431BCD16E2A82800700A81 /* MPPasteBoardController.m in Sources */, 4C431BCD16E2A82800700A81 /* MPPasteBoardController.m in Sources */,
@@ -2166,21 +1855,17 @@
4C46B88517063A070046109A /* NSString+MPPasswordCreation.m in Sources */, 4C46B88517063A070046109A /* NSString+MPPasswordCreation.m in Sources */,
4C5A11FE1708DE8700223D8A /* MPPasswordCreatorViewController.m in Sources */, 4C5A11FE1708DE8700223D8A /* MPPasswordCreatorViewController.m in Sources */,
4CE5B54B173AFBA700207B39 /* MPDocument.m in Sources */, 4CE5B54B173AFBA700207B39 /* MPDocument.m in Sources */,
4C22040D1746ED160054C916 /* KdbGroup+Undo.m in Sources */,
4C3D4C0817594CA40038DAAC /* HNHSeparator.m in Sources */, 4C3D4C0817594CA40038DAAC /* HNHSeparator.m in Sources */,
4C5BF67B175C01F300D53DF7 /* MPUppercaseStringValueTransformer.m in Sources */, 4C5BF67B175C01F300D53DF7 /* MPUppercaseStringValueTransformer.m in Sources */,
4CC3AABD175F4983003EF01B /* HNHRoundedTextFieldCell.m in Sources */, 4CC3AABD175F4983003EF01B /* HNHRoundedTextFieldCell.m in Sources */,
4C9D6AA917615199001C660C /* HNHRoundedSecureTextFieldCell.m in Sources */, 4C9D6AA917615199001C660C /* HNHRoundedSecureTextFieldCell.m in Sources */,
4C4A100F176286FD00BBF2CA /* MPTableView.m in Sources */, 4C4A100F176286FD00BBF2CA /* MPTableView.m in Sources */,
4C4A101217629DA900BBF2CA /* KdbGroup+KVOAdditions.m in Sources */,
4CAF62FC1763604000CD7084 /* HNHBadgedTextFieldCell.m in Sources */, 4CAF62FC1763604000CD7084 /* HNHBadgedTextFieldCell.m in Sources */,
4C58BD4F176370B100B8178C /* HNHBadgedTextField.m in Sources */, 4C58BD4F176370B100B8178C /* HNHBadgedTextField.m in Sources */,
4C01C23F1764D2980016D5D0 /* KdbEntry+Undo.m in Sources */,
4C01C2421764D8980016D5D0 /* MPContextMenuHelper.m in Sources */, 4C01C2421764D8980016D5D0 /* MPContextMenuHelper.m in Sources */,
4C01C245176500C40016D5D0 /* HNHLevelIndicatorCell.m in Sources */, 4C01C245176500C40016D5D0 /* HNHLevelIndicatorCell.m in Sources */,
4C569D9E17652B0600595B62 /* MPConstants.m in Sources */, 4C569D9E17652B0600595B62 /* MPConstants.m in Sources */,
4C569DA117652BFE00595B62 /* MPEntryTableDataSource.m in Sources */, 4C569DA117652BFE00595B62 /* MPEntryTableDataSource.m in Sources */,
4C569DA417653F3500595B62 /* KdbEntry+MPTreeTools.m in Sources */,
4C79DF2A176685870083708F /* HNHRoundedTextField.m in Sources */, 4C79DF2A176685870083708F /* HNHRoundedTextField.m in Sources */,
4C46E09E17673A0A00DA62E8 /* HNHShadowBox.m in Sources */, 4C46E09E17673A0A00DA62E8 /* HNHShadowBox.m in Sources */,
4C37A6731769393300AD0A40 /* HNHTableHeaderCell.m in Sources */, 4C37A6731769393300AD0A40 /* HNHTableHeaderCell.m in Sources */,
@@ -2220,27 +1905,13 @@
4CC299FF176F99E50050C939 /* MPRequestHandlerService.m in Sources */, 4CC299FF176F99E50050C939 /* MPRequestHandlerService.m in Sources */,
4CC29A02176F9D140050C939 /* MPTestAssociateRequestHandler.m in Sources */, 4CC29A02176F9D140050C939 /* MPTestAssociateRequestHandler.m in Sources */,
4CA0E3A7176FAF99004D18CB /* MPDocumentQueryService.m in Sources */, 4CA0E3A7176FAF99004D18CB /* MPDocumentQueryService.m in Sources */,
4C83F4AA1774B155006C5FC0 /* Kdb3Tree+NewTree.m in Sources */,
4C83F4AD1774B25F006C5FC0 /* Kdb4Tree+NewTree.m in Sources */,
4C2724CE1778EFB100FD8456 /* NSData+Random.m in Sources */,
4C2724D11778EFE300FD8456 /* NSString+Empty.m in Sources */,
4C2724D41778FA0700FD8456 /* NSDate+Packed.m in Sources */,
4C2724D71778FF1A00FD8456 /* NSUUID+KeePassKit.m in Sources */, 4C2724D71778FF1A00FD8456 /* NSUUID+KeePassKit.m in Sources */,
4C2724DA17790E7C00FD8456 /* NSMutableData+Base64.m in Sources */,
4C2A6134177A1D5F00C9826C /* KPLErrorCodes.m in Sources */,
4CD5D705177A5F3300100649 /* MPDatabaseSettingsWindowController.m in Sources */, 4CD5D705177A5F3300100649 /* MPDatabaseSettingsWindowController.m in Sources */,
4C5EC302177B700D00DA955B /* MPRootAdapter.m in Sources */,
4C74DD07177BD1640034A9DB /* MPCustomFieldView.m in Sources */, 4C74DD07177BD1640034A9DB /* MPCustomFieldView.m in Sources */,
4C36E5B4177CD4FB00152132 /* Kdb4Tree+KVOAdditions.m in Sources */,
4C4FCE15177CFE6B00BBF7AE /* MPCustomFieldTableCellView.m in Sources */, 4C4FCE15177CFE6B00BBF7AE /* MPCustomFieldTableCellView.m in Sources */,
4C4FCE18177D03D700BBF7AE /* Kdb4Entry+KVOAdditions.m in Sources */,
4C52A244177D7B9F0000D88F /* HNHScrollView.m in Sources */, 4C52A244177D7B9F0000D88F /* HNHScrollView.m in Sources */,
4C3E1CC0177DEFB3003BD9BD /* StringField+Undo.m in Sources */,
4CC7EA1B17807E7E0089D4F3 /* HNHRoundedTextFieldCellHelper.m in Sources */, 4CC7EA1B17807E7E0089D4F3 /* HNHRoundedTextFieldCellHelper.m in Sources */,
4CC672791781D0C0006DEDCF /* KdbGroup+MPAdditions.m in Sources */,
4CC6727C1781D0D2006DEDCF /* KdbEntry+MPAdditions.m in Sources */,
4C5FE9AE17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.m in Sources */, 4C5FE9AE17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.m in Sources */,
4CF1F0CA1786B37900CD920E /* NSData+Gzip.m in Sources */,
4C3666411787327E00B249F1 /* MPDocument+Attachments.m in Sources */, 4C3666411787327E00B249F1 /* MPDocument+Attachments.m in Sources */,
4CD6C5AE1789FDE6000891F6 /* HNHRoundedSecureTextField.m in Sources */, 4CD6C5AE1789FDE6000891F6 /* HNHRoundedSecureTextField.m in Sources */,
4C10412C178CDD44001B5239 /* NSDate+Humanized.m in Sources */, 4C10412C178CDD44001B5239 /* NSDate+Humanized.m in Sources */,
@@ -2253,7 +1924,6 @@
4C8A173D1790AA41008B5C17 /* NSData+Keyfile.m in Sources */, 4C8A173D1790AA41008B5C17 /* NSData+Keyfile.m in Sources */,
4C3F28541791EDFD00703281 /* KPKErrors.m in Sources */, 4C3F28541791EDFD00703281 /* KPKErrors.m in Sources */,
4C4436771792BE810099E220 /* KPKFormat.m in Sources */, 4C4436771792BE810099E220 /* KPKFormat.m in Sources */,
4C801AFC179310E2002821E3 /* NSString+Hexdata.m in Sources */,
4CF62B86179385D700B660B6 /* KPKAttribute.m in Sources */, 4CF62B86179385D700B660B6 /* KPKAttribute.m in Sources */,
4CDB5C421794AA4F0017667E /* KPKTree+Serializing.m in Sources */, 4CDB5C421794AA4F0017667E /* KPKTree+Serializing.m in Sources */,
4C5AA591179549A1008ECAD7 /* KPKXmlTreeWriter.m in Sources */, 4C5AA591179549A1008ECAD7 /* KPKXmlTreeWriter.m in Sources */,
@@ -2263,9 +1933,6 @@
4CC0D2D117974A5A000B4BDA /* MPAttachmentTableViewDelegate.m in Sources */, 4CC0D2D117974A5A000B4BDA /* MPAttachmentTableViewDelegate.m in Sources */,
4C67D33017981A2B00A7BDFC /* HNHTokenField.m in Sources */, 4C67D33017981A2B00A7BDFC /* HNHTokenField.m in Sources */,
4C67D33317981ABA00A7BDFC /* HNHTokenFieldCell.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 */, 4C305F36179A0BD70082334F /* KPKIcon.m in Sources */,
4C1842AB179B027800E2F5BC /* KPKDeletedNode.m in Sources */, 4C1842AB179B027800E2F5BC /* KPKDeletedNode.m in Sources */,
4C1842AF179B211C00E2F5BC /* KPKXmlTreeReader.m in Sources */, 4C1842AF179B211C00E2F5BC /* KPKXmlTreeReader.m in Sources */,
@@ -2295,9 +1962,7 @@
4CA08DA017A831B200A6544B /* MPAddEntryContextMenuDelegate.m in Sources */, 4CA08DA017A831B200A6544B /* MPAddEntryContextMenuDelegate.m in Sources */,
4C6BEA3117A88E6C00CF69A8 /* MPStripLineBreaksTransformer.m in Sources */, 4C6BEA3117A88E6C00CF69A8 /* MPStripLineBreaksTransformer.m in Sources */,
4C79E80317A9187400AC6CD2 /* KPKXmlHeaderWriter.m in Sources */, 4C79E80317A9187400AC6CD2 /* KPKXmlHeaderWriter.m in Sources */,
4CFB5E9F17AAD20200D9B10C /* Kdb4Group+Undo.m in Sources */,
4CE3E62617AB0D2D00D9E4B4 /* MPAttachmentTableDataSource.m in Sources */, 4CE3E62617AB0D2D00D9E4B4 /* MPAttachmentTableDataSource.m in Sources */,
4CF4FEE017AEA4A400712774 /* UUID+Pasterboard.m in Sources */,
4C6366AC17AF1E0100AAF17D /* NSColor+KeePassKit.m in Sources */, 4C6366AC17AF1E0100AAF17D /* NSColor+KeePassKit.m in Sources */,
4C08C3AE17B3022400BBBC95 /* KPKLegacyHeaderWriter.m in Sources */, 4C08C3AE17B3022400BBBC95 /* KPKLegacyHeaderWriter.m in Sources */,
4C0728BD17B5B7F7005A7DD9 /* MPPasswordEditWindowController.m in Sources */, 4C0728BD17B5B7F7005A7DD9 /* MPPasswordEditWindowController.m in Sources */,
@@ -2311,6 +1976,17 @@
4C6C72C417C01E4200768849 /* NSMutableData+KeePassKit.m in Sources */, 4C6C72C417C01E4200768849 /* NSMutableData+KeePassKit.m in Sources */,
4C0104BB17C37BFC00173EF3 /* KPKLegacyHeaderUtility.m in Sources */, 4C0104BB17C37BFC00173EF3 /* KPKLegacyHeaderUtility.m in Sources */,
4C0104BE17C37DA400173EF3 /* KPKXmlUtilities.m in Sources */, 4C0104BE17C37DA400173EF3 /* KPKXmlUtilities.m in Sources */,
4C5CD35517D15DBD000B7F38 /* NSData+Gzip.m in Sources */,
4C5CD35617D15DBD000B7F38 /* NSData+Random.m in Sources */,
4C5CD35717D15DBD000B7F38 /* NSDate+Packed.m in Sources */,
4C5CD35817D15DBD000B7F38 /* NSMutableData+Base64.m in Sources */,
4C5CD35917D15DBD000B7F38 /* NSString+Empty.m in Sources */,
4C5CD35A17D15DBD000B7F38 /* NSString+Hexdata.m in Sources */,
4C5CD36117D15DCA000B7F38 /* KPKArc4RandomStream.m in Sources */,
4C5CD36217D15DCA000B7F38 /* KPKRandomStream.m in Sources */,
4C5CD36317D15DCA000B7F38 /* KPKSalsa20RandomStream.m in Sources */,
4CC6DB7A17D23719002C6091 /* KPKNode+IconImage.m in Sources */,
4CC6DB7D17D23DCE002C6091 /* KPKUTIs.m in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };

View File

@@ -0,0 +1,15 @@
//
// KPKNode+IconImage.h
// MacPass
//
// Created by Michael Starke on 31.08.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "KPKNode.h"
@interface KPKNode (IconImage)
@property (nonatomic, readonly) NSImage *iconImage;
@end

View File

@@ -0,0 +1,26 @@
//
// KPKNode+IconImage.m
// MacPass
//
// Created by Michael Starke on 31.08.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "KPKNode+IconImage.h"
#import "KPKIcon.h"
#import "MPIconHelper.h"
@implementation KPKNode (IconImage)
- (NSImage *)iconImage {
if([self respondsToSelector:@selector(customIconUuid)]) {
// find the custom icon
}
if(self.customIcon) {
return self.customIcon.image;
}
return [MPIconHelper icon:(MPIconType)self.icon];
}
@end

View File

@@ -1,18 +0,0 @@
//
// 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

@@ -1,31 +0,0 @@
//
// 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

@@ -1,15 +0,0 @@
//
// Kdb3Tree+NewTree.h
// MacPass
//
// Created by Michael Starke on 21.06.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb3Node.h"
@interface Kdb3Tree (NewTree)
+ (Kdb3Tree *)templateTree;
@end

View File

@@ -1,54 +0,0 @@
//
// Kdb3Tree+NewTree.m
// MacPass
//
// Created by Michael Starke on 21.06.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb3Tree+NewTree.h"
@implementation Kdb3Tree (NewTree)
+ (Kdb3Tree *)templateTree {
Kdb3Tree *tree = [[Kdb3Tree alloc] init];
Kdb3Group *rootGroup = [[Kdb3Group alloc] init];
rootGroup.name = @"%ROOT%";
tree.root = rootGroup;
KdbGroup *parentGroup = [tree createGroup:rootGroup];
parentGroup.name = NSLocalizedString(@"GENERAL", "General");
parentGroup.image = 48;
[rootGroup addGroup:parentGroup];
KdbGroup *group = [tree createGroup:parentGroup];
group.name = NSLocalizedString(@"WINDOWS", "Windows");
group.image = 38;
[parentGroup addGroup:group];
group = [tree createGroup:parentGroup];
group.name = NSLocalizedString(@"NETWORK", "Network");
group.image = 3;
[parentGroup addGroup:group];
group = [tree createGroup:parentGroup];
group.name = NSLocalizedString(@"INTERNET", "Internet");
group.image = 1;
[parentGroup addGroup:group];
group = [tree createGroup:parentGroup];
group.name = NSLocalizedString(@"EMAIL", "EMail");
group.image = 19;
[parentGroup addGroup:group];
group = [tree createGroup:parentGroup];
group.name = NSLocalizedString(@"HOMEBANKING", "Homebanking");
group.image = 37;
[parentGroup addGroup:group];
return tree;
}
@end

View File

@@ -1,23 +0,0 @@
//
// Kdb4Entry+KVOAdditions.h
// MacPass
//
// Created by Michael Starke on 28.06.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb4Node.h"
@interface Kdb4Entry (KVOAdditions)
- (NSUInteger)countOfStringFields;
- (StringField *)objectInStringFieldsAtIndex:(NSUInteger)index;
- (void)removeObjectFromStringFieldsAtIndex:(NSUInteger)anIndex;
- (void)insertObject:(StringField *)stringfield inStringFieldsAtIndex:(NSUInteger)anIndex;
- (NSUInteger)countOfBinaries;
- (BinaryRef *)objectInBinariesAtIndex:(NSUInteger)index;
- (void)removeObjectFromBinariesAtIndex:(NSUInteger)index;
- (void)insertObject:(BinaryRef *)binary inBinariesAtIndex:(NSUInteger)index;
@end

View File

@@ -1,47 +0,0 @@
//
// Kdb4Entry+KVOAdditions.m
// MacPass
//
// Created by Michael Starke on 28.06.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb4Entry+KVOAdditions.h"
@implementation Kdb4Entry (KVOAdditions)
/* Entries */
- (NSUInteger)countOfStringFields {
return [self.stringFields count];
}
- (StringField *)objectInStringFieldsAtIndex:(NSUInteger)index {
return (self.stringFields)[index];
}
- (void)insertObject:(StringField *)stringfield inStringFieldsAtIndex:(NSUInteger)anIndex {
[self.stringFields insertObject:stringfield atIndex:anIndex];
}
- (void)removeObjectFromStringFieldsAtIndex:(NSUInteger)anIndex {
[self.stringFields removeObjectAtIndex:anIndex];
}
/* Binaries */
- (NSUInteger)countOfBinaries {
return [self.binaries count];
}
- (BinaryRef *)objectInBinariesAtIndex:(NSUInteger)index {
return (self.binaries)[index];
}
- (void)insertObject:(BinaryRef *)binary inBinariesAtIndex:(NSUInteger)index {
[self.binaries insertObject:binary atIndex:index];
}
- (void)removeObjectFromBinariesAtIndex:(NSUInteger)index {
[self.binaries removeObjectAtIndex:index];
}
@end

View File

@@ -1,15 +0,0 @@
//
// 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

@@ -1,36 +0,0 @@
//
// 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 {
if(key == nil) {
key = NSLocalizedString(@"DEFAULT_CUSTOM_FIELD_TITLE", @"Default Titel for new Custom-Fields");
}
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

@@ -1,16 +0,0 @@
//
// Kdb4Group+Undo.h
// MacPass
//
// Created by Michael Starke on 01.08.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb4Node.h"
@interface Kdb4Group (Undo)
- (NSString *)notesUndoable;
- (void)setNotesUndoable:(NSString *)newNotes;
@end

View File

@@ -1,24 +0,0 @@
//
// Kdb4Group+Undo.m
// MacPass
//
// Created by Michael Starke on 01.08.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb4Group+Undo.h"
#import "KdbGroup+Undo.h"
@implementation Kdb4Group (Undo)
- (NSString *)notesUndoable {
return self.notes;
}
- (void)setNotesUndoable:(NSString *)newNotes {
[[self undoManager] registerUndoWithTarget:self selector:@selector(setNotesUndoable:) object:self.notes];
[[self undoManager] setActionName:NSLocalizedString(@"SET_NOTES", "")];
self.notes = newNotes;
}
@end

View File

@@ -1,19 +0,0 @@
//
// Kdb4Tree+KVOAdditions.h
// MacPass
//
// Created by Michael Starke on 27.06.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb4Node.h"
@interface Kdb4Tree (KVOAdditions)
- (void)insertObject:(Binary *)binary inBinariesAtIndex:(NSUInteger)index;
- (void)insertObject:(CustomIcon *)icon inCustomIconsAtIndex:(NSUInteger)index;
- (CustomIcon *)objectInCustomIconsAtIndex:(NSUInteger)index;
- (Binary *)objectInBinariesAtIndex:(NSUInteger)index;
@end

View File

@@ -1,29 +0,0 @@
//
// Kdb4Tree+KVOAdditions.m
// MacPass
//
// Created by Michael Starke on 27.06.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb4Tree+KVOAdditions.h"
@implementation Kdb4Tree (KVOAdditions)
- (void)insertObject:(Binary *)binary inBinariesAtIndex:(NSUInteger)index {
[self.binaries insertObject:binary atIndex:index];
}
- (void)insertObject:(CustomIcon *)icon inCustomIconsAtIndex:(NSUInteger)index {
[self.customIcons insertObject:icon atIndex:index];
}
- (Binary *)objectInBinariesAtIndex:(NSUInteger)index {
return (self.binaries)[index];
}
- (CustomIcon *)objectInCustomIconsAtIndex:(NSUInteger)index {
return (self.customIcons)[index];
}
@end

View File

@@ -1,16 +0,0 @@
//
// Kdb4Tree+NewTree.h
// MacPass
//
// Created by Michael Starke on 21.06.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb4Node.h"
@interface Kdb4Tree (NewTree)
+(Kdb4Tree *)templateTree;
+(Kdb4Tree *)demoTree;
@end

View File

@@ -1,123 +0,0 @@
//
// Kdb4Tree+NewTree.m
// MacPass
//
// Created by Michael Starke on 21.06.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb4Tree+NewTree.h"
@implementation Kdb4Tree (NewTree)
+ (Kdb4Tree *)templateTree {
NSDate *currentTime = [NSDate date];
Kdb4Tree *tree = [[Kdb4Tree alloc] init];
tree.generator = @"MacPass";
tree.databaseName = NSLocalizedString(@"DATABASE", "");
tree.databaseNameChanged = currentTime;
tree.databaseDescription = @"";
tree.databaseDescriptionChanged = currentTime;
tree.defaultUserName = @"";
tree.defaultUserNameChanged = currentTime;
tree.maintenanceHistoryDays = 365;
tree.color = @"";
tree.masterKeyChanged = currentTime;
tree.masterKeyChangeRec = -1;
tree.masterKeyChangeForce = -1;
tree.protectTitle = NO;
tree.protectUserName = NO;
tree.protectPassword = YES;
tree.protectUrl = NO;
tree.protectNotes = NO;
tree.recycleBinEnabled = YES;
tree.recycleBinUuid = [UUID nullUuid];
tree.recycleBinChanged = currentTime;
tree.entryTemplatesGroup = [UUID nullUuid];
tree.entryTemplatesGroupChanged = currentTime;
tree.historyMaxItems = 10;
tree.historyMaxSize = 6 * 1024 * 1024; // 6 MB
tree.lastSelectedGroup = [UUID nullUuid];
tree.lastTopVisibleGroup = [UUID nullUuid];
KdbGroup *parentGroup = [tree createGroup:nil];
parentGroup.name = NSLocalizedString(@"GENERAL", "General");
parentGroup.image = 48;
tree.root = parentGroup;
KdbGroup *group = [tree createGroup:parentGroup];
group.name = NSLocalizedString(@"WINDOWS", "Windows");
group.image = 38;
[parentGroup addGroup:group];
group = [tree createGroup:parentGroup];
group.name = NSLocalizedString(@"NETWORK", "Network");
group.image = 3;
[parentGroup addGroup:group];
group = [tree createGroup:parentGroup];
group.name = NSLocalizedString(@"INTERNET", "Internet");
group.image = 1;
[parentGroup addGroup:group];
group = [tree createGroup:parentGroup];
group.name = NSLocalizedString(@"EMAIL", "EMail");
group.image = 19;
[parentGroup addGroup:group];
group = [tree createGroup:parentGroup];
group.name = NSLocalizedString(@"HOMEBANKING", "Homebanking");
group.image = 37;
[parentGroup addGroup:group];
return tree;
}
+ (Kdb4Tree *)demoTree {
NSDate *currentTime = [NSDate date];
Kdb4Tree *tree = [[Kdb4Tree alloc] init];
tree.generator = @"MacPass";
tree.databaseName = @"Icon Demonstation";
tree.databaseNameChanged = currentTime;
tree.databaseDescription = @"This database just has all default icons as groups in the tree";
tree.databaseDescriptionChanged = currentTime;
tree.defaultUserName = @"";
tree.defaultUserNameChanged = currentTime;
tree.maintenanceHistoryDays = 365;
tree.color = @"";
tree.masterKeyChanged = currentTime;
tree.masterKeyChangeRec = -1;
tree.masterKeyChangeForce = -1;
tree.protectTitle = NO;
tree.protectUserName = NO;
tree.protectPassword = YES;
tree.protectUrl = NO;
tree.protectNotes = NO;
tree.recycleBinEnabled = YES;
tree.recycleBinUuid = [UUID nullUuid];
tree.recycleBinChanged = currentTime;
tree.entryTemplatesGroup = [UUID nullUuid];
tree.entryTemplatesGroupChanged = currentTime;
tree.historyMaxItems = 10;
tree.historyMaxSize = 6 * 1024 * 1024; // 6 MB
tree.lastSelectedGroup = [UUID nullUuid];
tree.lastTopVisibleGroup = [UUID nullUuid];
KdbGroup *parentGroup = [tree createGroup:nil];
parentGroup.name = @"General";
parentGroup.image = 48;
tree.root = parentGroup;
for(NSUInteger iImageIndex = 0; iImageIndex < 69; iImageIndex++) {
KdbGroup *group = [tree createGroup:parentGroup];
group.name = [NSString stringWithFormat:@"Group %ld", iImageIndex];
group.image = iImageIndex;
[parentGroup addGroup:group];
}
return tree;
}
@end

View File

@@ -1,15 +0,0 @@
//
// KdbEntry+MPAdditions.h
// MacPass
//
// Created by Michael Starke on 01.07.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb.h"
@interface KdbEntry (MPAdditions)
@property (nonatomic, readonly) NSImage *icon;
@end

View File

@@ -1,21 +0,0 @@
//
// KdbEntry+MPAdditions.m
// MacPass
//
// Created by Michael Starke on 01.07.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "KdbEntry+MPAdditions.h"
#import "Kdb3Node.h"
#import "Kdb4Node.h"
#import "MPIconHelper.h"
@implementation KdbEntry (MPAdditions)
- (NSImage *)icon {
return [MPIconHelper icon:(MPIconType)self.image];
}
@end

View File

@@ -1,15 +0,0 @@
//
// KdbEntry+MPTreeTools.h
// MacPass
//
// Created by Michael Starke on 10.06.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb.h"
@interface KdbEntry (MPTreeTools)
- (NSUInteger)indexInParent;
@end

View File

@@ -1,21 +0,0 @@
//
// KdbEntry+MPTreeTools.m
// MacPass
//
// Created by Michael Starke on 10.06.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "KdbEntry+MPTreeTools.h"
@implementation KdbEntry (MPTreeTools)
- (NSUInteger)indexInParent {
if(self.parent) {
return [self.parent.entries indexOfObject:self];
}
return NSNotFound;
}
@end

View File

@@ -1,29 +0,0 @@
//
// KdbEntry+Undo.h
// MacPass
//
// Created by Michael Starke on 12.05.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb.h"
@interface KdbEntry (Undo)
- (NSString *)titleUndoable;
- (NSString *)usernameUndoable;
- (NSString *)passwordUndoable;
- (NSString *)urlUndoable;
- (NSString *)notesUndoable;
- (void)setTitleUndoable:(NSString *)title;
- (void)setUsernameUndoable:(NSString *)username;
- (void)setPasswordUndoable:(NSString *)password;
- (void)setUrlUndoable:(NSString *)url;
- (void)setNotesUndoable:(NSString *)notes;
- (void)deleteUndoable;
- (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index;
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index;
@end

View File

@@ -1,139 +0,0 @@
//
// KdbEntry+Undo.m
// MacPass
//
// Created by Michael Starke on 12.05.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "KdbEntry+Undo.h"
#import "Kdb4Node.h"
#import "KdbGroup+Undo.h"
#import "KdbGroup+KVOAdditions.h"
#import "KdbGroup+MPTreeTools.h"
#ifndef MPSetActionName
#define MPSetActionName(key, comment) \
if(![[self undoManager] isUndoing]) {\
[[self undoManager] setActionName:[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]];\
}
#endif
@implementation KdbEntry (Undo)
- (NSUndoManager *)undoManager {
return [[[NSDocumentController sharedDocumentController] currentDocument] undoManager];
}
- (NSString *)titleUndoable {
return [self title];
}
- (NSString *)usernameUndoable {
return [self username];
}
- (NSString *)passwordUndoable {
return [self password];
}
- (NSString *)urlUndoable {
return [self url];
}
- (NSString *)notesUndoable {
return [self notes];
}
- (void)setTitleUndoable:(NSString *)title {
[[self undoManager] registerUndoWithTarget:self selector:@selector(setTitleUndoable:) object:self.title];
MPSetActionName(@"SET_TITLE", "");
[self _touchModifcationDate];
[self setTitle:title];
}
- (void)setUsernameUndoable:(NSString *)username {
[[self undoManager] registerUndoWithTarget:self selector:@selector(setUsernameUndoable:) object:self.username];
MPSetActionName(@"SET_USERNAME", "");
[self _touchModifcationDate];
[self setUsername:username];
}
- (void)setPasswordUndoable:(NSString *)password {
[[self undoManager] registerUndoWithTarget:self selector:@selector(setPasswordUndoable:) object:self.password];
MPSetActionName(@"SET_PASSWORT", "Undo set password");
[self _touchModifcationDate];
[self setPassword:password];
}
- (void)setUrlUndoable:(NSString *)url {
[[self undoManager] registerUndoWithTarget:self selector:@selector(setUrlUndoable:) object:self.url];
MPSetActionName(@"SET_URL", "Undo set URL");
[self _touchModifcationDate];
[self setUrl:url];
}
- (void)setNotesUndoable:(NSString *)notes {
[[self undoManager] registerUndoWithTarget:self selector:@selector(setNotesUndoable:) object:self.notes];
MPSetActionName(@"SET_NOTES", "Set Notes");
[self _touchModifcationDate];
[self setNotes:notes];
}
- (void)deleteUndoable {
if(!self.parent) {
return; // No parent to be removed from
}
NSUInteger oldIndex = [self.parent.entries indexOfObject:self];
if(oldIndex == NSNotFound) {
return; // We're not in our parents entries list
}
[[[self undoManager] prepareWithInvocationTarget:self.parent] addEntryUndoable:self atIndex:oldIndex];
MPSetActionName(@"DELETE_ENTRY", "");
//[[NSNotificationCenter defaultCenter] postNotificationName:@"" object:self userInfo:nil];
[self.parent removeObjectFromEntriesAtIndex:oldIndex];
}
- (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index {
[self _moveToGroup:group atIndex:index actionName:NSLocalizedString(@"MOVE_ENTRY", "Move Group")];
}
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index {
[self _moveToGroup:trash atIndex:index actionName:NSLocalizedString(@"TRASH_ENTRY", "Move Entry to Trash")];
}
- (void)_moveToGroup:(KdbGroup *)group atIndex:(NSUInteger)index actionName:(NSString *)name {
if(!group || !self.parent) {
return; // Nothing to be moved about
}
NSUInteger oldIndex = [self.parent.entries indexOfObject:self];
if(oldIndex == NSNotFound) {
return; // Not found in entries of parent!
}
[[[self undoManager] prepareWithInvocationTarget:self] _moveToGroup:self.parent atIndex:oldIndex actionName:name];
MPSetActionName(name, "");
[self.parent removeObjectFromEntriesAtIndex:oldIndex];
// Old indices might be wrong, correct them if necessary
index = MIN(index, [group.entries count]);
[group insertObject:self inEntriesAtIndex:index];
if([self respondsToSelector:@selector(setLocationChanged:)]) {
id entry = self;
[entry setLocationChanged:[NSDate date]];
}
}
- (void)_touchModifcationDate {
self.lastModificationTime = [NSDate date];
}
@end

View File

@@ -1,25 +0,0 @@
//
// KdbGroup+KVOAdditions.h
// MacPass
//
// Created by Michael Starke on 08.06.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb.h"
@interface KdbGroup (KVOAdditions)
/* KVO Accesors for the entries */
- (KdbEntry *)objectInEntriesAtIndex:(NSUInteger)index;
- (NSUInteger)countOfEntries;
- (void)insertObject:(KdbEntry *)entry inEntriesAtIndex:(NSUInteger)index;
- (void)removeObjectFromEntriesAtIndex:(NSUInteger)index;
/* KVO Accessors for the groups */
- (KdbGroup *)objectInGroupsAtIndex:(NSUInteger)index;
- (NSUInteger)countOfGroups;
- (void)insertObject:(KdbGroup *)group inGroupsAtIndex:(NSUInteger)index;
- (void)removeObjectFromGroupsAtIndex:(NSUInteger)index;
@end

View File

@@ -1,51 +0,0 @@
//
// KdbGroup+KVOAdditions.m
// MacPass
//
// Created by Michael Starke on 08.06.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "KdbGroup+KVOAdditions.h"
@implementation KdbGroup (KVOAdditions)
- (void)insertObject:(KdbEntry *)entry inEntriesAtIndex:(NSUInteger)index {
entry.parent = self;
[_entries insertObject:entry atIndex:index];
}
- (void)removeObjectFromEntriesAtIndex:(NSUInteger)index {
KdbEntry *entry = _entries[index];
[_entries removeObjectAtIndex:index];
entry.parent = nil;
}
- (NSUInteger)countOfEntries {
return [self.entries count];
}
- (KdbEntry *)objectInEntriesAtIndex:(NSUInteger)index {
return self.entries[index];
}
- (KdbGroup *)objectInGroupsAtIndex:(NSUInteger)index {
return self.groups[index];
}
- (NSUInteger)countOfGroups {
return [self.groups count];
}
- (void)insertObject:(KdbGroup *)group inGroupsAtIndex:(NSUInteger)index {
group.parent = self;
[_groups insertObject:group atIndex:index];
}
- (void)removeObjectFromGroupsAtIndex:(NSUInteger)index {
KdbGroup *group = (self.groups)[index];
[_groups removeObjectAtIndex:index];
group.parent = nil;
}
@end

View File

@@ -1,22 +0,0 @@
//
// KdbGroup+MPAdditions.h
// MacPass
//
// Created by Michael Starke on 01.07.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb.h"
@interface KdbGroup (MPAdditions)
/* Adapter to load images based on icon index */
@property (nonatomic, readonly) NSImage *icon;
/* Walks the tree up to the root element */
- (KdbGroup *)root;
/* Removes all Groups and Entries from this group*/
- (void)clear;
@end

View File

@@ -1,40 +0,0 @@
//
// KdbGroup+MPAdditions.m
// MacPass
//
// Created by Michael Starke on 01.07.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "KdbGroup+MPAdditions.h"
#import "KdbGroup+KVOAdditions.h"
#import "MPIconHelper.h"
#import "Kdb4Node.h"
@implementation KdbGroup (MPAdditions)
- (NSImage *)icon {
if([self respondsToSelector:@selector(customIconUuid)]) {
}
return [MPIconHelper icon:(MPIconType)self.image];
}
- (KdbGroup *)root {
if(self.parent) {
return [self.parent root];
}
return self;
}
- (void)clear {
NSUInteger groupCount = [_groups count];
for(NSInteger index = (groupCount - 1); index > -1; index--) {
[self removeObjectFromGroupsAtIndex:index];
}
NSUInteger entryCount = [_entries count];
for(NSInteger index = (entryCount - 1); index > -1; index--) {
[self removeObjectFromEntriesAtIndex:index];
}
}
@end

View File

@@ -1,33 +0,0 @@
//
// KdbGroup+MPTreeTools.h
// MacPass
//
// Created by michael starke on 19.02.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb.h"
@class UUID;
@interface KdbGroup (MPTreeTools)
/* Returns all groups under this group and it's subgroups */
- (NSArray *)childGroups;
/* Returns all entries under this group and it's subgroups */
- (NSArray *)childEntries;
/* Returns the entry with the UUID */
- (KdbEntry *)entryForUUID:(UUID *)uuid;
/**
* Searches through all subgroups and loactes the Group with the given UUID
* @param uuid UUID of the searched group
* @return group with matching UUID, otherwise nil
*/
- (KdbGroup *)groupForUUID:(UUID *)uuid;
/**
* Determines, if the reciever is an anchestor of the given group
* @param group The group to test for anchestry
* @return YES, if the receiver is an anchestor of group
*/
- (BOOL)isAnchestorOfGroup:(KdbGroup *)group;
@end

View File

@@ -1,66 +0,0 @@
//
// KdbGroup+MPTreeTools.m
// MacPass
//
// Created by michael starke on 19.02.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "KdbGroup+MPTreeTools.h"
#import "Kdb4Node.h"
#import "Kdb3Node.h"
@implementation KdbGroup (MPTreeTools)
- (NSArray *)childGroups {
NSMutableArray *childGroups = [NSMutableArray arrayWithCapacity:[self.groups count]];
[childGroups addObjectsFromArray:self.groups];
for(KdbGroup *childGroup in self.groups) {
[childGroups addObjectsFromArray:[childGroup childGroups]];
}
return childGroups;
}
- (NSArray *)childEntries {
NSMutableArray *childEntries = [NSMutableArray arrayWithCapacity:[self.groups count] + [self.entries count]];
[childEntries addObjectsFromArray:self.entries];
for( KdbGroup *childGroup in self.groups) {
[childEntries addObjectsFromArray:[childGroup childEntries]];
}
return childEntries;
}
- (KdbEntry *)entryForUUID:(UUID *)uuid {
NSArray *childEntries = [self childEntries];
NSArray *filterdEntries = [childEntries filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
return [uuid isEqual:(UUID *)[evaluatedObject uuid]];
}]];
NSAssert([filterdEntries count] <= 1, @"UUID hast to be unique");
return [filterdEntries lastObject];
}
- (KdbGroup *)groupForUUID:(UUID *)uuid {
NSArray *childGroups = [self childGroups];
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
return [uuid isEqual:(UUID *)[evaluatedObject uuid]];
}];
NSArray *filteredGroups = [childGroups filteredArrayUsingPredicate:predicate];
NSAssert([filteredGroups count] <= 1, @"UUID hast to be unique");
return [filteredGroups lastObject];
}
- (BOOL)isAnchestorOfGroup:(KdbGroup *)group {
if(group == nil) {
return NO;
}
KdbGroup *ancestor = group.parent;
while(ancestor) {
if(ancestor == self) {
return YES;
}
ancestor = ancestor.parent;
}
return NO;
}
@end

View File

@@ -1,26 +0,0 @@
//
// KdbGroup+Undo.h
// MacPass
//
// Created by Michael Starke on 18.05.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb.h"
APPKIT_EXTERN NSString *const MPGroupNameUndoableKey;
@interface KdbGroup (Undo)
- (NSUndoManager *)undoManager;
- (NSString *)nameUndoable;
- (void)setNameUndoable:(NSString *)newName;
- (void)deleteUndoable;
- (void)addGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index;
- (void)addEntryUndoable:(KdbEntry *)entry atIndex:(NSUInteger)index;
- (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index;
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index;
@end

View File

@@ -1,114 +0,0 @@
//
// KdbGroup+Undo.m
// MacPass
//
// Created by Michael Starke on 18.05.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "KdbGroup+Undo.h"
#import "KdbGroup+KVOAdditions.h"
#import "KdbEntry+Undo.h"
NSString *const MPGroupNameUndoableKey = @"nameUndoable";
@implementation KdbGroup (Undo)
- (NSUndoManager *)undoManager {
return [[[NSDocumentController sharedDocumentController] currentDocument] undoManager];
}
- (NSString *)nameUndoable {
return [self name];
}
- (void)setNameUndoable:(NSString *)newName {
[[self undoManager] registerUndoWithTarget:self selector:@selector(setNameUndoable:) object:self.name];
if(![[self undoManager] isUndoing]) {
[[self undoManager] setActionName:NSLocalizedString(@"SET_NAME", "Set Name")];
}
self.name = newName;
}
- (void)deleteUndoable {
if(!self.parent) {
return;
}
NSUInteger oldIndex = [self.parent.groups indexOfObject:self];
if(oldIndex == NSNotFound) {
return; // Inconsistent data
}
[[[self undoManager] prepareWithInvocationTarget:self.parent] addGroupUndoable:self atIndex:oldIndex];
if(![[self undoManager] isUndoing]) {
[[self undoManager] setActionName:NSLocalizedString(@"DELETE_GROUP", "Delete Group")];
}
[self.parent removeObjectFromGroupsAtIndex:oldIndex];
}
- (void)addGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index {
if(!group) {
return;
}
[[[self undoManager] prepareWithInvocationTarget:group] deleteUndoable];
if(![[self undoManager] isUndoing]) {
[[self undoManager] setActionName:NSLocalizedString(@"ADD_GROUP", "Add Group")];
}
index = MIN(index, [group.groups count]);
[self insertObject:group inGroupsAtIndex:index];
}
- (void)addEntryUndoable:(KdbEntry *)entry atIndex:(NSUInteger)index {
if(!entry) {
return;
}
index = MIN(index, [self.entries count]);
[[[self undoManager] prepareWithInvocationTarget:entry] deleteUndoable];
if(![[self undoManager] isUndoing]) {
[[self undoManager] setActionName:NSLocalizedString(@"ADD_ENTRY", "Add Entry")];
}
[self insertObject:entry inEntriesAtIndex:index];
}
- (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index {
[self _moveToGroup:group atIndex:index actionName:NSLocalizedString(@"MOVE_GROUP", "Move Group" )];
}
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index {
[self _moveToGroup:trash atIndex:index actionName:NSLocalizedString(@"TRASH_GROUP", "Move Group to Trash")];
}
- (void)_moveToGroup:(KdbGroup *)group atIndex:(NSUInteger)index actionName:(NSString *)actionName {
if(!self.parent || !group) {
return; // No target or origin
}
if(self.parent == group) {
// Correct the index to accomodate the removal
index--;
}
NSUInteger oldIndex = [self.parent.groups indexOfObject:self];
if(oldIndex == NSNotFound) {
return; // We aren't in our parents groups list.
}
[[[self undoManager] prepareWithInvocationTarget:self] moveToGroupUndoable:self.parent atIndex:oldIndex];
if(![[self undoManager] isUndoing]) {
[[self undoManager] setActionName:actionName];
}
[self.parent removeObjectFromGroupsAtIndex:oldIndex];
index = MIN(index, [group.groups count]);
index = MAX(index, 0 );
[group insertObject:self inGroupsAtIndex:index];
}
@end

View File

@@ -1,20 +0,0 @@
//
// KdbTree+MPAdditions.h
// MacPass
//
// Created by michael starke on 20.02.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb.h"
@class BinaryRef;
@class Binary;
@interface KdbTree (MPAdditions)
- (NSArray *)allEntries;
- (NSArray *)allGroups;
@end

View File

@@ -1,26 +0,0 @@
//
// KdbTree+MPAdditions.m
// MacPass
//
// Created by michael starke on 20.02.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "KdbTree+MPAdditions.h"
#import "KdbGroup+MPTreeTools.h"
#import "NSMutableData+Base64.h"
#import "Kdb3Node.h"
#import "Kdb4Node.h"
@implementation KdbTree (MPAdditions)
- (NSArray *)allGroups {
return [self.root childGroups];
}
- (NSArray *)allEntries {
return [self.root childEntries];
}
@end

View File

@@ -11,7 +11,8 @@
#import "MPDocumentWindowController.h" #import "MPDocumentWindowController.h"
#import "MPActionHelper.h" #import "MPActionHelper.h"
#import "KdbGroup+MPTreeTools.h" #import "KPKEntry.h"
#import "KPKGroup.h"
#define EDIT_TEMPLATES_ITEM_TAG 10; #define EDIT_TEMPLATES_ITEM_TAG 10;
@@ -31,7 +32,7 @@
[menu addItemWithTitle:NSLocalizedString(@"EDIT_TEMPLATE_GROUP", "") action:[MPActionHelper actionOfType:MPActionEditTemplateGroup] keyEquivalent:@""]; [menu addItemWithTitle:NSLocalizedString(@"EDIT_TEMPLATE_GROUP", "") action:[MPActionHelper actionOfType:MPActionEditTemplateGroup] keyEquivalent:@""];
[menu addItem:[NSMenuItem separatorItem]]; [menu addItem:[NSMenuItem separatorItem]];
for(KdbEntry *entry in [document.templates childEntries]) { for(KPKEntry *entry in [document.templates childEntries]) {
NSString *templateMask = NSLocalizedString(@"NEW_ENTRY_WITH_TEMPLATE_%@", ""); NSString *templateMask = NSLocalizedString(@"NEW_ENTRY_WITH_TEMPLATE_%@", "");
NSMenuItem *templateItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:[NSString stringWithFormat:templateMask, entry.title] NSMenuItem *templateItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:[NSString stringWithFormat:templateMask, entry.title]
action:@selector(createEntryFromTemplate:) action:@selector(createEntryFromTemplate:)

View File

@@ -9,9 +9,6 @@
#import "MPAttachmentTableDataSource.h" #import "MPAttachmentTableDataSource.h"
#import "MPDocument.h" #import "MPDocument.h"
#import "Kdb3Entry+KVOAdditions.h"
#import "Kdb4Entry+KVOAdditions.h"
@implementation MPAttachmentTableDataSource @implementation MPAttachmentTableDataSource
- (NSDragOperation)tableView:(NSTableView *)tableView - (NSDragOperation)tableView:(NSTableView *)tableView

View File

@@ -11,8 +11,8 @@
#import "MPDocument.h" #import "MPDocument.h"
#import "MPSelectedAttachmentTableCellView.h" #import "MPSelectedAttachmentTableCellView.h"
#import "Kdb4Node.h" #import "KPKEntry.h"
#import "Kdb3Node.h" #import "KPKBinary.h"
#import "HNHTableRowView.h" #import "HNHTableRowView.h"
@@ -22,17 +22,9 @@
NSTableView *tableView = [notification object]; NSTableView *tableView = [notification object];
MPDocument *document = [[[tableView window] windowController] document]; MPDocument *document = [[[tableView window] windowController] document];
NSIndexSet *allColumns = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [[tableView tableColumns] count])]; NSIndexSet *allColumns = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [[tableView tableColumns] count])];
if([document.selectedEntry isKindOfClass:[Kdb4Entry class]]) { NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [document.selectedEntry.binaries count] )];
Kdb4Entry *entryv4 = (Kdb4Entry *)document.selectedEntry;
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [entryv4.binaries count] )];
[tableView reloadDataForRowIndexes:indexSet columnIndexes:allColumns]; [tableView reloadDataForRowIndexes:indexSet columnIndexes:allColumns];
} }
if([document.selectedEntry isKindOfClass:[Kdb3Entry class]]) {
Kdb3Entry *entryv3 = (Kdb3Entry *)document.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 { - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
/* Decide what view to use */ /* Decide what view to use */
@@ -54,17 +46,11 @@
view = [tableView makeViewWithIdentifier:@"NormalCell" owner:tableView]; view = [tableView makeViewWithIdentifier:@"NormalCell" owner:tableView];
} }
/* Bind view */ /* Bind view */
if([document.selectedEntry isKindOfClass:[Kdb4Entry class]]) { KPKEntry *entry = document.selectedEntry;
Kdb4Entry *entry = (Kdb4Entry *)document.selectedEntry; NSAssert([entry.binaries count] > row, @"Indes needs to be valid for binaries");
BinaryRef *binaryRef = entry.binaries[row]; KPKBinary *binary = entry.binaries[row];
[[view textField] bind:NSValueBinding toObject:binaryRef withKeyPath:@"key" options:nil]; [[view textField] bind:NSValueBinding toObject:binary withKeyPath:@"name" options:nil];
[[view imageView] setImage:[[NSWorkspace sharedWorkspace] iconForFileType:[binaryRef.key pathExtension]]]; [[view imageView] setImage:[[NSWorkspace sharedWorkspace] iconForFileType:[binary.name pathExtension]]];
}
else {
Kdb3Entry *entry= (Kdb3Entry *)document.selectedEntry;
[[view textField] bind:NSValueBinding toObject:entry withKeyPath:@"binaryDesc" options:nil];
[[view imageView] setImage:[[NSWorkspace sharedWorkspace] iconForFileType:[entry.binaryDesc pathExtension]]];
}
return view; return view;
} }

View File

@@ -12,9 +12,6 @@
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
FOUNDATION_EXPORT NSString *const MPPasteBoardType; FOUNDATION_EXPORT NSString *const MPPasteBoardType;
FOUNDATION_EXPORT NSString *const MPEntryUTI;
FOUNDATION_EXPORT NSString *const MPGroupUTI;
FOUNDATION_EXTERN NSString *const MPUUIDUTI;
FOUNDATION_EXPORT NSString *const MPErrorDomain; FOUNDATION_EXPORT NSString *const MPErrorDomain;
#endif #endif

View File

@@ -10,6 +10,3 @@
NSString *const MPPasteBoardType = @"com.hicknhack.macpass.pasteboard"; NSString *const MPPasteBoardType = @"com.hicknhack.macpass.pasteboard";
NSString *const MPErrorDomain = @"com.hicknhack.macpass.error"; NSString *const MPErrorDomain = @"com.hicknhack.macpass.error";
NSString *const MPEntryUTI = @"com.hicknhack.macpass.entry";
NSString *const MPGroupUTI = @"com.hicknhack.macpass.group";
NSString *const MPUUIDUTI = @"com.hicknhack.macpass.UUID";

View File

@@ -10,28 +10,31 @@
#import "MPDocument.h" #import "MPDocument.h"
#import "MPCustomFieldTableCellView.h" #import "MPCustomFieldTableCellView.h"
#import "Kdb4Node.h" #import "KPKEntry.h"
#import "StringField+Undo.h" #import "KPKAttribute.h"
@implementation MPCustomFieldTableViewDelegate @implementation MPCustomFieldTableViewDelegate
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
MPDocument *document = [[[tableView window] windowController] document]; MPDocument *document = [[[tableView window] windowController] document];
if(![document.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
return nil; KPKEntry *entry = document.selectedEntry;
}
Kdb4Entry *entry = (Kdb4Entry *)document.selectedEntry;
MPCustomFieldTableCellView *view = [tableView makeViewWithIdentifier:@"SelectedCell" owner:tableView]; MPCustomFieldTableCellView *view = [tableView makeViewWithIdentifier:@"SelectedCell" owner:tableView];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_customFieldFrameChanged:) name:NSViewFrameDidChangeNotification object:view];
if([document.selectedEntry isKindOfClass:[Kdb4Entry class]]) { [[NSNotificationCenter defaultCenter] addObserver:self
StringField *stringField = entry.stringFields[row]; selector:@selector(_customFieldFrameChanged:)
name:NSViewFrameDidChangeNotification
object:view];
NSAssert([entry.customAttributes count] > row, @"Count of custom attributes must match row");
KPKAttribute *attribute = entry.customAttributes[row];
NSDictionary *validateOptions = @{ NSValidatesImmediatelyBindingOption: @YES }; NSDictionary *validateOptions = @{ NSValidatesImmediatelyBindingOption: @YES };
[view.labelTextField bind:NSValueBinding toObject:stringField withKeyPath:MPStringFieldKeyUndoableKey options:validateOptions]; [view.labelTextField bind:NSValueBinding toObject:attribute withKeyPath:@"key" options:validateOptions];
[view.valueTextField bind:NSValueBinding toObject:stringField withKeyPath:MPStringFieldValueUndoableKey options:nil]; [view.valueTextField bind:NSValueBinding toObject:attribute withKeyPath:@"value" options:nil];
[view.removeButton setTarget:self.viewController]; [view.removeButton setTarget:self.viewController];
[view.removeButton setAction:@selector(removeCustomField:)]; [view.removeButton setAction:@selector(removeCustomField:)];
[view.removeButton setTag:row]; [view.removeButton setTag:row];
}
return view; return view;
} }

View File

@@ -13,14 +13,16 @@
#import "MPIconHelper.h" #import "MPIconHelper.h"
#import "MPSettingsHelper.h" #import "MPSettingsHelper.h"
#import "KPKGroup.h"
#import "KPKTree.h"
#import "KPKMetaData.h"
#import "KPKNode+IconImage.h"
#import "HNHRoundedTextField.h" #import "HNHRoundedTextField.h"
#import "HNHRoundedSecureTextField.h" #import "HNHRoundedSecureTextField.h"
#import "NSString+Empty.h" #import "NSString+Empty.h"
#import "Kdb.h"
#import "Kdb4Node.h"
#import "KdbGroup+MPAdditions.h"
@interface MPDatabaseSettingsWindowController () { @interface MPDatabaseSettingsWindowController () {
MPDocument *_document; MPDocument *_document;
@@ -56,19 +58,20 @@
- (IBAction)save:(id)sender { - (IBAction)save:(id)sender {
/* General */ /* General */
_document.treeV4.databaseDescription = [self.databaseDescriptionTextView string]; KPKMetaData *metaData = _document.tree.metaData;
_document.treeV4.databaseName = [self.databaseNameTextField stringValue]; metaData.databaseDescription = [self.databaseDescriptionTextView string];
metaData.databaseName = [self.databaseNameTextField stringValue];
/* Display */ /* Display */
/* Advanced */ /* Advanced */
_document.treeV4.recycleBinEnabled = self.trashEnabled; metaData.recycleBinEnabled = self.trashEnabled;
NSMenuItem *trashMenuItem = [self.selectRecycleBinGroupPopUpButton selectedItem]; NSMenuItem *trashMenuItem = [self.selectRecycleBinGroupPopUpButton selectedItem];
KdbGroup *trashGroup = [trashMenuItem representedObject]; KPKGroup *trashGroup = [trashMenuItem representedObject];
[_document useGroupAsTrash:trashGroup]; [_document useGroupAsTrash:trashGroup];
NSMenuItem *templateMenuItem = [self.templateGroupPopUpButton selectedItem]; NSMenuItem *templateMenuItem = [self.templateGroupPopUpButton selectedItem];
KdbGroup *templateGroup = [templateMenuItem representedObject]; KPKGroup *templateGroup = [templateMenuItem representedObject];
[_document useGroupAsTemplate:templateGroup]; [_document useGroupAsTemplate:templateGroup];
BOOL protectNotes = [self.protectNotesCheckButton state] == NSOnState; BOOL protectNotes = [self.protectNotesCheckButton state] == NSOnState;
@@ -77,16 +80,14 @@
BOOL protectURL = [self.protectURLCheckButton state] == NSOnState; BOOL protectURL = [self.protectURLCheckButton state] == NSOnState;
BOOL protectUsername = [self.protectUserNameCheckButton state] == NSOnState; BOOL protectUsername = [self.protectUserNameCheckButton state] == NSOnState;
if(_document.version == MPDatabaseVersion4) { metaData.protectNotes = protectNotes;
_document.treeV4.protectNotes = protectNotes; metaData.protectPassword = protectPassword;
_document.treeV4.protectPassword = protectPassword; metaData.protectTitle = protectTitle;
_document.treeV4.protectTitle = protectTitle; metaData.protectUrl = protectURL;
_document.treeV4.protectUrl = protectURL; metaData.protectUserName = protectUsername;
_document.treeV4.protectUserName = protectUsername; metaData.defaultUserName = [self.defaultUsernameTextField stringValue];
_document.treeV4.defaultUserName = [self.defaultUsernameTextField stringValue];
} /*
else {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:protectNotes forKey:kMPSettingsKeyLegacyHideNotes]; [defaults setBool:protectNotes forKey:kMPSettingsKeyLegacyHideNotes];
[defaults setBool:protectPassword forKey:kMPSettingsKeyLegacyHidePassword]; [defaults setBool:protectPassword forKey:kMPSettingsKeyLegacyHidePassword];
@@ -94,7 +95,7 @@
[defaults setBool:protectURL forKey:kMPSettingsKeyLegacyHideURL]; [defaults setBool:protectURL forKey:kMPSettingsKeyLegacyHideURL];
[defaults setBool:protectUsername forKey:kMPSettingsKeyLegacyHideUsername]; [defaults setBool:protectUsername forKey:kMPSettingsKeyLegacyHideUsername];
[defaults synchronize]; [defaults synchronize];
} */
[self close:nil]; [self close:nil];
} }
@@ -108,11 +109,11 @@
return; return;
} }
/* Update all stuff that might have changed */ /* Update all stuff that might have changed */
Kdb4Tree *tree = _document.treeV4; KPKMetaData *metaData = _document.tree.metaData;
[self _setupDatabase:tree]; [self _setupDatabase:metaData];
[self _setupProtectionTab:tree]; [self _setupProtectionTab:metaData];
[self _setupAdvancedTab:tree]; [self _setupAdvancedTab:_document.tree];
[self _setupTemplatesTab:tree]; [self _setupTemplatesTab:_document.tree];
self.isDirty = NO; self.isDirty = NO;
} }
@@ -142,7 +143,8 @@
case MPDatabaseSettingsTabAdvanced: case MPDatabaseSettingsTabAdvanced:
case MPDatabaseSettingsTabGeneral: case MPDatabaseSettingsTabGeneral:
case MPDatabaseSettingsTabTemplates: case MPDatabaseSettingsTabTemplates:
return (_document.version == MPDatabaseVersion4); return YES;
//return (_document.version == MPDatabaseVersion4);
default: default:
return NO; return NO;
@@ -150,62 +152,30 @@
} }
#pragma mark Private Helper #pragma mark Private Helper
- (void)_setupDatabase:(Kdb4Tree *)tree { - (void)_setupDatabase:(KPKMetaData *)metaData {
BOOL isKdbx = (nil != tree); [self.databaseNameTextField setStringValue:metaData.databaseName];
[self.databaseDescriptionTextView setEditable:isKdbx]; [self.databaseDescriptionTextView setString:metaData.databaseDescription];
[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 { - (void)_setupProtectionTab:(KPKMetaData *)metaData {
BOOL isKdbX = (nil != tree); [self.protectNotesCheckButton setState:metaData.protectNotes ? NSOnState : NSOffState ];
[self.protectPasswortCheckButton setState:metaData.protectPassword ? NSOnState : NSOffState];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [self.protectTitleCheckButton setState:metaData.protectTitle ? NSOnState : NSOffState];
[self.protectURLCheckButton setState:metaData.protectUrl ? NSOnState : NSOffState];
BOOL protectNotes = isKdbX ? tree.protectNotes : [defaults boolForKey:kMPSettingsKeyLegacyHideNotes]; [self.protectUserNameCheckButton setState:metaData.protectUserName ? NSOnState : NSOffState];
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 { - (void)_setupAdvancedTab:(KPKTree *)tree {
BOOL isKdbX = (nil != tree);
self.trashEnabled = isKdbX ? tree.recycleBinEnabled : NO;
[self.enableRecycleBinCheckButton bind:NSValueBinding toObject:self withKeyPath:@"trashEnabled" options:nil]; [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.selectRecycleBinGroupPopUpButton bind:NSEnabledBinding toObject:self withKeyPath:@"trashEnabled" options:nil];
if(isKdbX) {
[self _updateTrashFolders:tree]; [self _updateTrashFolders:tree];
} }
}
- (void)_setupTemplatesTab:(Kdb4Tree *)tree { - (void)_setupTemplatesTab:(KPKTree *)tree {
if(tree) { [self.defaultUsernameTextField setStringValue:tree.metaData.defaultUserName];
[self.defaultUsernameTextField setStringValue:tree.defaultUserName];
[self.defaultUsernameTextField setEditable:YES]; [self.defaultUsernameTextField setEditable:YES];
[self _updateTemplateGroup:tree]; [self _updateTemplateGroup:tree];
} }
else {
[self.defaultUsernameTextField setStringValue:_missingFeature];
[self.defaultUsernameTextField setEditable:NO];
}
}
- (void)_updateFirstResponder { - (void)_updateFirstResponder {
NSTabViewItem *selected = [self.sectionTabView selectedTabViewItem]; NSTabViewItem *selected = [self.sectionTabView selectedTabViewItem];
@@ -229,18 +199,18 @@
} }
} }
- (void)_updateTrashFolders:(Kdb4Tree *)tree { - (void)_updateTrashFolders:(KPKTree *)tree {
NSMenu *menu = [self _buildTrashTreeMenu:tree]; NSMenu *menu = [self _buildTrashTreeMenu:tree];
[self.selectRecycleBinGroupPopUpButton setMenu:menu]; [self.selectRecycleBinGroupPopUpButton setMenu:menu];
} }
- (void)_updateTemplateGroup:(Kdb4Tree *)tree { - (void)_updateTemplateGroup:(KPKTree *)tree {
NSMenu *menu = [self _buildTemplateTreeMenu:tree]; NSMenu *menu = [self _buildTemplateTreeMenu:tree];
[self.templateGroupPopUpButton setMenu:menu]; [self.templateGroupPopUpButton setMenu:menu];
} }
- (NSMenu *)_buildTrashTreeMenu:(Kdb4Tree *)tree { - (NSMenu *)_buildTrashTreeMenu:(KPKTree *)tree {
NSMenu *menu = [self _buildTreeMenu:tree preselect:tree.recycleBinUuid]; NSMenu *menu = [self _buildTreeMenu:tree preselect:tree.metaData.recycleBinUuid];
NSMenuItem *selectItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOCREATE_TRASH_FOLDER", @"Menu item for automatic trash creation") NSMenuItem *selectItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOCREATE_TRASH_FOLDER", @"Menu item for automatic trash creation")
action:NULL action:NULL
@@ -251,8 +221,8 @@
return menu; return menu;
} }
- (NSMenu *)_buildTemplateTreeMenu:(Kdb4Tree *)tree { - (NSMenu *)_buildTemplateTreeMenu:(KPKTree *)tree {
NSMenu *menu = [self _buildTreeMenu:tree preselect:tree.entryTemplatesGroup]; NSMenu *menu = [self _buildTreeMenu:tree preselect:tree.metaData.entryTemplatesGroup];
NSMenuItem *selectItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"NO_TEMPLATE_GROUP", @"Menu item to reset the template groups") NSMenuItem *selectItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"NO_TEMPLATE_GROUP", @"Menu item to reset the template groups")
action:NULL action:NULL
@@ -264,18 +234,16 @@
} }
- (NSMenu *)_buildTreeMenu:(Kdb4Tree *)tree preselect:(UUID *)uuid { - (NSMenu *)_buildTreeMenu:(KPKTree *)tree preselect:(NSUUID *)uuid {
NSMenu *menu = [[NSMenu alloc] init]; NSMenu *menu = [[NSMenu alloc] init];
[menu setAutoenablesItems:NO]; [menu setAutoenablesItems:NO];
/* /*
Trash and Templates can be nested, so wee need to adhere to this :( Trash and Templates can be nested, so wee need to adhere to this :(
*/ */
for(Kdb4Group *group in tree.root.groups) { for(KPKGroup *group in tree.root.groups) {
NSMenuItem *groupItem = [[NSMenuItem alloc] init]; NSMenuItem *groupItem = [[NSMenuItem alloc] init];
[groupItem setImage:group.icon]; [groupItem setImage:group.iconImage];
[groupItem setTitle:group.name]; [groupItem setTitle:group.name];
[groupItem setRepresentedObject:group]; [groupItem setRepresentedObject:group];
[groupItem setEnabled:YES]; [groupItem setEnabled:YES];

View File

@@ -8,169 +8,21 @@
#import "MPDocument.h" #import "MPDocument.h"
#import "NSMutableData+Base64.h" #import "KPKEntry.h"
#import "NSData+Gzip.h" #import "KPKBinary.h"
#import "Kdb3Node.h"
#import "Kdb3Entry+KVOAdditions.h"
#import "Kdb4Node.h"
#import "Kdb4Entry+KVOAdditions.h"
@implementation MPDocument (Attachments) @implementation MPDocument (Attachments)
- (void)addAttachment:(NSURL *)location toEntry:(KdbEntry *)anEntry { - (void)addAttachment:(NSURL *)location toEntry:(KPKEntry *)anEntry {
NSError *error = nil; NSError *error = nil;
NSDictionary *resourceKeys = [location resourceValuesForKeys:@[NSURLIsDirectoryKey] error:&error]; NSDictionary *resourceKeys = [location resourceValuesForKeys:@[NSURLIsDirectoryKey] error:&error];
if([resourceKeys[ NSURLIsDirectoryKey ] boolValue] == YES ) { if([resourceKeys[ NSURLIsDirectoryKey ] boolValue] == YES ) {
return; // We do not add whol directories return; // We do not add whole directories
} }
NSString *fileName = [location lastPathComponent]; KPKBinary *binary = [[KPKBinary alloc] initWithContentsOfURL:location];
if([anEntry isKindOfClass:[Kdb3Entry class]]) {
Kdb3Entry *entry = (Kdb3Entry *)anEntry;
NSData *binaryData = [NSData dataWithContentsOfURL:location options:NSDataReadingUncached error:&error];
if(!binaryData) {
[NSApp presentError:error];
binaryData = nil;
error = nil;
return; // failed
}
entry.binary = binaryData;
entry.binaryDesc = fileName;
[entry insertObject:@"" inBinariesAtIndex:1];
}
if( [anEntry isKindOfClass:[Kdb4Entry class]]) {
Kdb4Entry *entry = (Kdb4Entry *)anEntry;
NSData *fileData = [NSData dataWithContentsOfURL:location options:NSDataReadingMappedIfSafe error:&error];
if(!fileData) {
[NSApp presentError:error];
fileData = nil;
error = nil;
return; // failed
}
Binary *binary = [[Binary alloc] init];
NSUInteger nextId = [self nextBinaryId];
if(nextId == NSNotFound) {
binary = nil;
return; // No id found. Something went wrong
}
binary.binaryId = nextId;
binary.compressed = (self.treeV4.compressionAlgorithm != KPLCompressionNone);
NSData *encodedData;
if(binary.compressed) {
switch(self.treeV4.compressionAlgorithm) {
case KPLCompressionGzip: {
NSData *compressedData = [fileData gzipDeflate];
encodedData = [NSMutableData mutableDataWithBase64EncodedData:compressedData];
break;
}
default:
NSAssert(NO, @"Unsupported Compression Algorithm");
binary = nil;
encodedData = nil;
fileData = nil;
return;
}
}
else {
encodedData = fileData;
}
binary.data = [[NSString alloc] initWithData:encodedData encoding:NSUTF8StringEncoding];
[self.treeV4.binaries addObject:binary];
BinaryRef *ref = [[BinaryRef alloc] init];
ref.key = fileName;
ref.ref = binary.binaryId;
[entry insertObject:ref inBinariesAtIndex:[entry.binaries count]];
}
}
- (void)removeAttachment:(BinaryRef *)reference fromEntry:(KdbEntry *)anEntry {
if(self.version != MPDatabaseVersion4) {
return; // Wrong Database version;
}
Binary *binary = [self findBinary:reference];
Kdb4Entry *entry = (Kdb4Entry *)anEntry;
NSUInteger index = [entry.binaries indexOfObject:reference];
if(index == NSNotFound) {
return; // No Reference for this entry found
}
[entry removeObjectFromBinariesAtIndex:index];
[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;
}
NSPredicate *filterPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
Binary *binaryFile = evaluatedObject;
return (binaryFile.binaryId == reference.ref);
}];
NSArray *filteredBinary = [self.treeV4.binaries filteredArrayUsingPredicate:filterPredicate];
return [filteredBinary lastObject];
}
- (void)saveAttachmentForItem:(id)item toLocation:(NSURL *)location {
NSData *fileData = [self attachmentDataForItem:item];
if(!fileData) {
return; // No data to save;
}
NSError *error = nil;
if( ![fileData writeToURL:location options:NSDataWritingAtomic error:&error] ) {
[NSApp presentError:error];
}
}
- (NSData *)attachmentDataForItem:(id)item {
if([item isKindOfClass:[Kdb3Entry class]]) {
Kdb3Entry *entry = (Kdb3Entry *)item;
return entry.binary;
}
else if([item isKindOfClass:[BinaryRef class]]) {
Binary *binary = [self findBinary:item];
NSData *rawData = nil;
if(binary) { if(binary) {
if(binary.compressed) { [anEntry addBinary:binary];
rawData = [NSMutableData mutableDataWithBase64DecodedData:[binary.data dataUsingEncoding:NSUTF8StringEncoding]];
rawData = [rawData gzipInflate];
} }
else {
rawData = [NSMutableData mutableDataWithBase64DecodedData:[binary.data dataUsingEncoding:NSUTF8StringEncoding]];
}
return rawData;
}
}
return nil;
}
- (NSString *)attachmenFileNameForItem:(id)item {
if([item isKindOfClass:[Kdb3Entry class]]) {
Kdb3Entry *entry = (Kdb3Entry *)item;
return entry.binaryDesc;
}
else if([item isKindOfClass:[BinaryRef class]]) {
return ((BinaryRef *)item).key;
}
return nil;
}
- (NSUInteger)nextBinaryId {
if(self.version != MPDatabaseVersion4) {
return NSNotFound;
}
NSUInteger maxKey = 0;
for(Binary *binary in self.treeV4.binaries) {
maxKey = MAX(binary.binaryId, maxKey);
}
return (maxKey + 1);
} }
@end @end

View File

@@ -22,17 +22,11 @@ APPKIT_EXTERN NSString *const MPDocumentDidChangeCurrentGroupNotication;
APPKIT_EXTERN NSString *const MPDocumnetDidChangeCurrentEntryNotification; APPKIT_EXTERN NSString *const MPDocumnetDidChangeCurrentEntryNotification;
*/ */
@class KdbGroup; @class KPKGroup;
@class KdbEntry; @class KPKEntry;
@class KdbTree; @class KPKTree;
@class Kdb4Tree; @class KPKBinary;
@class Kdb3Tree; @class KPKAttribute;
@class Kdb4Entry;
@class UUID;
@class Binary;
@class BinaryRef;
@class StringField;
@class MPRootAdapter;
@interface MPDocument : NSDocument @interface MPDocument : NSDocument
@@ -42,24 +36,22 @@ APPKIT_EXTERN NSString *const MPDocumnetDidChangeCurrentEntryNotification;
@property (assign, nonatomic) BOOL locked; @property (assign, nonatomic) BOOL locked;
@property (assign, readonly) BOOL decrypted; @property (assign, readonly) BOOL decrypted;
@property (strong, readonly, nonatomic) KdbTree *tree; @property (strong, readonly, nonatomic) KPKTree *tree;
@property (weak, readonly, nonatomic) KdbGroup *root; @property (weak, readonly, nonatomic) KPKGroup *root;
@property (readonly, strong) MPRootAdapter *rootAdapter; @property (weak, readonly) KPKGroup *trash;
@property (weak, readonly) KdbGroup *trash; @property (weak, readonly) KPKGroup *templates;
@property (weak, readonly) KdbGroup *templates;
@property (nonatomic, copy) NSString *password; @property (nonatomic, copy) NSString *password;
@property (nonatomic, strong) NSURL *key; @property (nonatomic, strong) NSURL *key;
@property (assign, readonly) MPDatabaseVersion version;
@property (assign, readonly, getter = isReadOnly) BOOL readOnly; @property (assign, readonly, getter = isReadOnly) BOOL readOnly;
/* /*
State (active group/entry) State (active group/entry)
*/ */
@property (nonatomic, weak) KdbEntry *selectedEntry; @property (nonatomic, weak) KPKEntry *selectedEntry;
@property (nonatomic, weak) KdbGroup *selectedGroup; @property (nonatomic, weak) KPKGroup *selectedGroup;
@property (nonatomic, weak) id selectedItem; @property (nonatomic, weak) id selectedItem;
@@ -73,14 +65,11 @@ APPKIT_EXTERN NSString *const MPDocumnetDidChangeCurrentEntryNotification;
/* /*
Returns the entry for the given UUID, nil if none was found Returns the entry for the given UUID, nil if none was found
*/ */
- (KdbEntry *)findEntry:(UUID *)uuid; - (KPKEntry *)findEntry:(NSUUID *)uuid;
- (KdbGroup *)findGroup:(UUID *)uuid; - (KPKGroup *)findGroup:(NSUUID *)uuid;
- (Kdb4Tree *)treeV4; - (void)useGroupAsTrash:(KPKGroup *)group;
- (Kdb3Tree *)treeV3; - (void)useGroupAsTemplate:(KPKGroup *)group;
- (void)useGroupAsTrash:(KdbGroup *)group;
- (void)useGroupAsTemplate:(KdbGroup *)group;
- (BOOL)isItemTrashed:(id)item; - (BOOL)isItemTrashed:(id)item;
@@ -89,16 +78,12 @@ APPKIT_EXTERN NSString *const MPDocumnetDidChangeCurrentEntryNotification;
#pragma mark Undo Data Manipulation #pragma mark Undo Data Manipulation
/* Undoable Intiialization of elements */ /* Undoable Intiialization of elements */
- (KdbGroup *)createGroup:(KdbGroup *)parent; - (KPKGroup *)createGroup:(KPKGroup *)parent;
- (KdbEntry *)createEntry:(KdbGroup *)parent; - (KPKEntry *)createEntry:(KPKGroup *)parent;
- (StringField *)createStringField:(KdbEntry *)entry; - (KPKAttribute *)createCustomAttribute:(KPKEntry *)entry;
/* TODO in UNDO auslagen */ - (void)deleteGroup:(KPKGroup *)group;
- (void)addStringField:(StringField *)field toEntry:(Kdb4Entry *)entry atIndex:(NSUInteger)index; - (void)deleteEntry:(KPKEntry *)entry;
- (void)removeStringField:(StringField *)field formEntry:(Kdb4Entry *)entry;
- (void)deleteGroup:(KdbGroup *)group;
- (void)deleteEntry:(KdbEntry *)entry;
- (IBAction)emptyTrash:(id)sender; - (IBAction)emptyTrash:(id)sender;
- (IBAction)createEntryFromTemplate:(id)sender; - (IBAction)createEntryFromTemplate:(id)sender;
@@ -106,16 +91,6 @@ APPKIT_EXTERN NSString *const MPDocumnetDidChangeCurrentEntryNotification;
@interface MPDocument (Attachments) @interface MPDocument (Attachments)
- (void)addAttachment:(NSURL *)location toEntry:(KdbEntry *)anEntry; - (void)addAttachment:(NSURL *)location toEntry:(KPKEntry *)anEntry;
/**
item can be either a BinaryRef or an Kdb3Entry.
*/
- (void)saveAttachmentForItem:(id)item toLocation:(NSURL *)location;
- (NSData *)attachmentDataForItem:(id)item;
- (NSString *)attachmenFileNameForItem:(id)item;
- (void)removeAttachment:(BinaryRef *)reference fromEntry:(KdbEntry *)anEntry;
- (void)removeAttachmentFromEntry:(KdbEntry *)anEntry;
- (NSUInteger)nextBinaryId;
- (Binary *)findBinary:(BinaryRef *)reference;
@end @end

View File

@@ -9,36 +9,21 @@
#import "MPDocument.h" #import "MPDocument.h"
#import "MPDocumentWindowController.h" #import "MPDocumentWindowController.h"
#import "MPDatabaseVersion.h" #import "MPDatabaseVersion.h"
#import "MPRootAdapter.h"
#import "MPIconHelper.h" #import "MPIconHelper.h"
#import "MPActionHelper.h" #import "MPActionHelper.h"
#import "MPSettingsHelper.h" #import "MPSettingsHelper.h"
#import "MPNotifications.h" #import "MPNotifications.h"
#import "MPSavePanelAccessoryViewController.h" #import "MPSavePanelAccessoryViewController.h"
#import "KdbLib.h"
#import "Kdb3Node.h"
#import "Kdb4Node.h"
#import "Kdb4Persist.h"
#import "KdbPassword.h"
#import "KdbGroup+KVOAdditions.h"
#import "Kdb4Entry+KVOAdditions.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"
#import "DDXMLNode.h" #import "DDXMLNode.h"
#import "KPKEntry.h"
#import "KPKGroup.h"
#import "KPKTree.h"
#import "KPKTree+Serializing.h" #import "KPKTree+Serializing.h"
#import "KPKPassword.h" #import "KPKPassword.h"
#import "KPKMetaData.h"
#import "KPKAttribute.h"
NSString *const MPDocumentDidAddGroupNotification = @"com.hicknhack.macpass.MPDocumentDidAddGroupNotification"; NSString *const MPDocumentDidAddGroupNotification = @"com.hicknhack.macpass.MPDocumentDidAddGroupNotification";
NSString *const MPDocumentDidRevertNotifiation = @"com.hicknhack.macpass.MPDocumentDidRevertNotifiation"; NSString *const MPDocumentDidRevertNotifiation = @"com.hicknhack.macpass.MPDocumentDidRevertNotifiation";
@@ -54,15 +39,13 @@ typedef NS_ENUM(NSUInteger, MPAlertType) {
@interface MPDocument () { @interface MPDocument () {
@private @private
BOOL _didLockFile; BOOL _didLockFile;
NSData *_fileData; NSData *_encryptedData;
} }
@property (strong, nonatomic) MPSavePanelAccessoryViewController *savePanelViewController; @property (strong, nonatomic) MPSavePanelAccessoryViewController *savePanelViewController;
@property (strong, nonatomic) KdbTree *tree; @property (strong, nonatomic) KPKTree *tree;
@property (weak, nonatomic) KdbGroup *root; @property (weak, nonatomic) KPKGroup *root;
@property (weak, nonatomic, readonly) KdbPassword *passwordHash;
@property (assign) MPDatabaseVersion version;
@property (assign, nonatomic) BOOL hasPasswordOrKey; @property (assign, nonatomic) BOOL hasPasswordOrKey;
@property (assign) BOOL decrypted; @property (assign) BOOL decrypted;
@@ -90,27 +73,13 @@ typedef NS_ENUM(NSUInteger, MPAlertType) {
- (id)initWithVersion:(MPDatabaseVersion)version { - (id)initWithVersion:(MPDatabaseVersion)version {
self = [super init]; self = [super init];
if(self) { if(self) {
_fileData = nil; _encryptedData = nil;
_didLockFile = NO; _didLockFile = NO;
_decrypted = YES; _decrypted = YES;
_hasPasswordOrKey = NO; _hasPasswordOrKey = NO;
_locked = NO; _locked = NO;
_readOnly = NO; _readOnly = NO;
_rootAdapter = [[MPRootAdapter alloc] init]; self.tree = [KPKTree templateTree];
_version = version;
[[self undoManager] setLevelsOfUndo:10];
switch(_version) {
case MPDatabaseVersion3:
self.tree = [Kdb3Tree templateTree];
break;
case MPDatabaseVersion4:
self.tree = [Kdb4Tree templateTree];
//self.tree = [Kdb4Tree demoTree];
break;
default:
self = nil;
return nil;
}
} }
return self; return self;
} }
@@ -133,10 +102,10 @@ typedef NS_ENUM(NSUInteger, MPAlertType) {
/* /*
Move this to data:ofType: method with KeePassKit Move this to data:ofType: method with KeePassKit
*/ */
NSError *error = nil; KPKPassword *password = nil;
[KdbWriterFactory persist:self.tree fileURL:url withPassword:self.passwordHash error:&error]; NSData *treeData = [self.tree encryptWithPassword:password forVersion:KPKXmlVersion error:outError];
if(error) { if([treeData writeToURL:url options:NSDataWritingAtomic error:outError]) {
NSLog(@"%@", [error localizedDescription]); NSLog(@"%@", [*outError localizedDescription]);
return NO; return NO;
} }
return YES; return YES;
@@ -158,7 +127,7 @@ typedef NS_ENUM(NSUInteger, MPAlertType) {
Delete our old Tree, and just grab the data Delete our old Tree, and just grab the data
*/ */
self.tree = nil; self.tree = nil;
_fileData = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:outError]; _encryptedData = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:outError];
self.decrypted = NO; self.decrypted = NO;
return YES; return YES;
} }
@@ -193,57 +162,42 @@ typedef NS_ENUM(NSUInteger, MPAlertType) {
} }
- (BOOL)prepareSavePanel:(NSSavePanel *)savePanel { - (BOOL)prepareSavePanel:(NSSavePanel *)savePanel {
/*
Save as different format doesn work without KeePassKit
hence disabled for now
if(!self.savePanelViewController) { if(!self.savePanelViewController) {
self.savePanelViewController = [[MPSavePanelAccessoryViewController alloc] init]; self.savePanelViewController = [[MPSavePanelAccessoryViewController alloc] init];
} }
self.savePanelViewController.savePanel = savePanel; self.savePanelViewController.savePanel = savePanel;
self.savePanelViewController.document = self; self.savePanelViewController.document = self;
[savePanel setAccessoryView:[self.savePanelViewController view]]; [savePanel setAccessoryView:[self.savePanelViewController view]];
*/
return YES; return YES;
} }
- (void)writeXMLToURL:(NSURL *)url { - (void)writeXMLToURL:(NSURL *)url {
DataOutputStream *outputStream = [[DataOutputStream alloc] init]; NSData *xmlData = [self.tree xmlData];
Kdb4Persist *persist = [[Kdb4Persist alloc] initWithTree:self.treeV4 outputStream:outputStream randomStream:nil]; [xmlData writeToURL:url atomically:YES];
[persist persistWithOptions:DDXMLNodeCompactEmptyElement|DDXMLNodePrettyPrint];
[outputStream.data writeToURL:url atomically:YES];
} }
#pragma mark Lock/Unlock/Decrypt #pragma mark Lock/Unlock/Decrypt
- (BOOL)unlockWithPassword:(NSString *)password keyFileURL:(NSURL *)keyFileURL { - (BOOL)unlockWithPassword:(NSString *)password keyFileURL:(NSURL *)keyFileURL {
/*
KPKPassword *passwordData = [[KPKPassword alloc] initWithPassword:password key:keyFileURL]; KPKPassword *passwordData = [[KPKPassword alloc] initWithPassword:password key:keyFileURL];
KPKTree *tree = [[KPKTree alloc] initWithData:_fileData password:passwordData error:NULL];
*/
self.key = keyFileURL; self.key = keyFileURL;
self.password = [password length] > 0 ? password : nil; self.password = [password length] > 0 ? password : nil;
@try { NSError *error;
self.tree = [KdbReaderFactory load:[[self fileURL] path] withPassword:self.passwordHash]; self.tree = [[KPKTree alloc] initWithData:_encryptedData password:passwordData error:&error];
} if(self.tree) {
@catch (NSException *exception) {
return NO;
}
if([self.tree isKindOfClass:[Kdb4Tree class]]) {
self.version = MPDatabaseVersion4;
}
else if( [self.tree isKindOfClass:[Kdb3Tree class]]) {
self.version = MPDatabaseVersion3;
}
self.decrypted = YES; self.decrypted = YES;
return YES; return YES;
} }
self.decrypted = NO;
return NO;
}
- (void)lockDatabase:(id)sender { - (void)lockDatabase:(id)sender {
// Persist Tree into data KPKPassword *password = [[KPKPassword alloc] initWithPassword:self.password key:self.key];
NSError *error;
/* Locking needs to be lossless hence just use the XML format */
_encryptedData = [self.tree encryptWithPassword:password forVersion:KPKXmlVersion error:&error];
self.tree = nil; self.tree = nil;
self.locked = YES; self.locked = YES;
} }
@@ -263,18 +217,14 @@ typedef NS_ENUM(NSUInteger, MPAlertType) {
} }
} }
- (KdbPassword *)passwordHash { - (void)setSelectedGroup:(KPKGroup *)selectedGroup {
return [[KdbPassword alloc] initWithPassword:self.password passwordEncoding:NSUTF8StringEncoding keyFileURL:self.key];
}
- (void)setSelectedGroup:(KdbGroup *)selectedGroup {
if(_selectedGroup != selectedGroup) { if(_selectedGroup != selectedGroup) {
_selectedGroup = selectedGroup; _selectedGroup = selectedGroup;
} }
self.selectedItem = _selectedGroup; self.selectedItem = _selectedGroup;
} }
- (void)setSelectedEntry:(KdbEntry *)selectedEntry { - (void)setSelectedEntry:(KPKEntry *)selectedEntry {
if(_selectedEntry != selectedEntry) { if(_selectedEntry != selectedEntry) {
_selectedEntry = selectedEntry; _selectedEntry = selectedEntry;
} }
@@ -289,85 +239,52 @@ typedef NS_ENUM(NSUInteger, MPAlertType) {
} }
#pragma mark Data Accesors #pragma mark Data Accesors
- (void)setTree:(KdbTree *)tree { - (void)setTree:(KPKTree *)tree {
if(_tree != tree) { if(_tree != tree) {
_tree = tree; _tree = tree;
self.rootAdapter.tree = _tree; _tree.undoManager = [self undoManager];
} }
} }
- (KdbGroup *)root { - (KPKGroup *)root {
return self.tree.root; return self.tree.root;
} }
- (KdbEntry *)findEntry:(UUID *)uuid { - (KPKEntry *)findEntry:(NSUUID *)uuid {
return [self.root entryForUUID:uuid]; return [self.root entryForUUID:uuid];
} }
- (KdbGroup *)findGroup:(UUID *)uuid { - (KPKGroup *)findGroup:(NSUUID *)uuid {
return [self.root groupForUUID:uuid]; return [self.root groupForUUID:uuid];
} }
- (Kdb3Tree *)treeV3 {
switch (_version) {
case MPDatabaseVersion3:
NSAssert(self.tree == nil || [self.tree isKindOfClass:[Kdb3Tree class]], @"Tree has to be Version3");
return (Kdb3Tree *)self.tree;
case MPDatabaseVersion4:
return nil;
default:
return nil;
}
}
- (Kdb4Tree *)treeV4 {
switch (_version) {
case MPDatabaseVersion3:
return nil;
case MPDatabaseVersion4:
NSAssert(self.tree == nil || [self.tree isKindOfClass:[Kdb4Tree class]], @"Tree has to be Version4");
return (Kdb4Tree *)self.tree;
default:
return nil;
}
}
- (BOOL)useTrash { - (BOOL)useTrash {
if(self.treeV4) { return self.tree.metaData.recycleBinEnabled;
return self.treeV4.recycleBinEnabled;
}
return NO;
} }
- (KdbGroup *)trash { - (KPKGroup *)trash {
static KdbGroup *_trash = nil; static KPKGroup *_trash = nil;
if(self.useTrash) { if(self.useTrash) {
BOOL trashValid = [((Kdb4Group *)_trash).uuid isEqual:self.treeV4.recycleBinUuid]; BOOL trashValid = [_trash.uuid isEqual:self.tree.metaData.recycleBinUuid];
if(!trashValid) { if(!trashValid) {
_trash = [self findGroup:self.treeV4.recycleBinUuid]; _trash = [self findGroup:self.tree.metaData.recycleBinUuid];
} }
return _trash; return _trash;
} }
return nil; return nil;
} }
- (KdbGroup *)templates { - (KPKGroup *)templates {
static KdbGroup *_templates = nil; static KPKGroup *_templates = nil;
if(self.version == MPDatabaseVersion3) { BOOL templateValid = [_templates.uuid isEqual:self.tree.metaData.entryTemplatesGroup];
return nil;
}
BOOL templateValid = [((Kdb4Group *)_templates).uuid isEqual:self.treeV4.entryTemplatesGroup];
if(!templateValid) { if(!templateValid) {
_templates = [self findGroup:self.treeV4.entryTemplatesGroup]; _templates = [self findGroup:self.tree.metaData.entryTemplatesGroup];
} }
return _templates; return _templates;
} }
- (BOOL)isItemTrashed:(id)item { - (BOOL)isItemTrashed:(id)item {
if(self.version == MPDatabaseVersion3) { BOOL validItem = [item isKindOfClass:[KPKEntry class]] || [item isKindOfClass:[KPKGroup class]];
return NO;
}
BOOL validItem = [item isKindOfClass:[KdbEntry class]] || [item isKindOfClass:[KdbGroup class]];
if(!item) { if(!item) {
return NO; return NO;
} }
@@ -386,27 +303,22 @@ typedef NS_ENUM(NSUInteger, MPAlertType) {
return NO; return NO;
} }
- (void)useGroupAsTrash:(KdbGroup *)group { - (void)useGroupAsTrash:(KPKGroup *)group {
if(self.useTrash) { if(self.useTrash) {
Kdb4Group *groupv4 = (Kdb4Group *)group; if(![self.tree.metaData.recycleBinUuid isEqual:group.uuid]) {
if(![self.treeV4.recycleBinUuid isEqual:groupv4.uuid]) { self.tree.metaData.recycleBinUuid = group.uuid;
self.treeV4.recycleBinUuid = groupv4.uuid;
} }
} }
} }
- (void)useGroupAsTemplate:(KdbGroup *)group { - (void)useGroupAsTemplate:(KPKGroup *)group {
if(self.version != MPDatabaseVersion4) { if(![self.tree.metaData.entryTemplatesGroup isEqual:group.uuid]) {
return; // wrong database version self.tree.metaData.entryTemplatesGroup = group.uuid;
}
Kdb4Group *groupv4 = (Kdb4Group *)group;
if(![self.treeV4.entryTemplatesGroup isEqual:groupv4.uuid]) {
self.treeV4.entryTemplatesGroup = groupv4.uuid;
} }
} }
#pragma mark Data manipulation #pragma mark Data manipulation
- (KdbEntry *)createEntry:(KdbGroup *)parent { - (KPKEntry *)createEntry:(KPKGroup *)parent {
if(!parent) { if(!parent) {
return nil; // No parent return nil; // No parent
} }
@@ -416,16 +328,16 @@ typedef NS_ENUM(NSUInteger, MPAlertType) {
if([self isItemTrashed:parent]) { if([self isItemTrashed:parent]) {
return nil; return nil;
} }
KdbEntry *newEntry = [self.tree createEntry:parent]; KPKEntry *newEntry = [self.tree createEntry:parent];
newEntry.title = NSLocalizedString(@"DEFAULT_ENTRY_TITLE", @"Title for a newly created entry"); newEntry.title = NSLocalizedString(@"DEFAULT_ENTRY_TITLE", @"Title for a newly created entry");
if(self.treeV4 && ([self.treeV4.defaultUserName length] > 0)) { if([self.tree.metaData.defaultUserName length] > 0) {
newEntry.title = self.treeV4.defaultUserName; newEntry.title = self.tree.metaData.defaultUserName;
} }
[parent addEntryUndoable:newEntry atIndex:[parent.entries count]]; [parent addEntry:newEntry];
return newEntry; return newEntry;
} }
- (KdbGroup *)createGroup:(KdbGroup *)parent { - (KPKGroup *)createGroup:(KPKGroup *)parent {
if(!parent) { if(!parent) {
return nil; // no parent! return nil; // no parent!
} }
@@ -435,29 +347,25 @@ typedef NS_ENUM(NSUInteger, MPAlertType) {
if([self isItemTrashed:parent]) { if([self isItemTrashed:parent]) {
return nil; return nil;
} }
KdbGroup *newGroup = [self.tree createGroup:parent]; KPKGroup *newGroup = [self.tree createGroup:parent];
newGroup.name = NSLocalizedString(@"DEFAULT_GROUP_NAME", @"Title for a newly created group"); newGroup.name = NSLocalizedString(@"DEFAULT_GROUP_NAME", @"Title for a newly created group");
newGroup.image = MPIconFolder; newGroup.icon = MPIconFolder;
[parent addGroupUndoable:newGroup atIndex:[parent.groups count]]; [parent addGroup:newGroup];
NSDictionary *userInfo = @{ MPDocumentGroupKey : newGroup }; NSDictionary *userInfo = @{ MPDocumentGroupKey : newGroup };
[[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidAddGroupNotification object:self userInfo:userInfo]; [[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidAddGroupNotification object:self userInfo:userInfo];
return newGroup; return newGroup;
} }
- (StringField *)createStringField:(KdbEntry *)entry { - (KPKAttribute *)createCustomAttribute:(KPKEntry *)entry {
if(![entry isKindOfClass:[Kdb4Entry class]]) {
return nil;
}
Kdb4Entry *entryV4 = (Kdb4Entry *)entry;
NSString *title = NSLocalizedString(@"DEFAULT_CUSTOM_FIELD_TITLE", @"Default Titel for new Custom-Fields"); 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"); NSString *value = NSLocalizedString(@"DEFAULT_CUSTOM_FIELD_VALUE", @"Default Value for new Custom-Fields");
title = [entryV4 uniqueKeyForProposal:title]; title = [entry proposedKeyForAttributeKey:title];
StringField *newStringField = [StringField stringFieldWithKey:title andValue:value]; KPKAttribute *newAttribute = [[KPKAttribute alloc] initWithKey:title value:value];
[self addStringField:newStringField toEntry:entryV4 atIndex:[entryV4.stringFields count]]; [entry addCustomAttribute:newAttribute];
return newStringField; return newAttribute;
} }
- (void)deleteEntry:(KdbEntry *)entry { - (void)deleteEntry:(KPKEntry *)entry {
if(self.useTrash) { if(self.useTrash) {
if(!self.trash) { if(!self.trash) {
[self _createTrashGroup]; [self _createTrashGroup];
@@ -465,15 +373,17 @@ typedef NS_ENUM(NSUInteger, MPAlertType) {
if([self isItemTrashed:entry]) { if([self isItemTrashed:entry]) {
return; // Entry is already trashed return; // Entry is already trashed
} }
[entry moveToTrashUndoable:self.trash atIndex:[self.trash.entries count]]; [entry moveToGroup:self.trash atIndex:[self.trash.entries count]];
[[self undoManager] setActionName:NSLocalizedString(@"TRASH_ENTRY", "Move Entry to Trash")];
} }
else { else {
[entry deleteUndoable]; [entry remove];
[[self undoManager] setActionName:NSLocalizedString(@"DELETE_ENTRY", "")];
} }
self.selectedEntry = nil; self.selectedEntry = nil;
} }
- (void)deleteGroup:(KdbGroup *)group { - (void)deleteGroup:(KPKGroup *)group {
if(self.useTrash) { if(self.useTrash) {
if(!self.trash) { if(!self.trash) {
[self _createTrashGroup]; [self _createTrashGroup];
@@ -481,38 +391,18 @@ typedef NS_ENUM(NSUInteger, MPAlertType) {
if( (group == self.trash) || [self isItemTrashed:group] ) { if( (group == self.trash) || [self isItemTrashed:group] ) {
return; //Groups already trashed cannot be deleted return; //Groups already trashed cannot be deleted
} }
[group moveToTrashUndoable:self.trash atIndex:[self.trash.groups count]]; [group moveToGroup:self.trash atIndex:[self.trash.groups count]];
[[self undoManager] setActionName:NSLocalizedString(@"TRASH_GROUP", "Move Group to Trash")];
} }
else { else {
[group deleteUndoable]; [group remove];
[[self undoManager] setActionName:NSLocalizedString(@"DELETE_GROUP", "Delete Group")];
} }
} }
#pragma mark CustomFields
- (void)addStringField:(StringField *)field toEntry:(Kdb4Entry *)entry atIndex:(NSUInteger)index {
[[[self undoManager] prepareWithInvocationTarget:self] removeStringField:field formEntry:entry];
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_ADD_STRING_FIELD", @"Add Stringfield Undo")];
field.entry = entry;
[entry insertObject:field inStringFieldsAtIndex:index];
}
- (void)removeStringField:(StringField *)field formEntry:(Kdb4Entry *)entry {
NSInteger index = [entry.stringFields indexOfObject:field];
if(NSNotFound == index) {
return; // Nothing found to be removed
}
[[[self undoManager] prepareWithInvocationTarget:self] 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 #pragma mark Actions
- (void)emptyTrash:(id)sender { - (void)emptyTrash:(id)sender {
if(self.version != MPDatabaseVersion4) {
return; // We have no trash on those file types
}
NSAlert *alert = [[NSAlert alloc] init]; NSAlert *alert = [[NSAlert alloc] init];
[alert setAlertStyle:NSWarningAlertStyle]; [alert setAlertStyle:NSWarningAlertStyle];
[alert setMessageText:NSLocalizedString(@"WARNING_ON_EMPTY_TRASH_TITLE", "")]; [alert setMessageText:NSLocalizedString(@"WARNING_ON_EMPTY_TRASH_TITLE", "")];
@@ -534,7 +424,7 @@ typedef NS_ENUM(NSUInteger, MPAlertType) {
- (void)createEntryFromTemplate:(id)sender { - (void)createEntryFromTemplate:(id)sender {
NSMenuItem *item = sender; NSMenuItem *item = sender;
KdbEntry *entry = [item representedObject]; KPKEntry *entry = [item representedObject];
if(entry) { if(entry) {
// Create Entry from template; // Create Entry from template;
} }
@@ -565,50 +455,32 @@ typedef NS_ENUM(NSUInteger, MPAlertType) {
} }
} }
- (KdbGroup *)_createTrashGroup { - (KPKGroup *)_createTrashGroup {
/* Maybe push the stuff to the Tree? */ /* Maybe push the stuff to the Tree? */
if(self.version == MPDatabaseVersion3) { KPKGroup *trash = [self.tree createGroup:self.tree.root];
return nil;
}
else if(self.version == MPDatabaseVersion4) {
KdbGroup *trash = [self.tree createGroup:self.tree.root];
trash.name = NSLocalizedString(@"TRASH", @"Name for the trash group"); trash.name = NSLocalizedString(@"TRASH", @"Name for the trash group");
trash.image = MPIconTrash; trash.icon = MPIconTrash;
[self.tree.root insertObject:trash inGroupsAtIndex:[self.tree.root.groups count]]; BOOL registrationEnable = [[self undoManager] isUndoRegistrationEnabled];
self.treeV4.recycleBinUuid = ((Kdb4Group *)trash).uuid; if(registrationEnable) {
[[self undoManager] disableUndoRegistration];
}
[self.tree.root addGroup:trash];
if(registrationEnable) {
[[self undoManager] enableUndoRegistration];
}
self.tree.metaData.recycleBinUuid = trash.uuid;
return trash; return trash;
} }
else {
NSAssert(NO, @"Database with unknown version: %ld", _version);
return nil;
}
}
- (void)_emptyTrash { - (void)_emptyTrash {
for(KdbEntry *entry in [self.trash childEntries]) { for(KPKEntry *entry in [self.trash childEntries]) {
[[self undoManager] removeAllActionsWithTarget:entry]; [[self undoManager] removeAllActionsWithTarget:entry];
} }
for(KdbGroup *group in [self.trash childGroups]) { for(KPKGroup *group in [self.trash childGroups]) {
[[self undoManager] removeAllActionsWithTarget:group]; [[self undoManager] removeAllActionsWithTarget:group];
} }
[self _cleanTrashedBinaries];
[self.trash clear]; [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 @end

View File

@@ -8,13 +8,13 @@
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
@class KdbEntry; @class KPKEntry;
@interface MPDocumentQueryService : NSObject @interface MPDocumentQueryService : NSObject
+ (MPDocumentQueryService *)defaultService; + (MPDocumentQueryService *)defaultService;
- (KdbEntry *)configurationEntry; - (KPKEntry *)configurationEntry;
- (KdbEntry *)createConfigurationEntry; - (KPKEntry *)createConfigurationEntry;
@end @end

View File

@@ -8,11 +8,12 @@
#import "MPDocumentQueryService.h" #import "MPDocumentQueryService.h"
#import "MPDocument.h" #import "MPDocument.h"
#import "UUID.h"
#import "NSUUID+KeePassKit.h"
@interface MPDocumentQueryService () { @interface MPDocumentQueryService () {
@private @private
UUID *rootUuid; NSUUID *rootUuid;
} }
@end @end
@@ -36,20 +37,20 @@
0x9f, 0x36, 0x89, 0x7d, 0x62, 0x3e, 0xcb, 0x31 0x9f, 0x36, 0x89, 0x7d, 0x62, 0x3e, 0xcb, 0x31
}; };
NSData *data = [NSData dataWithBytes:uuidBytes length:16]; NSData *data = [NSData dataWithBytes:uuidBytes length:16];
rootUuid = [[UUID alloc] initWithData:data]; rootUuid = [[NSUUID alloc] initWithData:data];
} }
return self; return self;
} }
- (KdbEntry *)configurationEntry { - (KPKEntry *)configurationEntry {
/* /*
We are looking in all document, We are looking in all document,
but only store the key in one. but only store the key in one.
*/ */
NSArray *documents = [[NSDocumentController sharedDocumentController] documents]; NSArray *documents = [[NSDocumentController sharedDocumentController] documents];
for(MPDocument *document in documents) { for(MPDocument *document in documents) {
KdbEntry *entry = [document findEntry:rootUuid]; KPKEntry *entry = [document findEntry:rootUuid];
if(entry) { if(entry) {
return entry; return entry;
} }
@@ -57,7 +58,7 @@
return nil; return nil;
} }
- (KdbEntry *)createConfigurationEntry { - (KPKEntry *)createConfigurationEntry {
return nil; return nil;
} }

View File

@@ -14,9 +14,6 @@
@class MPPasswordInputController; @class MPPasswordInputController;
@class MPOutlineViewController; @class MPOutlineViewController;
@class KdbGroup;
@class KdbEntry;
@interface MPDocumentWindowController : NSWindowController @interface MPDocumentWindowController : NSWindowController
@property (readonly, strong) MPPasswordInputController *passwordInputController; @property (readonly, strong) MPPasswordInputController *passwordInputController;

View File

@@ -184,9 +184,6 @@
} }
BOOL enabled = YES; BOOL enabled = YES;
if(itemAction == @selector(exportDatabase:)) {
enabled = (nil != document.treeV4);
}
if(itemAction == [MPActionHelper actionOfType:MPActionDelete]) { if(itemAction == [MPActionHelper actionOfType:MPActionDelete]) {
enabled &= (nil != document.selectedItem) && (document.selectedItem != document.trash); enabled &= (nil != document.selectedItem) && (document.selectedItem != document.trash);
} }

View File

@@ -8,8 +8,8 @@
#import "MPDocumentWindowDelegate.h" #import "MPDocumentWindowDelegate.h"
#import "MPDocument.h" #import "MPDocument.h"
#import "Kdb.h"
#import "KdbEntry+Undo.h" #import "KPKEntry.h"
@implementation MPDocumentWindowDelegate @implementation MPDocumentWindowDelegate
@@ -55,9 +55,9 @@
BOOL ok = NO; BOOL ok = NO;
if(document.selectedGroup) { if(document.selectedGroup) {
[[document undoManager] beginUndoGrouping]; [[document undoManager] beginUndoGrouping];
KdbEntry *entry = [document createEntry:document.selectedGroup]; KPKEntry *entry = [document createEntry:document.selectedGroup];
ok = (nil != entry); ok = (nil != entry);
entry.urlUndoable = [url absoluteString]; entry.url = [url absoluteString];
[[document undoManager] endUndoGrouping]; [[document undoManager] endUndoGrouping];
[[document undoManager] setActionName:NSLocalizedString(@"IMPORT_URL", @"Imports a dragged URL for a new entry")]; [[document undoManager] setActionName:NSLocalizedString(@"IMPORT_URL", @"Imports a dragged URL for a new entry")];
} }

View File

@@ -9,7 +9,8 @@
#import "MPEntryContextMenuDelegate.h" #import "MPEntryContextMenuDelegate.h"
#import "MPDocument.h" #import "MPDocument.h"
#import "Kdb4Node.h" #import "KPKEntry.h"
#import "KPKAttribute.h"
static NSUInteger const kMPCustomFieldMenuItem = 1000; static NSUInteger const kMPCustomFieldMenuItem = 1000;
static NSUInteger const kMPAttachmentsMenuItem = 2000; static NSUInteger const kMPAttachmentsMenuItem = 2000;
@@ -31,23 +32,22 @@ static NSUInteger const kMPAttachmentsMenuItem = 2000;
[menu removeItem:lastItem]; [menu removeItem:lastItem];
} }
MPDocument *document = [[NSDocumentController sharedDocumentController] currentDocument]; MPDocument *document = [[NSDocumentController sharedDocumentController] currentDocument];
if([document.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
Kdb4Entry *entry = (Kdb4Entry *)document.selectedEntry; KPKEntry *entry = document.selectedEntry;
if([entry.stringFields count] > 0) { if([entry.customAttributes count] > 0) {
[menu addItem:[NSMenuItem separatorItem]]; [menu addItem:[NSMenuItem separatorItem]];
NSMenuItem *customFieldsItem = [[NSMenuItem alloc] init]; NSMenuItem *attributeItem = [[NSMenuItem alloc] init];
NSMenu *submenu = [[NSMenu alloc] initWithTitle:@"Fields"]; NSMenu *submenu = [[NSMenu alloc] initWithTitle:@"Fields"];
[customFieldsItem setTitle:NSLocalizedString(@"COPY_CUSTOM_FIELDS", "Submenu to Copy custom fields")]; [attributeItem setTitle:NSLocalizedString(@"COPY_CUSTOM_FIELDS", "Submenu to Copy custom fields")];
[customFieldsItem setTag:kMPCustomFieldMenuItem]; [attributeItem setTag:kMPCustomFieldMenuItem];
for (StringField *field in entry.stringFields) { for (KPKAttribute *attribute in entry.customAttributes) {
NSString *title = [NSString stringWithFormat:NSLocalizedString(@"COPY_FIELD_%@", "Mask for title to copy field value"), field.key]; NSString *title = [NSString stringWithFormat:NSLocalizedString(@"COPY_FIELD_%@", "Mask for title to copy field value"), attribute.key];
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:title action:@selector(copyCustomField:) keyEquivalent:@""]; NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:title action:@selector(copyCustomAttribute:) keyEquivalent:@""];
[item setTag:[entry.stringFields indexOfObject:field]]; [item setTag:[entry.customAttributes indexOfObject:attribute]];
[submenu addItem:item]; [submenu addItem:item];
} }
[customFieldsItem setSubmenu:submenu]; [attributeItem setSubmenu:submenu];
[menu addItem:customFieldsItem]; [menu addItem:attributeItem];
}
} }
} }

View File

@@ -8,7 +8,6 @@
#import "MPViewController.h" #import "MPViewController.h"
@class KdbEntry;
@class HNHRoundedSecureTextField; @class HNHRoundedSecureTextField;
@class MPDocument; @class MPDocument;

View File

@@ -15,10 +15,8 @@
#import "MPDocument.h" #import "MPDocument.h"
#import "MPIconHelper.h" #import "MPIconHelper.h"
#import "Kdb.h" #import "KPKEntry.h"
#import "Kdb3Node.h" #import "KPKBinary.h"
#import "Kdb4Node.h"
#import "KdbEntry+Undo.h"
#import "HNHScrollView.h" #import "HNHScrollView.h"
#import "HNHRoundedSecureTextField.h" #import "HNHRoundedSecureTextField.h"
@@ -43,7 +41,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
@property (nonatomic, assign) MPEntryTab activeTab; @property (nonatomic, assign) MPEntryTab activeTab;
@property (strong) NSPopover *activePopover; @property (strong) NSPopover *activePopover;
@property (nonatomic, weak) KdbEntry *entry; @property (nonatomic, weak) KPKEntry *entry;
@end @end
@@ -127,7 +125,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
[self bind:@"entry" toObject:document withKeyPath:@"selectedEntry" options:nil]; [self bind:@"entry" toObject:document withKeyPath:@"selectedEntry" options:nil];
} }
- (void)setEntry:(KdbEntry *)entry { - (void)setEntry:(KPKEntry *)entry {
if(_entry != entry) { if(_entry != entry) {
_entry = entry; _entry = entry;
[self _updateContent]; [self _updateContent];
@@ -139,36 +137,23 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
- (IBAction)addCustomField:(id)sender { - (IBAction)addCustomField:(id)sender {
MPDocument *document = [[self windowController] document]; MPDocument *document = [[self windowController] document];
[document createStringField:self.entry]; [document createCustomAttribute:self.entry];
} }
- (IBAction)removeCustomField:(id)sender { - (IBAction)removeCustomField:(id)sender {
MPDocument *document = [[self windowController] document];
NSUInteger index = [sender tag]; NSUInteger index = [sender tag];
Kdb4Entry *entry = (Kdb4Entry *)self.entry; KPKAttribute *attribute = self.entry.customAttributes[index];
[document removeStringField:(entry.stringFields)[index] formEntry:entry]; [self.entry removeCustomAttribute:attribute];
} }
- (IBAction)saveAttachment:(id)sender { - (IBAction)saveAttachment:(id)sender {
BOOL isVersion4 = [self.entry isKindOfClass:[Kdb4Entry class]]; KPKBinary *binary = self.entry.binaries[[sender tag]];
id item = self.entry;
NSString *fileName = nil;
if(isVersion4) {
Kdb4Entry *entry= (Kdb4Entry *)self.entry;
item = entry.binaries[[sender tag]];
fileName = ((BinaryRef *)item).key;
}
else {
fileName = ((Kdb3Entry *)item).binaryDesc;
}
NSSavePanel *savePanel = [NSSavePanel savePanel]; NSSavePanel *savePanel = [NSSavePanel savePanel];
[savePanel setCanCreateDirectories:YES]; [savePanel setCanCreateDirectories:YES];
[savePanel setNameFieldStringValue:fileName]; [savePanel setNameFieldStringValue:binary.name];
[savePanel beginSheetModalForWindow:[[self windowController] window] completionHandler:^(NSInteger result) { [savePanel beginSheetModalForWindow:[[self windowController] window] completionHandler:^(NSInteger result) {
if(result == NSFileHandlingPanelOKButton) { if(result == NSFileHandlingPanelOKButton) {
MPDocument *document = [[self windowController] document]; [binary saveToLocation:[savePanel URL]];
[document saveAttachmentForItem:item toLocation:[savePanel URL]];
} }
}]; }];
} }
@@ -180,24 +165,17 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
[openPanel setAllowsMultipleSelection:YES]; [openPanel setAllowsMultipleSelection:YES];
[openPanel beginSheetModalForWindow:[[self windowController] window] completionHandler:^(NSInteger result) { [openPanel beginSheetModalForWindow:[[self windowController] window] completionHandler:^(NSInteger result) {
if(result == NSFileHandlingPanelOKButton) { if(result == NSFileHandlingPanelOKButton) {
MPDocument *document = [[self windowController] document];
for (NSURL *attachmentURL in [openPanel URLs]) { for (NSURL *attachmentURL in [openPanel URLs]) {
[document addAttachment:attachmentURL toEntry:self.entry]; KPKBinary *binary = [[KPKBinary alloc] initWithContentsOfURL:attachmentURL];
[self.entry addBinary:binary];
} }
} }
}]; }];
} }
- (IBAction)removeAttachment:(id)sender { - (IBAction)removeAttachment:(id)sender {
MPDocument *document = [[self windowController] document]; KPKBinary *binary = self.entry.binaries[[sender tag]];
if(document.version == MPDatabaseVersion3) { [self.entry removeBinary:binary];
[document removeAttachmentFromEntry:self.entry];
}
else if(document.version == MPDatabaseVersion4) {
Kdb4Entry *entry = (Kdb4Entry *)self.entry;
BinaryRef *reference = entry.binaries[[sender tag]];
[document removeAttachment:reference fromEntry:self.entry];
}
} }
#pragma mark - #pragma mark -
@@ -230,7 +208,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
NSString *password = [controller generatedPassword]; NSString *password = [controller generatedPassword];
/* We should only use the password if there is actally one */ /* We should only use the password if there is actally one */
if([password length] > 0) { if([password length] > 0) {
self.entry.passwordUndoable = [controller generatedPassword]; self.entry.password = [controller generatedPassword];
} }
} }
/* TODO: Check for Icon wizzard */ /* TODO: Check for Icon wizzard */
@@ -249,15 +227,12 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
- (void)_bindEntry { - (void)_bindEntry {
if(self.entry) { if(self.entry) {
[self.titleTextField bind:NSValueBinding toObject:self.entry withKeyPath:@"titleUndoable" options:nil]; [self.titleTextField bind:NSValueBinding toObject:self.entry withKeyPath:@"title" options:nil];
//[self.itemImageView setImage:[MPIconHelper icon:(MPIconType)self.entry.image ]]; //[self.itemImageView setImage:[MPIconHelper icon:(MPIconType)self.entry.image ]];
[self.passwordTextField bind:NSValueBinding toObject:self.entry withKeyPath:@"passwordUndoable" options:nil]; [self.passwordTextField bind:NSValueBinding toObject:self.entry withKeyPath:@"password" options:nil];
[self.usernameTextField bind:NSValueBinding toObject:self.entry withKeyPath:@"usernameUndoable" options:nil]; [self.usernameTextField bind:NSValueBinding toObject:self.entry withKeyPath:@"username" options:nil];
[self.URLTextField bind:NSValueBinding toObject:self.entry withKeyPath:@"urlUndoable" options:nil]; [self.URLTextField bind:NSValueBinding toObject:self.entry withKeyPath:@"url" options:nil];
[self.notesTextView bind:NSValueBinding toObject:self.entry withKeyPath:@"notesUndoable" options:nil]; [self.notesTextView bind:NSValueBinding toObject:self.entry withKeyPath:@"notes" options:nil];
BOOL isKdbx = [self.entry isKindOfClass:[Kdb4Entry class]];
[self.infoTabControl setEnabled:isKdbx forSegment:MPEntryTabCustomFields];
} }
else { else {
[self.titleTextField unbind:NSValueBinding]; [self.titleTextField unbind:NSValueBinding];
@@ -279,13 +254,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
} }
- (void)_bindCustomFields { - (void)_bindCustomFields {
if(self.entry && [self.entry isKindOfClass:[Kdb4Entry class]]) { [_customFieldsController bind:NSContentArrayBinding toObject:self.entry withKeyPath:@"customAttributes" options:nil];
[_customFieldsController bind:NSContentArrayBinding toObject:self.entry withKeyPath:@"stringFields" options:nil];
}
else if([_customFieldsController content] != nil){
[_customFieldsController unbind:NSContentArrayBinding];
[_customFieldsController setContent:nil];
}
} }
@end @end

View File

@@ -9,10 +9,8 @@
#import "MPEntryTableDataSource.h" #import "MPEntryTableDataSource.h"
#import "MPEntryViewController.h" #import "MPEntryViewController.h"
#import "Kdb.h" #import "KPKEntry.h"
#import "UUID+Pasterboard.h" #import "NSUUID+KeePassKit.h"
#import "MPConstants.h"
@interface MPEntryTableDataSource () @interface MPEntryTableDataSource ()
@@ -27,10 +25,10 @@
} }
id item = [self.viewController.entryArrayController arrangedObjects][[rowIndexes firstIndex]]; id item = [self.viewController.entryArrayController arrangedObjects][[rowIndexes firstIndex]];
if(![item isKindOfClass:[KdbEntry class]]) { if(![item isKindOfClass:[KPKEntry class]]) {
return NO; return NO;
} }
KdbEntry *entry = (KdbEntry *)item; KPKEntry *entry = (KPKEntry *)item;
[pboard writeObjects:@[entry.uuid]]; [pboard writeObjects:@[entry.uuid]];
return YES; return YES;
} }

View File

@@ -22,14 +22,13 @@ typedef NS_ENUM( NSUInteger, MPCopyContentTypeTag) {
MPCopyWholeEntry, MPCopyWholeEntry,
}; };
@class KdbGroup; @class KPKEntry;
@class KdbEntry;
@class MPOutlineViewDelegate; @class MPOutlineViewDelegate;
@class MPDocumentWindowController; @class MPDocumentWindowController;
@interface MPEntryViewController : MPViewController <NSTableViewDelegate> @interface MPEntryViewController : MPViewController <NSTableViewDelegate>
@property (readonly, weak, nonatomic) KdbEntry *selectedEntry; @property (readonly, weak, nonatomic) KPKEntry *selectedEntry;
@property (weak,readonly) NSTableView *entryTable; @property (weak,readonly) NSTableView *entryTable;
@property (readonly, strong) NSArrayController *entryArrayController; @property (readonly, strong) NSArrayController *entryArrayController;
@@ -46,7 +45,7 @@ typedef NS_ENUM( NSUInteger, MPCopyContentTypeTag) {
/* Copy/Paste */ /* Copy/Paste */
- (void)copyUsername:(id)sender; - (void)copyUsername:(id)sender;
- (void)copyPassword:(id)sender; - (void)copyPassword:(id)sender;
- (void)copyCustomField:(id)sender; - (void)copyCustomAttribute:(id)sender;
- (void)copyURL:(id)sender; - (void)copyURL:(id)sender;
- (void)openURL:(id)sender; - (void)openURL:(id)sender;

View File

@@ -24,14 +24,15 @@
#import "MPStripLineBreaksTransformer.h" #import "MPStripLineBreaksTransformer.h"
#import "MPEntryContextMenuDelegate.h" #import "MPEntryContextMenuDelegate.h"
#import "KPKUTIs.h"
#import "KPKGroup.h"
#import "KPKEntry.h"
#import "KPKNode+IconImage.h"
#import "KPKAttribute.h"
#import "HNHTableHeaderCell.h" #import "HNHTableHeaderCell.h"
#import "HNHGradientView.h" #import "HNHGradientView.h"
#import "Kdb4Node.h"
#import "KdbGroup+MPTreeTools.h"
#import "KdbGroup+Undo.h"
#import "KdbEntry+Undo.h"
#import "MPNotifications.h" #import "MPNotifications.h"
#define STATUS_BAR_ANIMATION_TIME 0.15 #define STATUS_BAR_ANIMATION_TIME 0.15
@@ -90,7 +91,7 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
@property (weak) IBOutlet NSTextField *entryCountTextField; @property (weak) IBOutlet NSTextField *entryCountTextField;
@property (weak) KdbEntry *selectedEntry; @property (weak) KPKEntry *selectedEntry;
@property (nonatomic, strong) MPEntryTableDataSource *dataSource; @property (nonatomic, strong) MPEntryTableDataSource *dataSource;
@@ -139,7 +140,7 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
[self.entryTable setDoubleAction:@selector(_columnDoubleClick:)]; [self.entryTable setDoubleAction:@selector(_columnDoubleClick:)];
[self.entryTable setTarget:self]; [self.entryTable setTarget:self];
[self.entryTable setFloatsGroupRows:NO]; [self.entryTable setFloatsGroupRows:NO];
[self.entryTable registerForDraggedTypes:@[MPEntryUTI]]; [self.entryTable registerForDraggedTypes:@[KPKEntryUTI]];
[[NSNotificationCenter defaultCenter] addObserver:self [[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(_didBecomFirstResponder:) selector:@selector(_didBecomFirstResponder:)
name:MPDidActivateViewNotification name:MPDidActivateViewNotification
@@ -209,7 +210,7 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
#pragma mark NSTableViewDelgate #pragma mark NSTableViewDelgate
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
KdbEntry *entry = [self.entryArrayController arrangedObjects][row]; KPKEntry *entry = [self.entryArrayController arrangedObjects][row];
BOOL isTitleColumn = [[tableColumn identifier] isEqualToString:MPEntryTableTitleColumnIdentifier]; BOOL isTitleColumn = [[tableColumn identifier] isEqualToString:MPEntryTableTitleColumnIdentifier];
BOOL isGroupColumn = [[tableColumn identifier] isEqualToString:MPEntryTableParentColumnIdentifier]; BOOL isGroupColumn = [[tableColumn identifier] isEqualToString:MPEntryTableParentColumnIdentifier];
BOOL isPasswordColum = [[tableColumn identifier] isEqualToString:MPEntryTablePasswordColumnIdentifier]; BOOL isPasswordColum = [[tableColumn identifier] isEqualToString:MPEntryTablePasswordColumnIdentifier];
@@ -223,31 +224,31 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
if(isTitleColumn || isGroupColumn) { if(isTitleColumn || isGroupColumn) {
view = [tableView makeViewWithIdentifier:_MPTableImageCellView owner:self]; view = [tableView makeViewWithIdentifier:_MPTableImageCellView owner:self];
if( isTitleColumn ) { if( isTitleColumn ) {
[[view textField] bind:NSValueBinding toObject:entry withKeyPath:@"titleUndoable" options:nil]; [[view textField] bind:NSValueBinding toObject:entry withKeyPath:@"title" options:nil];
[[view imageView] setImage:[MPIconHelper icon:(MPIconType)entry.image]]; [[view imageView] setImage:entry.iconImage];
} }
else { else {
assert(entry.parent); assert(entry.parent);
[[view textField] bind:NSValueBinding toObject:entry.parent withKeyPath:MPGroupNameUndoableKey options:nil]; [[view textField] bind:NSValueBinding toObject:entry.parent withKeyPath:entry.parent.name options:nil];
[[view imageView] setImage:[MPIconHelper icon:(MPIconType)entry.parent.image]]; [[view imageView] setImage:entry.iconImage];
} }
} }
else if( isPasswordColum ) { else if( isPasswordColum ) {
view = [tableView makeViewWithIdentifier:_MPTAbleSecurCellView owner:self]; view = [tableView makeViewWithIdentifier:_MPTAbleSecurCellView owner:self];
NSDictionary *options = @{ NSValueTransformerBindingOption : [NSValueTransformer valueTransformerForName:MPStringLengthValueTransformerName] }; NSDictionary *options = @{ NSValueTransformerBindingOption : [NSValueTransformer valueTransformerForName:MPStringLengthValueTransformerName] };
[[view textField] bind:NSValueBinding toObject:entry withKeyPath:@"passwordUndoable" options:options]; [[view textField] bind:NSValueBinding toObject:entry withKeyPath:@"password" options:options];
} }
else { else {
view = [tableView makeViewWithIdentifier:_MPTableStringCellView owner:self]; view = [tableView makeViewWithIdentifier:_MPTableStringCellView owner:self];
if(isURLColumn) { if(isURLColumn) {
[[view textField] bind:NSValueBinding toObject:entry withKeyPath:@"urlUndoable" options:nil]; [[view textField] bind:NSValueBinding toObject:entry withKeyPath:@"url" options:nil];
} }
else if( isUsernameColumn) { else if( isUsernameColumn) {
[[view textField] bind:NSValueBinding toObject:entry withKeyPath:@"usernameUndoable" options:nil]; [[view textField] bind:NSValueBinding toObject:entry withKeyPath:@"username" options:nil];
} }
else if( isNotesColumn ) { else if( isNotesColumn ) {
NSDictionary *options = @{ NSValueTransformerNameBindingOption : MPStripLineBreaksTransformerName }; NSDictionary *options = @{ NSValueTransformerNameBindingOption : MPStripLineBreaksTransformerName };
[[view textField] bind:NSValueBinding toObject:entry withKeyPath:@"notesUndoable" options:options]; [[view textField] bind:NSValueBinding toObject:entry withKeyPath:@"notes" options:options];
} }
else if( isAttachmentColumn ) { else if( isAttachmentColumn ) {
[[view textField] setStringValue:@""]; [[view textField] setStringValue:@""];
@@ -258,7 +259,7 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
[formatter setDateStyle:NSDateFormatterMediumStyle]; [formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setTimeStyle:NSDateFormatterMediumStyle]; [formatter setTimeStyle:NSDateFormatterMediumStyle];
[[view textField] setFormatter:formatter]; [[view textField] setFormatter:formatter];
[[view textField] bind:NSValueBinding toObject:entry withKeyPath:@"lastModificationTime" options:nil]; [[view textField] bind:NSValueBinding toObject:entry.timeInfo withKeyPath:@"lastModificationTime" options:nil];
} }
} }
@@ -292,13 +293,13 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
If we reselct the group, or just another group If we reselct the group, or just another group
we clear the filter and bind to the new selected group we clear the filter and bind to the new selected group
*/ */
if([self _showsFilterBar] && ![document.selectedItem isKindOfClass:[KdbEntry class]]) { if([self _showsFilterBar] && ![document.selectedItem isKindOfClass:[KPKEntry class]]) {
[self clearFilter:nil]; [self clearFilter:nil];
[self.entryArrayController bind:NSContentArrayBinding toObject:document.selectedGroup withKeyPath:@"entries" options:nil]; [self.entryArrayController bind:NSContentArrayBinding toObject:document.selectedGroup withKeyPath:@"entries" options:nil];
return; return;
} }
if([[self.entryArrayController content] count] > 0) { if([[self.entryArrayController content] count] > 0) {
KdbEntry *entry = [[self.entryArrayController content] lastObject]; KPKEntry *entry = [[self.entryArrayController content] lastObject];
if(entry.parent == document.selectedGroup) { if(entry.parent == document.selectedGroup) {
return; // we are showing the correct object right now. return; // we are showing the correct object right now.
} }
@@ -593,9 +594,9 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
} }
#pragma makr Action Helper #pragma mark Action Helper
- (KdbEntry *)_clickedOrSelectedEntry { - (KPKEntry *)_clickedOrSelectedEntry {
NSInteger activeRow = [self.entryTable clickedRow]; NSInteger activeRow = [self.entryTable clickedRow];
/* Fallback to selection e.g. for toolbar actions */ /* Fallback to selection e.g. for toolbar actions */
if(activeRow < 0 ) { if(activeRow < 0 ) {
@@ -610,39 +611,38 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
#pragma mark Actions #pragma mark Actions
- (void)copyPassword:(id)sender { - (void)copyPassword:(id)sender {
KdbEntry *selectedEntry = [self _clickedOrSelectedEntry]; KPKEntry *selectedEntry = [self _clickedOrSelectedEntry];
if(selectedEntry) { if(selectedEntry) {
[self _copyToPasteboard:selectedEntry.password overlayInfo:MPOverlayInfoPassword name:nil]; [self _copyToPasteboard:selectedEntry.password overlayInfo:MPOverlayInfoPassword name:nil];
} }
} }
- (void)copyUsername:(id)sender { - (void)copyUsername:(id)sender {
KdbEntry *selectedEntry = [self _clickedOrSelectedEntry]; KPKEntry *selectedEntry = [self _clickedOrSelectedEntry];
if(selectedEntry) { if(selectedEntry) {
[self _copyToPasteboard:selectedEntry.username overlayInfo:MPOverlayInfoUsername name:nil]; [self _copyToPasteboard:selectedEntry.username overlayInfo:MPOverlayInfoUsername name:nil];
} }
} }
- (void)copyCustomField:(id)sender { - (void)copyCustomAttribute:(id)sender {
KdbEntry *selectedEntry = [self _clickedOrSelectedEntry]; KPKEntry *selectedEntry = [self _clickedOrSelectedEntry];
if(selectedEntry && [selectedEntry isKindOfClass:[Kdb4Entry class]]) { if(selectedEntry && [selectedEntry isKindOfClass:[KPKEntry class]]) {
Kdb4Entry *entry = (Kdb4Entry *)selectedEntry;
NSUInteger index = [sender tag]; NSUInteger index = [sender tag];
NSAssert((index >= 0) && (index < [entry.stringFields count]), @"Index for custom field needs to be valid"); NSAssert((index >= 0) && (index < [selectedEntry.customAttributes count]), @"Index for custom field needs to be valid");
StringField *field = entry.stringFields[index]; KPKAttribute *attribute = selectedEntry.customAttributes[index];
[self _copyToPasteboard:field.value overlayInfo:MPOverlayInfoCustom name:field.key]; [self _copyToPasteboard:attribute.value overlayInfo:MPOverlayInfoCustom name:attribute.key];
} }
} }
- (void)copyURL:(id)sender { - (void)copyURL:(id)sender {
KdbEntry *selectedEntry = [self _clickedOrSelectedEntry]; KPKEntry *selectedEntry = [self _clickedOrSelectedEntry];
if(selectedEntry) { if(selectedEntry) {
[self _copyToPasteboard:selectedEntry.url overlayInfo:MPOverlayInfoURL name:nil]; [self _copyToPasteboard:selectedEntry.url overlayInfo:MPOverlayInfoURL name:nil];
} }
} }
- (void)openURL:(id)sender { - (void)openURL:(id)sender {
KdbEntry *selectedEntry = [self _clickedOrSelectedEntry]; KPKEntry *selectedEntry = [self _clickedOrSelectedEntry];
if(selectedEntry && [selectedEntry.url length] > 0) { if(selectedEntry && [selectedEntry.url length] > 0) {
NSURL *webURL = [NSURL URLWithString:selectedEntry.url]; NSURL *webURL = [NSURL URLWithString:selectedEntry.url];
[[NSWorkspace sharedWorkspace] openURL:webURL]; [[NSWorkspace sharedWorkspace] openURL:webURL];
@@ -650,7 +650,7 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
} }
- (void)deleteNode:(id)sender { - (void)deleteNode:(id)sender {
KdbEntry *entry =[self _clickedOrSelectedEntry]; KPKEntry *entry =[self _clickedOrSelectedEntry];
MPDocument *document = [[self windowController] document]; MPDocument *document = [[self windowController] document];
[document deleteEntry:entry]; [document deleteEntry:entry];
} }

View File

@@ -10,16 +10,14 @@
#import "MPDocument.h" #import "MPDocument.h"
#import "MPPasteBoardController.h" #import "MPPasteBoardController.h"
#import "Kdb.h" #import "KPKGroup.h"
#import "Kdb4Node.h"
#import "Kdb4Group+Undo.h"
#import "HNHScrollView.h" #import "HNHScrollView.h"
#import "HNHRoundedTextField.h" #import "HNHRoundedTextField.h"
@interface MPGroupInspectorViewController () @interface MPGroupInspectorViewController ()
@property (nonatomic, weak) KdbGroup *group; @property (nonatomic, weak) KPKGroup *group;
@end @end
@@ -66,7 +64,7 @@
[self bind:@"group" toObject:document withKeyPath:@"selectedGroup" options:nil]; [self bind:@"group" toObject:document withKeyPath:@"selectedGroup" options:nil];
} }
- (void)setGroup:(KdbGroup *)group { - (void)setGroup:(KPKGroup *)group {
if(_group != group) { if(_group != group) {
_group = group; _group = group;
[self _updateBindings]; [self _updateBindings];
@@ -75,14 +73,8 @@
- (void)_updateBindings { - (void)_updateBindings {
if(self.group) { if(self.group) {
[self.titleTextField bind:NSValueBinding toObject:self.group withKeyPath:@"nameUndoable" options:nil]; [self.titleTextField bind:NSValueBinding toObject:self.group withKeyPath:@"name" options:nil];
if([self.group isKindOfClass:[Kdb4Group class]]) { [self.notesTextView bind:NSValueBinding toObject:self.group withKeyPath:@"notes" options:nil];
[self.notesTextView bind:NSValueBinding toObject:self.group withKeyPath:@"notesUndoable" options:nil];
}
else {
[self.notesTextView unbind:NSValueBinding];
[self.notesTextView setString:@""];
}
} }
else { else {
[self.titleTextField unbind:NSValueBinding]; [self.titleTextField unbind:NSValueBinding];

View File

@@ -16,9 +16,6 @@
#import "NSDate+Humanized.h" #import "NSDate+Humanized.h"
#import "KdbLib.h"
#import "Kdb4Node.h"
#import "Kdb3Node.h"
#import "HNHGradientView.h" #import "HNHGradientView.h"
#import "MPPopupImageView.h" #import "MPPopupImageView.h"
@@ -162,7 +159,7 @@ typedef NS_ENUM(NSUInteger, MPContentTab) {
return; return;
} }
[self.itemImageView bind:NSValueBinding toObject:item withKeyPath:@"icon" options:nil]; [self.itemImageView bind:NSValueBinding toObject:item withKeyPath:@"iconImage" options:nil];
if([item respondsToSelector:@selector(title)]) { if([item respondsToSelector:@selector(title)]) {
[self.itemNameTextField bind:NSValueBinding toObject:item withKeyPath:@"title" options:nil]; [self.itemNameTextField bind:NSValueBinding toObject:item withKeyPath:@"title" options:nil];

View File

@@ -9,13 +9,13 @@
#import "MPOutlineContextMenuDelegate.h" #import "MPOutlineContextMenuDelegate.h"
#import "MPOutlineViewController.h" #import "MPOutlineViewController.h"
#import "MPRootAdapter.h"
#import "MPDocument.h" #import "MPDocument.h"
#import "MPActionHelper.h" #import "MPActionHelper.h"
#import "MPContextMenuHelper.h" #import "MPContextMenuHelper.h"
#import "Kdb.h" #import "KPKGroup.h"
#import "KPKTree.h"
NSString *const _MPOutlineMenuDefault = @"Default"; NSString *const _MPOutlineMenuDefault = @"Default";
NSString *const _MPOutlineMenuTrash = @"Trash"; NSString *const _MPOutlineMenuTrash = @"Trash";
@@ -37,13 +37,16 @@ NSString *const _MPOutlineMenuTemplate = @"Template";
*/ */
id item = [self.viewController itemUnderMouse]; id item = [self.viewController itemUnderMouse];
if( [item isKindOfClass:[MPRootAdapter class]]) { if( [item isKindOfClass:[KPKTree class]]) {
[self _updateRootMenu:menu]; [self _updateRootMenu:menu];
} }
if( [item isKindOfClass:[KdbGroup class]]) { if( [item isKindOfClass:[KPKGroup class]]) {
KdbGroup *group = (KdbGroup *)item; KPKGroup *group = (KPKGroup *)item;
MPDocument *document = [[NSDocumentController sharedDocumentController] currentDocument]; MPDocument *document = [[NSDocumentController sharedDocumentController] currentDocument];
if(group && document.root == group ) {
}
if(group && document.trash == group) { if(group && document.trash == group) {
[self _updateTrashMenu:menu]; [self _updateTrashMenu:menu];
} }

View File

@@ -9,21 +9,17 @@
#import "MPOutlineDataSource.h" #import "MPOutlineDataSource.h"
#import "MPDocument.h" #import "MPDocument.h"
#import "MPConstants.h" #import "MPConstants.h"
#import "MPRootAdapter.h"
#import "KdbLib.h" #import "KPKGroup.h"
#import "KdbGroup+Undo.h" #import "KPKEntry.h"
#import "KdbEntry+Undo.h" #import "KPKUTIs.h"
#import "KdbGroup+MPTreeTools.h"
#import "KdbEntry+MPTreeTools.h"
#import "UUID.h" #import "NSUUID+KeePassKit.h"
#import "UUID+Pasterboard.h"
@interface MPOutlineDataSource () @interface MPOutlineDataSource ()
@property (weak) KdbGroup *draggedGroup; @property (weak) KPKGroup *draggedGroup;
@property (weak) KdbEntry *draggedEntry; @property (weak) KPKEntry *draggedEntry;
@end @end
@@ -33,8 +29,12 @@
- (BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray *)items toPasteboard:(NSPasteboard *)pasteboard { - (BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray *)items toPasteboard:(NSPasteboard *)pasteboard {
self.draggedGroup = nil; self.draggedGroup = nil;
if([items count] == 1) { if([items count] == 1) {
[pasteboard setString:self.draggedGroup.name forType:MPGroupUTI]; id item = [[items lastObject] representedObject];
self.draggedGroup = [[items lastObject] representedObject]; if(![item isKindOfClass:[KPKGroup class]]) {
return NO;
}
[pasteboard setString:self.draggedGroup.name forType:KPKGroupUTI];
self.draggedGroup = item;
return (nil != self.draggedGroup.parent); return (nil != self.draggedGroup.parent);
} }
return NO; return NO;
@@ -50,10 +50,6 @@
oprationMask = NSDragOperationCopy; oprationMask = NSDragOperationCopy;
} }
*/ */
id targetItem = [item representedObject];
if(targetItem == nil || [targetItem isKindOfClass:[MPRootAdapter class]]) {
return NSDragOperationNone; // no Target
}
NSPasteboard *pasteBoard = [info draggingPasteboard]; NSPasteboard *pasteBoard = [info draggingPasteboard];
NSArray *types = [pasteBoard types]; NSArray *types = [pasteBoard types];
@@ -61,14 +57,18 @@
return NSDragOperationNone; // We cannot work with more than one type return NSDragOperationNone; // We cannot work with more than one type
} }
id targetItem = [item representedObject];
if( ![targetItem isKindOfClass:[KPKGroup class]] && ![targetItem isKindOfClass:[KPKEntry class]]) {
return NSDragOperationNone; // Block all unknown types
}
MPDocument *document = [[[outlineView window] windowController] document]; MPDocument *document = [[[outlineView window] windowController] document];
NSString *draggedType = [types lastObject]; NSString *draggedType = [types lastObject];
if([draggedType isEqualToString:MPGroupUTI]) { if([draggedType isEqualToString:KPKGroupUTI]) {
// dragging group // dragging group
self.draggedEntry = nil; self.draggedEntry = nil;
} }
else if([draggedType isEqualToString:MPUUIDUTI]) { else if([draggedType isEqualToString:KPKUUIDUTI]) {
NSArray *uuids = [pasteBoard readObjectsForClasses:@[[UUID class]] options:nil]; NSArray *uuids = [pasteBoard readObjectsForClasses:@[[NSUUID class]] options:nil];
if([uuids count] != 1) { if([uuids count] != 1) {
return NSDragOperationNone; // NO entry readable return NSDragOperationNone; // NO entry readable
} }
@@ -79,7 +79,7 @@
return NSDragOperationNone; // unkonw type return NSDragOperationNone; // unkonw type
} }
KdbGroup *targetGroup = targetItem; KPKGroup *targetGroup = targetItem;
BOOL validTarget = YES; BOOL validTarget = YES;
if(self.draggedGroup) { if(self.draggedGroup) {
if( self.draggedGroup == targetGroup ) { if( self.draggedGroup == targetGroup ) {
@@ -108,19 +108,19 @@
} }
id targetItem = [item representedObject]; id targetItem = [item representedObject];
if(![targetItem isKindOfClass:[KdbGroup class]]) { if(![targetItem isKindOfClass:[KPKGroup class]]) {
return NO; // Wrong return NO; // Wrong
} }
KdbGroup *targetGroup = (KdbGroup *)targetItem; KPKGroup *targetGroup = (KPKGroup *)targetItem;
NSString *draggedType = [types lastObject]; NSString *draggedType = [types lastObject];
if([draggedType isEqualToString:MPGroupUTI]) { if([draggedType isEqualToString:KPKGroupUTI]) {
[self.draggedGroup moveToGroupUndoable:targetGroup atIndex:index]; [self.draggedGroup moveToGroup:targetGroup atIndex:index];
return YES; return YES;
} }
else if([draggedType isEqualToString:MPUUIDUTI]) { else if([draggedType isEqualToString:KPKUUIDUTI]) {
[self.draggedEntry moveToGroupUndoable:targetGroup atIndex:index]; [self.draggedEntry moveToGroup:targetGroup atIndex:index];
return YES; return YES;
} }
return NO; return NO;

View File

@@ -11,7 +11,6 @@
APPKIT_EXTERN NSString *const MPOutlineViewDidChangeGroupSelection; APPKIT_EXTERN NSString *const MPOutlineViewDidChangeGroupSelection;
@class MPOutlineViewDelegate; @class MPOutlineViewDelegate;
@class KdbGroup;
@class HNHGradientView; @class HNHGradientView;
@class MPDocumentWindowController; @class MPDocumentWindowController;

View File

@@ -15,13 +15,14 @@
#import "MPActionHelper.h" #import "MPActionHelper.h"
#import "MPIconHelper.h" #import "MPIconHelper.h"
#import "MPUppercaseStringValueTransformer.h" #import "MPUppercaseStringValueTransformer.h"
#import "MPRootAdapter.h"
#import "MPNotifications.h" #import "MPNotifications.h"
#import "MPOutlineContextMenuDelegate.h" #import "MPOutlineContextMenuDelegate.h"
#import "KdbLib.h" #import "KPKTree.h"
#import "Kdb4Node.h" #import "KPKGroup.h"
#import "KdbGroup+Undo.h" #import "KPKNode+IconImage.h"
#import "KPKMetaData.h"
#import "KPKUTIs.h"
#import "HNHGradientView.h" #import "HNHGradientView.h"
@@ -72,7 +73,7 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
[_outlineView setMenu:[self _contextMenu]]; [_outlineView setMenu:[self _contextMenu]];
[_outlineView setAllowsEmptySelection:YES]; [_outlineView setAllowsEmptySelection:YES];
[_outlineView setFloatsGroupRows:NO]; [_outlineView setFloatsGroupRows:NO];
[_outlineView registerForDraggedTypes:@[ MPGroupUTI, MPEntryUTI, MPUUIDUTI ]]; [_outlineView registerForDraggedTypes:@[ KPKGroupUTI, KPKUUIDUTI ]];
[_outlineView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:YES]; [_outlineView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:YES];
[_bottomBar setBorderType:HNHBorderTop]; [_bottomBar setBorderType:HNHBorderTop];
[_addGroupButton setAction:[MPActionHelper actionOfType:MPActionAddGroup]]; [_addGroupButton setAction:[MPActionHelper actionOfType:MPActionAddGroup]];
@@ -89,11 +90,9 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
if(!_bindingEstablished) { if(!_bindingEstablished) {
MPDocument *document = [[self windowController] document]; MPDocument *document = [[self windowController] document];
[_treeController setChildrenKeyPath:@"groups"]; [_treeController setChildrenKeyPath:@"groups"];
[_treeController bind:NSContentBinding toObject:document withKeyPath:@"rootAdapter" options:nil]; [_treeController bind:NSContentBinding toObject:document withKeyPath:@"tree" options:nil];
[_outlineView bind:NSContentBinding toObject:_treeController withKeyPath:@"arrangedObjects" options:nil]; [_outlineView bind:NSContentBinding toObject:_treeController withKeyPath:@"arrangedObjects" options:nil];
if([document.tree respondsToSelector:@selector(databaseName)]) { [self bind:@"databaseNameWrapper" toObject:document.tree.metaData withKeyPath:@"databaseName" options:nil];
[self bind:@"databaseNameWrapper" toObject:document.tree withKeyPath:@"databaseName" options:nil];
}
[_outlineView setDataSource:self.datasource]; [_outlineView setDataSource:self.datasource];
_bindingEstablished = YES; _bindingEstablished = YES;
} }
@@ -103,7 +102,7 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
- (void)_expandItems:(NSTreeNode *)node { - (void)_expandItems:(NSTreeNode *)node {
id nodeItem = [node representedObject]; id nodeItem = [node representedObject];
if([nodeItem isKindOfClass:[MPRootAdapter class]]) { if([nodeItem isKindOfClass:[KPKTree class]]) {
[self.outlineView expandItem:node expandChildren:NO]; [self.outlineView expandItem:node expandChildren:NO];
} }
else if([nodeItem respondsToSelector:@selector(isExpanded)]) { else if([nodeItem respondsToSelector:@selector(isExpanded)]) {
@@ -200,7 +199,7 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
#pragma mark Actions #pragma mark Actions
- (void)createGroup:(id)sender { - (void)createGroup:(id)sender {
KdbGroup *group = [self _clickedOrSelectedGroup]; KPKGroup *group = [self _clickedOrSelectedGroup];
MPDocument *document = [[self windowController] document]; MPDocument *document = [[self windowController] document];
if(!group) { if(!group) {
group = document.root; group = document.root;
@@ -220,17 +219,17 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
#pragma mark NSOutlineViewDelegate #pragma mark NSOutlineViewDelegate
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { - (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
NSTableCellView *view; NSTableCellView *view;
if( [self _itemIsRootNodeAdapter:item] ) { if( [self _itemIsRootNode:item] ) {
//NSDictionary *options = @{ NSValueTransformerBindingOption : [NSValueTransformer valueTransformerForName:MPUppsercaseStringValueTransformerName] }; //NSDictionary *options = @{ NSValueTransformerBindingOption : [NSValueTransformer valueTransformerForName:MPUppsercaseStringValueTransformerName] };
view = [outlineView makeViewWithIdentifier:_MPOutlinveViewHeaderViewIdentifier owner:self]; view = [outlineView makeViewWithIdentifier:_MPOutlinveViewHeaderViewIdentifier owner:self];
[view.textField bind:NSValueBinding toObject:self withKeyPath:@"databaseNameWrapper" options:nil]; [view.textField bind:NSValueBinding toObject:self withKeyPath:@"databaseNameWrapper" options:nil];
} }
else { else {
KdbGroup *group = [item representedObject]; KPKGroup *group = [item representedObject];
view = [outlineView makeViewWithIdentifier:_MPOutlineViewDataViewIdentifier owner:self]; view = [outlineView makeViewWithIdentifier:_MPOutlineViewDataViewIdentifier owner:self];
NSImage *icon = [MPIconHelper icon:(MPIconType)[group image]];
[view.imageView setImage:icon]; [view.imageView setImage:group.iconImage];
[view.textField bind:NSValueBinding toObject:group withKeyPath:MPGroupNameUndoableKey options:nil]; [view.textField bind:NSValueBinding toObject:group withKeyPath:@"name" options:nil];
[view.textField bind:@"count" toObject:group withKeyPath:@"entries.@count" options:nil]; [view.textField bind:@"count" toObject:group withKeyPath:@"entries.@count" options:nil];
} }
@@ -238,31 +237,31 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
} }
- (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item { - (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item {
return [self _itemIsRootNodeAdapter:item]; return [self _itemIsRootNode:item];
} }
- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item { - (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item {
return ![self _itemIsRootNodeAdapter:item]; return ![self _itemIsRootNode:item];
} }
- (void)outlineViewSelectionDidChange:(NSNotification *)notification { - (void)outlineViewSelectionDidChange:(NSNotification *)notification {
NSTreeNode *treeNode = [_outlineView itemAtRow:[_outlineView selectedRow]]; NSTreeNode *treeNode = [_outlineView itemAtRow:[_outlineView selectedRow]];
KdbGroup *selectedGroup = [treeNode representedObject]; KPKGroup *selectedGroup = [treeNode representedObject];
MPDocument *document = [[self windowController] document]; MPDocument *document = [[self windowController] document];
document.selectedGroup = selectedGroup; document.selectedGroup = selectedGroup;
} }
- (BOOL)outlineView:(NSOutlineView *)outlineView shouldShowOutlineCellForItem:(id)item { - (BOOL)outlineView:(NSOutlineView *)outlineView shouldShowOutlineCellForItem:(id)item {
return ![self _itemIsRootNodeAdapter:item]; return ![self _itemIsRootNode:item];
} }
- (void)outlineViewItemDidExpand:(NSNotification *)notification { - (void)outlineViewItemDidExpand:(NSNotification *)notification {
NSDictionary *userInfo = [notification userInfo]; NSDictionary *userInfo = [notification userInfo];
id item = userInfo[@"NSObject"]; id item = userInfo[@"NSObject"];
id representedObject = [item representedObject]; id representedObject = [item representedObject];
if([representedObject isKindOfClass:[KPKGroup class]]) {
NSLog(@"expanded:%@",representedObject); NSLog(@"expanded:%@",representedObject);
if([representedObject isKindOfClass:[Kdb4Group class]]) { KPKGroup *group = (KPKGroup *)representedObject;
Kdb4Group *group = (Kdb4Group *)representedObject;
group.isExpanded = YES; group.isExpanded = YES;
} }
} }
@@ -270,9 +269,9 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
NSDictionary *userInfo = [notification userInfo]; NSDictionary *userInfo = [notification userInfo];
id item = userInfo[@"NSObject"]; id item = userInfo[@"NSObject"];
id representedObject = [item representedObject]; id representedObject = [item representedObject];
if([representedObject isKindOfClass:[KPKGroup class]]) {
NSLog(@"collapsed:%@",representedObject); NSLog(@"collapsed:%@",representedObject);
if([representedObject isKindOfClass:[Kdb4Group class]]) { KPKGroup *group = (KPKGroup *)representedObject;
Kdb4Group *group = (Kdb4Group *)representedObject;
group.isExpanded = NO; group.isExpanded = NO;
} }
} }
@@ -280,7 +279,7 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
#pragma mark - #pragma mark -
#pragma mark Private #pragma mark Private
- (KdbGroup *)_clickedOrSelectedGroup { - (KPKGroup *)_clickedOrSelectedGroup {
NSInteger row = [self.outlineView clickedRow]; NSInteger row = [self.outlineView clickedRow];
if( row < 0 ) { if( row < 0 ) {
row = [self.outlineView selectedRow]; row = [self.outlineView selectedRow];
@@ -294,9 +293,9 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
return menu; return menu;
} }
- (BOOL)_itemIsRootNodeAdapter:(id)item { - (BOOL)_itemIsRootNode:(id)item {
id node = [item representedObject]; id node = [item representedObject];
return [node isKindOfClass:[MPRootAdapter class]]; return [node isKindOfClass:[KPKTree class]];
} }
@end @end

View File

@@ -13,6 +13,8 @@
#import "NSString+Empty.h" #import "NSString+Empty.h"
#import "NSData+Keyfile.h" #import "NSData+Keyfile.h"
#import "KPKTree.h"
@interface MPPasswordEditWindowController () { @interface MPPasswordEditWindowController () {
MPDocument * __unsafe_unretained _document; MPDocument * __unsafe_unretained _document;
} }
@@ -93,7 +95,7 @@
} }
- (IBAction)generateKey:(id)sender { - (IBAction)generateKey:(id)sender {
NSData *data = [NSData generateKeyfiledataForVersion:(KPKVersion)(_document.version + 1)]; NSData *data = [NSData generateKeyfiledataForVersion:_document.tree.minimumVersion];
if(data) { if(data) {
NSSavePanel *savePanel = [NSSavePanel savePanel]; NSSavePanel *savePanel = [NSSavePanel savePanel];
[savePanel setAllowedFileTypes:@[@"key", @"xml"]]; [savePanel setAllowedFileTypes:@[@"key", @"xml"]];

View File

@@ -1,20 +0,0 @@
//
// MPRootAdapter.h
// MacPass
//
// Created by Michael Starke on 26.06.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import <Foundation/Foundation.h>
@class KdbTree;
@interface MPRootAdapter : NSObject
@property (readonly, strong) NSArray *groups;
@property (nonatomic, strong) KdbTree *tree;
/* Subs to support interface */
@property (weak, readonly, nonatomic) NSArray *entries;
@end

View File

@@ -1,36 +0,0 @@
//
// MPRootAdapter.m
// MacPass
//
// Created by Michael Starke on 26.06.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "MPRootAdapter.h"
#import "Kdb.h"
@interface MPRootAdapter ()
@property (strong) NSArray *groups;
@end
@implementation MPRootAdapter
- (void)setTree:(KdbTree *)tree {
if(_tree != tree) {
_tree = tree;
if(_tree) {
self.groups = @[_tree.root];
}
else {
self.groups = nil;
}
}
}
- (NSArray *)entries {
return nil;
}
@end

View File

@@ -9,6 +9,9 @@
#import "MPSavePanelAccessoryViewController.h" #import "MPSavePanelAccessoryViewController.h"
#import "MPDocument.h" #import "MPDocument.h"
#import "KPKUTIs.h"
#import "KPKTree.h"
@interface MPSavePanelAccessoryViewController () @interface MPSavePanelAccessoryViewController ()
@end @end
@@ -42,7 +45,7 @@
- (IBAction)setFileType:(id)sender { - (IBAction)setFileType:(id)sender {
NSString *uti = [[self.fileTypePopupButton selectedItem] representedObject]; NSString *uti = [[self.fileTypePopupButton selectedItem] representedObject];
BOOL showInfoText = (self.document.version == MPDatabaseVersion4) && [uti isEqualToString:@"com.hicknhack.macpass.kdb"]; BOOL showInfoText = (self.document.tree.minimumVersion == KPKLegacyVersion && [uti isEqualToString:@"com.hicknhack.macpass.kdb"]);
[self.infoTextField setHidden:!showInfoText]; [self.infoTextField setHidden:!showInfoText];
[self.savePanel setAllowedFileTypes:@[uti]]; [self.savePanel setAllowedFileTypes:@[uti]];
} }
@@ -55,13 +58,16 @@
} }
- (void)_updateView { - (void)_updateView {
switch(self.document.version) { switch(self.document.tree.minimumVersion) {
case MPDatabaseVersion3: case KPKLegacyVersion:
[self.fileTypePopupButton selectItemAtIndex:1]; [self.fileTypePopupButton selectItemAtIndex:1];
break; break;
case MPDatabaseVersion4: case KPKXmlVersion:
[self.fileTypePopupButton selectItemAtIndex:0]; [self.fileTypePopupButton selectItemAtIndex:0];
break; break;
case KPKUnknownVersion:
NSAssert(NO, @"Minimum Version should always be valid");
break;
} }
} }

View File

@@ -1,23 +0,0 @@
//
// StringField+Undo.h
// MacPass
//
// Created by Michael Starke on 28.06.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "Kdb4Node.h"
APPKIT_EXTERN NSString *const MPStringFieldKeyUndoableKey;
APPKIT_EXTERN NSString *const MPStringFieldValueUndoableKey;
@interface StringField (Undo)
- (NSString *)keyUndoable;
- (NSString *)valueUndoable;
- (void)setKeyUndoable:(NSString *)key;
- (void)setValueUndoable:(NSString *)value;
@end

View File

@@ -1,44 +0,0 @@
//
// StringField+Undo.m
// MacPass
//
// Created by Michael Starke on 28.06.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "StringField+Undo.h"
NSString *const MPStringFieldKeyUndoableKey = @"keyUndoable";
NSString *const MPStringFieldValueUndoableKey = @"valueUndoable";
@implementation StringField (Undo)
- (NSUndoManager *)undoManager {
return [[[NSDocumentController sharedDocumentController] currentDocument] undoManager];
}
- (NSString *)keyUndoable {
return self.key;
}
- (NSString *)valueUndoable {
return self.value;
}
- (void)setKeyUndoable:(NSString *)key {
if(![self.key isEqualToString:key]) {
[[self undoManager] registerUndoWithTarget:self selector:@selector(setKeyUndoable:) object:self.key];
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_SET_STRINGFILED_KEY", @"Set StringField key")];
self.key = key;
}
}
- (void)setValueUndoable:(NSString *)value {
if(![self.value isEqualToString:value]) {
[[self undoManager] registerUndoWithTarget:self selector:@selector(setValueUndoable:) object:self.value];
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_SET_STRINGFIELD_VALUE", @"Set StringField value")];
self.value = value;
}
}
@end

View File

@@ -1,13 +0,0 @@
//
// 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

@@ -1,19 +0,0 @@
//
// 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,13 +0,0 @@
//
// UUID+Pasterboard.h
// MacPass
//
// Created by Michael Starke on 04.08.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "UUID.h"
@interface UUID (Pasterboard) <NSPasteboardReading, NSPasteboardWriting, NSCoding>
@end

View File

@@ -1,49 +0,0 @@
//
// UUID+Pasterboard.m
// MacPass
//
// Created by Michael Starke on 04.08.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "UUID+Pasterboard.h"
#import "MPConstants.h"
@implementation UUID (Pasterboard)
#pragma mark NSCoding
- (id)initWithCoder:(NSCoder *)aDecoder {
NSData *data = [aDecoder decodeObjectForKey:@"data"];
self = [self initWithData:data];
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:[self getData] forKey:@"data"];
}
#pragma mark -
#pragma mark NSPasteboardReading
+ (NSArray *)readableTypesForPasteboard:(NSPasteboard *)pasteboard {
return @[ MPUUIDUTI ];
}
+ (NSPasteboardReadingOptions)readingOptionsForType:(NSString *)type pasteboard:(NSPasteboard *)pasteboard {
NSAssert([type isEqualToString:MPUUIDUTI], @"Only MPUUID type is supported");
return NSPasteboardReadingAsKeyedArchive;
}
#pragma mark -
#pragma mark NSPasteboardWriting
- (id)pasteboardPropertyListForType:(NSString *)type {
NSAssert([type isEqualToString:MPUUIDUTI], @"Only MPUUID type is supported");
return [NSKeyedArchiver archivedDataWithRootObject:self];
}
- (NSArray *)writableTypesForPasteboard:(NSPasteboard *)pasteboard {
return @[ MPUUIDUTI ];
}
@end