From 63c1371709d7006c29ed06eb80e5819e16581e9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loun=C3=A8s=20Ksouri?= Date: Mon, 5 Oct 2020 19:32:50 +0200 Subject: [PATCH] Add endpoint to fetch Bitcoin price via Tor (#53) --- README.md | 2 ++ app.js | 2 ++ package.json | 1 + routes/v1/external.js | 28 ++++++++++++++++++++++++++++ utils/const.js | 2 ++ yarn.lock | 19 ++++++++++++++++++- 6 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 routes/v1/external.js diff --git a/README.md b/README.md index f045aeb..e3e4053 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,8 @@ Set the following environment variables directly or by placing them in `.env` fi | `UPDATE_SIGNAL_FILE` | Path to write the update signal file | `/signals/update` | | `UPDATE_LOCK_FILE` | Path to the update lock file | `/statuses/update-in-progress` | | `BACKUP_STATUS_FILE` | Path to backup status file | `/statuses/backup-status.json` | +| `TOR_PROXY_IP` | IP or domain where Tor proxy is listening | `192.168.0.1` | +| `TOR_PROXY_PORT` | Port where Tor proxy is listening | `9050` | ### Step 3. Run manager ```sh diff --git a/app.js b/app.js index a4326c5..1c29617 100644 --- a/app.js +++ b/app.js @@ -21,6 +21,7 @@ const logger = require('utils/logger.js'); const ping = require('routes/ping.js'); const account = require('routes/v1/account.js'); const system = require('routes/v1/system.js'); +const external = require('routes/v1/external.js'); const app = express(); @@ -40,6 +41,7 @@ app.use(morgan(logger.morganConfiguration)); app.use('/ping', ping); app.use('/v1/account', account); app.use('/v1/system', system); +app.use('/v1/external', external); app.use(errorHandleMiddleware); app.use((req, res) => { diff --git a/package.json b/package.json index 13dd1bb..64016c1 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "passport-jwt": "^4.0.0", "request-promise": "^4.2.2", "semver": "^7.3.2", + "socks-proxy-agent": "^5.0.0", "uuid": "^8.0.0", "validator": "^13.0.0", "winston": "^3.0.0-rc5", diff --git a/routes/v1/external.js b/routes/v1/external.js new file mode 100644 index 0000000..0c2c4b3 --- /dev/null +++ b/routes/v1/external.js @@ -0,0 +1,28 @@ +const express = require('express'); +const router = express.Router(); + +const auth = require('middlewares/auth.js'); + +const constants = require('utils/const.js'); +const safeHandler = require('utils/safeHandler'); + +const {SocksProxyAgent} = require('socks-proxy-agent'); +const axios = require('axios'); + +const agent = new SocksProxyAgent(`socks5h://${constants.TOR_PROXY_IP}:${constants.TOR_PROXY_PORT}`); + +router.get('/price', auth.jwt, safeHandler(async(req, res) => { + const response = await axios({ + url: 'https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD', + httpsAgent: agent, + method: 'GET' + }); + + if (response.data) { + return res.status(constants.STATUS_CODES.OK).json(response.data); + } + + return res.status(constants.STATUS_CODES.BAD_GATEWAY).json(); +})); + +module.exports = router; diff --git a/utils/const.js b/utils/const.js index db7ab4a..e25b514 100644 --- a/utils/const.js +++ b/utils/const.js @@ -29,6 +29,8 @@ module.exports = { UPDATE_SIGNAL_FILE: process.env.UPDATE_SIGNAL_FILE || '/signals/update', UPDATE_LOCK_FILE: process.env.UPDATE_LOCK_FILE || '/statuses/update-in-progress', BACKUP_STATUS_FILE: process.env.BACKUP_STATUS_FILE || '/statuses/backup-status.json', + TOR_PROXY_IP: process.env.TOR_PROXY_IP || '192.168.0.1', + TOR_PROXY_PORT: process.env.TOR_PROXY_PORT || 9050, STATUS_CODES: { ACCEPTED: 202, BAD_GATEWAY: 502, diff --git a/yarn.lock b/yarn.lock index 9d2438a..96262b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2681,7 +2681,7 @@ ip-regex@^2.0.0, ip-regex@^2.1.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= -ip@1.1.5: +ip@1.1.5, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= @@ -5295,6 +5295,23 @@ socks-proxy-agent@^4.0.0: agent-base "~4.2.1" socks "~2.3.2" +socks-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60" + integrity sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA== + dependencies: + agent-base "6" + debug "4" + socks "^2.3.3" + +socks@^2.3.3: + version "2.4.4" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.4.4.tgz#f1a3382e7814ae28c97bb82a38bc1ac24b21cca2" + integrity sha512-7LmHN4IHj1Vpd/k8D872VGCHJ6yIVyeFkfIBExRmGPYQ/kdUkpdg9eKh9oOzYYYKQhuxavayJHTnmBG+EzluUA== + dependencies: + ip "^1.1.5" + smart-buffer "^4.1.0" + socks@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3"