[MM-59044] Add per-server permission check for screen sharing (#3097)
This commit is contained in:
@@ -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);
|
||||
|
||||
|
@@ -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');
|
||||
});
|
||||
|
@@ -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) => {
|
||||
|
@@ -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>
|
||||
|
Reference in New Issue
Block a user