From 1c91b1a9a1902d589f5b806930a1b880f873933f Mon Sep 17 00:00:00 2001 From: michael starke Date: Fri, 21 Jun 2013 18:29:24 +0200 Subject: [PATCH] Newly created groups should now be selected Added lock on sleep Lock on idle still missing Fixed some issues with clipboard clearing Fixed preferences bindings errors --- MacPass.xcodeproj/project.pbxproj | 18 +++++++-- MacPass/Base.lproj/GeneralSettings.xib | 55 +++++++++++++++++++------- MacPass/MPAppDelegate.h | 1 + MacPass/MPAppDelegate.m | 11 +++++- MacPass/MPDocumentWindowController.m | 2 + MacPass/MPGeneralSettingsController.h | 7 +++- MacPass/MPGeneralSettingsController.m | 5 ++- MacPass/MPLockDaemon.m | 9 +++-- MacPass/MPOutlineViewController.h | 2 + MacPass/MPOutlineViewController.m | 24 ++++++++++- MacPass/MPOutlineViewDelegate.m | 3 +- MacPass/MPPasteBoardController.m | 3 ++ MacPass/MPSettingsHelper.h | 2 +- MacPass/MPSettingsHelper.m | 4 +- MacPass/MPSettingsWindowController.m | 17 +++++--- MacPass/MacPass-Info.plist | 2 +- 16 files changed, 126 insertions(+), 39 deletions(-) diff --git a/MacPass.xcodeproj/project.pbxproj b/MacPass.xcodeproj/project.pbxproj index f289c1ed..6d908b3b 100644 --- a/MacPass.xcodeproj/project.pbxproj +++ b/MacPass.xcodeproj/project.pbxproj @@ -125,6 +125,8 @@ 4C80BB6F176DE06F00E5E248 /* HNHScrollDocumentViewAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C80BB6E176DE06F00E5E248 /* HNHScrollDocumentViewAdapter.m */; }; 4C811C8316ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C811C8216ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m */; }; 4C83814215BF4677001AE468 /* MPDocumentWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C83814115BF4677001AE468 /* MPDocumentWindowController.m */; }; + 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 */; }; 4C888C9316EB6F5E003D34A1 /* MPToolbarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C888C9216EB6F5E003D34A1 /* MPToolbarItem.m */; }; 4C888C9716EB754B003D34A1 /* MPActionHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C888C9616EB754B003D34A1 /* MPActionHelper.m */; }; @@ -413,6 +415,10 @@ 4C811C8216ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPKeyfilePathControlDelegate.m; sourceTree = ""; }; 4C83814015BF4677001AE468 /* MPDocumentWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDocumentWindowController.h; sourceTree = ""; }; 4C83814115BF4677001AE468 /* MPDocumentWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDocumentWindowController.m; sourceTree = ""; }; + 4C83F4A81774B155006C5FC0 /* Kdb3Tree+NewTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Kdb3Tree+NewTree.h"; sourceTree = ""; }; + 4C83F4A91774B155006C5FC0 /* Kdb3Tree+NewTree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Kdb3Tree+NewTree.m"; sourceTree = ""; }; + 4C83F4AB1774B25F006C5FC0 /* Kdb4Tree+NewTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Kdb4Tree+NewTree.h"; sourceTree = ""; }; + 4C83F4AC1774B25F006C5FC0 /* Kdb4Tree+NewTree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Kdb4Tree+NewTree.m"; sourceTree = ""; }; 4C888C8F16EB6C91003D34A1 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 4C888C9116EB6F5E003D34A1 /* MPToolbarItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPToolbarItem.h; sourceTree = ""; }; 4C888C9216EB6F5E003D34A1 /* MPToolbarItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPToolbarItem.m; sourceTree = ""; }; @@ -682,7 +688,7 @@ name = KeepassHttp; sourceTree = ""; }; - 4C2C4C2516D3BCEA00D49295 /* KeePassLibAdditions */ = { + 4C2C4C2516D3BCEA00D49295 /* KeePassLib Categories */ = { isa = PBXGroup; children = ( 4C569DA217653F3500595B62 /* KdbEntry+MPTreeTools.h */, @@ -697,8 +703,12 @@ 4C22040C1746ED160054C916 /* KdbGroup+Undo.m */, 4C4A101017629DA900BBF2CA /* KdbGroup+KVOAdditions.h */, 4C4A101117629DA900BBF2CA /* KdbGroup+KVOAdditions.m */, + 4C83F4A81774B155006C5FC0 /* Kdb3Tree+NewTree.h */, + 4C83F4A91774B155006C5FC0 /* Kdb3Tree+NewTree.m */, + 4C83F4AB1774B25F006C5FC0 /* Kdb4Tree+NewTree.h */, + 4C83F4AC1774B25F006C5FC0 /* Kdb4Tree+NewTree.m */, ); - name = KeePassLibAdditions; + name = "KeePassLib Categories"; sourceTree = ""; }; 4C2E382016D141F700037A9D /* Helper */ = { @@ -930,7 +940,7 @@ children = ( 4C245C11176E22150086100E /* KeepassHttp */, 4C46B8821706397A0046109A /* Security Additions */, - 4C2C4C2516D3BCEA00D49295 /* KeePassLibAdditions */, + 4C2C4C2516D3BCEA00D49295 /* KeePassLib Categories */, 4C2E382016D141F700037A9D /* Helper */, 4C586F9C16D07ABD00E7DB57 /* Icons */, 4CA0B30F15BCB85D00654E32 /* General */, @@ -1391,6 +1401,8 @@ 4CC299FF176F99E50050C939 /* MPRequestHandlerService.m in Sources */, 4CC29A02176F9D140050C939 /* MPTestAssociateRequestHandler.m in Sources */, 4CA0E3A7176FAF99004D18CB /* MPDocumentQueryService.m in Sources */, + 4C83F4AA1774B155006C5FC0 /* Kdb3Tree+NewTree.m in Sources */, + 4C83F4AD1774B25F006C5FC0 /* Kdb4Tree+NewTree.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MacPass/Base.lproj/GeneralSettings.xib b/MacPass/Base.lproj/GeneralSettings.xib index 41b0b479..cbcca2ea 100644 --- a/MacPass/Base.lproj/GeneralSettings.xib +++ b/MacPass/Base.lproj/GeneralSettings.xib @@ -294,23 +294,23 @@ 400 75 - + + + Never + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + YES LockTimes - - - Never - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - + for 1 Minute @@ -363,7 +363,6 @@ {{16, 12}, {122, 18}} - _NS:9 YES @@ -484,6 +483,22 @@ 521 + + + idleTimeOutPopup + + + + 809 + + + + lockOnSleepCheckButton + + + + 810 + @@ -1456,7 +1471,7 @@ - 808 + 810 @@ -1466,7 +1481,9 @@ NSButton NSPopUpButton + NSPopUpButton NSImageView + NSButton @@ -1477,10 +1494,18 @@ clearPasteboardTimeoutPopup NSPopUpButton + + idleTimeOutPopup + NSPopUpButton + imageView NSImageView + + lockOnSleepCheckButton + NSButton + IBProjectSource diff --git a/MacPass/MPAppDelegate.h b/MacPass/MPAppDelegate.h index 12534d39..751c6fec 100644 --- a/MacPass/MPAppDelegate.h +++ b/MacPass/MPAppDelegate.h @@ -15,5 +15,6 @@ - (IBAction)showPasswordCreator:(id)sender; - (NSString *)applicationName; +- (void)lockAllDocuments; @end \ No newline at end of file diff --git a/MacPass/MPAppDelegate.m b/MacPass/MPAppDelegate.m index 4ae84be2..440daad0 100644 --- a/MacPass/MPAppDelegate.m +++ b/MacPass/MPAppDelegate.m @@ -15,6 +15,7 @@ #import "MPStringLengthValueTransformer.h" #import "MPServerDaemon.h" #import "MPLockDaemon.h" +#import "MPDocumentWindowController.h" @interface MPAppDelegate () { @private @@ -46,7 +47,6 @@ lockDaemon = [[MPLockDaemon alloc] init]; } - - (void)dealloc { [_settingsController release]; [_passwordCreatorController release]; @@ -91,4 +91,13 @@ [self.passwordCreatorWindow makeKeyAndOrderFront:self.passwordCreatorWindow]; } +- (void)lockAllDocuments { + for(NSDocument *document in [[NSDocumentController sharedDocumentController] documents]) { + NSArray *windowControllers = [document windowControllers]; + if([windowControllers count] > 0) { + [windowControllers[0] lock:nil]; + } + } +} + @end diff --git a/MacPass/MPDocumentWindowController.m b/MacPass/MPDocumentWindowController.m index 05c6f445..41ece9c3 100644 --- a/MacPass/MPDocumentWindowController.m +++ b/MacPass/MPDocumentWindowController.m @@ -80,6 +80,7 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur { [_entryViewController setupNotifications:self]; [_inspectorViewController setupNotifications:self]; + [_outlineViewController setupNotifications:self]; [super windowDidLoad]; _toolbar = [[NSToolbar alloc] initWithIdentifier:@"MainWindowToolbar"]; @@ -202,6 +203,7 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur } - (void)lock:(id)sender { + // Test if document is lockable [self showPasswordInput]; } diff --git a/MacPass/MPGeneralSettingsController.h b/MacPass/MPGeneralSettingsController.h index cced9c1e..137477c5 100644 --- a/MacPass/MPGeneralSettingsController.h +++ b/MacPass/MPGeneralSettingsController.h @@ -7,11 +7,14 @@ // #import +#import "MPViewController.h" #import "MPSettingsTab.h" -@interface MPGeneralSettingsController : NSViewController -@property (assign) IBOutlet NSImageView *imageView; +@interface MPGeneralSettingsController : MPViewController + @property (assign) IBOutlet NSButton *clearPasteboardOnQuitCheckButton; @property (assign) IBOutlet NSPopUpButton *clearPasteboardTimeoutPopup; +@property (assign) IBOutlet NSPopUpButton *idleTimeOutPopup; +@property (assign) IBOutlet NSButton *lockOnSleepCheckButton; @end diff --git a/MacPass/MPGeneralSettingsController.m b/MacPass/MPGeneralSettingsController.m index 3cfe075d..299d574f 100644 --- a/MacPass/MPGeneralSettingsController.m +++ b/MacPass/MPGeneralSettingsController.m @@ -34,8 +34,11 @@ NSString *const MPGeneralSetingsIdentifier = @"GeneralSettingsTab"; NSUserDefaultsController *defaultsController = [NSUserDefaultsController sharedUserDefaultsController]; NSString *clearPasteboardKeyPath = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyClearPasteboardOnQuit]; NSString *clearPasteboardTimeOutKeyPath = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyPasteboardClearTimeout]; + NSString *idleTimeOutKeyPath = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyIdleLockTimeOut]; + NSString *lockOnSleepKeyPath = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyLockOnSleep]; [self.clearPasteboardOnQuitCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:clearPasteboardKeyPath options:nil]; [self.clearPasteboardTimeoutPopup bind:NSSelectedTagBinding toObject:defaultsController withKeyPath:clearPasteboardTimeOutKeyPath options:nil]; - + [self.lockOnSleepCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:lockOnSleepKeyPath options:nil]; + [self.idleTimeOutPopup bind:NSSelectedTagBinding toObject:defaultsController withKeyPath:idleTimeOutKeyPath options:nil]; } @end diff --git a/MacPass/MPLockDaemon.m b/MacPass/MPLockDaemon.m index a639bb44..fe4d9029 100644 --- a/MacPass/MPLockDaemon.m +++ b/MacPass/MPLockDaemon.m @@ -8,10 +8,13 @@ #import "MPLockDaemon.h" #import "MPSettingsHelper.h" +#import "MPAppDelegate.h" NSString *const MPShouldLockDatabaseNotification = @"com.hicknhack.macpass.MPShouldLockDatabaseNotification"; -@interface MPLockDaemon () +@interface MPLockDaemon () { + NSTimer *idleTimer; +} @property (nonatomic,assign) BOOL lockOnSleep; @property (nonatomic,assign) NSUInteger idleLockTime; @@ -33,7 +36,7 @@ NSString *const MPShouldLockDatabaseNotification = @"com.hicknhack.macpass.MPSho self = [super init]; if (self) { NSString *lockOnSleepKey = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyLockOnSleep]; - NSString *idleTimeOutKey = [NSString stringWithFormat:@"values.%@", kMPSEttingsKeyIdleLockTimeOut]; + NSString *idleTimeOutKey = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyIdleLockTimeOut]; NSUserDefaultsController *defaultsController = [NSUserDefaultsController sharedUserDefaultsController]; [self bind:@"lockOnSleep" toObject:defaultsController withKeyPath:lockOnSleepKey options:nil]; [self bind:@"idleLockTime" toObject:defaultsController withKeyPath:idleTimeOutKey options:nil]; @@ -73,7 +76,7 @@ NSString *const MPShouldLockDatabaseNotification = @"com.hicknhack.macpass.MPSho } - (void)_willSleepNotification:(NSNotification *)notification { - [[NSNotificationCenter defaultCenter] postNotificationName:MPShouldLockDatabaseNotification object:self]; + [[NSApp delegate] lockAllDocuments]; } @end diff --git a/MacPass/MPOutlineViewController.h b/MacPass/MPOutlineViewController.h index f6a210e8..86384674 100644 --- a/MacPass/MPOutlineViewController.h +++ b/MacPass/MPOutlineViewController.h @@ -11,6 +11,7 @@ @class MPOutlineViewDelegate; @class KdbGroup; @class HNHGradientView; +@class MPDocumentWindowController; @interface MPOutlineViewController : MPViewController @@ -19,6 +20,7 @@ @property (assign) IBOutlet HNHGradientView *bottomBar; - (void)showOutline; +- (void)setupNotifications:(MPDocumentWindowController *)windowController; - (void)createGroup:(id)sender; - (void)createEntry:(id)sender; diff --git a/MacPass/MPOutlineViewController.m b/MacPass/MPOutlineViewController.m index a3ae43fa..a53cbd08 100644 --- a/MacPass/MPOutlineViewController.m +++ b/MacPass/MPOutlineViewController.m @@ -58,7 +58,7 @@ [_datasource release]; [_outlineDelegate release]; [_menu release]; - + [super dealloc]; } @@ -86,6 +86,26 @@ [_outlineView expandItem:node expandChildren:NO]; } +- (void)setupNotifications:(MPDocumentWindowController *)windowController { + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_didCreateGroup:) name:MPDocumentDidAddGroupNotification object:[windowController document]]; +} + +- (void)_didCreateGroup:(NSNotification *)notification { + NSInteger selectedRow = [_outlineView selectedRow]; + NSIndexSet *indexSet; + if( selectedRow == -1) { + MPDocument *document = [[self windowController] document]; + indexSet = [NSIndexSet indexSetWithIndex:[document.root.groups count]]; + //TODO: Find out why selection is not set (treeUpdate?) + } + else { + id item = [_outlineView itemAtRow:selectedRow]; + [_outlineView expandItem:item]; + indexSet = [NSIndexSet indexSetWithIndex:selectedRow + 1]; + } + [_outlineView selectRowIndexes:indexSet byExtendingSelection:NO]; +} + - (NSMenu *)_contextMenu { NSMenu *menu = [[NSMenu alloc] init]; NSArray *items = [MPContextMenuHelper contextMenuItemsWithItems:MPContextMenuMinimal]; @@ -127,7 +147,7 @@ - (void)deleteEntry:(id)sender { KdbGroup *group = [self _clickedOrSelectedGroup]; if(group && group.parent) { - [group.parent removeGroupUndoable:group]; + [group.parent removeGroupUndoable:group]; } } diff --git a/MacPass/MPOutlineViewDelegate.m b/MacPass/MPOutlineViewDelegate.m index ddcab11c..81362c6c 100644 --- a/MacPass/MPOutlineViewDelegate.m +++ b/MacPass/MPOutlineViewDelegate.m @@ -59,9 +59,8 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell"; - (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item { NSTreeNode *treeNode = item; KdbGroup *group = [treeNode representedObject]; - return YES; //KdbGroup *group = item; - //return (nil != [group parent]); + return (nil != [group parent]); } - (void)outlineViewSelectionDidChange:(NSNotification *)notification { diff --git a/MacPass/MPPasteBoardController.m b/MacPass/MPPasteBoardController.m index dbe8819f..0b7682c3 100644 --- a/MacPass/MPPasteBoardController.m +++ b/MacPass/MPPasteBoardController.m @@ -55,6 +55,9 @@ - (void)setClearTimeout:(NSTimeInterval)clearTimeout { if(_clearTimeout != clearTimeout) { + if(clearTimeout > 0) { + [self _clearPasteboardContents]; + } _clearTimeout = clearTimeout; } } diff --git a/MacPass/MPSettingsHelper.h b/MacPass/MPSettingsHelper.h index f346d9e1..8c89d7b7 100644 --- a/MacPass/MPSettingsHelper.h +++ b/MacPass/MPSettingsHelper.h @@ -23,7 +23,7 @@ APPKIT_EXTERN NSString *const kMPSettingsKeyShowMenuItem; /* Autolock */ APPKIT_EXTERN NSString *const kMPSettingsKeyLockOnSleep; -APPKIT_EXTERN NSString *const kMPSEttingsKeyIdleLockTimeOut; +APPKIT_EXTERN NSString *const kMPSettingsKeyIdleLockTimeOut; typedef NS_ENUM(NSUInteger, MPPasswordEncoding) { diff --git a/MacPass/MPSettingsHelper.m b/MacPass/MPSettingsHelper.m index ff4675bf..3fc06582 100644 --- a/MacPass/MPSettingsHelper.m +++ b/MacPass/MPSettingsHelper.m @@ -15,7 +15,7 @@ NSString *const kMPSettingsKeyHttpPort =@"HttpPort"; NSString *const kMPSettingsKeyEnableHttpServer = @"EnableHttpServer"; NSString *const kMPSettingsKeyShowMenuItem = @"ShowMenuItem"; NSString *const kMPSettingsKeyLockOnSleep = @"LockOnSleep"; -NSString *const kMPSEttingsKeyIdleLockTimeOut = @"IdleLockTimeOut"; +NSString *const kMPSettingsKeyIdleLockTimeOut = @"IdleLockTimeOut"; @implementation MPSettingsHelper @@ -32,7 +32,7 @@ NSString *const kMPSEttingsKeyIdleLockTimeOut = @"IdleLockTimeOut"; kMPSettingsKeyEnableHttpServer: @NO, kMPSettingsKeyShowMenuItem: @YES, kMPSettingsKeyLockOnSleep: @YES, - kMPSEttingsKeyIdleLockTimeOut: @300 // 5 minutes + kMPSettingsKeyIdleLockTimeOut: @0 // 5 minutes }; } diff --git a/MacPass/MPSettingsWindowController.m b/MacPass/MPSettingsWindowController.m index 7a53b68d..615e03d0 100644 --- a/MacPass/MPSettingsWindowController.m +++ b/MacPass/MPSettingsWindowController.m @@ -10,11 +10,14 @@ #import "MPGeneralSettingsController.h" #import "MPServerSettingsController.h" -@interface MPSettingsWindowController () +@interface MPSettingsWindowController () { + NSString *lastIdentifier; +} @property (retain, nonatomic) NSToolbar *toolbar; @property (retain, nonatomic) NSMutableDictionary *settingsController; @property (retain, nonatomic) NSMutableDictionary *toolbarItems; +@property (retain) NSArray *defaultToolbarItems; @end @@ -28,6 +31,7 @@ [self.toolbar setDisplayMode:NSToolbarDisplayModeIconAndLabel]; _settingsController = [[NSMutableDictionary alloc] initWithCapacity:5]; _toolbarItems = [[NSMutableDictionary alloc] initWithCapacity:5]; + lastIdentifier = nil; [self _setupDefaultSettingsTabs]; @@ -45,10 +49,8 @@ } - (void)showSettings { - if([self.settingsController count] > 0) { - id tab = [self.settingsController allValues][0]; - NSString *identifier = [tab identifier]; - [self showSettingsTabWithIdentifier:identifier]; + if([self.defaultToolbarItems count] > 0) { + [self showSettingsTabWithIdentifier:self.defaultToolbarItems[0]]; } } @@ -116,9 +118,12 @@ [self _addSettingsTab:generalSettingsController]; [self _addSettingsTab:serverSettingsController]; + + self.defaultToolbarItems = @[ [generalSettingsController identifier], [serverSettingsController identifier] ]; [generalSettingsController release]; [serverSettingsController release]; + } - (void)_showSettingsTab:(id)sender { @@ -135,7 +140,7 @@ } - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar { - return [self.settingsController allKeys]; + return self.defaultToolbarItems; } - (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar { diff --git a/MacPass/MacPass-Info.plist b/MacPass/MacPass-Info.plist index 24823cfa..4aaa462a 100644 --- a/MacPass/MacPass-Info.plist +++ b/MacPass/MacPass-Info.plist @@ -48,7 +48,7 @@ CFBundleSignature ???? CFBundleVersion - 747 + 823 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright