From e2e48caf7fa1755600b090eb529ad07ee2701279 Mon Sep 17 00:00:00 2001 From: jesopo Date: Sun, 28 Jul 2019 18:15:04 +0100 Subject: [PATCH] add proxy.py closes #67 --- modules/proxy.py | 40 ++++++++++++++++++++++++++++++++++++++++ requirements.txt | 1 + 2 files changed, 41 insertions(+) create mode 100644 modules/proxy.py diff --git a/modules/proxy.py b/modules/proxy.py new file mode 100644 index 00000000..ccbda4ab --- /dev/null +++ b/modules/proxy.py @@ -0,0 +1,40 @@ +import typing, urllib.parse +import socks +from src import ModuleManager, utils + +TYPES = { + "socks4": socks.SOCKS4, + "socks5": socks.SOCKS5, + "http": socks.HTTP +} + +class ProxySetting(utils.Setting): + def parse(self, value: str) -> typing.Any: + parsed = urllib.parse.urlparse(value) + if parsed.scheme in TYPES and parsed.hostname: + return value + +@utils.export("serverset", ProxySetting("proxy", + "Proxy configuration for the current server", + example="socks5://localhost:9050")) +class Module(ModuleManager.BaseModule): + @utils.hook("preprocess.connect") + def new_server(self, event): + proxy = event["server"].get_setting("proxy", None) + if proxy: + proxy_parsed = urllib.parse.urlparse(proxy) + type = TYPES.get(proxy_parsed.scheme) + + if type == None: + raise ValueError("Invalid proxy type '%s' for '%s'" % + (proxy_parsed.scheme, str(event["server"]))) + + event["server"].socket._make_socket = self._socket_factory( + type, proxy_parsed.hostname, proxy_parsed.port) + + def _socket_factory(self, ptype, phost, pport): + return lambda host, port, bind, timeout: self._make_socket( + ptype, phost, pport, host, port, bind, timeout) + def _make_socket(self, ptype, phost, pport, host, port, bind, timeout): + return socks.create_connection((host, port), 20, bind, + ptype, phost, pport) diff --git a/requirements.txt b/requirements.txt index a229508e..84588df6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,7 @@ dnspython feedparser lxml netifaces +PySocks requests scrypt suds-jurko