aboutsummaryrefslogtreecommitdiffstats
path: root/src/electron/macOSPermissions.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/electron/macOSPermissions.js')
-rw-r--r--src/electron/macOSPermissions.js46
1 files changed, 25 insertions, 21 deletions
diff --git a/src/electron/macOSPermissions.js b/src/electron/macOSPermissions.js
index c114f4843..887af2903 100644
--- a/src/electron/macOSPermissions.js
+++ b/src/electron/macOSPermissions.js
@@ -1,45 +1,43 @@
1import { app, systemPreferences, dialog } from 'electron'; 1import { systemPreferences, dialog } from 'electron';
2import fs from 'fs'; 2import { pathExistsSync, mkdirSync, writeFileSync } from 'fs-extra';
3import macosVersion from 'macos-version'; 3import macosVersion from 'macos-version';
4import path from 'path'; 4import { dirname } from 'path';
5import { askForScreenCaptureAccess } from 'node-mac-permissions'; 5import { askForScreenCaptureAccess } from 'node-mac-permissions';
6import { userDataPath } from '../environment';
6 7
7const debug = require('debug')('Ferdi:macOSPermissions'); 8const debug = require('debug')('Ferdi:macOSPermissions');
8 9
9const permissionExists = macosVersion.isGreaterThanOrEqualTo('10.15'); 10const isExplicitScreenCapturePermissionReqd = macosVersion.isGreaterThanOrEqualTo('10.15');
10const filePath = path.join( 11debug(`Should check explicitly for screen-capture permissions: ${isExplicitScreenCapturePermissionReqd}`);
11 app.getPath('userData'),
12 '.has-app-requested-screen-capture-permissions',
13);
14 12
15function hasPromptedForPermission() { 13const filePath = userDataPath('.has-app-requested-screen-capture-permissions');
16 if (!permissionExists) {
17 return false;
18 }
19 14
20 if (filePath && fs.existsSync(filePath)) { 15function hasPromptedForScreenCapturePermission() {
21 return true; 16 if (!isExplicitScreenCapturePermissionReqd) {
17 return false;
22 } 18 }
23 19
24 return false; 20 debug('Checking if status file exists');
21 return filePath && pathExistsSync(filePath);
25} 22}
26 23
27function hasScreenCapturePermission() { 24function hasScreenCapturePermissionAlreadyBeenGranted() {
28 if (!permissionExists) { 25 if (!isExplicitScreenCapturePermissionReqd) {
29 return true; 26 return true;
30 } 27 }
31 28
32 const screenCaptureStatus = systemPreferences.getMediaAccessStatus('screen'); 29 const screenCaptureStatus = systemPreferences.getMediaAccessStatus('screen');
30 debug(`screen-capture permissions status: ${screenCaptureStatus}`);
33 return screenCaptureStatus === 'granted'; 31 return screenCaptureStatus === 'granted';
34} 32}
35 33
36function createStatusFile() { 34function createStatusFile() {
37 try { 35 try {
38 fs.writeFileSync(filePath, ''); 36 writeFileSync(filePath, '');
39 } catch (error) { 37 } catch (error) {
40 if (error.code === 'ENOENT') { 38 if (error.code === 'ENOENT') {
41 fs.mkdirSync(path.dirname(filePath)); 39 mkdirSync(dirname(filePath));
42 fs.writeFileSync(filePath, ''); 40 writeFileSync(filePath, '');
43 } 41 }
44 42
45 throw error; 43 throw error;
@@ -51,7 +49,13 @@ export const askFormacOSPermissions = async mainWindow => {
51 systemPreferences.askForMediaAccess('camera'); 49 systemPreferences.askForMediaAccess('camera');
52 systemPreferences.askForMediaAccess('microphone'); 50 systemPreferences.askForMediaAccess('microphone');
53 51
54 if (!hasPromptedForPermission() && !hasScreenCapturePermission()) { 52 if (hasScreenCapturePermissionAlreadyBeenGranted()) {
53 debug('Already obtained screen-capture permissions - writing status file');
54 createStatusFile();
55 return;
56 }
57
58 if (!hasPromptedForScreenCapturePermission()) {
55 debug('Checking screen capture permissions'); 59 debug('Checking screen capture permissions');
56 60
57 const { response } = await dialog.showMessageBox(mainWindow, { 61 const { response } = await dialog.showMessageBox(mainWindow, {