From 217299bcf8a55379a7fc6e05c378d878cc6c02a8 Mon Sep 17 00:00:00 2001 From: Vishwas Shashidhar Date: Tue, 20 Mar 2018 17:49:27 +0530 Subject: [PATCH] Electron 323: allow admins to set permissions to peripherals (#329) - implement permissions settings for electron - add "Yes" / "No" as user visible text in the windows installer confirmation screen - add "Yes" / "No" as user visible text in the windows installer for settings screen - fix windows installer conflicts --- config/Symphony.config | 11 +- .../Contents/MacOS/SymphonySettingsPlugin | Bin 69440 -> 81344 bytes .../Resources/Base.lproj/MyInstallerPane.nib | Bin 12736 -> 17587 bytes .../Contents/_CodeSignature/CodeResources | 6 +- .../Base.lproj/MyInstallerPane.xib | 171 ++++++++++++++++-- .../SymphonySettingsPlugin/MyInstallerPane.h | 8 + .../SymphonySettingsPlugin/MyInstallerPane.m | 85 ++++++++- installer/mac/postinstall.sh | 66 ++++++- installer/mac/symphony-mac-packager.pkgproj | 14 +- installer/win/Symphony-x64.aip | 140 +++++++++++--- installer/win/Symphony-x86.aip | 130 +++++++++++-- js/windowMgr.js | 85 ++++++++- 12 files changed, 630 insertions(+), 86 deletions(-) diff --git a/config/Symphony.config b/config/Symphony.config index c77eb2ab..3b83698d 100644 --- a/config/Symphony.config +++ b/config/Symphony.config @@ -19,5 +19,14 @@ "authServerWhitelist": "", "authNegotiateDelegateWhitelist": "", "disableGpu": false + }, + "permissions": { + "media": false, + "geolocation": true, + "notifications": true, + "midiSysex": true, + "pointerLock": true, + "fullscreen": false, + "openExternal": true } -} +} \ No newline at end of file diff --git a/installer/mac/SymphonySettingsPlugin.bundle/Contents/MacOS/SymphonySettingsPlugin b/installer/mac/SymphonySettingsPlugin.bundle/Contents/MacOS/SymphonySettingsPlugin index ae0a55f1ef04f81b7b6ee42b88f52c9cbc966c13..80be2b62f4a54f3daa794609e40f829bb7bf4eb4 100755 GIT binary patch delta 24531 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 Vb0uO?Wx}ZD@|&O3I(@LU`d`q724VmJ delta 19054 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 T5GjAKaPQ6_nXNrhTRZ$8%m1~+ diff --git a/installer/mac/SymphonySettingsPlugin.bundle/Contents/Resources/Base.lproj/MyInstallerPane.nib b/installer/mac/SymphonySettingsPlugin.bundle/Contents/Resources/Base.lproj/MyInstallerPane.nib index be3518cd16accd5f777f03ed141a158a58688226..25d8729e7f1cf882d8c8e20b117727632e8a402a 100644 GIT binary patch delta 10194 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 Qel{V-a20Pn{N7UgKR%*o&;S4c delta 5337 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 O1~1MM{;m1;JpFHm2k7Mh diff --git a/installer/mac/SymphonySettingsPlugin.bundle/Contents/_CodeSignature/CodeResources b/installer/mac/SymphonySettingsPlugin.bundle/Contents/_CodeSignature/CodeResources index 0154c96c..26ede4fd 100644 --- a/installer/mac/SymphonySettingsPlugin.bundle/Contents/_CodeSignature/CodeResources +++ b/installer/mac/SymphonySettingsPlugin.bundle/Contents/_CodeSignature/CodeResources @@ -6,7 +6,7 @@ Resources/Base.lproj/MyInstallerPane.nib - REWscTugC7Nqck170ufKwa7niM8= + ozgq40OwEdGzEYmpvPfyOGNdoxc= Resources/InstallerSections.plist @@ -37,11 +37,11 @@ hash - REWscTugC7Nqck170ufKwa7niM8= + ozgq40OwEdGzEYmpvPfyOGNdoxc= hash2 - 7tVq2ZiKqlKpvUpE6okEaYi4n4W8rSdip7Oxp23CKC8= + o5paIuef2SCH3ReBvdV7oINRCSJTzFOAkbopJGY4pjY= Resources/InstallerSections.plist diff --git a/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/Base.lproj/MyInstallerPane.xib b/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/Base.lproj/MyInstallerPane.xib index f3f226a0..204f6313 100644 --- a/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/Base.lproj/MyInstallerPane.xib +++ b/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/Base.lproj/MyInstallerPane.xib @@ -22,18 +22,25 @@ + + + + + + + - + - + @@ -42,7 +49,7 @@ - + @@ -51,7 +58,7 @@ - + @@ -60,7 +67,7 @@ - + @@ -77,16 +84,16 @@ - + - + - + @@ -103,7 +110,7 @@ - + @@ -112,7 +119,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/MyInstallerPane.h b/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/MyInstallerPane.h index acd6c83a..4e1ef246 100644 --- a/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/MyInstallerPane.h +++ b/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/MyInstallerPane.h @@ -17,4 +17,12 @@ @property (weak) IBOutlet NSButton *bringToFrontCheckBox; @property (weak) IBOutlet NSTextField *bringToFrontTextBox; +@property (weak) IBOutlet NSButton *mediaCheckBox; +@property (weak) IBOutlet NSButton *geoLocationCheckBox; +@property (weak) IBOutlet NSButton *notificationsCheckBox; +@property (weak) IBOutlet NSButton *midiSysexCheckBox; +@property (weak) IBOutlet NSButton *pointerLockCheckBox; +@property (weak) IBOutlet NSButton *fullScreenCheckBox; +@property (weak) IBOutlet NSButton *externalAppCheckBox; + @end diff --git a/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/MyInstallerPane.m b/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/MyInstallerPane.m index 3d9a7260..a3290ef3 100644 --- a/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/MyInstallerPane.m +++ b/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/MyInstallerPane.m @@ -25,20 +25,41 @@ // Now, validate the url against a url regex NSString *regex = @"^(https:\\/\\/)?(www.)?[a-z0-9]+([\\-\\.]{1}[a-z0-9]+)*\\.[a-z]{2,}(:[0-9]{1,5})?(\\/[a-zA-Z0-9-_.+!*'(),;\\/?:@=&$]*)?$"; + NSPredicate *podUrlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; - if ([podUrlTest evaluateWithObject:podUrl]) { - return YES; + + if (![podUrlTest evaluateWithObject:podUrl]) { + [_podUrlAlertTextBox setTitleWithMnemonic:@"Please enter a valid Pod url."]; + return NO; } - // In case of an invalid url, display the message under the pod url text box - // and don't go to the next screen, hence return NO - [_podUrlAlertTextBox setTitleWithMnemonic:@"Please enter a valid Pod url."]; - return NO; + // Double confirmation for disabling media + if ([_mediaCheckBox state] == 0) { + NSAlert *alert = [NSAlert alertWithMessageText: @"Are you sure you wish to disable the camera, microphone, and speakers?" defaultButton:@"No" alternateButton:@"Yes" otherButton:nil informativeTextWithFormat:@""]; + + NSInteger button = [alert runModal]; + + if (button == NSAlertDefaultReturn) { + return NO; + } + + return YES; + + } + + return YES; } - (void)willExitPane:(InstallerSectionDirection)dir { + [self writeSettingsToFile]; + [self writePermissionsToFile]; + +} + +- (void)writeSettingsToFile { + NSString *podUrl = [_podUrlTextBox stringValue]; NSString *securePrefix = @"https://"; @@ -46,7 +67,7 @@ podUrl = [securePrefix stringByAppendingString:podUrl]; [_podUrlTextBox setStringValue:podUrl]; } - + // By default, set autoLaunchOnStart and minimizeOnClose to true NSString *autoLaunchOnStart = @"true"; NSString *minimizeOnClose = @"true"; @@ -86,4 +107,54 @@ } +- (void)writePermissionsToFile { + + // By default, set all the values to true + NSString *media = @"true"; + NSString *geoLocation = @"true"; + NSString *notifications = @"true"; + NSString *midiSysex = @"true"; + NSString *pointerLock = @"true"; + NSString *fullScreen = @"true"; + NSString *openExternal = @"true"; + + if ([_mediaCheckBox state] == 0) { + media = @"false"; + } + + if ([_geoLocationCheckBox state] == 0) { + geoLocation = @"false"; + } + + if ([_notificationsCheckBox state] == 0) { + notifications = @"false"; + } + + if ([_midiSysexCheckBox state] == 0) { + midiSysex = @"false"; + } + + if ([_pointerLockCheckBox state] == 0) { + pointerLock = @"false"; + } + + if ([_fullScreenCheckBox state] == 0) { + fullScreen = @"false"; + } + + if ([_externalAppCheckBox state] == 0) { + openExternal = @"false"; + } + + // Create an array with the selected options + NSArray *symPermissions = [[NSArray alloc] initWithObjects:media, geoLocation, notifications, midiSysex, pointerLock, fullScreen, openExternal, nil]; + + // Create a string from the array with new-line as the separator + NSString *symPermissionsString = [symPermissions componentsJoinedByString:@"\n"]; + + // Write all the above settings to file + [symPermissionsString writeToFile:@"/tmp/sym_permissions.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil]; + +} + @end diff --git a/installer/mac/postinstall.sh b/installer/mac/postinstall.sh index d6f71579..7013218e 100755 --- a/installer/mac/postinstall.sh +++ b/installer/mac/postinstall.sh @@ -1,17 +1,18 @@ #!/bin/sh ## Create file path variables ## -tempFilePath='/tmp/sym_settings.txt' +settingsFilePath='/tmp/sym_settings.txt' +permissionsFilePath='/tmp/sym_permissions.txt' installPath="$2" configPath="/Symphony.app/Contents/config/Symphony.config" newPath=${installPath}${configPath} ## Get Symphony Settings from the temp file ## -pod_url=$(sed -n '1p' ${tempFilePath}); -minimize_on_close=$(sed -n '2p' '/tmp/sym_settings.txt'); -launch_on_startup=$(sed -n '3p' '/tmp/sym_settings.txt'); -always_on_top=$(sed -n '4p' '/tmp/sym_settings.txt'); -bring_to_front=$(sed -n '5p' '/tmp/sym_settings.txt'); +pod_url=$(sed -n '1p' ${settingsFilePath}); +minimize_on_close=$(sed -n '2p' ${settingsFilePath}); +launch_on_startup=$(sed -n '3p' ${settingsFilePath}); +always_on_top=$(sed -n '4p' ${settingsFilePath}); +bring_to_front=$(sed -n '5p' ${settingsFilePath}); if [ "$pod_url" == "" ]; then pod_url="https://corporate.symphony.com" @@ -43,9 +44,58 @@ sed -i "" -E "s#\"launchOnStartup\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])# sed -i "" -E "s#\"bringToFront\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"bringToFront\":\ $bring_to_front#g" ${newPath} ## Remove the temp settings file created ## -rm -f ${tempFilePath} +rm -f ${settingsFilePath} + +## Get Symphony Permissions from the temp file ## +media=$(sed -n '1p' ${permissionsFilePath}); +geo_location=$(sed -n '2p' ${permissionsFilePath}); +notifications=$(sed -n '3p' ${permissionsFilePath}); +midi_sysex=$(sed -n '4p' ${permissionsFilePath}); +pointer_lock=$(sed -n '5p' ${permissionsFilePath}); +full_screen=$(sed -n '6p' ${permissionsFilePath}); +open_external_app=$(sed -n '7p' ${permissionsFilePath}); + +if [ "$media" == "" ]; then + media=true; +fi + +if [ "$geo_location" == "" ]; then + geo_location=true; +fi + +if [ "$notifications" == "" ]; then + notifications=true; +fi + +if [ "$midi_sysex" == "" ]; then + midi_sysex=true; +fi + +if [ "$pointer_lock" == "" ]; then + pointer_lock=true; +fi + +if [ "$full_screen" == "" ]; then + full_screen=true; +fi + +if [ "$open_external_app" == "" ]; then + open_external_app=true; +fi + +## Replace the default permissions with the user selected permissions ## +sed -i "" -E "s#\"media\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"media\":\ $media#g" ${newPath} +sed -i "" -E "s#\"geolocation\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"geolocation\":\ $geo_location#g" ${newPath} +sed -i "" -E "s#\"notifications\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"notifications\":\ $notifications#g" ${newPath} +sed -i "" -E "s#\"midiSysex\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"midiSysex\":\ $midi_sysex#g" ${newPath} +sed -i "" -E "s#\"pointerLock\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"pointerLock\":\ $pointer_lock#g" ${newPath} +sed -i "" -E "s#\"fullscreen\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"fullscreen\":\ $full_screen#g" ${newPath} +sed -i "" -E "s#\"openExternal\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"openExternal\":\ $open_external_app#g" ${newPath} + +## Remove the temp permissions file created ## +rm -f ${permissionsFilePath} ## For launching symphony with sandbox enabled, create a shell script that is used as the launch point for the app EXEC_PATH=${installPath}/Symphony.app/Contents/MacOS exec ${EXEC_PATH}/Symphony --install ${newPath} ${launch_on_startup} -chmod 755 ${EXEC_PATH}/Symphony +chmod 755 ${EXEC_PATH}/Symphony \ No newline at end of file diff --git a/installer/mac/symphony-mac-packager.pkgproj b/installer/mac/symphony-mac-packager.pkgproj index 9d135dad..b1c7c6bd 100644 --- a/installer/mac/symphony-mac-packager.pkgproj +++ b/installer/mac/symphony-mac-packager.pkgproj @@ -5,6 +5,10 @@ PACKAGES + MUST-CLOSE-APPLICATION-ITEMS + + MUST-CLOSE-APPLICATIONS + PACKAGE_FILES DEFAULT_INSTALL_LOCATION @@ -267,7 +271,7 @@ PATH_TYPE 0 PERMISSIONS - 493 + 1005 TYPE 1 UID @@ -439,7 +443,7 @@ TREAT_MISSING_FILES_AS_WARNING VERSION - 4 + 5 PACKAGE_SCRIPTS @@ -478,6 +482,8 @@ PAYLOAD_SIZE -1 + REFERENCE_PATH + RELOCATABLE USE_HFS+_COMPRESSION @@ -599,7 +605,7 @@ PATH SymphonySettingsPlugin.bundle PATH_TYPE - 3 + 1 @@ -888,4 +894,4 @@ VERSION 2 - + \ No newline at end of file diff --git a/installer/win/Symphony-x64.aip b/installer/win/Symphony-x64.aip index 1413215f..54cc9bf8 100755 --- a/installer/win/Symphony-x64.aip +++ b/installer/win/Symphony-x64.aip @@ -11,6 +11,7 @@ + @@ -20,16 +21,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + @@ -294,11 +320,15 @@ - - - + + + + + + + @@ -350,6 +380,13 @@ + + + + + + + @@ -443,12 +480,27 @@ + + + + + + + + + + + + + + + + - @@ -461,14 +513,38 @@ - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -520,17 +596,24 @@ - + - - - - - - - - - + + + + + + + + + + + + + + + + @@ -561,7 +644,7 @@ - + @@ -570,8 +653,10 @@ + + @@ -587,12 +672,12 @@ - + @@ -648,11 +733,18 @@ - - - - + + + + + + + + + + + diff --git a/installer/win/Symphony-x86.aip b/installer/win/Symphony-x86.aip index d1560922..268304a2 100755 --- a/installer/win/Symphony-x86.aip +++ b/installer/win/Symphony-x86.aip @@ -11,6 +11,7 @@ + @@ -20,16 +21,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -291,6 +316,9 @@ + + + @@ -333,6 +361,13 @@ + + + + + + + @@ -426,12 +461,27 @@ + + + + + + + + + + + + + + + + - @@ -444,14 +494,38 @@ - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -502,18 +576,25 @@ - + - - - - - - - - - + + + + + + + + + + + + + + + + @@ -538,7 +619,7 @@ - + @@ -547,8 +628,10 @@ + + @@ -565,8 +648,8 @@ - + @@ -623,10 +706,17 @@ - - - + + + + + + + + + + diff --git a/js/windowMgr.js b/js/windowMgr.js index 5efb2c22..e0846e2a 100644 --- a/js/windowMgr.js +++ b/js/windowMgr.js @@ -223,6 +223,8 @@ function doCreateMainWindow(initialUrl, initialBounds, isCustomTitleBar) { } }); }); + + handlePermissionRequests(mainWindow.webContents); addWindowKey(key, mainWindow); mainWindow.loadURL(url); @@ -478,6 +480,8 @@ function doCreateMainWindow(initialUrl, initialBounds, isCustomTitleBar) { sendChildWinBoundsChange.bind(null, browserWin)); browserWin.on('move', throttledBoundsChange); browserWin.on('resize', throttledBoundsChange); + + handlePermissionRequests(browserWin.webContents); } }); } else { @@ -500,6 +504,77 @@ function doCreateMainWindow(initialUrl, initialBounds, isCustomTitleBar) { }); }); }); + + // ELECTRON-323: Handle session permission requests + function handlePermissionRequests(webContents) { + + let session = webContents.session; + + getConfigField('permissions') + .then((permissions) => { + + if (!permissions) { + log.send(logLevels.ERROR, 'permissions configuration is invalid, so, everything will be true by default!'); + return; + } + + session.setPermissionRequestHandler((sessionWebContents, permission, callback) => { + + function handleSessionPermissions(userPermission, message, cb) { + + log.send(logLevels.INFO, 'permission is -> ' + userPermission); + + if (!userPermission) { + let fullMessage = `Your administrator has disabled ${message}. Please contact your admin for help.`; + electron.dialog.showErrorBox('Permission Denied!', fullMessage); + } + + return cb(userPermission); + + } + + let PERMISSION_MEDIA = 'media'; + let PERMISSION_LOCATION = 'geolocation'; + let PERMISSION_NOTIFICATIONS = 'notifications'; + let PERMISSION_MIDI_SYSEX = 'midiSysex'; + let PERMISSION_POINTER_LOCK = 'pointerLock'; + let PERMISSION_FULL_SCREEN = 'fullscreen'; + let PERMISSION_OPEN_EXTERNAL = 'openExternal'; + + switch (permission) { + + case PERMISSION_MEDIA: + return handleSessionPermissions(permissions.media, 'sharing your camera, microphone, and speakers', callback); + + case PERMISSION_LOCATION: + return handleSessionPermissions(permissions.geolocation, 'sharing your location', callback); + + case PERMISSION_NOTIFICATIONS: + return handleSessionPermissions(permissions.notifications, 'notifications', callback); + + case PERMISSION_MIDI_SYSEX: + return handleSessionPermissions(permissions.midiSysex, 'MIDI Sysex', callback); + + case PERMISSION_POINTER_LOCK: + return handleSessionPermissions(permissions.pointerLock, 'Pointer Lock', callback); + + case PERMISSION_FULL_SCREEN: + return handleSessionPermissions(permissions.fullscreen, 'Full Screen', callback); + + case PERMISSION_OPEN_EXTERNAL: + return handleSessionPermissions(permissions.openExternal, 'Opening External App', callback); + + default: + return callback(false); + } + + }); + + }).catch((error) => { + log.send(logLevels.ERROR, 'unable to get permissions configuration, so, everything will be true by default! ' + error); + }) + + } } @@ -753,12 +828,11 @@ function checkExternalDisplay(appBounds) { const width = appBounds.width; const height = appBounds.height; const factor = 0.2; - const screen = electron.screen; - + // Loops through all the available displays and // verifies if the wrapper exists within the display bounds // returns false if not exists otherwise true - return !!screen.getAllDisplays().find(({ bounds }) => { + return !!electron.screen.getAllDisplays().find(({ bounds }) => { const leftMost = x + (width * factor); const topMost = y + (height * factor); @@ -779,9 +853,8 @@ function checkExternalDisplay(appBounds) { * was removed and if the wrapper was contained within that bounds */ function repositionMainWindow() { - const screen = electron.screen; - - const { workArea } = screen.getPrimaryDisplay(); + + const { workArea } = electron.screen.getPrimaryDisplay(); const bounds = workArea; if (!bounds) {