Log out active user and key when user is changed or deleted or unset.
This commit is contained in:
		@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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.
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,8 @@
 | 
			
		||||
#import "MPAppDelegate_Key.h"
 | 
			
		||||
#import "NSManagedObjectModel+KCOrderedAccessorFix.h"
 | 
			
		||||
 | 
			
		||||
#import <Countly/Countly.h>
 | 
			
		||||
 | 
			
		||||
@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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -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];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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];
 | 
			
		||||
            } );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -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];
 | 
			
		||||
            } );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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];
 | 
			
		||||
        }];
 | 
			
		||||
    }];
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
        }]];
 | 
			
		||||
 
 | 
			
		||||
@@ -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[@]}")"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user