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$/))
})
})
3 changes: 2 additions & 1 deletion src/renderer/components/Network/NetworkCustomPeerModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
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 @@ -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') {
Expand All @@ -468,7 +464,7 @@ export default {

return success
} catch (error) {
//
console.error(error)
}

return false
Expand Down
32 changes: 12 additions & 20 deletions src/renderer/store/modules/peer.js
Original file line number Diff line number Diff line change
Expand Up @@ -484,27 +484,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, 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}`
}

try {
networkConfig = await ClientService.fetchNetworkConfig(baseUrl, timeout)
networkConfig = await ClientService.fetchNetworkConfig(url.origin, timeout)
} catch (error) {
//
console.error(error)
}

if (!networkConfig) {
Expand All @@ -514,27 +506,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:'
}
}
}
Expand Down