From 005a8c2db82727021dc520150c23a086a2c04d06 Mon Sep 17 00:00:00 2001
From: librelois <elois@ifee.fr>
Date: Sun, 29 Oct 2017 04:44:47 +0100
Subject: [PATCH] [enh] add Proxy type

---
 app/lib/proxy.ts | 80 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 80 insertions(+)
 create mode 100644 app/lib/proxy.ts

diff --git a/app/lib/proxy.ts b/app/lib/proxy.ts
new file mode 100644
index 000000000..cdcb039dd
--- /dev/null
+++ b/app/lib/proxy.ts
@@ -0,0 +1,80 @@
+const SocksProxyAgent = require('socks-proxy-agent');
+
+const constants = require('./constants');
+const WS2PConstants = require('../modules/ws2p/lib/constants');
+
+export interface Proxies {
+    proxySocks: Proxy|undefined,
+    proxyTor: Proxy|undefined
+}
+
+export interface ProxyConf {
+    proxySocksAddress: string|undefined,
+    proxyTorAddress: string|undefined,
+    alwaysUseTor: boolean|undefined,
+    proxies: Proxies|undefined
+}
+
+export class Proxy {
+  private agent: any
+
+  constructor(proxy:string, type:string = "socks") {
+    if (type === "socks") {
+        this.agent = SocksProxyAgent("socks://"+proxy)
+    }
+    else {
+        this.agent = undefined
+    }
+  }
+
+  getAgent() {
+    return this.agent;
+  }
+
+  static defaultConf():ProxyConf {
+    return {
+        proxySocksAddress: undefined,
+        proxyTorAddress: undefined,
+        alwaysUseTor: undefined,
+        proxies: undefined
+    }
+  }
+
+  static createProxies(proxyConf: ProxyConf|undefined) : Proxies|undefined
+  {
+    if (proxyConf !== undefined) {
+      return  {
+        proxySocks: (proxyConf.proxySocksAddress !== undefined) ? new Proxy(proxyConf.proxySocksAddress, "socks"):undefined,
+        proxyTor: (proxyConf.proxyTorAddress !== undefined) ? new Proxy(proxyConf.proxyTorAddress, "socks"):undefined
+      }
+    } else {
+        return undefined
+    }
+  }
+
+  static httpProxy(url:string, proxyConf: ProxyConf|undefined) {
+    return Proxy.chooseProxy(url, proxyConf, constants.ONION_ENDPOINT_REGEX)
+  }
+
+  static wsProxy(address:string, proxyConf: ProxyConf|undefined) {
+    return Proxy.chooseProxy(address, proxyConf, WS2PConstants.ONION_ENDPOINT_REGEX)
+  }
+
+  private static chooseProxy(address:string, proxyConf: ProxyConf|undefined,  onionRegex:RegExp): Proxy|undefined {
+    if (proxyConf !== undefined) {
+        if (proxyConf.proxies === undefined) {
+            proxyConf.proxies = Proxy.createProxies(proxyConf)
+        }
+        if (proxyConf.proxies !== undefined) {
+            if ( proxyConf.proxies.proxyTor !== undefined && proxyConf.proxies.proxyTor.getAgent() !== undefined && (proxyConf.alwaysUseTor || address.match(onionRegex)))
+            {
+                return proxyConf.proxies.proxyTor
+            }
+            else if (proxyConf.proxies.proxySocks !== undefined && proxyConf.proxies.proxySocks.getAgent() !== undefined) {
+                return proxyConf.proxies.proxyTor
+            }
+        }
+    }
+    return undefined
+  }
+}
-- 
GitLab