From bf05457aaa1cb3a3f8af02968fad923a5c5326bf Mon Sep 17 00:00:00 2001 From: j0794 Date: Thu, 21 Nov 2024 11:11:14 +0500 Subject: [PATCH] Fix issues with media permissions on Linux and Jitsi Meet in embedded mode on all platforms --- src/main/permissionsManager.test.js | 16 +++++++++------- src/main/permissionsManager.ts | 29 +++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/main/permissionsManager.test.js b/src/main/permissionsManager.test.js index c89bc63a394..e2e7866af94 100644 --- a/src/main/permissionsManager.test.js +++ b/src/main/permissionsManager.test.js @@ -60,13 +60,15 @@ jest.mock('main/windows/mainWindow', () => ({ describe('main/PermissionsManager', () => { describe('setForServer', () => { - it('should ask for media permission when is not granted but the user explicitly granted it', () => { - systemPreferences.getMediaAccessStatus.mockReturnValue('denied'); - const permissionsManager = new PermissionsManager('anyfile.json'); - permissionsManager.setForServer({url: new URL('http://anyurl.com')}, {media: {allowed: true}}); - expect(systemPreferences.askForMediaAccess).toHaveBeenNthCalledWith(1, 'microphone'); - expect(systemPreferences.askForMediaAccess).toHaveBeenNthCalledWith(2, 'camera'); - }); + if (process.platform !== 'linux') { + it('should ask for media permission when is not granted but the user explicitly granted it', () => { + systemPreferences.getMediaAccessStatus.mockReturnValue('denied'); + const permissionsManager = new PermissionsManager('anyfile.json'); + permissionsManager.setForServer({url: new URL('http://anyurl.com')}, {media: {allowed: true}}); + expect(systemPreferences.askForMediaAccess).toHaveBeenNthCalledWith(1, 'microphone'); + expect(systemPreferences.askForMediaAccess).toHaveBeenNthCalledWith(2, 'camera'); + }); + } }); describe('handlePermissionRequest', () => { diff --git a/src/main/permissionsManager.ts b/src/main/permissionsManager.ts index 27dca9189b7..52e3d047b60 100644 --- a/src/main/permissionsManager.ts +++ b/src/main/permissionsManager.ts @@ -95,7 +95,7 @@ export class PermissionsManager extends JsonFileManager { }; setForServer = (server: MattermostServer, permissions: Permissions) => { - if (permissions.media?.allowed) { + if (permissions.media?.allowed && (process.platform === 'win32' || process.platform === 'darwin')) { this.checkMediaAccess('microphone'); this.checkMediaAccess('camera'); } @@ -137,11 +137,6 @@ export class PermissionsManager extends JsonFileManager { url = details.securityOrigin; } - const parsedURL = parseURL(url); - if (!parsedURL) { - return false; - } - let serverURL: URL | undefined; if (CallsWidgetWindow.isCallsWidget(webContentsId)) { serverURL = CallsWidgetWindow.getViewURL(); @@ -159,6 +154,28 @@ export class PermissionsManager extends JsonFileManager { return true; } + const preparsedURL = parseURL(url); + + if (!preparsedURL) { + return false; + } + + const preparsedHostChunks = preparsedURL.host.split('.').reverse(); + const serverHostChunks = serverURL.host.split('.').reverse(); + + if ( + preparsedHostChunks.length >= 3 && serverHostChunks.length >= 3 && + preparsedHostChunks[0] === serverHostChunks[0] && + preparsedHostChunks[1] === serverHostChunks[1] + ) { + url = serverURL.href; + } + + const parsedURL = parseURL(url); + if (!parsedURL) { + return false; + } + // Exception for embedded videos such as YouTube // We still want to ask permission to do this though const isExternalFullscreen = permission === 'fullscreen' && parsedURL.origin !== serverURL.origin;