summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOskar Nyberg <oskar@mullvad.net>2021-03-29 19:49:48 +0200
committerOskar Nyberg <oskar@mullvad.net>2021-04-15 15:44:20 +0200
commit34e3441353aa00f24f9de522ad612bc59a7004b0 (patch)
tree14e628d948b9c3b6876e261537abe5ca653b1115
parent62f4ff06bdacd1e25a265b12a689e7577e9b6ed3 (diff)
downloadmullvadvpn-34e3441353aa00f24f9de522ad612bc59a7004b0.tar.xz
mullvadvpn-34e3441353aa00f24f9de522ad612bc59a7004b0.zip
Persist browsed-for split-tunneling applications
-rw-r--r--gui/src/main/gui-settings.ts42
-rw-r--r--gui/src/renderer/redux/settings/reducers.ts1
-rw-r--r--gui/src/shared/gui-settings-state.ts4
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>;
}