diff options
| author | Oskar Nyberg <oskar@mullvad.net> | 2021-03-29 19:49:48 +0200 |
|---|---|---|
| committer | Oskar Nyberg <oskar@mullvad.net> | 2021-04-15 15:44:20 +0200 |
| commit | 34e3441353aa00f24f9de522ad612bc59a7004b0 (patch) | |
| tree | 14e628d948b9c3b6876e261537abe5ca653b1115 /gui/src | |
| parent | 62f4ff06bdacd1e25a265b12a689e7577e9b6ed3 (diff) | |
| download | mullvadvpn-34e3441353aa00f24f9de522ad612bc59a7004b0.tar.xz mullvadvpn-34e3441353aa00f24f9de522ad612bc59a7004b0.zip | |
Persist browsed-for split-tunneling applications
Diffstat (limited to 'gui/src')
| -rw-r--r-- | gui/src/main/gui-settings.ts | 42 | ||||
| -rw-r--r-- | gui/src/renderer/redux/settings/reducers.ts | 1 | ||||
| -rw-r--r-- | gui/src/shared/gui-settings-state.ts | 4 |
3 files changed, 40 insertions, 7 deletions
diff --git a/gui/src/main/gui-settings.ts b/gui/src/main/gui-settings.ts index c7f15df75e..753f767bde 100644 --- a/gui/src/main/gui-settings.ts +++ b/gui/src/main/gui-settings.ts @@ -11,6 +11,7 @@ const settingsSchema = { monochromaticIcon: 'boolean', startMinimized: 'boolean', unpinnedWindow: 'boolean', + browsedForSplitTunnelingApplications: 'Array<string>', }; const defaultSettings: IGuiSettingsState = { @@ -20,9 +21,14 @@ const defaultSettings: IGuiSettingsState = { monochromaticIcon: false, startMinimized: false, unpinnedWindow: process.platform !== 'win32' && process.platform !== 'darwin', + browsedForSplitTunnelingApplications: [], }; export default class GuiSettings { + public onChange?: (newState: IGuiSettingsState, oldState: IGuiSettingsState) => void; + + private stateValue: IGuiSettingsState = { ...defaultSettings }; + get state(): IGuiSettingsState { return this.stateValue; } @@ -75,9 +81,16 @@ export default class GuiSettings { return this.stateValue.unpinnedWindow; } - public onChange?: (newState: IGuiSettingsState, oldState: IGuiSettingsState) => void; + public addBrowsedForSplitTunnelingapplications(newApp: string) { + this.changeStateAndNotify({ + ...this.stateValue, + browsedForSplitTunnelingApplications: [...this.browsedForSplitTunnelingApplications, newApp], + }); + } - private stateValue: IGuiSettingsState = { ...defaultSettings }; + get browsedForSplitTunnelingApplications(): Array<string> { + return this.stateValue.browsedForSplitTunnelingApplications; + } public load() { try { @@ -110,12 +123,27 @@ export default class GuiSettings { } } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private validateSettings(settings: any) { + private validateSettings(settings: Record<string, unknown>) { Object.entries(settingsSchema).forEach(([key, expectedType]) => { - const actualType = typeof settings[key]; - if (key in settings && actualType !== expectedType) { - throw new Error(`Expected ${key} to be of type ${expectedType} but was ${actualType}`); + if (/^Array<.*>/.test(expectedType)) { + const value = settings[key]; + if (!Array.isArray(value)) { + throw new Error(`Expected ${key} to be array but wasn't`); + } else { + const expectedInnerType = expectedType.replace(/^Array</, '').replace(/>$/, ''); + const innerTypes: string[] = value.map((value) => typeof value); + if ( + innerTypes.some((value) => value !== innerTypes[0]) || + innerTypes[0] !== expectedInnerType + ) { + throw new Error(`Expected ${key} to to contain ${expectedInnerType}s`); + } + } + } else { + const actualType = typeof settings[key]; + if (key in settings && actualType !== expectedType) { + throw new Error(`Expected ${key} to be of type ${expectedType} but was ${actualType}`); + } } }); diff --git a/gui/src/renderer/redux/settings/reducers.ts b/gui/src/renderer/redux/settings/reducers.ts index 592caab687..068add8e89 100644 --- a/gui/src/renderer/redux/settings/reducers.ts +++ b/gui/src/renderer/redux/settings/reducers.ts @@ -149,6 +149,7 @@ const initialState: ISettingsReduxState = { monochromaticIcon: false, startMinimized: false, unpinnedWindow: window.platform !== 'win32' && window.platform !== 'darwin', + browsedForSplitTunnelingApplications: [], }, relaySettings: { normal: { diff --git a/gui/src/shared/gui-settings-state.ts b/gui/src/shared/gui-settings-state.ts index d8fc1f1ee2..dc5bea66f5 100644 --- a/gui/src/shared/gui-settings-state.ts +++ b/gui/src/shared/gui-settings-state.ts @@ -23,4 +23,8 @@ export interface IGuiSettingsState { // Tells the app wheter or not it should act as a window or a context menu. unpinnedWindow: boolean; + + // Conains a list of filepaths to applications added to the list of applications, in the split + // tunneling view, by the user. + browsedForSplitTunnelingApplications: Array<string>; } |
