Skip to content

Commit dd8ca73

Browse files
committed
Make Windows split tunneling types more general
1 parent 503caab commit dd8ca73

File tree

9 files changed

+653
-572
lines changed

9 files changed

+653
-572
lines changed

gui/src/main/index.ts

+36-29
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import util from 'util';
66

77
import config from '../config.json';
88
import { hasExpired } from '../shared/account-expiry';
9-
import { IWindowsApplication } from '../shared/application-types';
9+
import {
10+
ISplitTunnelingApplication,
11+
ISplitTunnelingAppListRetriever,
12+
} from '../shared/application-types';
1013
import {
1114
AccessMethodSetting,
1215
DaemonEvent,
@@ -67,7 +70,7 @@ const execAsync = util.promisify(exec);
6770

6871
// Only import split tunneling library on correct OS.
6972
const linuxSplitTunneling = process.platform === 'linux' && require('./linux-split-tunneling');
70-
const windowsSplitTunneling = process.platform === 'win32' && require('./windows-split-tunneling');
73+
const splitTunneling: ISplitTunnelingAppListRetriever | undefined = importSplitTunneling();
7174

7275
const ALLOWED_PERMISSIONS = ['clipboard-sanitized-write'];
7376

@@ -110,7 +113,7 @@ class ApplicationMain
110113
private rendererLog?: Logger;
111114
private translations: ITranslations = { locale: this.locale };
112115

113-
private windowsSplitTunnelingApplications?: IWindowsApplication[];
116+
private splitTunnelingApplications?: ISplitTunnelingApplication[];
114117

115118
private macOsScrollbarVisibility?: MacOsScrollbarVisibility;
116119

@@ -723,9 +726,7 @@ class ApplicationMain
723726

724727
IpcMainEventChannel.settings.notify?.(newSettings);
725728

726-
if (windowsSplitTunneling) {
727-
void this.updateSplitTunnelingApplications(newSettings.splitTunnel.appsList);
728-
}
729+
void this.updateSplitTunnelingApplications(newSettings.splitTunnel.appsList);
729730
}
730731

731732
private setRelayList(relayList: IRelayListWithEndpointData) {
@@ -734,12 +735,12 @@ class ApplicationMain
734735
}
735736

736737
private async updateSplitTunnelingApplications(appList: string[]): Promise<void> {
737-
const { applications } = await windowsSplitTunneling.getApplications({
738-
applicationPaths: appList,
739-
});
740-
this.windowsSplitTunnelingApplications = applications;
738+
if (splitTunneling) {
739+
const { applications } = await splitTunneling.getMetadataForApplications(appList);
740+
this.splitTunnelingApplications = applications;
741741

742-
IpcMainEventChannel.windowsSplitTunneling.notify?.(applications);
742+
IpcMainEventChannel.splitTunneling.notify?.(applications);
743+
}
743744
}
744745

