diff options
| author | 2019-12-10 05:27:35 +0000 | |
|---|---|---|
| committer | 2019-12-10 05:27:35 +0000 | |
| commit | 638eee0d685c06d258cb55287204ca97bca7c344 (patch) | |
| tree | 33442439317ae2846f1efb7674b7a3758c8990a1 /src/core_modules/proxy.py | |
| parent | move sys.exit() codes to an enum in utils.consts (diff) | |
| signature | ||
move core modules to src/core_modules, make them uneffected by white/black list
Diffstat (limited to 'src/core_modules/proxy.py')
| -rw-r--r-- | src/core_modules/proxy.py | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/core_modules/proxy.py b/src/core_modules/proxy.py new file mode 100644 index 00000000..1bcaebd1 --- /dev/null +++ b/src/core_modules/proxy.py @@ -0,0 +1,38 @@ +import typing, urllib.parse +import socks +from src import ModuleManager, utils + +TYPES = { + "socks4": socks.SOCKS4, + "socks5": socks.SOCKS5, + "http": socks.HTTP +} + +def _parse(value): + parsed = urllib.parse.urlparse(value) + if parsed.scheme in TYPES and parsed.hostname: + return value + +@utils.export("serverset", utils.FunctionSetting(_parse, "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): + def _(host, port, bind, timeout): + return socks.create_connection((host, port), timeout, bind, + ptype, phost, pport) + return _ |
