summaryrefslogtreecommitdiffhomepage
path: root/gui/src/main
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2023-01-30 12:17:28 +0100
committerDavid Lönnhager <david.l@mullvad.net>2023-02-01 17:38:39 +0100
commit820bcbf9bd3db7cae550af08fb384ff30696f0f8 (patch)
tree85d23dc2157f87ddbe28a8c2fca18e74d03d7829 /gui/src/main
parent669f92d79a97b4de52c250189b916298a4b2570f (diff)
downloadmullvadvpn-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.ts35
-rw-r--r--gui/src/main/user-interface.ts14
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(