From 3e2e23417ac591465596cedb8e951deff5734e3a Mon Sep 17 00:00:00 2001 From: Felipe Knorr Kuhn <100320+knorrium@users.noreply.github.com> Date: Wed, 23 Mar 2022 08:11:22 -0700 Subject: [PATCH] Allow syncing external backend assets using Tor --- backend/src/sync-assets.ts | 46 ++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/backend/src/sync-assets.ts b/backend/src/sync-assets.ts index 302196458..d7644e24b 100644 --- a/backend/src/sync-assets.ts +++ b/backend/src/sync-assets.ts @@ -1,8 +1,8 @@ -import axios from 'axios'; +import axios, { AxiosResponse } from 'axios'; import * as fs from 'fs'; -const fsPromises = fs.promises; import config from './config'; import logger from './logger'; +import { SocksProxyAgent } from 'socks-proxy-agent'; const PATH = './'; @@ -17,12 +17,44 @@ class SyncAssets { private async downloadFile(url: string) { const fileName = url.split('/').slice(-1)[0]; - logger.info(`Downloading external asset: ${fileName}...`); + try { - const response = await axios.get(url, { - responseType: 'stream', timeout: 30000 - }); - await fsPromises.writeFile(PATH + fileName, response.data); + 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); + + logger.info(`Downloading external asset ${fileName} over the Tor network...`); + await axios.get(url, { + httpAgent: agent, + httpsAgent: agent, + responseType: 'stream', + timeout: 30000 + }).then(function (response) { + response.data.pipe(fs.createWriteStream(PATH + fileName)); + logger.info(`External asset ${fileName} saved to ${PATH + fileName}`); + }); + } else { + logger.info(`Downloading external asset ${fileName} over clearnet...`); + await axios.get(url, { + responseType: 'stream', + timeout: 30000 + }).then(function (response) { + response.data.pipe(fs.createWriteStream(PATH + fileName)); + logger.info(`External asset ${fileName} saved to ${PATH + fileName}`); + }); + } } catch (e: any) { throw new Error(`Failed to download external asset. ` + e); }