Skip to content

Commit 4b37157

Browse files
authored
Bugfix/(nut tree/nut.js#477)/remove permission check for delay setters (#153)
* (nut-tree/nut.js#477) Removed both setMouseDelay and setKeyboardDelay from permissionCheck.js since these setters do not required any permissions * (nut-tree/nut.js#477) Update permissionCheck.js to cache permission check results and only ask for permissions on actual function call by wrapping it in a HOF * (nut-tree/nut.js#477) Re-require native bindings on error
1 parent 5858fc9 commit 4b37157

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

permissionCheck.js

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
const libnut = require("bindings")("libnut");
1+
let libnut = require("bindings")("libnut");
2+
3+
let hasScreenRecordingPermission = false;
4+
let hasAccessibilityPermission = false;
25

36
try {
47
const permissions = require("@nut-tree/node-mac-permissions");
@@ -9,25 +12,27 @@ try {
912
};
1013

1114
const askForAccessibility = (nativeFunction, functionName) => {
12-
if (process.platform !== 'darwin') {
15+
if (process.platform !== 'darwin' || hasAccessibilityPermission) {
1316
return nativeFunction;
1417
}
1518
const accessibilityStatus = permissions.getAuthStatus("accessibility");
1619

1720
if (accessibilityStatus === 'authorized') {
21+
hasAccessibilityPermission = true;
1822
return nativeFunction;
1923
} else if (accessibilityStatus === 'not determined' || accessibilityStatus === 'denied') {
2024
permissions.askForAccessibilityAccess();
2125
return wrapWithWarning(`##### WARNING! The application running this script tries to access accessibility features to execute ${functionName}! Please grant requested access and visit https://github.com/nut-tree/nut.js#macos for further information. #####`, nativeFunction);
2226
}
2327
}
2428
const askForScreenRecording = (nativeFunction, functionName) => {
25-
if (process.platform !== 'darwin') {
29+
if (process.platform !== 'darwin' || hasScreenRecordingPermission) {
2630
return nativeFunction;
2731
}
2832
const screenCaptureStatus = permissions.getAuthStatus("screen");
2933

3034
if (screenCaptureStatus === 'authorized') {
35+
hasScreenRecordingPermission = true;
3136
return nativeFunction;
3237
} else if (screenCaptureStatus === 'not determined' || screenCaptureStatus === 'denied') {
3338
permissions.askForScreenCaptureAccess();
@@ -42,11 +47,9 @@ try {
4247
"mouseClick",
4348
"mouseToggle",
4449
"scrollMouse",
45-
"setMouseDelay",
4650
"keyTap",
4751
"keyToggle",
4852
"typeString",
49-
"setKeyboardDelay",
5053
"getScreenSize",
5154
"highlight",
5255
"captureScreen",
@@ -61,14 +64,17 @@ try {
6164
];
6265

6366
for (const functionName of accessibilityAccess) {
64-
libnut[functionName] = askForAccessibility(libnut[functionName], functionName);
67+
const originalFunction = libnut[functionName];
68+
libnut[functionName] = (...args) => askForAccessibility(originalFunction, functionName)(...args);
6569
}
6670
for (const functionName of screenCaptureAccess) {
67-
libnut[functionName] = askForScreenRecording(libnut[functionName], functionName);
71+
const originalFunction = libnut[functionName];
72+
libnut[functionName] = (...args) => askForScreenRecording(originalFunction, functionName)(...args);
6873
}
6974
} catch (e) {
7075
console.warn(`Encountered error establishing macOS permission checks:`, e.message);
7176
console.warn(`Returning original module.`);
77+
libnut = require("bindings")("libnut");
7278
} finally {
7379
module.exports = libnut;
7480
}

0 commit comments

Comments
 (0)