From 485313fb1c049d242357ec4bd978ba8a6b911a75 Mon Sep 17 00:00:00 2001 From: Davi Figueiredo Date: Thu, 23 Jan 2020 15:12:22 -0300 Subject: [PATCH 1/7] fix: peer validation for https and http addresses --- __tests__/unit/store/modules/peer.spec.js | 21 +++++++--- .../Network/NetworkCustomPeerModal.vue | 3 +- .../components/Network/NetworkModal.vue | 14 +++---- src/renderer/store/modules/peer.js | 42 ++++++++++--------- 4 files changed, 44 insertions(+), 36 deletions(-) diff --git a/__tests__/unit/store/modules/peer.spec.js b/__tests__/unit/store/modules/peer.spec.js index a08bc802df..d8f5eeddb6 100644 --- a/__tests__/unit/store/modules/peer.spec.js +++ b/__tests__/unit/store/modules/peer.spec.js @@ -282,7 +282,9 @@ describe('peer store module', () => { } }) - const response = await store.dispatch('peer/validatePeer', { ...goodPeer1, timeout: 100 }) + const url = new URL(`${goodPeer1.host}:${goodPeer1.port}`) + + const response = await store.dispatch('peer/validatePeer', { url, timeout: 100 }) expect(response).toBeObject() expect(response).toContainEntries([ @@ -307,9 +309,10 @@ describe('peer store module', () => { } }) + const url = new URL(`https://${goodPeer1.ip}:${goodPeer1.port}`) + const response = await store.dispatch('peer/validatePeer', { - ...goodPeer1, - host: `https://${goodPeer1.ip}`, + url, timeout: 100 }) @@ -325,7 +328,9 @@ describe('peer store module', () => { .get('/api/v2/node/configuration') .reply(400) - const response = await store.dispatch('peer/validatePeer', { ...goodPeer1, timeout: 100 }) + const url = new URL(`${goodPeer1.host}:${goodPeer1.port}`) + + const response = await store.dispatch('peer/validatePeer', { url, timeout: 100 }) expect(response).toEqual(expect.stringMatching(/^Could not connect$/)) }) @@ -341,7 +346,9 @@ describe('peer store module', () => { .get('/api/v2/node/syncing') .reply(400) - const response = await store.dispatch('peer/validatePeer', { ...goodPeer1, timeout: 100 }) + const url = new URL(`${goodPeer1.host}:${goodPeer1.port}`) + + const response = await store.dispatch('peer/validatePeer', { url, timeout: 100 }) expect(response).toEqual(expect.stringMatching(/^Status check failed$/)) }) @@ -356,7 +363,9 @@ describe('peer store module', () => { } }) - const response = await store.dispatch('peer/validatePeer', { ...goodPeer1, timeout: 100 }) + const url = new URL(`${goodPeer1.host}:${goodPeer1.port}`) + + const response = await store.dispatch('peer/validatePeer', { url, timeout: 100 }) expect(response).toEqual(expect.stringMatching(/^Wrong network$/)) }) }) diff --git a/src/renderer/components/Network/NetworkCustomPeerModal.vue b/src/renderer/components/Network/NetworkCustomPeerModal.vue index 6481d6eb8f..43100bd896 100644 --- a/src/renderer/components/Network/NetworkCustomPeerModal.vue +++ b/src/renderer/components/Network/NetworkCustomPeerModal.vue @@ -122,8 +122,9 @@ export default { methods: { async validate () { this.showLoadingModal = true + const url = new URL(`${this.form.host}:${this.form.port}`) const response = await this.$store.dispatch('peer/validatePeer', { - host: this.form.host, + url, port: this.form.port }) if (response === false) { diff --git a/src/renderer/components/Network/NetworkModal.vue b/src/renderer/components/Network/NetworkModal.vue index 505905fc27..97aa72dca3 100644 --- a/src/renderer/components/Network/NetworkModal.vue +++ b/src/renderer/components/Network/NetworkModal.vue @@ -445,18 +445,14 @@ export default { this.showLoadingModal = true try { - let { hostname: host, port, protocol } = new URL(this.form.server) - - if (!port) { - port = protocol === 'https:' ? 443 : 80 - } - + const url = new URL(this.form.server) const response = await this.$store.dispatch('peer/validatePeer', { - host, - port, + url, ignoreNetwork: true }) + let success = false + if (response === false) { this.$error(this.$t('MODAL_NETWORK.SEED_VALIDATE_FAILED')) } else if (typeof response === 'string') { @@ -468,7 +464,7 @@ export default { return success } catch (error) { - // + console.error(error) } return false diff --git a/src/renderer/store/modules/peer.js b/src/renderer/store/modules/peer.js index 50c6de6ca6..4de0524a6d 100644 --- a/src/renderer/store/modules/peer.js +++ b/src/renderer/store/modules/peer.js @@ -484,27 +484,29 @@ export default { }, /** - * Validate custom peer, used to check it's acceptable to connect. - * @param {String} ip - * @param {Number} port + * Validate custom peer, used to check it's acceptable to connect. Uses URL() class. + * @param {Object} From class URL(). * @param {Number} [ignoreNetwork=false] * @param {Number} [timeout=3000] * @return {(Object|String)} */ - async validatePeer ({ rootGetters }, { host, ip, port, ignoreNetwork = false, timeout = 3000 }) { + async validatePeer ({ rootGetters }, { url, ignoreNetwork = false, timeout = 3000 }) { let networkConfig - if (!host && ip) { - host = ip - } - let baseUrl = `${host}:${port}` - const schemeUrl = host.match(/^(https?:\/\/)+(.+)$/) - if (!schemeUrl) { - baseUrl = `http://${baseUrl}` - } + + /* + host: "dexplorer.ark.io:8443" + hostname: "dexplorer.ark.io" + href: "https://dexplorer.ark.io:8443/" + origin: "https://dexplorer.ark.io:8443" + pathname: "/" + port: "8443" + protocol: "https:" + */ + try { - networkConfig = await ClientService.fetchNetworkConfig(baseUrl, timeout) + networkConfig = await ClientService.fetchNetworkConfig(url.origin, timeout) } catch (error) { - // + console.error(error) } if (!networkConfig) { @@ -514,27 +516,27 @@ export default { } const client = new ClientService(false) - client.host = baseUrl + client.host = url.origin client.client.withOptions({ timeout: 3000 }) let peerStatus try { peerStatus = await client.fetchPeerStatus() } catch (error) { - // + console.error(error) } if (!peerStatus) { return i18n.t('PEER.STATUS_CHECK_FAILED') } return { - ip: schemeUrl ? schemeUrl[2] : host, - host: baseUrl, - port: +port, + ip: url.hostname, + host: url.host, + port: +url.port, height: peerStatus.height, status: 'OK', latency: 0, - isHttps: schemeUrl && schemeUrl[1] === 'https://' + isHttps: url.protocol === 'https:' } } } From f94462aa83ce805b8ed408fb43f42078a91a0aff Mon Sep 17 00:00:00 2001 From: Davi Figueiredo Date: Thu, 23 Jan 2020 15:16:30 -0300 Subject: [PATCH 2/7] docs: remove comment for URL object --- src/renderer/store/modules/peer.js | 36 +++++++++++------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/src/renderer/store/modules/peer.js b/src/renderer/store/modules/peer.js index 4de0524a6d..9432598e03 100644 --- a/src/renderer/store/modules/peer.js +++ b/src/renderer/store/modules/peer.js @@ -202,13 +202,13 @@ export default { }, mutations: { - SET_PEERS (state, { peers, networkId }) { + SET_PEERS(state, { peers, networkId }) { Vue.set(state.all, networkId, { peers, lastUpdated: new Date() }) }, - SET_CURRENT_PEER (state, { peer, networkId }) { + SET_CURRENT_PEER(state, { peer, networkId }) { Vue.set(state.current, networkId, peer) } }, @@ -220,7 +220,7 @@ export default { * @param {Number} networkId * @return {void} */ - setToNetwork ({ commit }, { peers, networkId }) { + setToNetwork({ commit }, { peers, networkId }) { commit('SET_PEERS', { peers: peers.map(peer => { try { @@ -240,7 +240,7 @@ export default { * @param {Object[]} peers * @return {void} */ - set ({ commit, rootGetters }, peers) { + set({ commit, rootGetters }, peers) { const profile = rootGetters['session/profile'] if (!profile || !profile.networkId) { return @@ -265,7 +265,7 @@ export default { * @param {Object} peer * @return {void} */ - async setCurrentPeer ({ commit, dispatch, rootGetters }, peer) { + async setCurrentPeer({ commit, dispatch, rootGetters }, peer) { const profile = rootGetters['session/profile'] if (!profile || !profile.networkId) { return @@ -287,7 +287,7 @@ export default { * Refresh peer list. * @return {void} */ - async refresh ({ dispatch, getters, rootGetters }, network = null) { + async refresh({ dispatch, getters, rootGetters }, network = null) { if (!network) { network = rootGetters['session/network'] } @@ -351,7 +351,7 @@ export default { * @param {Boolean} [skipIfCustom=true] * @return {(Object|null)} */ - async findBest ({ dispatch, getters }, { refresh = true, network = null }) { + async findBest({ dispatch, getters }, { refresh = true, network = null }) { if (refresh) { try { await dispatch('refresh', network) @@ -382,7 +382,7 @@ export default { * @param {Boolean} [skipIfCustom=true] * @return {(Object|null)} */ - async connectToBest ({ dispatch, getters }, { refresh = true, skipIfCustom = true }) { + async connectToBest({ dispatch, getters }, { refresh = true, skipIfCustom = true }) { if (skipIfCustom) { const currentPeer = getters.current() if (!isEmpty(currentPeer) && currentPeer.isCustom) { @@ -402,7 +402,7 @@ export default { return peer }, - async ensureStillValid ({ rootGetters }, peer) { + async ensureStillValid({ rootGetters }, peer) { if (!peer) { throw new Error('Not connected to peer') } @@ -413,7 +413,7 @@ export default { } }, - async fallbackToSeedPeer ({ dispatch }) { + async fallbackToSeedPeer({ dispatch }) { dispatch('set', []) dispatch('setCurrentPeer', null) await dispatch('connectToBest', { skipIfCustom: false }) @@ -424,7 +424,7 @@ export default { * @param {Object} [port] * @return {(Object|void)} */ - async updateCurrentPeerStatus ({ dispatch, getters }, currentPeer) { + async updateCurrentPeerStatus({ dispatch, getters }, currentPeer) { let updateCurrentPeer = false if (isEmpty(currentPeer)) { currentPeer = { ...getters.current() } @@ -475,7 +475,7 @@ export default { * @param {Object} peer * @return {ClientService} */ - async clientServiceFromPeer (_, peer) { + async clientServiceFromPeer(_, peer) { const client = new ClientService(false) client.host = getBaseUrl(peer) client.client.withOptions({ timeout: 3000 }) @@ -490,19 +490,9 @@ export default { * @param {Number} [timeout=3000] * @return {(Object|String)} */ - async validatePeer ({ rootGetters }, { url, ignoreNetwork = false, timeout = 3000 }) { + async validatePeer({ rootGetters }, { url, ignoreNetwork = false, timeout = 3000 }) { let networkConfig - /* - host: "dexplorer.ark.io:8443" - hostname: "dexplorer.ark.io" - href: "https://dexplorer.ark.io:8443/" - origin: "https://dexplorer.ark.io:8443" - pathname: "/" - port: "8443" - protocol: "https:" - */ - try { networkConfig = await ClientService.fetchNetworkConfig(url.origin, timeout) } catch (error) { From 2ff0a2e440649ff87292340954d6a5c5bfbbc7b3 Mon Sep 17 00:00:00 2001 From: Davi Figueiredo Date: Thu, 23 Jan 2020 15:30:26 -0300 Subject: [PATCH 3/7] style: lint --- src/renderer/store/modules/peer.js | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/renderer/store/modules/peer.js b/src/renderer/store/modules/peer.js index 9432598e03..899553b815 100644 --- a/src/renderer/store/modules/peer.js +++ b/src/renderer/store/modules/peer.js @@ -202,13 +202,13 @@ export default { }, mutations: { - SET_PEERS(state, { peers, networkId }) { + SET_PEERS (state, { peers, networkId }) { Vue.set(state.all, networkId, { peers, lastUpdated: new Date() }) }, - SET_CURRENT_PEER(state, { peer, networkId }) { + SET_CURRENT_PEER (state, { peer, networkId }) { Vue.set(state.current, networkId, peer) } }, @@ -220,7 +220,7 @@ export default { * @param {Number} networkId * @return {void} */ - setToNetwork({ commit }, { peers, networkId }) { + setToNetwork ({ commit }, { peers, networkId }) { commit('SET_PEERS', { peers: peers.map(peer => { try { @@ -240,7 +240,7 @@ export default { * @param {Object[]} peers * @return {void} */ - set({ commit, rootGetters }, peers) { + set ({ commit, rootGetters }, peers) { const profile = rootGetters['session/profile'] if (!profile || !profile.networkId) { return @@ -265,7 +265,7 @@ export default { * @param {Object} peer * @return {void} */ - async setCurrentPeer({ commit, dispatch, rootGetters }, peer) { + async setCurrentPeer ({ commit, dispatch, rootGetters }, peer) { const profile = rootGetters['session/profile'] if (!profile || !profile.networkId) { return @@ -287,7 +287,7 @@ export default { * Refresh peer list. * @return {void} */ - async refresh({ dispatch, getters, rootGetters }, network = null) { + async refresh ({ dispatch, getters, rootGetters }, network = null) { if (!network) { network = rootGetters['session/network'] } @@ -351,7 +351,7 @@ export default { * @param {Boolean} [skipIfCustom=true] * @return {(Object|null)} */ - async findBest({ dispatch, getters }, { refresh = true, network = null }) { + async findBest ({ dispatch, getters }, { refresh = true, network = null }) { if (refresh) { try { await dispatch('refresh', network) @@ -382,7 +382,7 @@ export default { * @param {Boolean} [skipIfCustom=true] * @return {(Object|null)} */ - async connectToBest({ dispatch, getters }, { refresh = true, skipIfCustom = true }) { + async connectToBest ({ dispatch, getters }, { refresh = true, skipIfCustom = true }) { if (skipIfCustom) { const currentPeer = getters.current() if (!isEmpty(currentPeer) && currentPeer.isCustom) { @@ -402,7 +402,7 @@ export default { return peer }, - async ensureStillValid({ rootGetters }, peer) { + async ensureStillValid ({ rootGetters }, peer) { if (!peer) { throw new Error('Not connected to peer') } @@ -413,7 +413,7 @@ export default { } }, - async fallbackToSeedPeer({ dispatch }) { + async fallbackToSeedPeer ({ dispatch }) { dispatch('set', []) dispatch('setCurrentPeer', null) await dispatch('connectToBest', { skipIfCustom: false }) @@ -424,7 +424,7 @@ export default { * @param {Object} [port] * @return {(Object|void)} */ - async updateCurrentPeerStatus({ dispatch, getters }, currentPeer) { + async updateCurrentPeerStatus ({ dispatch, getters }, currentPeer) { let updateCurrentPeer = false if (isEmpty(currentPeer)) { currentPeer = { ...getters.current() } @@ -475,7 +475,7 @@ export default { * @param {Object} peer * @return {ClientService} */ - async clientServiceFromPeer(_, peer) { + async clientServiceFromPeer (_, peer) { const client = new ClientService(false) client.host = getBaseUrl(peer) client.client.withOptions({ timeout: 3000 }) @@ -490,7 +490,7 @@ export default { * @param {Number} [timeout=3000] * @return {(Object|String)} */ - async validatePeer({ rootGetters }, { url, ignoreNetwork = false, timeout = 3000 }) { + async validatePeer ({ rootGetters }, { url, ignoreNetwork = false, timeout = 3000 }) { let networkConfig try { From a54afbc6a5db0ef18e09aac8dc7d391a4e128c68 Mon Sep 17 00:00:00 2001 From: Davi Figueiredo Date: Wed, 29 Jan 2020 17:53:50 -0800 Subject: [PATCH 4/7] fix: removed console.log and insert correct logger. Co-Authored-By: Alex Barnsley <8069294+alexbarnsley@users.noreply.github.com> --- src/renderer/components/Network/NetworkModal.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/Network/NetworkModal.vue b/src/renderer/components/Network/NetworkModal.vue index 97aa72dca3..8ded8e3690 100644 --- a/src/renderer/components/Network/NetworkModal.vue +++ b/src/renderer/components/Network/NetworkModal.vue @@ -464,7 +464,7 @@ export default { return success } catch (error) { - console.error(error) + this.$logger.error('Could not validate seed: ', error) } return false From 813859500ec4970f468febbe023e74e9a923d494 Mon Sep 17 00:00:00 2001 From: Davi Figueiredo Date: Wed, 29 Jan 2020 17:54:16 -0800 Subject: [PATCH 5/7] fix: removed console.log and insert correct logger. Co-Authored-By: Alex Barnsley <8069294+alexbarnsley@users.noreply.github.com> --- src/renderer/store/modules/peer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/store/modules/peer.js b/src/renderer/store/modules/peer.js index 899553b815..1177400d90 100644 --- a/src/renderer/store/modules/peer.js +++ b/src/renderer/store/modules/peer.js @@ -496,7 +496,7 @@ export default { try { networkConfig = await ClientService.fetchNetworkConfig(url.origin, timeout) } catch (error) { - console.error(error) + this._vm.$logger.error('Could not validate peer (network config): ', error) } if (!networkConfig) { From c8696ffa616314cea91649daee3a841ad148b96d Mon Sep 17 00:00:00 2001 From: Davi Figueiredo Date: Wed, 29 Jan 2020 17:54:27 -0800 Subject: [PATCH 6/7] fix: removed console.log and insert correct logger. Co-Authored-By: Alex Barnsley <8069294+alexbarnsley@users.noreply.github.com> --- src/renderer/store/modules/peer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/store/modules/peer.js b/src/renderer/store/modules/peer.js index 1177400d90..83d1a030b1 100644 --- a/src/renderer/store/modules/peer.js +++ b/src/renderer/store/modules/peer.js @@ -513,7 +513,7 @@ export default { try { peerStatus = await client.fetchPeerStatus() } catch (error) { - console.error(error) + this._vm.$logger.error('Could not validate peer (status): ', error) } if (!peerStatus) { return i18n.t('PEER.STATUS_CHECK_FAILED') From b6800ee122b4075d90094cca9f1c4222d2524fb7 Mon Sep 17 00:00:00 2001 From: Alex Barnsley <8069294+alexbarnsley@users.noreply.github.com> Date: Fri, 31 Jan 2020 14:39:31 +0000 Subject: [PATCH 7/7] fix: import logger instead of _vm --- src/renderer/store/modules/peer.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/renderer/store/modules/peer.js b/src/renderer/store/modules/peer.js index 83d1a030b1..310c3f0685 100644 --- a/src/renderer/store/modules/peer.js +++ b/src/renderer/store/modules/peer.js @@ -1,4 +1,5 @@ import { isEmpty, random, shuffle } from 'lodash' +import logger from 'electron-log' import { PeerDiscovery } from '@arkecosystem/peers' import ClientService from '@/services/client' import config from '@config' @@ -226,7 +227,7 @@ export default { try { return PeerModel.deserialize(peer) } catch (error) { - this._vm.$logger.error(`Could not deserialize peer: ${error.message}`) + logger.error(`Could not deserialize peer: ${error.message}`) } return null @@ -251,7 +252,7 @@ export default { try { return PeerModel.deserialize(peer) } catch (error) { - this._vm.$logger.error(`Could not deserialize peer: ${error.message}`) + logger.error(`Could not deserialize peer: ${error.message}`) } return null @@ -496,7 +497,7 @@ export default { try { networkConfig = await ClientService.fetchNetworkConfig(url.origin, timeout) } catch (error) { - this._vm.$logger.error('Could not validate peer (network config): ', error) + logger.error('Could not validate peer (network config): ', error) } if (!networkConfig) { @@ -513,7 +514,7 @@ export default { try { peerStatus = await client.fetchPeerStatus() } catch (error) { - this._vm.$logger.error('Could not validate peer (status): ', error) + logger.error('Could not validate peer (status): ', error) } if (!peerStatus) { return i18n.t('PEER.STATUS_CHECK_FAILED')