summaryrefslogtreecommitdiffhomepage
path: root/gui
diff options
context:
space:
mode:
authorEmīls Piņķis <emils@mullvad.net>2019-07-02 20:00:13 +0100
committerEmīls Piņķis <emils@mullvad.net>2019-07-05 16:49:28 +0100
commit94794fe3cea82bc227963137fe65e23cf2b2903b (patch)
tree001480cc1e50e99cfffd9d82813239eea8baf7a5 /gui
parent0ca18fa4ae332ea119c76bed871e8372414d60c5 (diff)
downloadmullvadvpn-94794fe3cea82bc227963137fe65e23cf2b2903b.tar.xz
mullvadvpn-94794fe3cea82bc227963137fe65e23cf2b2903b.zip
Add wireguard key redux actions
Diffstat (limited to 'gui')
-rw-r--r--gui/src/renderer/redux/settings/actions.ts73
-rw-r--r--gui/src/renderer/redux/settings/reducers.ts117
-rw-r--r--gui/src/shared/ipc-event-channel.ts2
3 files changed, 188 insertions, 4 deletions
diff --git a/gui/src/renderer/redux/settings/actions.ts b/gui/src/renderer/redux/settings/actions.ts
index 742923276d..6c87c18fa9 100644
--- a/gui/src/renderer/redux/settings/actions.ts
+++ b/gui/src/renderer/redux/settings/actions.ts
@@ -1,4 +1,4 @@
-import { BridgeState } from '../../../shared/daemon-rpc-types';
+import { BridgeState, KeygenEvent } from '../../../shared/daemon-rpc-types';
import { IGuiSettingsState } from '../../../shared/gui-settings-state';
import { IRelayLocationRedux, RelaySettingsRedux } from './reducers';
@@ -47,6 +47,31 @@ export interface IUpdateAutoStartAction {
autoStart: boolean;
}
+// Used to set wireguard key when accounts are changed.
+export interface IWireguardSetKey {
+ type: 'SET_WIREGUARD_KEY';
+ publicKey?: string;
+}
+
+export interface IWireguardGenerateKey {
+ type: 'GENERATE_WIREGUARD_KEY';
+}
+
+export interface IWireguardVerifyKey {
+ type: 'VERIFY_WIREGUARD_KEY';
+ publicKey: string;
+}
+
+export interface IWireguardKeygenEvent {
+ type: 'WIREGUARD_KEYGEN_EVENT';
+ event: KeygenEvent;
+}
+
+export interface IWireguardKeyVerifiedAction {
+ type: 'WIREGUARD_KEY_VERIFICATION_COMPLETE';
+ verified: boolean;
+}
+
export type SettingsAction =
| IUpdateGuiSettingsAction
| IUpdateRelayAction
@@ -56,7 +81,12 @@ export type SettingsAction =
| IUpdateBlockWhenDisconnectedAction
| IUpdateBridgeStateAction
| IUpdateOpenVpnMssfixAction
- | IUpdateAutoStartAction;
+ | IUpdateAutoStartAction
+ | IWireguardSetKey
+ | IWireguardVerifyKey
+ | IWireguardGenerateKey
+ | IWireguardKeygenEvent
+ | IWireguardKeyVerifiedAction;
function updateGuiSettings(guiSettings: IGuiSettingsState): IUpdateGuiSettingsAction {
return {
@@ -123,6 +153,40 @@ function updateAutoStart(autoStart: boolean): IUpdateAutoStartAction {
};
}
+function setWireguardKey(publicKey?: string): IWireguardSetKey {
+ return {
+ type: 'SET_WIREGUARD_KEY',
+ publicKey,
+ };
+}
+
+function setWireguardKeygenEvent(event: KeygenEvent): IWireguardKeygenEvent {
+ return {
+ type: 'WIREGUARD_KEYGEN_EVENT',
+ event,
+ };
+}
+
+function generateWireguardKey(): IWireguardGenerateKey {
+ return {
+ type: 'GENERATE_WIREGUARD_KEY',
+ };
+}
+
+function verifyWireguardKey(publicKey: string): IWireguardVerifyKey {
+ return {
+ type: 'VERIFY_WIREGUARD_KEY',
+ publicKey,
+ };
+}
+
+function completeWireguardKeyVerification(verified: boolean): IWireguardKeyVerifiedAction {
+ return {
+ type: 'WIREGUARD_KEY_VERIFICATION_COMPLETE',
+ verified,
+ };
+}
+
export default {
updateGuiSettings,
updateRelay,
@@ -133,4 +197,9 @@ export default {
updateBridgeState,
updateOpenVpnMssfix,
updateAutoStart,
+ setWireguardKey,
+ setWireguardKeygenEvent,
+ generateWireguardKey,
+ verifyWireguardKey,
+ completeWireguardKeyVerification,
};
diff --git a/gui/src/renderer/redux/settings/reducers.ts b/gui/src/renderer/redux/settings/reducers.ts
index 6c652f887d..97a6a21ee4 100644
--- a/gui/src/renderer/redux/settings/reducers.ts
+++ b/gui/src/renderer/redux/settings/reducers.ts
@@ -1,4 +1,10 @@
-import { BridgeState, RelayLocation, RelayProtocol } from '../../../shared/daemon-rpc-types';
+import log from 'electron-log';
+import {
+ BridgeState,
+ KeygenEvent,
+ RelayLocation,
+ RelayProtocol,
+} from '../../../shared/daemon-rpc-types';
import { IGuiSettingsState } from '../../../shared/gui-settings-state';
import { ReduxAction } from '../store';
@@ -41,6 +47,41 @@ export interface IRelayLocationRedux {
cities: IRelayLocationCityRedux[];
}
+interface IWgKeySet {
+ type: 'key-set';
+ publicKey: string;
+ valid?: boolean;
+}
+
+interface IWgKeyNotSet {
+ type: 'key-not-set';
+}
+
+interface IWgTooManyKeys {
+ type: 'too-many-keys';
+}
+
+interface IWgKeyGenerationFailure {
+ type: 'generation-failure';
+}
+
+interface IWgKeyBeingGenerated {
+ type: 'being-generated';
+}
+
+interface IWgKeyBeingVerified {
+ type: 'being-verified';
+ publicKey: string;
+}
+
+export type WgKeyState =
+ | IWgKeySet
+ | IWgKeyNotSet
+ | IWgKeyGenerationFailure
+ | IWgTooManyKeys
+ | IWgKeyBeingVerified
+ | IWgKeyBeingGenerated;
+
export interface ISettingsReduxState {
autoStart: boolean;
guiSettings: IGuiSettingsState;
@@ -53,6 +94,7 @@ export interface ISettingsReduxState {
openVpn: {
mssfix?: number;
};
+ wireguardKeyState: WgKeyState;
}
const initialState: ISettingsReduxState = {
@@ -76,6 +118,9 @@ const initialState: ISettingsReduxState = {
bridgeState: 'auto',
blockWhenDisconnected: false,
openVpn: {},
+ wireguardKeyState: {
+ type: 'key-not-set',
+ },
};
export default function(
@@ -140,7 +185,77 @@ export default function(
bridgeState: action.bridgeState,
};
+ case 'SET_WIREGUARD_KEY':
+ return {
+ ...state,
+ wireguardKeyState: setWireguardKey(action.publicKey),
+ };
+ case 'WIREGUARD_KEYGEN_EVENT':
+ return {
+ ...state,
+ wireguardKeyState: setWireguardKeygenEvent(action.event),
+ };
+ case 'WIREGUARD_KEY_VERIFICATION_COMPLETE':
+ return {
+ ...state,
+ wireguardKeyState: applyKeyVerification(state.wireguardKeyState, action.verified),
+ };
+ case 'VERIFY_WIREGUARD_KEY':
+ return {
+ ...state,
+ wireguardKeyState: { type: 'being-verified', publicKey: action.publicKey },
+ };
+
+ case 'GENERATE_WIREGUARD_KEY':
+ return {
+ ...state,
+ wireguardKeyState: { type: 'being-generated' },
+ };
+
+ default:
+ return state;
+ }
+}
+
+function setWireguardKey(publicKey?: string): WgKeyState {
+ if (publicKey) {
+ return {
+ type: 'key-set',
+ publicKey,
+ };
+ } else {
+ return {
+ type: 'key-not-set',
+ };
+ }
+}
+
+function setWireguardKeygenEvent(keygenEvent: KeygenEvent): WgKeyState {
+ switch (keygenEvent) {
+ case 'too_many_keys':
+ return { type: 'too-many-keys' };
+ case 'generation_failure':
+ return { type: 'generation-failure' };
+ default:
+ return {
+ type: 'key-set',
+ publicKey: keygenEvent.newKey,
+ valid: true,
+ };
+ }
+}
+
+function applyKeyVerification(state: WgKeyState, verified: boolean): WgKeyState {
+ switch (state.type) {
+ case 'being-verified':
+ return {
+ ...state,
+ type: 'key-set',
+ valid: verified,
+ };
+ // drop the verification event if the key wasn't being verified.
default:
+ log.error(`Received key verification event when key wasn't being verified`);
return state;
}
}
diff --git a/gui/src/shared/ipc-event-channel.ts b/gui/src/shared/ipc-event-channel.ts
index 73457c3f9d..2bb594f5e6 100644
--- a/gui/src/shared/ipc-event-channel.ts
+++ b/gui/src/shared/ipc-event-channel.ts
@@ -114,7 +114,7 @@ interface IAutoStartHandlers extends ISender<boolean> {
handleSet(fn: (value: boolean) => Promise<void>): void;
}
-interface IWireguardKeyMethods extends IReceiver<string> {
+interface IWireguardKeyMethods extends IReceiver<string | undefined> {
listenKeygenEvents(fn: (event: KeygenEvent) => void): void;
generateKey(): Promise<KeygenEvent>;
verifyKey(): Promise<boolean>;