diff options
| author | Emīls Piņķis <emils@mullvad.net> | 2019-07-02 20:00:13 +0100 |
|---|---|---|
| committer | Emīls Piņķis <emils@mullvad.net> | 2019-07-05 16:49:28 +0100 |
| commit | 94794fe3cea82bc227963137fe65e23cf2b2903b (patch) | |
| tree | 001480cc1e50e99cfffd9d82813239eea8baf7a5 /gui | |
| parent | 0ca18fa4ae332ea119c76bed871e8372414d60c5 (diff) | |
| download | mullvadvpn-94794fe3cea82bc227963137fe65e23cf2b2903b.tar.xz mullvadvpn-94794fe3cea82bc227963137fe65e23cf2b2903b.zip | |
Add wireguard key redux actions
Diffstat (limited to 'gui')
| -rw-r--r-- | gui/src/renderer/redux/settings/actions.ts | 73 | ||||
| -rw-r--r-- | gui/src/renderer/redux/settings/reducers.ts | 117 | ||||
| -rw-r--r-- | gui/src/shared/ipc-event-channel.ts | 2 |
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>; |
