diff --git a/build/entitlements.mac.plist b/build/entitlements.mac.plist index c64d264b2..dba866fb6 100644 --- a/build/entitlements.mac.plist +++ b/build/entitlements.mac.plist @@ -7,5 +7,9 @@ com.apple.security.cs.disable-library-validation + com.apple.security.device.audio-input + + com.apple.security.device.camera + diff --git a/js/background.js b/js/background.js index 33add739a..d4474995c 100644 --- a/js/background.js +++ b/js/background.js @@ -5,6 +5,7 @@ storage, Whisper, BlockedNumberController, + Signal */ // eslint-disable-next-line func-names @@ -336,8 +337,11 @@ window.libsession.Utils.ToastUtils.pushSpellCheckDirty(); }; - window.toggleMediaPermissions = () => { + window.toggleMediaPermissions = async () => { const value = window.getMediaPermissions(); + if (value === false && Signal.OS.isMacOS()) { + await window.askForMediaAccess(); + } window.setMediaPermissions(!value); }; diff --git a/main.js b/main.js index c4b84fd7c..da5b4c5ca 100644 --- a/main.js +++ b/main.js @@ -25,6 +25,7 @@ const { protocol: electronProtocol, session, shell, + systemPreferences, } = electron; // FIXME Hardcoding appId to prevent build failrues on release. @@ -983,3 +984,20 @@ function getThemeFromMainWindow() { mainWindow.webContents.send('get-theme-setting'); }); } + +function askForMediaAccess() { + // Microphone part + let status = systemPreferences.getMediaAccessStatus('microphone'); + if (status !== 'granted') { + systemPreferences.askForMediaAccess('microphone'); + } + // Camera part + status = systemPreferences.getMediaAccessStatus('camera'); + if (status !== 'granted') { + systemPreferences.askForMediaAccess('camera'); + } +} + +ipc.on('media-access', () => { + askForMediaAccess(); +}); diff --git a/package.json b/package.json index 54d2c8ada..3a0765851 100644 --- a/package.json +++ b/package.json @@ -236,7 +236,11 @@ "hardenedRuntime": true, "gatekeeperAssess": false, "entitlements": "build/entitlements.mac.plist", - "entitlementsInherit": "build/entitlements.mac.plist" + "entitlementsInherit": "build/entitlements.mac.plist", + "extendInfo": { + "NSCameraUsageDescription": "Session requires camera access to record video.", + "NSMicrophoneUsageDescription": "Session requires microphone access to record audio." + } }, "dmg": { "sign": false diff --git a/preload.js b/preload.js index da0a7108d..6904d80ab 100644 --- a/preload.js +++ b/preload.js @@ -219,6 +219,8 @@ window.setSettingValue = (settingID, value) => { window.getMediaPermissions = () => ipc.sendSync('get-media-permissions'); window.setMediaPermissions = value => ipc.send('set-media-permissions', !!value); +window.askForMediaAccess = () => ipc.send('media-access'); + // Auto update setting window.getAutoUpdateEnabled = () => ipc.sendSync('get-auto-update-setting'); window.setAutoUpdateEnabled = value => ipc.send('set-auto-update-setting', !!value); diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index 8b5d07e29..029a1d294 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -253,11 +253,13 @@ class SettingsViewInner extends React.Component { return ( v{window.versionInfo.version} - + + + {window.versionInfo.commitHash} );