From 6b2b9ce9260ce6ff4b71c0ea57cf3c32f6161530 Mon Sep 17 00:00:00 2001 From: Beaudan Date: Tue, 4 Jun 2019 14:02:11 +1000 Subject: [PATCH] Remove default port and use port from storage server responses --- config/default.json | 2 ++ js/modules/loki_message_api.js | 14 ++++++------- js/modules/loki_rpc.js | 10 +++++++-- js/modules/loki_snode_api.js | 37 ++++++++++++++++++++++++++-------- main.js | 2 ++ preload.js | 2 ++ 6 files changed, 50 insertions(+), 17 deletions(-) diff --git a/config/default.json b/config/default.json index a9ec560cc..9a98c6aa5 100644 --- a/config/default.json +++ b/config/default.json @@ -5,6 +5,8 @@ "contentProxyUrl": "random.snode", "localServerPort": "8081", "defaultPoWDifficulty": "100", + "seedNodeUrl": "13.238.53.205", + "seedNodePort": "22023", "disableAutoUpdate": false, "updatesUrl": "https://updates2.signal.org/desktop", "updatesPublicKey": diff --git a/js/modules/loki_message_api.js b/js/modules/loki_message_api.js index f58bb9b04..f1bbddce3 100644 --- a/js/modules/loki_message_api.js +++ b/js/modules/loki_message_api.js @@ -170,8 +170,8 @@ class LokiMessageAPI { async openSendConnection(params) { while (!_.isEmpty(this.sendingSwarmNodes[params.timestamp])) { - const url = this.sendingSwarmNodes[params.timestamp].shift(); - const successfulSend = await this.sendToNode(url, params); + const snode = this.sendingSwarmNodes[params.timestamp].shift(); + const successfulSend = await this.sendToNode(snode.address, snode.port, params); if (successfulSend) { return true; } @@ -179,14 +179,14 @@ class LokiMessageAPI { return false; } - async sendToNode(url, params) { + async sendToNode(address, port, params) { let successiveFailures = 0; while (successiveFailures < 3) { await sleepFor(successiveFailures * 500); try { const result = await rpc( - `https://${url}`, - this.snodeServerPort, + `https://${address}`, + port, 'store', params ); @@ -222,8 +222,8 @@ class LokiMessageAPI { } } } - log.error(`Failed to send to node: ${url}`); - await lokiSnodeAPI.unreachableNode(params.pubKey, url); + log.error(`Failed to send to node: ${address}`); + await lokiSnodeAPI.unreachableNode(params.pubKey, address); return false; } diff --git a/js/modules/loki_rpc.js b/js/modules/loki_rpc.js index c33f368e9..111f65411 100644 --- a/js/modules/loki_rpc.js +++ b/js/modules/loki_rpc.js @@ -5,6 +5,7 @@ const { parse } = require('url'); const LOKI_EPHEMKEY_HEADER = 'X-Loki-EphemKey'; const endpointBase = '/v1/storage_rpc'; +const seedEndpointBase = '/json_rpc'; const decryptResponse = async (response, address) => { try { @@ -101,11 +102,15 @@ const fetch = async (url, options = {}) => { }; // Wrapper for a JSON RPC request -const rpc = (address, port, method, params, options = {}) => { +const rpc = (address, port, method, params, options = {}, seedRequest = false) => { const headers = options.headers || {}; const portString = port ? `:${port}` : ''; - const url = `${address}${portString}${endpointBase}`; + const endpoint = seedRequest ? seedEndpointBase : endpointBase; + const url = `${address}${portString}${endpoint}`; + // TODO: The jsonrpc and body field will be ignored on storage server const body = { + jsonrpc: '2.0', + id: '0', method, params, }; @@ -123,6 +128,7 @@ const rpc = (address, port, method, params, options = {}) => { return fetch(url, fetchOptions); }; + module.exports = { rpc, }; diff --git a/js/modules/loki_snode_api.js b/js/modules/loki_snode_api.js index 4f97afd7a..e7e276687 100644 --- a/js/modules/loki_snode_api.js +++ b/js/modules/loki_snode_api.js @@ -65,9 +65,29 @@ class LokiSnodeAPI { return resolveCname(this.localUrl); } - getRandomSnodeAddress() { + async getRandomSnodeAddress() { /* resolve random snode */ - return resolveCname(this.serverUrl); + if (this.randomSnodePool.length === 0) { + await this.initialiseRandomPool(); + } + return this.randomSnodePool[Math.floor(Math.random() * this.randomSnodePool.length)]; + } + + async initialiseRandomPool() { + const result = await rpc( + `http://${window.seedNodeUrl}`, + window.seedNodePort, + 'get_service_nodes', + {}, // Params + {}, // Options + true // Seed request + ); + const snodes = result.result.service_node_states; + this.randomSnodePool = snodes.map(snode => ({ + address: snode.public_ip, + port: snode.storage_port, + }) + ); } async unreachableNode(pubKey, nodeUrl) { @@ -121,10 +141,11 @@ class LokiSnodeAPI { async updateOurSwarmNodes(newNodes) { this.ourSwarmNodes = {}; - const ps = newNodes.map(async url => { - const lastHash = await window.Signal.Data.getLastHashBySnode(url); - this.ourSwarmNodes[url] = { + const ps = newNodes.map(async snode => { + const lastHash = await window.Signal.Data.getLastHashBySnode(snode.address); + this.ourSwarmNodes[snode.address] = { lastHash, + port: snode.port, }; }); await Promise.all(ps); @@ -167,11 +188,11 @@ class LokiSnodeAPI { async getSwarmNodes(pubKey) { // TODO: Hit multiple random nodes and merge lists? - const nodeUrl = await this.getRandomSnodeAddress(); + const { address, port } = await this.getRandomSnodeAddress(); const result = await rpc( - `https://${nodeUrl}`, - this.snodeServerPort, + `https://${address}`, + port, 'get_snodes_for_pubkey', { pubKey, diff --git a/main.js b/main.js index 455299a98..b3bd6bbd0 100644 --- a/main.js +++ b/main.js @@ -156,6 +156,8 @@ function prepareURL(pathSegments, moreKeys) { cdnUrl: config.get('cdnUrl'), localServerPort: config.get('localServerPort'), defaultPoWDifficulty: config.get('defaultPoWDifficulty'), + seedNodeUrl: config.get('seedNodeUrl'), + seedNodePort: config.get('seedNodePort'), certificateAuthority: config.get('certificateAuthority'), environment: config.environment, node_version: process.versions.node, diff --git a/preload.js b/preload.js index 55dfb9772..f163079ad 100644 --- a/preload.js +++ b/preload.js @@ -288,6 +288,8 @@ window.WebAPI = initializeWebAPI({ proxyUrl: config.proxyUrl, }); +window.seedNodeUrl = config.seedNodeUrl; +window.seedNodePort = config.seedNodePort; const LokiSnodeAPI = require('./js/modules/loki_snode_api'); window.lokiSnodeAPI = new LokiSnodeAPI({