[MM-59044] Add per-server permission check for screen sharing (#3097)

This commit is contained in:
Devin Binnie
2024-07-19 15:52:07 -04:00
committed by GitHub
parent 7c27a6d1cd
commit 198b1afe88
5 changed files with 33 additions and 0 deletions

View File

@@ -45,6 +45,7 @@ const supportedPermissionTypes = [
'fullscreen',
'openExternal',
'clipboard-sanitized-write',
'screenShare',
];
// permissions that require a dialog
@@ -53,6 +54,7 @@ const authorizablePermissionTypes = [
'geolocation',
'notifications',
'openExternal',
'screenShare',
];
type PermissionsByOrigin = {
@@ -239,10 +241,12 @@ t('main.permissionsManager.checkPermission.dialog.message.media');
t('main.permissionsManager.checkPermission.dialog.message.geolocation');
t('main.permissionsManager.checkPermission.dialog.message.notifications');
t('main.permissionsManager.checkPermission.dialog.message.openExternal');
t('main.permissionsManager.checkPermission.dialog.message.screenShare');
t('main.permissionsManager.checkPermission.dialog.detail.media');
t('main.permissionsManager.checkPermission.dialog.detail.geolocation');
t('main.permissionsManager.checkPermission.dialog.detail.notifications');
t('main.permissionsManager.checkPermission.dialog.detail.openExternal');
t('main.permissionsManager.checkPermission.dialog.detail.screenShare');
let permissionsManager = new PermissionsManager(permissionsJson);

View File

@@ -17,6 +17,7 @@ import {
CALLS_PLUGIN_ID,
} from 'common/utils/constants';
import urlUtils from 'common/utils/url';
import PermissionsManager from 'main/permissionsManager';
import {
resetScreensharePermissionsMacOS,
openScreensharePermissionsSettingsMacOS,
@@ -56,6 +57,9 @@ jest.mock('common/utils/url', () => ({
getFormattedPathName: jest.fn(),
parseURL: jest.fn(),
}));
jest.mock('main/permissionsManager', () => ({
doPermissionRequest: jest.fn(),
}));
jest.mock('main/windows/mainWindow', () => ({
get: jest.fn(),
focus: jest.fn(),
@@ -599,6 +603,11 @@ describe('main/windows/callsWidgetWindow', () => {
arr.push([`${item.name}_${view.name}`, {
sendToRenderer: jest.fn(),
webContentsId: index,
view: {
server: {
url: new URL('http://server-1.com'),
},
},
}]);
});
return arr;
@@ -606,6 +615,7 @@ describe('main/windows/callsWidgetWindow', () => {
const views = new Map(map);
beforeEach(() => {
PermissionsManager.doPermissionRequest.mockReturnValue(Promise.resolve(true));
ViewManager.getViewByWebContentsId.mockImplementation((id) => [...views.values()].find((view) => view.webContentsId === id));
callsWidgetWindow.mainView = views.get('server-1_view-1');
});

View File

@@ -27,6 +27,7 @@ import {Logger} from 'common/log';
import {CALLS_PLUGIN_ID, MINIMUM_CALLS_WIDGET_HEIGHT, MINIMUM_CALLS_WIDGET_WIDTH} from 'common/utils/constants';
import {getFormattedPathName, isCallsPopOutURL, parseURL} from 'common/utils/url';
import Utils from 'common/utils/util';
import PermissionsManager from 'main/permissionsManager';
import {
composeUserAgent,
getLocalPreload,
@@ -403,6 +404,11 @@ export class CallsWidgetWindow {
}
}
if (!await PermissionsManager.doPermissionRequest(view.webContentsId, 'screenShare', {requestingUrl: view.view.server.url.toString(), isMainFrame: false})) {
log.warn('screen share permissions disallowed', view.webContentsId, view.view.server.url.toString());
return [];
}
const screenPermissionsErrArgs = ['screen-permissions', this.callID];
return desktopCapturer.getSources(opts).then((sources) => {

View File

@@ -577,6 +577,16 @@ class NewServerModal extends React.PureComponent<Props, State> {
defaultMessage='Location'
/>
</Toggle>
<Toggle
isChecked={this.state.permissions.screenShare?.allowed}
onChange={this.handleChangePermission('screenShare')}
>
<i className='icon icon-monitor-share'/>
<FormattedMessage
id='renderer.components.newServerModal.permissions.screenShare'
defaultMessage='Screen Share'
/>
</Toggle>
</>
}
</Modal.Body>