diff options
| author | Linus Färnstrand <linus@mullvad.net> | 2018-01-16 10:31:37 +0100 |
|---|---|---|
| committer | Linus Färnstrand <linus@mullvad.net> | 2018-01-16 10:31:37 +0100 |
| commit | a595255a67749dc343a03ebee69a184f74692860 (patch) | |
| tree | 98d1232fa1902b85fc134f289c1b890d4921a166 /app | |
| parent | c3933d569efe1196b9814abffe3ea7f00491df02 (diff) | |
| parent | 7b3b291236b88a9c0855b93beb46eba1b2bd70d1 (diff) | |
| download | mullvadvpn-a595255a67749dc343a03ebee69a184f74692860.tar.xz mullvadvpn-a595255a67749dc343a03ebee69a184f74692860.zip | |
Merge branch 'get-position'
Diffstat (limited to 'app')
| -rw-r--r-- | app/components/Connect.js | 40 | ||||
| -rw-r--r-- | app/lib/backend.js | 26 | ||||
| -rw-r--r-- | app/lib/ipc-facade.js | 43 | ||||
| -rw-r--r-- | app/redux/connection/actions.js | 42 | ||||
| -rw-r--r-- | app/redux/connection/reducers.js | 15 | ||||
| -rw-r--r-- | app/redux/settings/reducers.js | 3 |
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, }; |