745746
private registerIpcListeners() {
@@ -758,7 +759,7 @@ class ApplicationMain
758759
upgradeVersion: this.version.upgradeVersion,
759760
guiSettings: this.settings.gui.state,
760761
translations: this.translations,
761-
windowsSplitTunnelingApplications: this.windowsSplitTunnelingApplications,
762+
splitTunnelingApplications: this.splitTunnelingApplications,
762763
macOsScrollbarVisibility: this.macOsScrollbarVisibility,
763764
changelog: this.changelog ?? [],
764765
forceShowChanges: CommandLineOptions.showChanges.match,
@@ -789,38 +790,38 @@ class ApplicationMain
789790
IpcMainEventChannel.linuxSplitTunneling.handleGetApplications(() => {
790791
return linuxSplitTunneling.getApplications(this.locale);
791792
});
792-
IpcMainEventChannel.windowsSplitTunneling.handleGetApplications((updateCaches: boolean) => {
793-
return windowsSplitTunneling.getApplications({ updateCaches });
793+
IpcMainEventChannel.splitTunneling.handleGetApplications((updateCaches: boolean) => {
794+
return splitTunneling!.getApplications(updateCaches);
794795
});
795796
IpcMainEventChannel.linuxSplitTunneling.handleLaunchApplication((application) => {
796797
return linuxSplitTunneling.launchApplication(application);
797798
});
798799

799-
IpcMainEventChannel.windowsSplitTunneling.handleSetState((enabled) => {
800+
IpcMainEventChannel.splitTunneling.handleSetState((enabled) => {
800801
return this.daemonRpc.setSplitTunnelingState(enabled);
801802
});
802-
IpcMainEventChannel.windowsSplitTunneling.handleAddApplication(async (application) => {
803+
IpcMainEventChannel.splitTunneling.handleAddApplication(async (application) => {
803804
// If the applications is a string (path) it's an application picked with the file picker
804805
// that we want to add to the list of additional applications.
805806
if (typeof application === 'string') {
806807
this.settings.gui.addBrowsedForSplitTunnelingApplications(application);
807-
const applicationPath = await windowsSplitTunneling.addApplicationPathToCache(application);
808-
await this.daemonRpc.addSplitTunnelingApplication(applicationPath);
808+
const executablePath = await splitTunneling!.resolveExecutablePath(application);
809+
await splitTunneling!.addApplicationPathToCache(application);
810+
await this.daemonRpc.addSplitTunnelingApplication(executablePath);
809811
} else {
810812
await this.daemonRpc.addSplitTunnelingApplication(application.absolutepath);
811813
}
812814
});
813-
IpcMainEventChannel.windowsSplitTunneling.handleRemoveApplication((application) => {
815+
IpcMainEventChannel.splitTunneling.handleRemoveApplication((application) => {
814816
return this.daemonRpc.removeSplitTunnelingApplication(
815817
typeof application === 'string' ? application : application.absolutepath,
816818
);
817819
});
818-
IpcMainEventChannel.windowsSplitTunneling.handleForgetManuallyAddedApplication(
819-
(application) => {
820-
this.settings.gui.deleteBrowsedForSplitTunnelingApplications(application.absolutepath);
821-
return windowsSplitTunneling.removeApplicationFromCache(application);
822-
},
823-
);
820+
IpcMainEventChannel.splitTunneling.handleForgetManuallyAddedApplication((application) => {
821+
this.settings.gui.deleteBrowsedForSplitTunnelingApplications(application.absolutepath);
822+
splitTunneling!.removeApplicationFromCache(application);
823+
return Promise.resolve();
824+
});
824825

825826
IpcMainEventChannel.app.handleQuit(() => this.disconnectAndQuit());
826827
IpcMainEventChannel.app.handleOpenUrl(async (url) => {
@@ -851,10 +852,10 @@ class ApplicationMain
851852
this.settings.registerIpcListeners();
852853
this.account.registerIpcListeners();
853854

854-
if (windowsSplitTunneling) {
855-
this.settings.gui.browsedForSplitTunnelingApplications.forEach(
856-
windowsSplitTunneling.addApplicationPathToCache,
857-
);
855+
if (splitTunneling) {
856+
this.settings.gui.browsedForSplitTunnelingApplications.forEach((application) => {
857+
void splitTunneling.addApplicationPathToCache(application);
858+
});
858859
}
859860
}
860861

@@ -1104,6 +1105,12 @@ class ApplicationMain
11041105
/* eslint-enable @typescript-eslint/member-ordering */
11051106
}
11061107

1108+
function importSplitTunneling() {
1109+
// eslint-disable-next-line @typescript-eslint/no-var-requires
1110+
const { WindowsSplitTunnelingAppListRetriever } = require('./windows-split-tunneling');
1111+
return new WindowsSplitTunnelingAppListRetriever();
1112+
}
1113+
11071114
if (CommandLineOptions.help.match) {
11081115
console.log('Mullvad VPN');
11091116
console.log('Graphical interface for managing the Mullvad VPN daemon');

0 commit comments

Comments
 (0)