KeePassKit API changes. Fixed binding leak issue preventing the document from being deallocated

This commit is contained in:
michael starke
2015-06-08 17:11:00 +02:00
parent 9a99261edd
commit cbeb16c70d
5 changed files with 58 additions and 35 deletions

View File

@@ -66,10 +66,10 @@ NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDi
self = [super init]; self = [super init];
if(self) { if(self) {
/* We know that we do not use the varibale after instancation */ /* We know that we do not use the varibale after instancation */
#pragma clang diagnostic push #pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable" #pragma clang diagnostic ignored "-Wunused-variable"
MPDocumentController *documentController = [[MPDocumentController alloc] init]; MPDocumentController *documentController = [[MPDocumentController alloc] init];
#pragma clang diagnostic pop #pragma clang diagnostic pop
} }
return self; return self;
} }
@@ -212,10 +212,11 @@ NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDi
} }
- (void)lockAllDocuments { - (void)lockAllDocuments {
for(NSDocument *document in [[NSDocumentController sharedDocumentController] documents]) { for(NSDocument *document in ((NSDocumentController *)[NSDocumentController sharedDocumentController]).documents) {
NSArray *windowControllers = [document windowControllers]; for(id windowController in document.windowControllers) {
if([windowControllers count] > 0) { if([windowController respondsToSelector:@selector(lock)]) {
[windowControllers[0] lock:nil]; [windowController lock];
}
} }
} }
} }
@@ -235,6 +236,12 @@ NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDi
NSArray *documents = [documentController documents]; NSArray *documents = [documentController documents];
BOOL restoredWindows = [documents count] > 0; BOOL restoredWindows = [documents count] > 0;
for(NSDocument *document in documents) {
for(NSWindowController *windowController in [document windowControllers]) {
[windowController.window.contentView layout];
}
}
BOOL reopen = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyReopenLastDatabaseOnLaunch]; BOOL reopen = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyReopenLastDatabaseOnLaunch];
BOOL showWelcomeScreen = !restoredWindows && !_shouldOpenFile; BOOL showWelcomeScreen = !restoredWindows && !_shouldOpenFile;
if(reopen && !restoredWindows && !_shouldOpenFile) { if(reopen && !restoredWindows && !_shouldOpenFile) {

View File

@@ -126,8 +126,6 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey
if(self) { if(self) {
_didLockFile = NO; _didLockFile = NO;
_readOnly = NO; _readOnly = NO;
self.tree = [KPKTree allocTemplateTree];
self.tree.metaData.rounds = [[NSUserDefaults standardUserDefaults] integerForKey:kMPSettingsKeyDefaultPasswordRounds];
} }
return self; return self;
} }
@@ -136,6 +134,15 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey
[self _cleanupLock]; [self _cleanupLock];
} }
- (instancetype)initWithType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
self = [self init];
if(self) {
self.tree = [[KPKTree alloc] initWithTemplateContents];
self.tree.metaData.rounds = [[NSUserDefaults standardUserDefaults] integerForKey:kMPSettingsKeyDefaultPasswordRounds];
}
return self;
}
- (void)makeWindowControllers { - (void)makeWindowControllers {
MPDocumentWindowController *windowController = [[MPDocumentWindowController alloc] init]; MPDocumentWindowController *windowController = [[MPDocumentWindowController alloc] init];
[self addWindowController:windowController]; [self addWindowController:windowController];
@@ -234,6 +241,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey
if([[self fileURL] isFileURL]) { if([[self fileURL] isFileURL]) {
[[NSUserDefaults standardUserDefaults] setObject:[self.fileURL absoluteString] forKey:kMPSettingsKeyLastDatabasePath]; [[NSUserDefaults standardUserDefaults] setObject:[self.fileURL absoluteString] forKey:kMPSettingsKeyLastDatabasePath];
} }
self.tree = nil;
[super close]; [super close];
} }
@@ -410,16 +418,16 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey
[[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentCurrentItemChangedNotification object:self]; [[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentCurrentItemChangedNotification object:self];
} }
} }
- (void)setTree:(KPKTree *)tree { //- (void)setTree:(KPKTree *)tree {
if(_tree != tree) { // if(_tree != tree) {
_tree = tree; // _tree = tree;
_tree.undoManager = [self undoManager]; // _tree.undoManager = [self undoManager];
if(nil == _treeDelgate) { // if(nil == _treeDelgate) {
_treeDelgate = [[MPTreeDelegate alloc] initWithDocument:self]; // _treeDelgate = [[MPTreeDelegate alloc] initWithDocument:self];
} // }
_tree.delegate = _treeDelgate; // _tree.delegate = _treeDelgate;
} // }
} //}
#pragma mark Data Accesors #pragma mark Data Accesors
@@ -682,26 +690,26 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey
id<MPTargetNodeResolving> nodeResolver = [NSApp targetForAction:@selector(currentTargetNode)]; id<MPTargetNodeResolving> nodeResolver = [NSApp targetForAction:@selector(currentTargetNode)];
/* /*
NSLog(@"entryResolver:%@", [entryResolver class]); NSLog(@"entryResolver:%@", [entryResolver class]);
NSLog(@"groupResolver:%@", [groupResolver class]); NSLog(@"groupResolver:%@", [groupResolver class]);
NSLog(@"nodeResolver:%@", [nodeResolver class]); NSLog(@"nodeResolver:%@", [nodeResolver class]);
*/ */
KPKNode *targetNode = [nodeResolver currentTargetNode]; KPKNode *targetNode = [nodeResolver currentTargetNode];
KPKEntry *targetEntry = [entryResolver currentTargetEntry]; KPKEntry *targetEntry = [entryResolver currentTargetEntry];
KPKGroup *targetGroup = [groupResolver currentTargetGroup]; KPKGroup *targetGroup = [groupResolver currentTargetGroup];
/* /*
if([targetNode asGroup]) { if([targetNode asGroup]) {
NSLog(@"targetNode:%@", ((KPKGroup *)targetNode).name); NSLog(@"targetNode:%@", ((KPKGroup *)targetNode).name);
} }
else if([targetNode asEntry]) { else if([targetNode asEntry]) {
NSLog(@"targetNode:%@", ((KPKEntry *)targetNode).title); NSLog(@"targetNode:%@", ((KPKEntry *)targetNode).title);
} }
NSLog(@"targetGroup:%@", targetGroup.name); NSLog(@"targetGroup:%@", targetGroup.name);
NSLog(@"tagetEntry:%@", targetEntry.title ); NSLog(@"tagetEntry:%@", targetEntry.title );
*/ */
if(self.encrypted || self.isReadOnly) { return NO; } if(self.encrypted || self.isReadOnly) { return NO; }

