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/Modal/ModalPeer.vue b/src/renderer/components/Modal/ModalPeer.vue index c39f910a8d..2cea344b02 100644 --- a/src/renderer/components/Modal/ModalPeer.vue +++ b/src/renderer/components/Modal/ModalPeer.vue @@ -146,10 +146,12 @@ export default { }, methods: { - emitConnect () { - this.$emit('connect', { - peer: this.form, - closeTrigger: this.closeTrigger + async validate () { + this.showLoadingModal = true + const url = new URL(`${this.form.host}:${this.form.port}`) + await this.$store.dispatch('peer/validatePeer', { + url, + port: this.form.port }) }, diff --git a/src/renderer/components/Network/NetworkModal.vue b/src/renderer/components/Network/NetworkModal.vue index 8ee8eac45b..22375b0c15 100644 --- a/src/renderer/components/Network/NetworkModal.vue +++ b/src/renderer/components/Network/NetworkModal.vue @@ -446,18 +446,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') { @@ -469,7 +465,7 @@ export default { return success } catch (error) { - // + this.$logger.error('Could not validate seed: ', error) } return false diff --git a/src/renderer/store/modules/peer.js b/src/renderer/store/modules/peer.js index 7cbbf3bc7e..81a3a308c6 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 @@ -499,27 +500,19 @@ 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, nethash, ignoreNetwork = false, timeout = 3000 }) { + async validatePeer ({ rootGetters }, { url, nethash, 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}` - } + try { - networkConfig = await ClientService.fetchNetworkConfig(baseUrl, timeout) + networkConfig = await ClientService.fetchNetworkConfig(url.origin, timeout) } catch (error) { - console.error('Could not get network config:', error) + logger.error('Could not validate peer (network config): ', error) } if (!networkConfig) { @@ -529,14 +522,14 @@ 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) { - // + logger.error('Could not validate peer (status): ', error) } if (!peerStatus) { @@ -544,13 +537,13 @@ export default { } 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:' } } }