diff options
| author | David Lönnhager <david.l@mullvad.net> | 2023-01-30 12:17:28 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2023-02-01 17:38:39 +0100 |
| commit | 820bcbf9bd3db7cae550af08fb384ff30696f0f8 (patch) | |
| tree | 85d23dc2157f87ddbe28a8c2fca18e74d03d7829 /gui/src/main | |
| parent | 669f92d79a97b4de52c250189b916298a4b2570f (diff) | |
| download | mullvadvpn-820bcbf9bd3db7cae550af08fb384ff30696f0f8.tar.xz mullvadvpn-820bcbf9bd3db7cae550af08fb384ff30696f0f8.zip | |
Add 'Go to System Settings' button to launch view
Diffstat (limited to 'gui/src/main')
| -rw-r--r-- | gui/src/main/index.ts | 35 | ||||
| -rw-r--r-- | gui/src/main/user-interface.ts | 14 |
2 files changed, 48 insertions, 1 deletions
diff --git a/gui/src/main/index.ts b/gui/src/main/index.ts index 7503c24e01..40f9054958 100644 --- a/gui/src/main/index.ts +++ b/gui/src/main/index.ts @@ -1,4 +1,4 @@ -import { exec } from 'child_process'; +import { exec, execFile } from 'child_process'; import { app, nativeTheme, session, shell, systemPreferences } from 'electron'; import fs from 'fs'; import * as path from 'path'; @@ -45,6 +45,7 @@ import NotificationController, { NotificationSender, } from './notification-controller'; import * as problemReport from './problem-report'; +import { resolveBin } from './proc'; import ReconnectionBackoff from './reconnection-backoff'; import Settings, { SettingsDelegate } from './settings'; import TunnelStateHandler, { @@ -88,6 +89,7 @@ class ApplicationMain private reconnectBackoff = new ReconnectionBackoff(); private beforeFirstDaemonConnection = true; private isPerformingPostUpgrade = false; + private daemonAllowed?: boolean; private quitInitiated = false; private tunnelStateExpectation?: Expectation; @@ -384,6 +386,8 @@ class ApplicationMain systemPreferences.subscribeNotification('AppleShowScrollBarsSettingChanged', async () => { await this.updateMacOsScrollbarVisibility(); }); + + await this.checkMacOsLaunchDaemon(); } this.userInterface = new UserInterface( @@ -591,6 +595,9 @@ class ApplicationMain } else { log.info('Disconnected from the daemon'); } + if (process.platform === 'darwin') { + void this.checkMacOsLaunchDaemon(); + } }; private connectToDaemon() { @@ -677,6 +684,7 @@ class ApplicationMain tunnelState: this.tunnelState.tunnelState, settings: this.settings.all, isPerformingPostUpgrade: this.isPerformingPostUpgrade, + daemonAllowed: this.daemonAllowed, deviceState: this.account.deviceState, relayList: this.relayList, currentVersion: this.version.currentVersion, @@ -875,6 +883,31 @@ class ApplicationMain return this.settings.gui.unpinnedWindow && !this.settings.gui.startMinimized; } + private checkMacOsLaunchDaemon(): Promise<void> { + const daemonBin = resolveBin('mullvad-daemon'); + const args = ['--launch-daemon-status']; + return new Promise((resolve, _reject) => { + execFile(daemonBin, args, { windowsHide: true }, (error, stdout, stderr) => { + if (error) { + if (error.code === 2) { + IpcMainEventChannel.daemon.notifyDaemonAllowed?.(false); + this.daemonAllowed = false; + } else { + log.error( + `Error while checking launch daemon authorization status. + Stdout: ${stdout.toString()} + Stderr: ${stderr.toString()}`, + ); + } + } else { + IpcMainEventChannel.daemon.notifyDaemonAllowed?.(true); + this.daemonAllowed = true; + } + resolve(); + }); + }); + } + private async updateMacOsScrollbarVisibility(): Promise<void> { const command = 'defaults read kCFPreferencesAnyApplication AppleShowScrollBars || echo Automatic'; diff --git a/gui/src/main/user-interface.ts b/gui/src/main/user-interface.ts index 88922f3f75..78af002c58 100644 --- a/gui/src/main/user-interface.ts +++ b/gui/src/main/user-interface.ts @@ -1,6 +1,8 @@ +import { exec } from 'child_process'; import { app, BrowserWindow, dialog, Menu, nativeImage, screen, Tray } from 'electron'; import path from 'path'; import { sprintf } from 'sprintf-js'; +import { promisify } from 'util'; import { closeToExpiry, hasExpired } from '../shared/account-expiry'; import { connectEnabled, disconnectEnabled, reconnectEnabled } from '../shared/connect-helper'; @@ -20,6 +22,8 @@ import { isMacOs11OrNewer } from './platform-version'; import TrayIconController, { TrayIconType } from './tray-icon-controller'; import WindowController, { WindowControllerDelegate } from './window-controller'; +const execAsync = promisify(exec); + export interface UserInterfaceDelegate { cancelPendingNotifications(): void; resetTunnelStateAnnouncements(): void; @@ -69,6 +73,16 @@ export default class UserInterface implements WindowControllerDelegate { this.browsingFiles = false; return response; }); + + IpcMainEventChannel.app.handleShowLaunchDaemonSettings(async () => { + try { + await execAsync( + 'open -W x-apple.systempreferences:com.apple.LoginItems-Settings.extension', + ); + } catch (error) { + log.error(`Failed to open launch daemon settings: ${error}`); + } + }); } public createTrayIconController( |
