mirror of
https://github.com/MacPass/MacPass.git
synced 2025-12-14 04:42:29 +00:00
Disabled direct fail of autotype on missing access. Added time out for user interaction to prevent unexpected behaviour
This commit is contained in:
@@ -51,6 +51,7 @@ NSString *const kMPProcessIdentifierKey = @"kMPProcessIdentifierKey";
|
|||||||
@property (assign) pid_t targetPID; // The pid of the process we want to sent commands to
|
@property (assign) pid_t targetPID; // The pid of the process we want to sent commands to
|
||||||
@property (copy) NSString *targetWindowTitle; // The title of the window that we are targeting
|
@property (copy) NSString *targetWindowTitle; // The title of the window that we are targeting
|
||||||
@property (strong) NSRunningApplication *previousApplication; // The application that was active before we got invoked
|
@property (strong) NSRunningApplication *previousApplication; // The application that was active before we got invoked
|
||||||
|
@property (assign) NSTimeInterval userActionRequested;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@@ -81,6 +82,7 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
if (self) {
|
if (self) {
|
||||||
_enabled = NO;
|
_enabled = NO;
|
||||||
_targetPID = -1;
|
_targetPID = -1;
|
||||||
|
_userActionRequested = NSDate.distantPast.timeIntervalSinceReferenceDate;
|
||||||
[self bind:NSStringFromSelector(@selector(enabled))
|
[self bind:NSStringFromSelector(@selector(enabled))
|
||||||
toObject:NSUserDefaultsController.sharedUserDefaultsController
|
toObject:NSUserDefaultsController.sharedUserDefaultsController
|
||||||
withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyEnableGlobalAutotype]
|
withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyEnableGlobalAutotype]
|
||||||
@@ -214,7 +216,7 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
#pragma mark Autotype Execution
|
#pragma mark Autotype Execution
|
||||||
|
|
||||||
- (void)_performAutotypeForEntry:(KPKEntry *)entryOrNil {
|
- (void)_performAutotypeForEntry:(KPKEntry *)entryOrNil {
|
||||||
if(!self.autotypeSupported) {
|
/*if(!self.autotypeSupported) {
|
||||||
NSUserNotification *notification = [[NSUserNotification alloc] init];
|
NSUserNotification *notification = [[NSUserNotification alloc] init];
|
||||||
notification.title = NSApp.applicationName;
|
notification.title = NSApp.applicationName;
|
||||||
notification.informativeText = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_MACPASS_HAS_NO_ACCESSIBILTY_PERMISSIONS", "Notification: Autotype failed, MacPass has no permission to send key strokes");
|
notification.informativeText = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_MACPASS_HAS_NO_ACCESSIBILTY_PERMISSIONS", "Notification: Autotype failed, MacPass has no permission to send key strokes");
|
||||||
@@ -223,7 +225,7 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
notification.showsButtons = YES;
|
notification.showsButtons = YES;
|
||||||
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
|
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
|
||||||
return;
|
return;
|
||||||
}
|
}*/
|
||||||
NSInteger pid = NSProcessInfo.processInfo.processIdentifier;
|
NSInteger pid = NSProcessInfo.processInfo.processIdentifier;
|
||||||
if(self.targetPID == pid) {
|
if(self.targetPID == pid) {
|
||||||
return; // We do not perform Autotype on ourselves
|
return; // We do not perform Autotype on ourselves
|
||||||
@@ -240,7 +242,9 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeAutotypeOpenDocumentRequest };
|
notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeAutotypeOpenDocumentRequest };
|
||||||
notification.showsButtons = YES;
|
notification.showsButtons = YES;
|
||||||
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
|
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
|
||||||
return;
|
self.userActionRequested = NSDate.date.timeIntervalSinceReferenceDate;
|
||||||
|
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didUnlockDatabase:) name:MPDocumentDidUnlockDatabaseNotification object:nil];
|
||||||
|
return; // Unlock should trigger autotype
|
||||||
}
|
}
|
||||||
|
|
||||||
NSPredicate *filterPredicate = [NSPredicate predicateWithBlock:^BOOL(id _Nonnull evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
|
NSPredicate *filterPredicate = [NSPredicate predicateWithBlock:^BOOL(id _Nonnull evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
|
||||||
@@ -256,6 +260,7 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
[document showWindows];
|
[document showWindows];
|
||||||
MPDocumentWindowController *wc = document.windowControllers.firstObject;
|
MPDocumentWindowController *wc = document.windowControllers.firstObject;
|
||||||
[wc showPasswordInputWithMessage:NSLocalizedString(@"AUTOTYPE_MESSAGE_UNLOCK_DATABASE", @"Message displayed to the user to unlock the database to perform global autotype")];
|
[wc showPasswordInputWithMessage:NSLocalizedString(@"AUTOTYPE_MESSAGE_UNLOCK_DATABASE", @"Message displayed to the user to unlock the database to perform global autotype")];
|
||||||
|
self.userActionRequested = NSDate.date.timeIntervalSinceReferenceDate;
|
||||||
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didUnlockDatabase:) name:MPDocumentDidUnlockDatabaseNotification object:nil];
|
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didUnlockDatabase:) name:MPDocumentDidUnlockDatabaseNotification object:nil];
|
||||||
return; // wait for the unlock to happen
|
return; // wait for the unlock to happen
|
||||||
}
|
}
|
||||||
@@ -392,8 +397,18 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
- (void)_didUnlockDatabase:(NSNotification *)notification {
|
- (void)_didUnlockDatabase:(NSNotification *)notification {
|
||||||
/* Remove ourselves and call again to search matches */
|
/* Remove ourselves and call again to search matches */
|
||||||
[NSNotificationCenter.defaultCenter removeObserver:self name:MPDocumentDidUnlockDatabaseNotification object:nil];
|
[NSNotificationCenter.defaultCenter removeObserver:self name:MPDocumentDidUnlockDatabaseNotification object:nil];
|
||||||
|
NSTimeInterval now = NSDate.date.timeIntervalSinceReferenceDate;
|
||||||
|
if(now - self.userActionRequested > 30) {
|
||||||
|
NSUserNotification *notification = [[NSUserNotification alloc] init];
|
||||||
|
notification.title = NSApp.applicationName;
|
||||||
|
notification.informativeText = NSLocalizedString(@"AUTOTYPE_TIMED_OUT", "Notficication: Autotype timed out");
|
||||||
|
notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeAutotypeFeedback };
|
||||||
|
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
|
||||||
|
}
|
||||||
|
else {
|
||||||
[self _performAutotypeForEntry:nil];
|
[self _performAutotypeForEntry:nil];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
#pragma mark NSApplication Notifications
|
#pragma mark NSApplication Notifications
|
||||||
|
|||||||
@@ -430,7 +430,6 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
|
|||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark Lock/Unlock/Decrypt
|
#pragma mark Lock/Unlock/Decrypt
|
||||||
|
|
||||||
- (void)lockDatabase:(id)sender {
|
- (void)lockDatabase:(id)sender {
|
||||||
/*
|
/*
|
||||||
[self saveDocument] is enqued so that dataOfType is called too late to actually save teh database.
|
[self saveDocument] is enqued so that dataOfType is called too late to actually save teh database.
|
||||||
|
|||||||
@@ -107,6 +107,9 @@
|
|||||||
/* Notification: Autotype found a single match for %@ (string placeholder). */
|
/* Notification: Autotype found a single match for %@ (string placeholder). */
|
||||||
"AUTOTYPE_OVERLAY_SINGLE_MATCH_FOR_%@" = "Treffer für %@!";
|
"AUTOTYPE_OVERLAY_SINGLE_MATCH_FOR_%@" = "Treffer für %@!";
|
||||||
|
|
||||||
|
/* Notficication: Autotype timed out */
|
||||||
|
"AUTOTYPE_TIMED_OUT" = "Autotype wegen zu langer Wartezeit abgebrochen";
|
||||||
|
|
||||||
/* Enable autotype menu item */
|
/* Enable autotype menu item */
|
||||||
"AUTOTYPE_YES" = "Autotype aktivieren";
|
"AUTOTYPE_YES" = "Autotype aktivieren";
|
||||||
|
|
||||||
|
|||||||
@@ -107,6 +107,9 @@
|
|||||||
/* Notification: Autotype found a single match for %@ (string placeholder). */
|
/* Notification: Autotype found a single match for %@ (string placeholder). */
|
||||||
"AUTOTYPE_OVERLAY_SINGLE_MATCH_FOR_%@" = "Found Match for %@!";
|
"AUTOTYPE_OVERLAY_SINGLE_MATCH_FOR_%@" = "Found Match for %@!";
|
||||||
|
|
||||||
|
/* Notficication: Autotype timed out */
|
||||||
|
"AUTOTYPE_TIMED_OUT" = "Autotype timed out.";
|
||||||
|
|
||||||
/* Enable autotype menu item */
|
/* Enable autotype menu item */
|
||||||
"AUTOTYPE_YES" = "Enable Autotype";
|
"AUTOTYPE_YES" = "Enable Autotype";
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user