2
0

Log out active user and key when user is changed or deleted or unset.

This commit is contained in:
Maarten Billemont 2020-04-04 16:30:14 -04:00
parent 975743adec
commit fa0c80d6b3
13 changed files with 52 additions and 44 deletions

View File

@ -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;

View File

@ -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.

View File

@ -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 {

View File

@ -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];
}

View File

@ -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;

View File

@ -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];
} );
}

View File

@ -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 {

View File

@ -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];
} );
}

View File

@ -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)

View File

@ -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];
}];
}];
}

View File

@ -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;
}

View File

@ -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();
}]];

View File

@ -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[@]}")"