From b1dde4d8b1c5382c43349a12dc840885f24fbd2f Mon Sep 17 00:00:00 2001 From: Felipe Knorr Kuhn Date: Thu, 3 Feb 2022 23:23:57 -0800 Subject: [PATCH] Query conversion rates service over clearnet or Tor with mempool User-Agent --- backend/src/api/fiat-conversion.ts | 27 ++++++++++++++++++++++++++- backend/src/config.ts | 18 +++++++++++++++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/backend/src/api/fiat-conversion.ts b/backend/src/api/fiat-conversion.ts index d779e31fd..e6b44300a 100644 --- a/backend/src/api/fiat-conversion.ts +++ b/backend/src/api/fiat-conversion.ts @@ -2,6 +2,8 @@ import logger from '../logger'; import axios from 'axios'; import { IConversionRates } from '../mempool.interfaces'; import config from '../config'; +import backendInfo from './backend-info'; +import { SocksProxyAgent } from 'socks-proxy-agent'; class FiatConversion { private conversionRates: IConversionRates = { @@ -17,6 +19,9 @@ class FiatConversion { public startService() { logger.info('Starting currency rates service'); + if (config.SOCKS5PROXY.ENABLED) { + logger.info('Currency rates service will be queried over the Tor network'); + } setInterval(this.updateCurrency.bind(this), 1000 * config.MEMPOOL.PRICE_FEED_UPDATE_INTERVAL); this.updateCurrency(); } @@ -26,8 +31,28 @@ class FiatConversion { } private async updateCurrency(): Promise { + const headers = { 'User-Agent': `mempool/v${backendInfo.getBackendInfo().version}` }; + let response; try { - const response = await axios.get('https://price.bisq.wiz.biz/getAllMarketPrices', { timeout: 10000 }); + let fiatConversionUrl = 'https://price.bisq.wiz.biz/getAllMarketPrices'; + if (config.SOCKS5PROXY.ENABLED) { + let socksOptions: any = { + agentOptions: { + keepAlive: true, + }, + host: config.SOCKS5PROXY.HOST, + port: config.SOCKS5PROXY.PORT + }; + if (config.SOCKS5PROXY.USERNAME && config.SOCKS5PROXY.PASSWORD) { + socksOptions.username = config.SOCKS5PROXY.USERNAME; + socksOptions.password = config.SOCKS5PROXY.PASSWORD; + } + const agent = new SocksProxyAgent(socksOptions); + fiatConversionUrl = 'http://wizpriceje6q5tdrxkyiazsgu7irquiqjy2dptezqhrtu7l2qelqktid.onion/getAllMarketPrices'; + response = await axios.get(fiatConversionUrl, { httpAgent: agent, headers: headers, timeout: 30000 }); + } else { + response = await axios.get(fiatConversionUrl, { headers: headers, timeout: 10000 }); + } const usd = response.data.data.find((item: any) => item.currencyCode === 'USD'); this.conversionRates = { 'USD': usd.price, diff --git a/backend/src/config.ts b/backend/src/config.ts index 085d538c4..e610e9f47 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -51,7 +51,7 @@ interface IConfig { ENABLED: boolean; HOST: string; PORT: number; - MIN_PRIORITY: 'emerg' | 'alert' | 'crit' | 'err' |'warn' | 'notice' | 'info' | 'debug'; + MIN_PRIORITY: 'emerg' | 'alert' | 'crit' | 'err' | 'warn' | 'notice' | 'info' | 'debug'; FACILITY: string; }; STATISTICS: { @@ -62,6 +62,13 @@ interface IConfig { ENABLED: boolean; DATA_PATH: string; }; + SOCKS5PROXY: { + ENABLED: boolean; + HOST: string; + PORT: number; + USERNAME: string; + PASSWORD: string; + }; } const defaults: IConfig = { @@ -128,6 +135,13 @@ const defaults: IConfig = { 'ENABLED': false, 'DATA_PATH': '/bisq/statsnode-data/btc_mainnet/db' }, + 'SOCKS5PROXY': { + 'ENABLED': false, + 'HOST': '127.0.0.1', + 'PORT': 9050, + 'USERNAME': '', + 'PASSWORD': '' + } }; class Config implements IConfig { @@ -140,6 +154,7 @@ class Config implements IConfig { SYSLOG: IConfig['SYSLOG']; STATISTICS: IConfig['STATISTICS']; BISQ: IConfig['BISQ']; + SOCKS5PROXY: IConfig['SOCKS5PROXY']; constructor() { const configs = this.merge(configFile, defaults); @@ -152,6 +167,7 @@ class Config implements IConfig { this.SYSLOG = configs.SYSLOG; this.STATISTICS = configs.STATISTICS; this.BISQ = configs.BISQ; + this.SOCKS5PROXY = configs.SOCKS5PROXY; } merge = (...objects: object[]): IConfig => {