View File

@@ -124,6 +124,8 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
} }
- (void)dealloc { - (void)dealloc {
[self.entryTable unbind:NSContentArrayBinding];
[self.entryArrayController unbind:NSContentArrayBinding];
[[NSNotificationCenter defaultCenter] removeObserver:self]; [[NSNotificationCenter defaultCenter] removeObserver:self];
} }
@@ -387,6 +389,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
return; // we are showing the correct object right now. return; // we are showing the correct object right now.
} }
} }
[self.entryArrayController unbind:NSContentArrayBinding];
[self.entryArrayController bind:NSContentArrayBinding toObject:document.selectedGroup withKeyPath:NSStringFromSelector(@selector(entries)) options:nil]; [self.entryArrayController bind:NSContentArrayBinding toObject:document.selectedGroup withKeyPath:NSStringFromSelector(@selector(entries)) options:nil];
} }
[self _updateContextBar]; [self _updateContextBar];
@@ -423,7 +426,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
NSAssert(result != nil, @"Resutls should never be nil"); NSAssert(result != nil, @"Resutls should never be nil");
self.filteredEntries = result; self.filteredEntries = result;
[self.entryArrayController unbind:NSContentArrayBinding]; [self.entryArrayController unbind:NSContentArrayBinding];
[self.entryArrayController setContent:self.filteredEntries]; [self.entryArrayController bind:NSContentArrayBinding toObject:self withKeyPath:NSStringFromSelector(@selector(filteredEntries)) options:nil];
[[self.entryTable tableColumnWithIdentifier:MPEntryTableParentColumnIdentifier] setHidden:NO]; [[self.entryTable tableColumnWithIdentifier:MPEntryTableParentColumnIdentifier] setHidden:NO];
} }
@@ -432,6 +435,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
[[self.entryTable tableColumnWithIdentifier:MPEntryTableParentColumnIdentifier] setHidden:YES]; [[self.entryTable tableColumnWithIdentifier:MPEntryTableParentColumnIdentifier] setHidden:YES];
MPDocument *document = [[self windowController] document]; MPDocument *document = [[self windowController] document];
document.selectedItem = document.selectedGroup; document.selectedItem = document.selectedGroup;
// TODO: really necessary?
if( nil == document.selectedItem && nil == document.selectedGroup ) { if( nil == document.selectedItem && nil == document.selectedGroup ) {
[self.entryArrayController unbind:NSContentArrayBinding]; [self.entryArrayController unbind:NSContentArrayBinding];
[self.entryArrayController setContent:nil]; [self.entryArrayController setContent:nil];
@@ -737,6 +741,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
#pragma mark periodic UI Update #pragma mark periodic UI Update
- (void)_updateExpirationDisplay { - (void)_updateExpirationDisplay {
return;
/* items are all entries */ /* items are all entries */
[[self.entryArrayController arrangedObjects] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { [[self.entryArrayController arrangedObjects] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[[obj timeInfo] isExpired]; [[obj timeInfo] isExpired];

View File

@@ -72,6 +72,8 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
} }
- (void)dealloc { - (void)dealloc {
[self.outlineView unbind:NSContentBinding];
[self.treeController unbind:NSContentBinding];
[[NSNotificationCenter defaultCenter] removeObserver:self]; [[NSNotificationCenter defaultCenter] removeObserver:self];
[self.outlineView setDelegate:nil]; [self.outlineView setDelegate:nil];
} }
@@ -299,6 +301,7 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
} }
- (void)_updateExpirationDisplay { - (void)_updateExpirationDisplay {
return;
MPDocument *document = [[self windowController] document]; MPDocument *document = [[self windowController] document];
[document.root.timeInfo isExpired]; [document.root.timeInfo isExpired];
[[document.tree allGroups] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { [[document.tree allGroups] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {