From fa0c80d6b3682cb71aa5f4aff1b3fe43c222b779 Mon Sep 17 00:00:00 2001 From: Maarten Billemont Date: Sat, 4 Apr 2020 16:30:14 -0400 Subject: [PATCH] Log out active user and key when user is changed or deleted or unset. --- platform-darwin/Source/MPAppDelegate_Key.h | 2 +- platform-darwin/Source/MPAppDelegate_Key.m | 15 ++++----------- platform-darwin/Source/MPAppDelegate_Shared.m | 18 ++++++++++++++++-- platform-darwin/Source/Mac/MPMacAppDelegate.m | 15 +++++++++------ .../Source/Mac/MPSitesWindowController.m | 9 +++++---- .../Source/iOS/MPAnswersViewController.m | 3 --- .../Source/iOS/MPCombinedViewController.m | 4 ++-- .../Source/iOS/MPMessageViewController.m | 3 --- .../Source/iOS/MPPreferencesViewController.m | 2 +- .../Source/iOS/MPSitesViewController.m | 2 +- .../Source/iOS/MPUsersViewController.m | 2 +- platform-darwin/Source/iOS/MPiOSAppDelegate.m | 19 +++++++++++-------- platform-independent/c/cli/mpw-cli-tests | 2 +- 13 files changed, 52 insertions(+), 44 deletions(-) diff --git a/platform-darwin/Source/MPAppDelegate_Key.h b/platform-darwin/Source/MPAppDelegate_Key.h index 3a79bd53..609629c9 100644 --- a/platform-darwin/Source/MPAppDelegate_Key.h +++ b/platform-darwin/Source/MPAppDelegate_Key.h @@ -21,7 +21,7 @@ @interface MPAppDelegate_Shared(Key) - (BOOL)signInAsUser:(MPUserEntity *)user saveInContext:(NSManagedObjectContext *)moc usingMasterPassword:(NSString *)password; -- (void)signOutAnimated:(BOOL)animated; +- (void)signOut; - (void)storeSavedKeyFor:(MPUserEntity *)user; - (void)forgetSavedKeyFor:(MPUserEntity *)user; diff --git a/platform-darwin/Source/MPAppDelegate_Key.m b/platform-darwin/Source/MPAppDelegate_Key.m index 401d5719..4b65fb74 100644 --- a/platform-darwin/Source/MPAppDelegate_Key.m +++ b/platform-darwin/Source/MPAppDelegate_Key.m @@ -115,17 +115,9 @@ } } -- (void)signOutAnimated:(BOOL)animated { - - if (self.key) - self.key = nil; - - if ([[MPConfig get].sendInfo boolValue]) { - [Countly.sharedInstance userLoggedOut]; - } +- (void)signOut { self.activeUser = nil; - [[NSNotificationCenter defaultCenter] postNotificationName:MPSignedOutNotification object:self userInfo:@{ @"animated": @(animated) }]; } - (BOOL)signInAsUser:(MPUserEntity *)user saveInContext:(NSManagedObjectContext *)moc usingMasterPassword:(NSString *)password { @@ -191,7 +183,10 @@ return NO; } + inf( @"Logged in user: %@", user.userID ); + user.lastUsed = [NSDate date]; + self.activeUser = user; if (![self.key isEqualToKey:tryKey]) { // Upgrade the user's keyID if not at the default version yet. @@ -222,8 +217,6 @@ err( @"While setting username: %@", exception ); } - user.lastUsed = [NSDate date]; - self.activeUser = user; [moc saveToStore]; // Perform a data sanity check now that we're logged in as the user to allow fixes that require the user's key. diff --git a/platform-darwin/Source/MPAppDelegate_Shared.m b/platform-darwin/Source/MPAppDelegate_Shared.m index 83bf4814..59ced1ff 100644 --- a/platform-darwin/Source/MPAppDelegate_Shared.m +++ b/platform-darwin/Source/MPAppDelegate_Shared.m @@ -21,6 +21,8 @@ #import "MPAppDelegate_Key.h" #import "NSManagedObjectModel+KCOrderedAccessorFix.h" +#import + @interface MPAppDelegate_Shared() @property(strong, atomic) MPKey *key; @@ -63,14 +65,26 @@ static MPAppDelegate_Shared *instance; MPUserEntity *activeUser = [MPUserEntity existingObjectWithID:activeUserOID inContext:context]; if (!activeUser) - [self signOutAnimated:YES]; + [self signOut]; return activeUser; } - (void)setActiveUser:(MPUserEntity *)activeUser { - self.activeUserOID = activeUser.permanentObjectID; + NSManagedObjectID *activeUserOID = activeUser.permanentObjectID; + if ([self.activeUserOID isEqualTo:activeUserOID]) + return; + + if (self.key) + self.key = nil; + + if ([[MPConfig get].sendInfo boolValue]) + [Countly.sharedInstance userLoggedOut]; + + [[NSNotificationCenter defaultCenter] postNotificationName:MPSignedOutNotification object:self]; + + self.activeUserOID = activeUserOID; } - (void)handleCoordinatorError:(NSError *)error { diff --git a/platform-darwin/Source/Mac/MPMacAppDelegate.m b/platform-darwin/Source/Mac/MPMacAppDelegate.m index a2f6ce41..d15c9a14 100644 --- a/platform-darwin/Source/Mac/MPMacAppDelegate.m +++ b/platform-darwin/Source/Mac/MPMacAppDelegate.m @@ -295,8 +295,6 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven - (void)selectUser:(NSMenuItem *)item { - [self signOutAnimated:NO]; - NSManagedObjectContext *mainContext = [MPMacAppDelegate managedObjectContextForMainThreadIfReady]; self.activeUser = [MPUserEntity existingObjectWithID:[item representedObject] inContext:mainContext]; } @@ -369,10 +367,12 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven return masterPassword; } result:^(NSError *error) { - [self updateUsers]; + PearlMainQueue( ^{ + [self updateUsers]; - if (error && !(error.domain == NSCocoaErrorDomain && error.code == NSUserCancelledError)) - [[NSAlert alertWithError:error] runModal]; + if (error && !(error.domain == NSCocoaErrorDomain && error.code == NSUserCancelledError)) + [[NSAlert alertWithError:error] runModal]; + } ); }]; }] resume]; } @@ -458,7 +458,7 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven - (IBAction)lock:(id)sender { - [self signOutAnimated:YES]; + [self signOut]; } - (IBAction)terminate:(id)sender { @@ -642,6 +642,9 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven userItem.state = NSOffState; } + if (!mainActiveUser) + [self.sitesWindowController close]; + [self updateMenuItems]; } diff --git a/platform-darwin/Source/Mac/MPSitesWindowController.m b/platform-darwin/Source/Mac/MPSitesWindowController.m index 2e785585..f1bedb3a 100644 --- a/platform-darwin/Source/Mac/MPSitesWindowController.m +++ b/platform-darwin/Source/Mac/MPSitesWindowController.m @@ -51,8 +51,6 @@ } ); PearlAddNotificationObserver( NSWindowWillCloseNotification, self.window, [NSOperationQueue mainQueue], ^(id host, NSNotification *note) { - PearlRemoveNotificationObservers(); - NSWindow *sheet = [self.window attachedSheet]; if (sheet) [self.window endSheet:sheet]; @@ -86,6 +84,10 @@ prof_finish( @"ui" ); } +- (void)dealloc { + PearlRemoveNotificationObservers(); +} + - (void)replaceFonts:(NSView *)view { if (view.window.backingScaleFactor == 1) @@ -325,7 +327,7 @@ [alert_ beginSheetModalForWindow:self.window completionHandler:nil]; if ([MPMacAppDelegate get].key) - [[MPMacAppDelegate get] signOutAnimated:YES]; + [[MPMacAppDelegate get] signOut]; } ); }]; } @@ -573,7 +575,6 @@ } prof_finish( @"newSites: %@", newSites ); - dbg( @"newSites: %@", newSites ); if (![newSites isEqualToArray:self.sites]) PearlMainQueue( ^{ self.sites = newSites; diff --git a/platform-darwin/Source/iOS/MPAnswersViewController.m b/platform-darwin/Source/iOS/MPAnswersViewController.m index df2078e5..07cde3fb 100644 --- a/platform-darwin/Source/iOS/MPAnswersViewController.m +++ b/platform-darwin/Source/iOS/MPAnswersViewController.m @@ -49,10 +49,7 @@ PearlAddNotificationObserver( MPSignedOutNotification, nil, [NSOperationQueue mainQueue], ^(MPAnswersViewController *self, NSNotification *note) { - if (![note.userInfo[@"animated"] boolValue]) - [UIView setAnimationsEnabled:NO]; [[MPOverlaySegue dismissViewController:self] perform]; - [UIView setAnimationsEnabled:YES]; } ); } diff --git a/platform-darwin/Source/iOS/MPCombinedViewController.m b/platform-darwin/Source/iOS/MPCombinedViewController.m index 38ab53e8..a0970e4e 100644 --- a/platform-darwin/Source/iOS/MPCombinedViewController.m +++ b/platform-darwin/Source/iOS/MPCombinedViewController.m @@ -51,7 +51,7 @@ } ); PearlAddNotificationObserver( MPSignedOutNotification, nil, [NSOperationQueue mainQueue], ^(MPCombinedViewController *self, NSNotification *note) { - [self setMode:MPCombinedModeUserSelection animated:[note.userInfo[@"animated"] boolValue]]; + [self setMode:MPCombinedModeUserSelection]; } ); } @@ -110,7 +110,7 @@ - (void)setMode:(MPCombinedMode)mode { - [self setMode:mode animated:YES]; + [self setMode:mode animated:[UIView areAnimationsEnabled]]; } - (void)setMode:(MPCombinedMode)mode animated:(BOOL)animated { diff --git a/platform-darwin/Source/iOS/MPMessageViewController.m b/platform-darwin/Source/iOS/MPMessageViewController.m index 5fdccc77..64867b8c 100644 --- a/platform-darwin/Source/iOS/MPMessageViewController.m +++ b/platform-darwin/Source/iOS/MPMessageViewController.m @@ -64,10 +64,7 @@ PearlAddNotificationObserver( MPSignedOutNotification, nil, [NSOperationQueue mainQueue], ^(MPMessageViewController *self, NSNotification *note) { - if (![note.userInfo[@"animated"] boolValue]) - [UIView setAnimationsEnabled:NO]; [[MPOverlaySegue dismissViewController:self] perform]; - [UIView setAnimationsEnabled:YES]; } ); } diff --git a/platform-darwin/Source/iOS/MPPreferencesViewController.m b/platform-darwin/Source/iOS/MPPreferencesViewController.m index dd91863b..a3f4968f 100644 --- a/platform-darwin/Source/iOS/MPPreferencesViewController.m +++ b/platform-darwin/Source/iOS/MPPreferencesViewController.m @@ -98,7 +98,7 @@ UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; if (cell == self.signOutCell) { [self dismissPopup]; - [[MPiOSAppDelegate get] signOutAnimated:YES]; + [[MPiOSAppDelegate get] signOut]; } if (cell == self.feedbackCell) diff --git a/platform-darwin/Source/iOS/MPSitesViewController.m b/platform-darwin/Source/iOS/MPSitesViewController.m index b79f5baa..17d52aa8 100644 --- a/platform-darwin/Source/iOS/MPSitesViewController.m +++ b/platform-darwin/Source/iOS/MPSitesViewController.m @@ -363,7 +363,7 @@ typedef NS_OPTIONS( NSUInteger, MPPasswordsTips ) { [MPiOSAppDelegate managedObjectContextForMainThreadPerformBlock:^(NSManagedObjectContext *mainContext) { // TODO: either move this into the app delegate or remove the duplicate signOutAnimated: call from the app delegate. if (![[MPiOSAppDelegate get] activeUserInContext:mainContext]) - [[MPiOSAppDelegate get] signOutAnimated:YES]; + [[MPiOSAppDelegate get] signOut]; }]; }]; } diff --git a/platform-darwin/Source/iOS/MPUsersViewController.m b/platform-darwin/Source/iOS/MPUsersViewController.m index c0c9b741..f2be1319 100644 --- a/platform-darwin/Source/iOS/MPUsersViewController.m +++ b/platform-darwin/Source/iOS/MPUsersViewController.m @@ -776,7 +776,7 @@ referenceSizeForFooterInSection:(NSInteger)section { self.masterPasswordChoice = nil; if (activeUserState != MPActiveUserStateMinimized && (!self.active || [MPiOSAppDelegate get].activeUserOID)) { - [[MPiOSAppDelegate get] signOutAnimated:YES]; + [[MPiOSAppDelegate get] signOut]; return; } diff --git a/platform-darwin/Source/iOS/MPiOSAppDelegate.m b/platform-darwin/Source/iOS/MPiOSAppDelegate.m index abcac19a..de66e89e 100644 --- a/platform-darwin/Source/iOS/MPiOSAppDelegate.m +++ b/platform-darwin/Source/iOS/MPiOSAppDelegate.m @@ -332,16 +332,16 @@ void mpw_log_sink_pearl(const MPLogEvent *record) { } ); } ); } result:^(NSError *error) { - [activityOverlay cancelOverlayAnimated:YES]; + PearlMainQueue( ^{ + [activityOverlay cancelOverlayAnimated:YES]; - if (error && !(error.domain == NSCocoaErrorDomain && error.code == NSUserCancelledError)) { - PearlMainQueue( ^{ + if (error && !(error.domain == NSCocoaErrorDomain && error.code == NSUserCancelledError)) { UIAlertController *controller = [UIAlertController alertControllerWithTitle:@"Error" message:[error localizedDescription] preferredStyle:UIAlertControllerStyleAlert]; [controller addAction:[UIAlertAction actionWithTitle:@"Continue" style:UIAlertActionStyleCancel handler:nil]]; [self.navigationController presentViewController:controller animated:YES completion:nil]; - } ); - } + } + } ); }]; } @@ -392,8 +392,11 @@ void mpw_log_sink_pearl(const MPLogEvent *record) { - (void)applicationDidEnterBackground:(UIApplication *)application { inf( @"Did background" ); - if (![[MPiOSConfig get].rememberLogin boolValue]) - [self signOutAnimated:NO]; + if (![[MPiOSConfig get].rememberLogin boolValue]) { + [UIView setAnimationsEnabled:NO]; + [self signOut]; + [UIView setAnimationsEnabled:YES]; + } [self.hangDetector stop]; @@ -661,7 +664,7 @@ void mpw_log_sink_pearl(const MPLogEvent *record) { [moc saveToStore]; }]; - [self signOutAnimated:YES]; + [self signOut]; if (didReset) didReset(); }]]; diff --git a/platform-independent/c/cli/mpw-cli-tests b/platform-independent/c/cli/mpw-cli-tests index 3b5fa375..8970b11a 100755 --- a/platform-independent/c/cli/mpw-cli-tests +++ b/platform-independent/c/cli/mpw-cli-tests @@ -31,7 +31,7 @@ mpw_expect() { [[ $file ]] && (( ! keep )) && rm "$file" printf '.' - local result=$(set -x; ./mpw -q "${args[@]}") err=$? + local result=$(./mpw -q "${args[@]}") err=$? if (( err )); then printf >&2 "Error (exit %d) mpw%s\n" "$err" "$(printf ' %q' "${args[@]}")"