@@ -6,7 +6,10 @@ import util from 'util';
6
6
7
7
import config from '../config.json' ;
8
8
import { hasExpired } from '../shared/account-expiry' ;
9
- import { IWindowsApplication } from '../shared/application-types' ;
9
+ import {
10
+ ISplitTunnelingApplication ,
11
+ ISplitTunnelingAppListRetriever ,
12
+ } from '../shared/application-types' ;
10
13
import {
11
14
AccessMethodSetting ,
12
15
DaemonEvent ,
@@ -67,7 +70,7 @@ const execAsync = util.promisify(exec);
67
70
68
71
// Only import split tunneling library on correct OS.
69
72
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 ( ) ;
71
74
72
75
const ALLOWED_PERMISSIONS = [ 'clipboard-sanitized-write' ] ;
73
76
@@ -110,7 +113,7 @@ class ApplicationMain
110
113
private rendererLog ?: Logger ;
111
114
private translations : ITranslations = { locale : this . locale } ;
112
115
113
- private windowsSplitTunnelingApplications ?: IWindowsApplication [ ] ;
116
+ private splitTunnelingApplications ?: ISplitTunnelingApplication [ ] ;
114
117
115
118
private macOsScrollbarVisibility ?: MacOsScrollbarVisibility ;
116
119
@@ -723,9 +726,7 @@ class ApplicationMain
723
726
724
727
IpcMainEventChannel . settings . notify ?.( newSettings ) ;
725
728
726
- if ( windowsSplitTunneling ) {
727
- void this . updateSplitTunnelingApplications ( newSettings . splitTunnel . appsList ) ;
728
- }
729
+ void this . updateSplitTunnelingApplications ( newSettings . splitTunnel . appsList ) ;
729
730
}
730
731
731
732
private setRelayList ( relayList : IRelayListWithEndpointData ) {
@@ -734,12 +735,12 @@ class ApplicationMain
734
735
}
735
736
736
737
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 ;
741
741
742
- IpcMainEventChannel . windowsSplitTunneling . notify ?.( applications ) ;
742
+ IpcMainEventChannel . splitTunneling . notify ?.( applications ) ;
743
+ }
743
744
}
744
745
745
746
private registerIpcListeners ( ) {
@@ -758,7 +759,7 @@ class ApplicationMain
758
759
upgradeVersion : this . version . upgradeVersion ,
759
760
guiSettings : this . settings . gui . state ,
760
761
translations : this . translations ,
761
- windowsSplitTunnelingApplications : this . windowsSplitTunnelingApplications ,
762
+ splitTunnelingApplications : this . splitTunnelingApplications ,
762
763
macOsScrollbarVisibility : this . macOsScrollbarVisibility ,
763
764
changelog : this . changelog ?? [ ] ,
764
765
forceShowChanges : CommandLineOptions . showChanges . match ,
@@ -789,38 +790,38 @@ class ApplicationMain
789
790
IpcMainEventChannel . linuxSplitTunneling . handleGetApplications ( ( ) => {
790
791
return linuxSplitTunneling . getApplications ( this . locale ) ;
791
792
} ) ;
792
- IpcMainEventChannel . windowsSplitTunneling . handleGetApplications ( ( updateCaches : boolean ) => {
793
- return windowsSplitTunneling . getApplications ( { updateCaches } ) ;
793
+ IpcMainEventChannel . splitTunneling . handleGetApplications ( ( updateCaches : boolean ) => {
794
+ return splitTunneling ! . getApplications ( updateCaches ) ;
794
795
} ) ;
795
796
IpcMainEventChannel . linuxSplitTunneling . handleLaunchApplication ( ( application ) => {
796
797
return linuxSplitTunneling . launchApplication ( application ) ;
797
798
} ) ;
798
799
799
- IpcMainEventChannel . windowsSplitTunneling . handleSetState ( ( enabled ) => {
800
+ IpcMainEventChannel . splitTunneling . handleSetState ( ( enabled ) => {
800
801
return this . daemonRpc . setSplitTunnelingState ( enabled ) ;
801
802
} ) ;
802
- IpcMainEventChannel . windowsSplitTunneling . handleAddApplication ( async ( application ) => {
803
+ IpcMainEventChannel . splitTunneling . handleAddApplication ( async ( application ) => {
803
804
// If the applications is a string (path) it's an application picked with the file picker
804
805
// that we want to add to the list of additional applications.
805
806
if ( typeof application === 'string' ) {
806
807
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 ) ;
809
811
} else {
810
812
await this . daemonRpc . addSplitTunnelingApplication ( application . absolutepath ) ;
811
813
}
812
814
} ) ;
813
- IpcMainEventChannel . windowsSplitTunneling . handleRemoveApplication ( ( application ) => {
815
+ IpcMainEventChannel . splitTunneling . handleRemoveApplication ( ( application ) => {
814
816
return this . daemonRpc . removeSplitTunnelingApplication (
815
817
typeof application === 'string' ? application : application . absolutepath ,
816
818
) ;
817
819
} ) ;
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
+ } ) ;
824
825
825
826
IpcMainEventChannel . app . handleQuit ( ( ) => this . disconnectAndQuit ( ) ) ;
826
827
IpcMainEventChannel . app . handleOpenUrl ( async ( url ) => {
@@ -851,10 +852,10 @@ class ApplicationMain
851
852
this . settings . registerIpcListeners ( ) ;
852
853
this . account . registerIpcListeners ( ) ;
853
854
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
+ } ) ;
858
859
}
859
860
}
860
861
@@ -1104,6 +1105,12 @@ class ApplicationMain
1104
1105
/* eslint-enable @typescript-eslint/member-ordering */
1105
1106
}
1106
1107
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
+
1107
1114
if ( CommandLineOptions . help . match ) {
1108
1115
console . log ( 'Mullvad VPN' ) ;
1109
1116
console . log ( 'Graphical interface for managing the Mullvad VPN daemon' ) ;
0 commit comments