summaryrefslogtreecommitdiffhomepage
path: root/app
diff options
context:
space:
mode:
authorLinus Färnstrand <linus@mullvad.net>2018-01-16 10:31:37 +0100
committerLinus Färnstrand <linus@mullvad.net>2018-01-16 10:31:37 +0100
commita595255a67749dc343a03ebee69a184f74692860 (patch)
tree98d1232fa1902b85fc134f289c1b890d4921a166 /app
parentc3933d569efe1196b9814abffe3ea7f00491df02 (diff)
parent7b3b291236b88a9c0855b93beb46eba1b2bd70d1 (diff)
downloadmullvadvpn-a595255a67749dc343a03ebee69a184f74692860.tar.xz
mullvadvpn-a595255a67749dc343a03ebee69a184f74692860.zip
Merge branch 'get-position'
Diffstat (limited to 'app')
-rw-r--r--app/components/Connect.js40
-rw-r--r--app/lib/backend.js26
-rw-r--r--app/lib/ipc-facade.js43
-rw-r--r--app/redux/connection/actions.js42
-rw-r--r--app/redux/connection/reducers.js15
-rw-r--r--app/redux/settings/reducers.js3
6 files changed, 61 insertions, 108 deletions
diff --git a/app/components/Connect.js b/app/components/Connect.js
index fdbe927b77..abbf7785a9 100644
--- a/app/components/Connect.js
+++ b/app/components/Connect.js
@@ -153,19 +153,6 @@ export default class Connect extends Component {
: './assets/images/location-marker-unsecure.svg' } />
*/
- let ipComponent = undefined;
- if (isConnected || isDisconnected) {
- if (this.state.showCopyIPMessage) {
- ipComponent = (<span>{ 'IP copied to clipboard!' }</span>);
- } else {
- // TODO: remove empty IP placeholder when implemented in backend.
- if(isDisconnected) {
- ipComponent = (<span>{ '\u2003' }</span>);
- } else {
- ipComponent = (<span>{ this.props.connection.clientIp }</span>);
- }
- }
- }
return (
<div className="connect">
<div className="connect__map">
@@ -188,18 +175,8 @@ export default class Connect extends Component {
**********************************
*/ }
- { /* location when disconnected.
- TODO: merge with the isConnecting block below when implemented in backend.
- */ }
- { isDisconnected ?
- <div className="connect__status-location">
- <span>{ '\u2002' }</span>
- </div>
- : null
- }
-
- { /* location when connecting */ }
- { isConnecting ?
+ { /* location when connecting or disconnected */ }
+ { isConnecting || isDisconnected ?
<div className="connect__status-location">
<span>{ this.props.connection.country }</span>
</div>
@@ -209,9 +186,11 @@ export default class Connect extends Component {
{ /* location when connected */ }
{ isConnected ?
<div className="connect__status-location">
- { this.props.connection.city }<br/>{ this.props.connection.country }
+ { this.props.connection.city }
+ { this.props.connection.city && <br/> }
+ { this.props.connection.country }
</div>
- : null
+ :null
}
{ /*
@@ -221,7 +200,12 @@ export default class Connect extends Component {
*/ }
<div className={ this.ipAddressClass() } onClick={ this.onIPAddressClick.bind(this) }>
- { ipComponent }
+ { (isConnected || isDisconnected) ? (
+ <span>{
+ this.state.showCopyIPMessage ?
+ 'IP copied to clipboard!' :
+ this.props.connection.ip
+ }</span>) : null }
</div>
</div>
diff --git a/app/lib/backend.js b/app/lib/backend.js
index cd14adb045..9439e09256 100644
--- a/app/lib/backend.js
+++ b/app/lib/backend.js
@@ -128,12 +128,6 @@ export class Backend {
}
try {
- await this._fetchPublicIP();
- } catch(e) {
- log.error('Failed to fetch the public IP: ', e.message);
- }
-
- try {
await this._fetchLocation();
} catch(e) {
log.error('Failed to fetch the location: ', e.message);
@@ -359,7 +353,8 @@ export class Backend {
cities: country.cities.map((city) => ({
name: city.name,
code: city.code,
- position: city.position,
+ latitude: city.latitude,
+ longitude: city.longitude,
hasActiveRelays: city.has_active_relays,
}))
}));
@@ -369,18 +364,6 @@ export class Backend {
);
}
- async _fetchPublicIP() {
- await this._ensureAuthenticated();
-
- const publicIp = await this._ipc.getPublicIp();
-
- log.info('Got public IP: ', publicIp);
-
- this._store.dispatch(
- connectionActions.newPublicIp(publicIp)
- );
- }
-
async _fetchLocation() {
await this._ensureAuthenticated();
@@ -389,9 +372,12 @@ export class Backend {
log.info('Got location: ', location);
const locationUpdate = {
+ ip: location.ip,
country: location.country,
city: location.city,
- location: location.position
+ latitude: location.latitude,
+ longitude: location.longitude,
+ mullvadExitIp: location.mullvad_exit_ip,
};
this._store.dispatch(
diff --git a/app/lib/ipc-facade.js b/app/lib/ipc-facade.js
index b2676193ee..244e6bcc4b 100644
--- a/app/lib/ipc-facade.js
+++ b/app/lib/ipc-facade.js
@@ -1,25 +1,27 @@
// @flow
import JsonRpcWs, { InvalidReply } from './jsonrpc-ws-ipc';
-import { object, string, number, boolean, enumeration, arrayOf, oneOf } from 'validated/schema';
+import { object, maybe, string, number, boolean, enumeration, arrayOf, oneOf } from 'validated/schema';
import { validate } from 'validated/object';
-import type { Coordinate2d } from '../types';
-
export type AccountData = { expiry: string };
export type AccountToken = string;
export type Ip = string;
export type Location = {
+ ip: Ip,
country: string,
- city: string,
- position: Coordinate2d,
+ city: ?string,
+ latitude: number,
+ longitude: number,
+ mullvad_exit_ip: boolean,
};
const LocationSchema = object({
+ ip: string,
country: string,
- country_code: string,
- city: string,
- city_code: string,
- position: arrayOf(number),
+ city: maybe(string),
+ latitude: number,
+ longitude: number,
+ mullvad_exit_ip: boolean,
});
export type SecurityState = 'secured' | 'unsecured';
@@ -121,7 +123,8 @@ export type RelayListCountry = {
export type RelayListCity = {
name: string,
code: string,
- position: [number, number],
+ latitude: number,
+ longitude: number,
has_active_relays: boolean,
};
@@ -132,7 +135,8 @@ const RelayListSchema = object({
cities: arrayOf(object({
name: string,
code: string,
- position: arrayOf(number),
+ latitude: number,
+ longitude: number,
has_active_relays: boolean,
})),
})),
@@ -152,7 +156,6 @@ export interface IpcFacade {
connect(): Promise<void>,
disconnect(): Promise<void>,
shutdown(): Promise<void>,
- getPublicIp(): Promise<Ip>,
getLocation(): Promise<Location>,
getState(): Promise<BackendState>,
registerStateListener((BackendState) => void): void,
@@ -264,19 +267,11 @@ export class RealIpc implements IpcFacade {
.then(this._ignoreResponse);
}
- getPublicIp(): Promise<Ip> {
- return this._ipc.send('get_public_ip')
- .then(raw => {
- if (typeof raw === 'string' && raw) {
- return raw;
- } else {
- throw new InvalidReply(raw, 'Expected a string');
- }
- });
- }
-
getLocation(): Promise<Location> {
- return this._ipc.send('get_current_location')
+ // send the IPC with 30s timeout since the backend will wait
+ // for a HTTP request before replying
+
+ return this._ipc.send('get_current_location', [], 30000)
.then(raw => {
try {
const validated: any = validate(LocationSchema, raw);
diff --git a/app/redux/connection/actions.js b/app/redux/connection/actions.js
index aef4b85213..6f0da8cecf 100644
--- a/app/redux/connection/actions.js
+++ b/app/redux/connection/actions.js
@@ -4,15 +4,15 @@ import { Clipboard } from 'reactxp';
import type { Backend } from '../../lib/backend';
import type { ReduxThunk } from '../store';
-import type { Coordinate2d } from '../../types';
+import type { Ip } from '../../lib/ipc-facade';
const connect = (backend: Backend): ReduxThunk => () => backend.connect();
const disconnect = (backend: Backend) => () => backend.disconnect();
const copyIPAddress = (): ReduxThunk => {
return (_, getState) => {
- const { connection: { clientIp } } = getState();
- if(clientIp) {
- Clipboard.setText(clientIp);
+ const ip = getState().connection.ip;
+ if(ip) {
+ Clipboard.setText(ip);
}
};
};
@@ -28,20 +28,16 @@ type DisconnectedAction = {
type: 'DISCONNECTED',
};
-type NewPublicIpAction = {
- type: 'NEW_PUBLIC_IP',
- ip: string,
-};
-
-type Location = {
- location: Coordinate2d,
- country: string,
- city: string,
-};
-
type NewLocationAction = {
type: 'NEW_LOCATION',
- newLocation: Location,
+ newLocation: {
+ ip: Ip,
+ country: string,
+ city: ?string,
+ latitude: number,
+ longitude: number,
+ mullvadExitIp: boolean,
+ },
};
type OnlineAction = {
@@ -52,8 +48,7 @@ type OfflineAction = {
type: 'OFFLINE',
};
-export type ConnectionAction = NewPublicIpAction
- | NewLocationAction
+export type ConnectionAction = NewLocationAction
| ConnectingAction
| ConnectedAction
| DisconnectedAction
@@ -78,14 +73,7 @@ function disconnected(): DisconnectedAction {
};
}
-function newPublicIp(ip: string): NewPublicIpAction {
- return {
- type: 'NEW_PUBLIC_IP',
- ip: ip,
- };
-}
-
-function newLocation(newLoc: Location): NewLocationAction {
+function newLocation(newLoc: $PropertyType<NewLocationAction, 'newLocation'>): NewLocationAction {
return {
type: 'NEW_LOCATION',
newLocation: newLoc,
@@ -105,5 +93,5 @@ function offline(): OfflineAction {
}
-export default { connect, disconnect, copyIPAddress, newPublicIp, newLocation, connecting, connected, disconnected, online, offline };
+export default { connect, disconnect, copyIPAddress, newLocation, connecting, connected, disconnected, online, offline };
diff --git a/app/redux/connection/reducers.js b/app/redux/connection/reducers.js
index 52c1d648c1..7eb4c2aaf4 100644
--- a/app/redux/connection/reducers.js
+++ b/app/redux/connection/reducers.js
@@ -1,14 +1,15 @@
// @flow
import type { ReduxAction } from '../store';
-import type { Coordinate2d } from '../../types';
+import type { Ip } from '../../lib/ipc-facade';
export type ConnectionState = 'disconnected' | 'connecting' | 'connected';
export type ConnectionReduxState = {
status: ConnectionState,
isOnline: boolean,
- clientIp: ?string,
- location: ?Coordinate2d,
+ ip: ?Ip,
+ latitude: ?number,
+ longitude: ?number,
country: ?string,
city: ?string,
};
@@ -16,8 +17,9 @@ export type ConnectionReduxState = {
const initialState: ConnectionReduxState = {
status: 'disconnected',
isOnline: true,
- clientIp: null,
- location: null,
+ ip: null,
+ latitude: null,
+ longitude: null,
country: null,
city: null,
};
@@ -29,9 +31,6 @@ export default function(state: ConnectionReduxState = initialState, action: Redu
case 'CONNECTION_CHANGE':
return { ...state, ...action.newData };
- case 'NEW_PUBLIC_IP':
- return { ...state, ...{ clientIp: action.ip }};
-
case 'NEW_LOCATION':
return { ...state, ...action.newLocation };
diff --git a/app/redux/settings/reducers.js b/app/redux/settings/reducers.js
index 59f51c2a66..39005fd486 100644
--- a/app/redux/settings/reducers.js
+++ b/app/redux/settings/reducers.js
@@ -20,7 +20,8 @@ export type RelaySettingsRedux = {|
export type RelayLocationCityRedux = {
name: string,
code: string,
- position: [number, number],
+ latitude: number,
+ longitude: number,
hasActiveRelays: boolean,
};