summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-01-15 07:31:45 -0200
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-01-15 07:31:45 -0200
commiteb427a7d331f0797fe89bcac69fbb130acfaa23c (patch)
tree785bd6fa44fd768fc4f53d78dab6005de5a82008
parentb08e79578b43f523baecba5d0a189faaa20a23fa (diff)
parent511d59b5d18aba5ff0776a9960cc37e8b32f640a (diff)
downloadmullvadvpn-eb427a7d331f0797fe89bcac69fbb130acfaa23c.tar.xz
mullvadvpn-eb427a7d331f0797fe89bcac69fbb130acfaa23c.zip
Merge branch 'uncouple-app-from-tunnel'
-rw-r--r--CHANGELOG.md3
-rw-r--r--gui/packages/desktop/src/main/gui-settings.js11
-rw-r--r--gui/packages/desktop/src/main/index.js4
-rw-r--r--gui/packages/desktop/src/renderer/app.js30
-rw-r--r--gui/packages/desktop/src/renderer/components/Preferences.js14
-rw-r--r--gui/packages/desktop/src/renderer/containers/PreferencesPage.js6
-rw-r--r--gui/packages/desktop/src/renderer/redux/settings/reducers.js3
-rw-r--r--gui/packages/desktop/src/shared/gui-settings-state.js1
-rw-r--r--gui/packages/desktop/src/shared/ipc-event-channel.js5
9 files changed, 58 insertions, 19 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9e9d2afc13..c5183fae9d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -43,6 +43,9 @@ Line wrap the file at 100 chars. Th
### Changed
- Disable buttons and menus that open external links when the app knows that there is no internet
connection.
+- The auto-start and auto-connect toggles in the GUI have been reworked so that auto-connect
+ configures the GUI to automatically connect when it starts and so that it will only auto-connect
+ on boot when both settings are set.
### Fixed
- Stop GUI from glitching during the short reconnect state.
diff --git a/gui/packages/desktop/src/main/gui-settings.js b/gui/packages/desktop/src/main/gui-settings.js
index b5e1ad2e8c..a6a6efd30b 100644
--- a/gui/packages/desktop/src/main/gui-settings.js
+++ b/gui/packages/desktop/src/main/gui-settings.js
@@ -9,6 +9,7 @@ import type { GuiSettingsState } from '../shared/gui-settings-state';
export default class GuiSettings {
_state: GuiSettingsState = {
+ autoConnect: true,
monochromaticIcon: false,
startMinimized: false,
};
@@ -21,6 +22,8 @@ export default class GuiSettings {
const contents = fs.readFileSync(settingsFile, 'utf8');
const settings = JSON.parse(contents);
+ this._state.autoConnect =
+ typeof settings.autoConnect === 'boolean' ? settings.autoConnect : true;
this._state.monochromaticIcon = settings.monochromaticIcon || false;
this._state.startMinimized = settings.startMinimized || false;
} catch (error) {
@@ -42,6 +45,14 @@ export default class GuiSettings {
return this._state;
}
+ set autoConnect(newValue: boolean) {
+ this._changeStateAndNotify({ ...this._state, autoConnect: newValue });
+ }
+
+ get autoConnect(): boolean {
+ return this._state.autoConnect;
+ }
+
set monochromaticIcon(newValue: boolean) {
this._changeStateAndNotify({ ...this._state, monochromaticIcon: newValue });
}
diff --git a/gui/packages/desktop/src/main/index.js b/gui/packages/desktop/src/main/index.js
index 5da25f39de..683ec5db55 100644
--- a/gui/packages/desktop/src/main/index.js
+++ b/gui/packages/desktop/src/main/index.js
@@ -760,6 +760,10 @@ const ApplicationMain = {
guiSettings: this._guiSettings.state,
}));
+ IpcMainEventChannel.guiSettings.handleAutoConnect((autoConnect: boolean) => {
+ this._guiSettings.autoConnect = autoConnect;
+ });
+
IpcMainEventChannel.guiSettings.handleStartMinimized((startMinimized: boolean) => {
this._guiSettings.startMinimized = startMinimized;
});
diff --git a/gui/packages/desktop/src/renderer/app.js b/gui/packages/desktop/src/renderer/app.js
index 793b0a9224..7235a6a836 100644
--- a/gui/packages/desktop/src/renderer/app.js
+++ b/gui/packages/desktop/src/renderer/app.js
@@ -14,6 +14,7 @@ import { createMemoryHistory } from 'history';
import { InvalidAccountError } from '../main/errors';
import makeRoutes from './routes';
+import { getOpenAtLogin, setOpenAtLogin } from './lib/autostart';
import configureStore from './redux/store';
import accountActions from './redux/account/actions';
@@ -343,10 +344,28 @@ export default class AppRenderer {
async setAutoConnect(autoConnect: boolean) {
const actions = this._reduxActions;
- await this._daemonRpc.setAutoConnect(autoConnect);
+ await IpcRendererEventChannel.guiSettings.setAutoConnect(autoConnect);
+ await this._setDaemonAutoConnect(autoConnect, getOpenAtLogin());
actions.settings.updateAutoConnect(autoConnect);
}
+ _getAutoConnect(): boolean {
+ return this._reduxStore.getState().settings.guiSettings.autoConnect;
+ }
+
+ async setAutoStart(autoStart: boolean) {
+ await setOpenAtLogin(autoStart);
+ await this._setDaemonAutoConnect(this._getAutoConnect(), autoStart);
+ }
+
+ async _setDaemonAutoConnect(guiAutoConnect: boolean, autoStart: boolean) {
+ const daemonAutoConnect = guiAutoConnect && autoStart;
+
+ if (daemonAutoConnect !== this._settings.autoConnect) {
+ await this._daemonRpc.setAutoConnect(daemonAutoConnect);
+ }
+ }
+
setStartMinimized(startMinimized: boolean) {
IpcRendererEventChannel.guiSettings.setStartMinimized(startMinimized);
}
@@ -435,15 +454,17 @@ export default class AppRenderer {
const accountToken = this._settings.accountToken;
if (accountToken) {
- if (process.env.NODE_ENV !== 'development') {
+ if (process.env.NODE_ENV === 'development') {
+ log.debug('Skip autoconnect in development');
+ } else if (!this._getAutoConnect()) {
+ log.debug('Skip autoconnect because GUI setting is disabled');
+ } else {
try {
log.debug('Autoconnect the tunnel');
await this.connectTunnel();
} catch (error) {
log.error(`Failed to autoconnect the tunnel: ${error.message}`);
}
- } else {
- log.debug('Skip autoconnect in development');
}
} else {
log.debug('Skip autoconnect because account token is not set');
@@ -490,7 +511,6 @@ export default class AppRenderer {
const reduxSettings = this._reduxActions.settings;
reduxSettings.updateAllowLan(newSettings.allowLan);
- reduxSettings.updateAutoConnect(newSettings.autoConnect);
reduxSettings.updateEnableIpv6(newSettings.tunnelOptions.enableIpv6);
reduxSettings.updateBlockWhenDisconnected(newSettings.blockWhenDisconnected);
reduxSettings.updateOpenVpnMssfix(newSettings.tunnelOptions.openvpn.mssfix);
diff --git a/gui/packages/desktop/src/renderer/components/Preferences.js b/gui/packages/desktop/src/renderer/components/Preferences.js
index 53ed912798..19ae96f338 100644
--- a/gui/packages/desktop/src/renderer/components/Preferences.js
+++ b/gui/packages/desktop/src/renderer/components/Preferences.js
@@ -64,20 +64,16 @@ export default class Preferences extends Component<PreferencesProps, State> {
<View style={styles.preferences__content}>
<Cell.Container>
- <Cell.Label>Auto-connect</Cell.Label>
- <Switch isOn={this.props.autoConnect} onChange={this.props.setAutoConnect} />
+ <Cell.Label>Launch app on start-up</Cell.Label>
+ <Switch isOn={this.state.autoStart} onChange={this._onChangeAutoStart} />
</Cell.Container>
- <Cell.Footer>
- Automatically connect to the VPN at the earliest moment during computer
- boot-up.
- </Cell.Footer>
<Cell.Container>
- <Cell.Label>Auto-launch</Cell.Label>
- <Switch isOn={this.state.autoStart} onChange={this._onChangeAutoStart} />
+ <Cell.Label>Auto-connect</Cell.Label>
+ <Switch isOn={this.props.autoConnect} onChange={this.props.setAutoConnect} />
</Cell.Container>
<Cell.Footer>
- Automatically launch the app when logging in to the computer.
+ Automatically connect to a server when the app launches.
</Cell.Footer>
<Cell.Container>
diff --git a/gui/packages/desktop/src/renderer/containers/PreferencesPage.js b/gui/packages/desktop/src/renderer/containers/PreferencesPage.js
index a64381aa86..565160c528 100644
--- a/gui/packages/desktop/src/renderer/containers/PreferencesPage.js
+++ b/gui/packages/desktop/src/renderer/containers/PreferencesPage.js
@@ -5,13 +5,13 @@ import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { goBack } from 'connected-react-router';
import Preferences from '../components/Preferences';
-import { getOpenAtLogin, setOpenAtLogin } from '../lib/autostart';
+import { getOpenAtLogin } from '../lib/autostart';
import type { ReduxState, ReduxDispatch } from '../redux/store';
import type { SharedRouteProps } from '../routes';
const mapStateToProps = (state: ReduxState) => ({
- autoConnect: state.settings.autoConnect,
+ autoConnect: state.settings.guiSettings.autoConnect,
allowLan: state.settings.allowLan,
monochromaticIcon: state.settings.guiSettings.monochromaticIcon,
startMinimized: state.settings.guiSettings.startMinimized,
@@ -28,7 +28,7 @@ const mapDispatchToProps = (dispatch: ReduxDispatch, props: SharedRouteProps) =>
},
setAutoStart: async (autoStart) => {
try {
- await setOpenAtLogin(autoStart);
+ await props.app.setAutoStart(autoStart);
} catch (error) {
log.error(`Cannot set auto-start: ${error.message}`);
}
diff --git a/gui/packages/desktop/src/renderer/redux/settings/reducers.js b/gui/packages/desktop/src/renderer/redux/settings/reducers.js
index 99795c41ba..7f5d1c42ef 100644
--- a/gui/packages/desktop/src/renderer/redux/settings/reducers.js
+++ b/gui/packages/desktop/src/renderer/redux/settings/reducers.js
@@ -48,7 +48,6 @@ export type SettingsReduxState = {
guiSettings: GuiSettingsState,
relaySettings: RelaySettingsRedux,
relayLocations: Array<RelayLocationRedux>,
- autoConnect: boolean,
allowLan: boolean,
enableIpv6: boolean,
blockWhenDisconnected: boolean,
@@ -59,6 +58,7 @@ export type SettingsReduxState = {
const initialState: SettingsReduxState = {
guiSettings: {
+ autoConnect: true,
monochromaticIcon: false,
startMinimized: false,
},
@@ -70,7 +70,6 @@ const initialState: SettingsReduxState = {
},
},
relayLocations: [],
- autoConnect: false,
allowLan: false,
enableIpv6: true,
blockWhenDisconnected: false,
diff --git a/gui/packages/desktop/src/shared/gui-settings-state.js b/gui/packages/desktop/src/shared/gui-settings-state.js
index 4a7ccb572e..336e019d1d 100644
--- a/gui/packages/desktop/src/shared/gui-settings-state.js
+++ b/gui/packages/desktop/src/shared/gui-settings-state.js
@@ -1,6 +1,7 @@
// @flow
export type GuiSettingsState = {
+ autoConnect: boolean,
monochromaticIcon: boolean,
startMinimized: boolean,
};
diff --git a/gui/packages/desktop/src/shared/ipc-event-channel.js b/gui/packages/desktop/src/shared/ipc-event-channel.js
index 06c5f9620e..d54009dfdb 100644
--- a/gui/packages/desktop/src/shared/ipc-event-channel.js
+++ b/gui/packages/desktop/src/shared/ipc-event-channel.js
@@ -35,11 +35,13 @@ interface Receiver<T> {
}
interface GuiSettingsMethods {
+ setAutoConnect: (boolean) => void;
setStartMinimized: (boolean) => void;
setMonochromaticIcon: (boolean) => void;
}
interface GuiSettingsHandlers {
+ handleAutoConnect: ((boolean) => void) => void;
handleStartMinimized: ((boolean) => void) => void;
handleMonochromaticIcon: ((boolean) => void) => void;
}
@@ -66,6 +68,7 @@ const CURRENT_VERSION_CHANGED = 'current-version-changed';
const UPGRADE_VERSION_CHANGED = 'upgrade-version-changed';
const GUI_SETTINGS_CHANGED = 'gui-settings-changed';
+const SET_AUTO_CONNECT = 'set-auto-connect';
const SET_MONOCHROMATIC_ICON = 'set-monochromatic-icon';
const SET_START_MINIMIZED = 'set-start-minimized';
const GET_APP_STATE = 'get-app-state';
@@ -119,6 +122,7 @@ export class IpcRendererEventChannel {
static guiSettings: Receiver<GuiSettingsState> & GuiSettingsMethods = {
listen: listen(GUI_SETTINGS_CHANGED),
+ setAutoConnect: set(SET_AUTO_CONNECT),
setMonochromaticIcon: set(SET_MONOCHROMATIC_ICON),
setStartMinimized: set(SET_START_MINIMIZED),
};
@@ -172,6 +176,7 @@ export class IpcMainEventChannel {
static guiSettings: Sender<GuiSettingsState> & GuiSettingsHandlers = {
notify: sender(GUI_SETTINGS_CHANGED),
+ handleAutoConnect: handler(SET_AUTO_CONNECT),
handleMonochromaticIcon: handler(SET_MONOCHROMATIC_ICON),
handleStartMinimized: handler(SET_START_MINIMIZED),
};