summaryrefslogtreecommitdiffhomepage
path: root/gui/src/renderer
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2019-03-26 14:17:54 +0100
committerEmīls Piņķis <emils@mullvad.net>2019-05-29 19:33:21 +0100
commite0ab65494b2730378b6134e62687a7cb6172f582 (patch)
tree8c8c8ec2b548fe74136caa174ed6e6642693fe0b /gui/src/renderer
parent43e1d284a8b54406f8ccaf75607acf5acff17e50 (diff)
downloadmullvadvpn-e0ab65494b2730378b6134e62687a7cb6172f582.tar.xz
mullvadvpn-e0ab65494b2730378b6134e62687a7cb6172f582.zip
Add shadowsocks bridge selector
Diffstat (limited to 'gui/src/renderer')
-rw-r--r--gui/src/renderer/app.tsx7
-rw-r--r--gui/src/renderer/components/AdvancedSettings.tsx37
-rw-r--r--gui/src/renderer/containers/AdvancedSettingsPage.tsx11
-rw-r--r--gui/src/renderer/redux/settings/actions.ts15
-rw-r--r--gui/src/renderer/redux/settings/reducers.ts10
5 files changed, 77 insertions, 3 deletions
diff --git a/gui/src/renderer/app.tsx b/gui/src/renderer/app.tsx
index d98c7d23e9..6ac6467b81 100644
--- a/gui/src/renderer/app.tsx
+++ b/gui/src/renderer/app.tsx
@@ -32,6 +32,7 @@ import AccountExpiry from './lib/account-expiry';
import {
AccountToken,
+ BridgeState,
ILocation,
IRelayList,
ISettings,
@@ -305,6 +306,12 @@ export default class AppRenderer {
actions.settings.updateEnableIpv6(enableIpv6);
}
+ public async setBridgeState(bridgeState: BridgeState) {
+ const actions = this.reduxActions;
+ await IpcRendererEventChannel.settings.setBridgeState(bridgeState);
+ actions.settings.updateBridgeState(bridgeState);
+ }
+
public async setBlockWhenDisconnected(blockWhenDisconnected: boolean) {
const actions = this.reduxActions;
await IpcRendererEventChannel.settings.setBlockWhenDisconnected(blockWhenDisconnected);
diff --git a/gui/src/renderer/components/AdvancedSettings.tsx b/gui/src/renderer/components/AdvancedSettings.tsx
index a1a844f8e6..5c9be492a0 100644
--- a/gui/src/renderer/components/AdvancedSettings.tsx
+++ b/gui/src/renderer/components/AdvancedSettings.tsx
@@ -2,7 +2,7 @@ import * as React from 'react';
import { Component, View } from 'reactxp';
import { sprintf } from 'sprintf-js';
import { colors } from '../../config.json';
-import { RelayProtocol } from '../../shared/daemon-rpc-types';
+import { BridgeState, RelayProtocol } from '../../shared/daemon-rpc-types';
import { messages } from '../../shared/gettext';
import styles from './AdvancedSettingsStyles';
import * as Cell from './Cell';
@@ -36,12 +36,27 @@ function mapPortToSelectorItem(value: number): ISelectorItem<number> {
return { label: value.toString(), value };
}
+function makeBridgeItems(): Array<ISelectorItem<BridgeState>> {
+ return [
+ {
+ label: messages.pgettext('advanced-settings-view', 'On'),
+ value: 'on',
+ },
+ {
+ label: messages.pgettext('advanced-settings-view', 'Off'),
+ value: 'off',
+ },
+ ];
+}
+
interface IProps {
enableIpv6: boolean;
blockWhenDisconnected: boolean;
protocol?: RelayProtocol;
mssfix?: number;
port?: number;
+ bridgeState?: BridgeState;
+ setBridgeState: (value: BridgeState) => void;
setEnableIpv6: (value: boolean) => void;
setBlockWhenDisconnected: (value: boolean) => void;
setOpenVpnMssfix: (value: number | undefined) => void;
@@ -56,6 +71,8 @@ interface IState {
}
export default class AdvancedSettings extends Component<IProps, IState> {
+ private bridgeSelectorItems = makeBridgeItems();
+
constructor(props: IProps) {
super(props);
@@ -163,6 +180,16 @@ export default class AdvancedSettings extends Component<IProps, IState> {
)}
</View>
+ <Selector
+ title={
+ // TRANSLATORS: The title for the shadowsocks bridge selector section.
+ messages.pgettext('advanced-settings-view', 'Shadowsocks bridge')
+ }
+ values={this.bridgeSelectorItems}
+ value={this.props.bridgeState}
+ onSelect={this.onSelectBridgeState}
+ />
+
<Cell.Container>
<Cell.Label>{messages.pgettext('advanced-settings-view', 'Mssfix')}</Cell.Label>
<Cell.InputFrame style={styles.advanced_settings__mssfix_frame}>
@@ -213,6 +240,14 @@ export default class AdvancedSettings extends Component<IProps, IState> {
this.props.setRelayProtocolAndPort(this.props.protocol, port);
};
+ private onSelectBridgeState = (bridgeState?: BridgeState) => {
+ if (bridgeState) {
+ this.props.setBridgeState(bridgeState);
+ } else {
+ this.props.setBridgeState('auto');
+ }
+ };
+
private onMssfixChange = (mssfixString: string) => {
const mssfix = mssfixString.replace(/[^0-9]/g, '');
diff --git a/gui/src/renderer/containers/AdvancedSettingsPage.tsx b/gui/src/renderer/containers/AdvancedSettingsPage.tsx
index 5fbdd57b25..a8784a62e2 100644
--- a/gui/src/renderer/containers/AdvancedSettingsPage.tsx
+++ b/gui/src/renderer/containers/AdvancedSettingsPage.tsx
@@ -2,7 +2,7 @@ import { goBack } from 'connected-react-router';
import log from 'electron-log';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
-import { RelayProtocol } from '../../shared/daemon-rpc-types';
+import { BridgeState, RelayProtocol } from '../../shared/daemon-rpc-types';
import AdvancedSettings from '../components/AdvancedSettings';
import RelaySettingsBuilder from '../lib/relay-settings-builder';
@@ -17,6 +17,7 @@ const mapStateToProps = (state: IReduxState) => {
enableIpv6: state.settings.enableIpv6,
blockWhenDisconnected: state.settings.blockWhenDisconnected,
mssfix: state.settings.openVpn.mssfix,
+ bridgeState: state.settings.bridgeState,
...protocolAndPort,
};
};
@@ -82,6 +83,14 @@ const mapDispatchToProps = (dispatch: ReduxDispatch, props: ISharedRouteProps) =
}
},
+ setBridgeState: async (bridgeState: BridgeState) => {
+ try {
+ await props.app.setBridgeState(bridgeState);
+ } catch (e) {
+ log.error(`Failed to update bridge state: ${e.message}`);
+ }
+ },
+
setOpenVpnMssfix: async (mssfix?: number) => {
try {
await props.app.setOpenVpnMssfix(mssfix);
diff --git a/gui/src/renderer/redux/settings/actions.ts b/gui/src/renderer/redux/settings/actions.ts
index 4587a1c513..742923276d 100644
--- a/gui/src/renderer/redux/settings/actions.ts
+++ b/gui/src/renderer/redux/settings/actions.ts
@@ -1,3 +1,4 @@
+import { BridgeState } from '../../../shared/daemon-rpc-types';
import { IGuiSettingsState } from '../../../shared/gui-settings-state';
import { IRelayLocationRedux, RelaySettingsRedux } from './reducers';
@@ -31,6 +32,11 @@ export interface IUpdateBlockWhenDisconnectedAction {
blockWhenDisconnected: boolean;
}
+export interface IUpdateBridgeStateAction {
+ type: 'UPDATE_BRIDGE_STATE';
+ bridgeState: BridgeState;
+}
+
export interface IUpdateOpenVpnMssfixAction {
type: 'UPDATE_OPENVPN_MSSFIX';
mssfix?: number;
@@ -48,6 +54,7 @@ export type SettingsAction =
| IUpdateAllowLanAction
| IUpdateEnableIpv6Action
| IUpdateBlockWhenDisconnectedAction
+ | IUpdateBridgeStateAction
| IUpdateOpenVpnMssfixAction
| IUpdateAutoStartAction;
@@ -95,6 +102,13 @@ function updateBlockWhenDisconnected(
};
}
+function updateBridgeState(bridgeState: BridgeState): IUpdateBridgeStateAction {
+ return {
+ type: 'UPDATE_BRIDGE_STATE',
+ bridgeState,
+ };
+}
+
function updateOpenVpnMssfix(mssfix?: number): IUpdateOpenVpnMssfixAction {
return {
type: 'UPDATE_OPENVPN_MSSFIX',
@@ -116,6 +130,7 @@ export default {
updateAllowLan,
updateEnableIpv6,
updateBlockWhenDisconnected,
+ updateBridgeState,
updateOpenVpnMssfix,
updateAutoStart,
};
diff --git a/gui/src/renderer/redux/settings/reducers.ts b/gui/src/renderer/redux/settings/reducers.ts
index ca02ab0db2..e2565ec0e7 100644
--- a/gui/src/renderer/redux/settings/reducers.ts
+++ b/gui/src/renderer/redux/settings/reducers.ts
@@ -1,4 +1,4 @@
-import { RelayLocation, RelayProtocol } from '../../../shared/daemon-rpc-types';
+import { BridgeState, RelayLocation, RelayProtocol } from '../../../shared/daemon-rpc-types';
import { IGuiSettingsState } from '../../../shared/gui-settings-state';
import { ReduxAction } from '../store';
@@ -48,6 +48,7 @@ export interface ISettingsReduxState {
relayLocations: IRelayLocationRedux[];
allowLan: boolean;
enableIpv6: boolean;
+ bridgeState?: BridgeState;
blockWhenDisconnected: boolean;
openVpn: {
mssfix?: number;
@@ -71,6 +72,7 @@ const initialState: ISettingsReduxState = {
relayLocations: [],
allowLan: false,
enableIpv6: true,
+ bridgeState: undefined,
blockWhenDisconnected: false,
openVpn: {},
};
@@ -131,6 +133,12 @@ export default function(
autoStart: action.autoStart,
};
+ case 'UPDATE_BRIDGE_STATE':
+ return {
+ ...state,
+ bridgeState: action.bridgeState === 'auto' ? undefined : action.bridgeState,
+ };
+
default:
return state;
}