Skip to content
This repository has been archived by the owner on Mar 23, 2023. It is now read-only.

fix: peer validation #1621

Closed
wants to merge 13 commits into from
Closed
21 changes: 15 additions & 6 deletions __tests__/unit/store/modules/peer.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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([
Expand All @@ -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
})

Expand All @@ -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$/))
})

Expand All @@ -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$/))
})

Expand All @@ -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$/))
})
})
10 changes: 6 additions & 4 deletions src/renderer/components/Modal/ModalPeer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -146,10 +146,12 @@ export default {
},

methods: {
emitConnect () {
this.$emit('connect', {
peer: this.form,
closeTrigger: this.closeTrigger
async validate () {
Copy link
Contributor

@brenopolanski brenopolanski Feb 19, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The validate method is not linked to the connect button. I received the message on the browser console:

Property or method "emitConnect" is not defined on the instance but referenced during render...

Although I have updated the code, the modal does not close and does not show any alerts if the connection is successful or not.

this.showLoadingModal = true
const url = new URL(`${this.form.host}:${this.form.port}`)
await this.$store.dispatch('peer/validatePeer', {
url,
port: this.form.port
})
},

Expand Down
14 changes: 5 additions & 9 deletions src/renderer/components/Network/NetworkModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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') {
Expand All @@ -469,7 +465,7 @@ export default {

return success
} catch (error) {
//
this.$logger.error('Could not validate seed: ', error)
}

return false
Expand Down
37 changes: 15 additions & 22 deletions src/renderer/store/modules/peer.js
Original file line number Diff line number Diff line change
@@ -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'
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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) {
Expand All @@ -529,28 +522,28 @@ 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) {
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:'
}
}
}
Expand Down