From fa65a6dc050647595b9e6cd7cd0b5e41e6c821be Mon Sep 17 00:00:00 2001 From: shortcutme <tamas@zeronet.io> Date: Thu, 6 Apr 2017 19:20:27 +0200 Subject: [PATCH] Update PySocks to 1.6.7 --- src/lib/PySocks/README.md | 54 ++-- src/lib/PySocks/setup.py | 5 +- src/lib/PySocks/socks.py | 232 ++++++++++++++---- src/lib/PySocks/test/README | 5 - src/lib/PySocks/test/httpproxy.py | 137 ----------- src/lib/PySocks/test/mocks | Bin 33596 -> 0 bytes src/lib/PySocks/test/mocks.conf | 104 -------- src/lib/PySocks/test/socks4server.py | 14 -- src/lib/PySocks/test/sockstest.py | 174 ------------- src/lib/PySocks/test/test.sh | 25 -- src/lib/PySocks/win_inet_pton/LICENSE | 4 + src/lib/PySocks/win_inet_pton/README | 29 +++ src/lib/PySocks/win_inet_pton/__init__.py | 1 + src/lib/PySocks/win_inet_pton/setup.py | 20 ++ .../PySocks/win_inet_pton/win_inet_pton.py | 84 +++++++ 15 files changed, 349 insertions(+), 539 deletions(-) delete mode 100644 src/lib/PySocks/test/README delete mode 100644 src/lib/PySocks/test/httpproxy.py delete mode 100644 src/lib/PySocks/test/mocks delete mode 100644 src/lib/PySocks/test/mocks.conf delete mode 100644 src/lib/PySocks/test/socks4server.py delete mode 100644 src/lib/PySocks/test/sockstest.py delete mode 100644 src/lib/PySocks/test/test.sh create mode 100644 src/lib/PySocks/win_inet_pton/LICENSE create mode 100644 src/lib/PySocks/win_inet_pton/README create mode 100644 src/lib/PySocks/win_inet_pton/__init__.py create mode 100644 src/lib/PySocks/win_inet_pton/setup.py create mode 100644 src/lib/PySocks/win_inet_pton/win_inet_pton.py diff --git a/src/lib/PySocks/README.md b/src/lib/PySocks/README.md index 65419240..f67a0264 100644 --- a/src/lib/PySocks/README.md +++ b/src/lib/PySocks/README.md @@ -1,7 +1,7 @@ PySocks ======= -Updated version of SocksiPy. Many old bugs fixed, and overall code cleanup. +Updated and semi-actively maintained version of [SocksiPy](http://socksipy.sourceforge.net/), with bug fixes and extra features. Acts as a drop-in replacement to the socket module. @@ -10,23 +10,10 @@ Acts as a drop-in replacement to the socket module. Features ======== -* Fully supports Python 2.6 - 3.4 - -* UDP support - -* SocksiPyHandler, courtesy e000, was also added as an example of how this module can be used with urllib2. See example code in sockshandler.py. `pip install` and `setup.py install` will automatically install the `sockshandler` module. - -* Bugs in the original SocksiPy were fixed, including two that could lead to infinite hanging when communicating with bad proxy servers. - -* urllib3, which powers the requests module, is working on integrating SOCKS proxy support based on this branch - -* `SOCKS5`, `SOCKS4`, and `HTTP` are now aliases for `PROXY_TYPE_SOCKS5`, `PROXY_TYPE_SOCKS4`, and `PROXY_TYPE_HTTP` - -* Tests added - -* Various style and performance improvements; codebase simplified - -* Actively maintained +* SOCKS proxy client for Python 2.6 - 3.x +* TCP and UDP both supported +* HTTP proxy client included but not supported or recommended (you should use urllib2's or requests' own HTTP proxy interface) +* urllib2 handler included. `pip install` / `setup.py install` will automatically install the `sockshandler` module. Installation ============ @@ -43,18 +30,18 @@ Alternatively, include just `socks.py` in your project. -------------------------------------------- -*Warning:* PySocks/SocksiPy only supports HTTP proxies that use CONNECT tunneling. Certain HTTP proxies may not work with this library. If you wish to use HTTP proxies (and not SOCKS proxies), it is recommended that you rely on your HTTP client's native proxy support (`proxies` dict for `requests`, or `urllib2.ProxyHandler` for `urllib2`) instead. +*Warning:* PySocks/SocksiPy only supports HTTP proxies that use CONNECT tunneling. Certain HTTP proxies may not work with this library. If you wish to use HTTP (not SOCKS) proxies, it is recommended that you rely on your HTTP client's native proxy support (`proxies` dict for `requests`, or `urllib2.ProxyHandler` for `urllib2`) instead. -------------------------------------------- Usage ===== -## Example ## +## socks.socksocket ## import socks - s = socks.socksocket() + s = socks.socksocket() # Same API as socket.socket in the standard lib s.set_proxy(socks.SOCKS5, "localhost") # SOCKS4 and SOCKS5 use port 1080 by default # Or @@ -63,23 +50,35 @@ Usage s.set_proxy(socks.HTTP, "5.5.5.5", 8888) # Can be treated identical to a regular socket object - s.connect(("www.test.com", 80)) - s.sendall("GET / ...") + s.connect(("www.somesite.com", 80)) + s.sendall("GET / HTTP/1.1 ...") print s.recv(4096) +## Monkeypatching ## To monkeypatch the entire standard library with a single default proxy: + import urllib2 import socket import socks - import urllib2 socks.set_default_proxy(socks.SOCKS5, "localhost") socket.socket = socks.socksocket - urllib2.urlopen("http://...") # All requests will pass through the SOCKS proxy + urllib2.urlopen("http://www.somesite.com/") # All requests will pass through the SOCKS proxy -Note that monkeypatching may not work for all standard modules or for all third party modules, and generally isn't recommended. +Note that monkeypatching may not work for all standard modules or for all third party modules, and generally isn't recommended. Monkeypatching is usually an anti-pattern in Python. + +## urllib2 Handler ## + +Example use case with the `sockshandler` urllib2 handler. Note that you must import both `socks` and `sockshandler`, as the handler is its own module separate from PySocks. The module is included in the PyPI package. + + import urllib2 + import socks + from sockshandler import SocksiPyHandler + + opener = urllib2.build_opener(SocksiPyHandler(socks.SOCKS5, "127.0.0.1", 9050)) + print opener.open("http://www.somesite.com/") # All requests made by the opener will pass through the SOCKS proxy -------------------------------------------- @@ -87,7 +86,7 @@ Original SocksiPy README attached below, amended to reflect API changes. -------------------------------------------- -SocksiPy - version 1.5.0 +SocksiPy A Python SOCKS module. @@ -277,6 +276,7 @@ class `HTTPError` - This will be raised for HTTP errors. The message will contai the HTTP status code and provided error message. After establishing the connection, the object behaves like a standard socket. + Methods like `makefile()` and `settimeout()` should behave just like regular sockets. Call the `close()` method to close the connection. diff --git a/src/lib/PySocks/setup.py b/src/lib/PySocks/setup.py index 9db0f3d2..d864fcc0 100644 --- a/src/lib/PySocks/setup.py +++ b/src/lib/PySocks/setup.py @@ -1,7 +1,7 @@ #!/usr/bin/env python -from distutils.core import setup +from setuptools import setup -VERSION = "1.5.3" +VERSION = "1.6.7" setup( name = "PySocks", @@ -14,4 +14,3 @@ setup( keywords = ["socks", "proxy"], py_modules=["socks", "sockshandler"] ) - diff --git a/src/lib/PySocks/socks.py b/src/lib/PySocks/socks.py index ad1e9780..0c91ea6a 100644 --- a/src/lib/PySocks/socks.py +++ b/src/lib/PySocks/socks.py @@ -1,6 +1,5 @@ """ SocksiPy - Python SOCKS module. -Version 1.5.3 Copyright 2006 Dan-Haim. All rights reserved. @@ -52,14 +51,28 @@ Modifications made by Anorov (https://github.com/Anorov) -Various small bug fixes """ -__version__ = "1.5.3" +__version__ = "1.6.7" import socket import struct from errno import EOPNOTSUPP, EINVAL, EAGAIN from io import BytesIO from os import SEEK_CUR +import os +import sys +import functools +import logging from collections import Callable +from base64 import b64encode + + +if os.name == "nt" and sys.version_info < (3, 0): + try: + import win_inet_pton + except ImportError: + raise ImportError("To run PySocks on Windows you must install win_inet_pton") + +log = logging.getLogger(__name__) PROXY_TYPE_SOCKS4 = SOCKS4 = 1 PROXY_TYPE_SOCKS5 = SOCKS5 = 2 @@ -70,6 +83,25 @@ PRINTABLE_PROXY_TYPES = dict(zip(PROXY_TYPES.values(), PROXY_TYPES.keys())) _orgsocket = _orig_socket = socket.socket + +def set_self_blocking(function): + + @functools.wraps(function) + def wrapper(*args, **kwargs): + self = args[0] + try: + _is_blocking = self.gettimeout() + if _is_blocking == 0: + self.setblocking(True) + return function(*args, **kwargs) + except Exception as e: + raise + finally: + # set orgin blcoking + if _is_blocking == 0: + self.setblocking(False) + return wrapper + class ProxyError(IOError): """ socket_err contains original socket.error exception. @@ -122,7 +154,10 @@ def set_default_proxy(proxy_type=None, addr=None, port=None, rdns=True, username username.encode() if username else None, password.encode() if password else None) -setdefaultproxy = set_default_proxy +def setdefaultproxy(*args, **kwargs): + if 'proxytype' in kwargs: + kwargs['proxy_type'] = kwargs.pop('proxytype') + return set_default_proxy(*args, **kwargs) def get_default_proxy(): """ @@ -147,9 +182,10 @@ def wrap_module(module): wrapmodule = wrap_module def create_connection(dest_pair, proxy_type=None, proxy_addr=None, - proxy_port=None, proxy_username=None, - proxy_password=None, timeout=None, - source_address=None): + proxy_port=None, proxy_rdns=True, + proxy_username=None, proxy_password=None, + timeout=None, source_address=None, + socket_options=None): """create_connection(dest_pair, *[, timeout], **proxy_args) -> socket object Like socket.create_connection(), but connects to proxy @@ -161,14 +197,48 @@ def create_connection(dest_pair, proxy_type=None, proxy_addr=None, source_address - tuple (host, port) for the socket to bind to as its source address before connecting (only for compatibility) """ - sock = socksocket() - if isinstance(timeout, (int, float)): - sock.settimeout(timeout) - if proxy_type is not None: - sock.set_proxy(proxy_type, proxy_addr, proxy_port, - proxy_username, proxy_password) - sock.connect(dest_pair) - return sock + # Remove IPv6 brackets on the remote address and proxy address. + remote_host, remote_port = dest_pair + if remote_host.startswith('['): + remote_host = remote_host.strip('[]') + if proxy_addr and proxy_addr.startswith('['): + proxy_addr = proxy_addr.strip('[]') + + err = None + + # Allow the SOCKS proxy to be on IPv4 or IPv6 addresses. + for r in socket.getaddrinfo(proxy_addr, proxy_port, 0, socket.SOCK_STREAM): + family, socket_type, proto, canonname, sa = r + sock = None + try: + sock = socksocket(family, socket_type, proto) + + if socket_options: + for opt in socket_options: + sock.setsockopt(*opt) + + if isinstance(timeout, (int, float)): + sock.settimeout(timeout) + + if proxy_type: + sock.set_proxy(proxy_type, proxy_addr, proxy_port, proxy_rdns, + proxy_username, proxy_password) + if source_address: + sock.bind(source_address) + + sock.connect((remote_host, remote_port)) + return sock + + except (socket.error, ProxyConnectionError) as e: + err = e + if sock: + sock.close() + sock = None + + if err: + raise err + + raise socket.error("gai returned empty list.") class _BaseSocket(socket.socket): """Allows Python 2's "delegated" methods such as send() to be overridden @@ -207,12 +277,12 @@ class socksocket(_BaseSocket): default_proxy = None - def __init__(self, family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0, _sock=None): + def __init__(self, family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0, *args, **kwargs): if type not in (socket.SOCK_STREAM, socket.SOCK_DGRAM): msg = "Socket type must be stream or datagram, not {!r}" raise ValueError(msg.format(type)) - _BaseSocket.__init__(self, family, type, proto, _sock) + super(socksocket, self).__init__(family, type, proto, *args, **kwargs) self._proxyconn = None # TCP connection to keep UDP relay alive if self.default_proxy: @@ -222,6 +292,8 @@ class socksocket(_BaseSocket): self.proxy_sockname = None self.proxy_peername = None + self._timeout = None + def _readall(self, file, count): """ Receive EXACTLY the number of bytes requested from the file object. @@ -235,6 +307,24 @@ class socksocket(_BaseSocket): data += d return data + def settimeout(self, timeout): + self._timeout = timeout + try: + # test if we're connected, if so apply timeout + peer = self.get_proxy_peername() + super(socksocket, self).settimeout(self._timeout) + except socket.error: + pass + + def gettimeout(self): + return self._timeout + + def setblocking(self, v): + if v: + self.settimeout(None) + else: + self.settimeout(0.0) + def set_proxy(self, proxy_type=None, addr=None, port=None, rdns=True, username=None, password=None): """set_proxy(proxy_type, addr[, port[, rdns[, username[, password]]]]) Sets the proxy to be used. @@ -257,7 +347,10 @@ class socksocket(_BaseSocket): username.encode() if username else None, password.encode() if password else None) - setproxy = set_proxy + def setproxy(self, *args, **kwargs): + if 'proxytype' in kwargs: + kwargs['proxy_type'] = kwargs.pop('proxytype') + return self.set_proxy(*args, **kwargs) def bind(self, *pos, **kw): """ @@ -273,7 +366,7 @@ class socksocket(_BaseSocket): if proxy_type != SOCKS5: msg = "UDP only supported by SOCKS5 proxy type" raise socket.error(EOPNOTSUPP, msg) - _BaseSocket.bind(self, *pos, **kw) + super(socksocket, self).bind(*pos, **kw) # Need to specify actual local port because # some relays drop packets if a port of zero is specified. @@ -292,12 +385,13 @@ class socksocket(_BaseSocket): # but some proxies return a private IP address (10.x.y.z) host, _ = proxy _, port = relay - _BaseSocket.connect(self, (host, port)) + super(socksocket, self).connect((host, port)) + super(socksocket, self).settimeout(self._timeout) self.proxy_sockname = ("0.0.0.0", 0) # Unknown def sendto(self, bytes, *args, **kwargs): if self.type != socket.SOCK_DGRAM: - return _BaseSocket.sendto(self, bytes, *args, **kwargs) + return super(socksocket, self).sendto(bytes, *args, **kwargs) if not self._proxyconn: self.bind(("", 0)) @@ -311,23 +405,23 @@ class socksocket(_BaseSocket): header.write(STANDALONE) self._write_SOCKS5_address(address, header) - sent = _BaseSocket.send(self, header.getvalue() + bytes, *flags, **kwargs) + sent = super(socksocket, self).send(header.getvalue() + bytes, *flags, **kwargs) return sent - header.tell() def send(self, bytes, flags=0, **kwargs): if self.type == socket.SOCK_DGRAM: return self.sendto(bytes, flags, self.proxy_peername, **kwargs) else: - return _BaseSocket.send(self, bytes, flags, **kwargs) + return super(socksocket, self).send(bytes, flags, **kwargs) def recvfrom(self, bufsize, flags=0): if self.type != socket.SOCK_DGRAM: - return _BaseSocket.recvfrom(self, bufsize, flags) + return super(socksocket, self).recvfrom(bufsize, flags) if not self._proxyconn: self.bind(("", 0)) - buf = BytesIO(_BaseSocket.recv(self, bufsize, flags)) - buf.seek(+2, SEEK_CUR) + buf = BytesIO(super(socksocket, self).recv(bufsize + 1024, flags)) + buf.seek(2, SEEK_CUR) frag = buf.read(1) if ord(frag): raise NotImplementedError("Received UDP packet fragment") @@ -338,7 +432,7 @@ class socksocket(_BaseSocket): if fromhost != peerhost or peerport not in (0, fromport): raise socket.error(EAGAIN, "Packet filtered") - return (buf.read(), (fromhost, fromport)) + return (buf.read(bufsize), (fromhost, fromport)) def recv(self, *pos, **kw): bytes, _ = self.recvfrom(*pos, **kw) @@ -347,7 +441,7 @@ class socksocket(_BaseSocket): def close(self): if self._proxyconn: self._proxyconn.close() - return _BaseSocket.close(self) + return super(socksocket, self).close() def get_proxy_sockname(self): """ @@ -361,7 +455,7 @@ class socksocket(_BaseSocket): """ Returns the IP and port number of the proxy. """ - return _BaseSocket.getpeername(self) + return super(socksocket, self).getpeername() getproxypeername = get_proxy_peername @@ -459,6 +553,8 @@ class socksocket(_BaseSocket): # Get the bound address/port bnd = self._read_SOCKS5_address(reader) + + super(socksocket, self).settimeout(self._timeout) return (resolved, bnd) finally: reader.close() @@ -471,25 +567,38 @@ class socksocket(_BaseSocket): """ host, port = addr proxy_type, _, _, rdns, username, password = self.proxy + family_to_byte = {socket.AF_INET: b"\x01", socket.AF_INET6: b"\x04"} # If the given destination address is an IP address, we'll - # use the IPv4 address request even if remote resolving was specified. - try: - addr_bytes = socket.inet_aton(host) - file.write(b"\x01" + addr_bytes) - host = socket.inet_ntoa(addr_bytes) - except socket.error: - # Well it's not an IP number, so it's probably a DNS name. - if rdns: - # Resolve remotely - host_bytes = host.encode('idna') - file.write(b"\x03" + chr(len(host_bytes)).encode() + host_bytes) - else: - # Resolve locally - addr_bytes = socket.inet_aton(socket.gethostbyname(host)) - file.write(b"\x01" + addr_bytes) - host = socket.inet_ntoa(addr_bytes) + # use the IP address request even if remote resolving was specified. + # Detect whether the address is IPv4/6 directly. + for family in (socket.AF_INET, socket.AF_INET6): + try: + addr_bytes = socket.inet_pton(family, host) + file.write(family_to_byte[family] + addr_bytes) + host = socket.inet_ntop(family, addr_bytes) + file.write(struct.pack(">H", port)) + return host, port + except socket.error: + continue + # Well it's not an IP number, so it's probably a DNS name. + if rdns: + # Resolve remotely + host_bytes = host.encode('idna') + file.write(b"\x03" + chr(len(host_bytes)).encode() + host_bytes) + else: + # Resolve locally + addresses = socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM, socket.IPPROTO_TCP, socket.AI_ADDRCONFIG) + # We can't really work out what IP is reachable, so just pick the + # first. + target_addr = addresses[0] + family = target_addr[0] + host = target_addr[4][0] + + addr_bytes = socket.inet_pton(family, host) + file.write(family_to_byte[family] + addr_bytes) + host = socket.inet_ntop(family, addr_bytes) file.write(struct.pack(">H", port)) return host, port @@ -500,6 +609,8 @@ class socksocket(_BaseSocket): elif atyp == b"\x03": length = self._readall(file, 1) addr = self._readall(file, ord(length)) + elif atyp == b"\x04": + addr = socket.inet_ntop(socket.AF_INET6, self._readall(file, 16)) else: raise GeneralProxyError("SOCKS5 proxy server sent invalid data") @@ -575,8 +686,17 @@ class socksocket(_BaseSocket): # If we need to resolve locally, we do this now addr = dest_addr if rdns else socket.gethostbyname(dest_addr) - self.sendall(b"CONNECT " + addr.encode('idna') + b":" + str(dest_port).encode() + - b" HTTP/1.1\r\n" + b"Host: " + dest_addr.encode('idna') + b"\r\n\r\n") + http_headers = [ + b"CONNECT " + addr.encode('idna') + b":" + str(dest_port).encode() + b" HTTP/1.1", + b"Host: " + dest_addr.encode('idna') + ] + + if username and password: + http_headers.append(b"Proxy-Authorization: basic " + b64encode(username + b":" + password)) + + http_headers.append(b"\r\n") + + self.sendall(b"\r\n".join(http_headers)) # We just need the first line to check if the connection was successful fobj = self.makefile() @@ -616,7 +736,7 @@ class socksocket(_BaseSocket): HTTP: _negotiate_HTTP } - + @set_self_blocking def connect(self, dest_pair): """ Connects to the specified destination through a proxy. @@ -625,6 +745,12 @@ class socksocket(_BaseSocket): dest_pair - 2-tuple of (IP/hostname, port). """ + if len(dest_pair) != 2 or dest_pair[0].startswith("["): + # Probably IPv6, not supported -- raise an error, and hope + # Happy Eyeballs (RFC6555) makes sure at least the IPv4 + # connection works... + raise socket.error("PySocks doesn't support IPv6: %s" % str(dest_pair)) + dest_addr, dest_port = dest_pair if self.type == socket.SOCK_DGRAM: @@ -650,17 +776,22 @@ class socksocket(_BaseSocket): raise GeneralProxyError("Invalid destination-connection (host, port) pair") + # We set the timeout here so that we don't hang in connection or during + # negotiation. + super(socksocket, self).settimeout(self._timeout) + if proxy_type is None: # Treat like regular socket object self.proxy_peername = dest_pair - _BaseSocket.connect(self, (dest_addr, dest_port)) + super(socksocket, self).settimeout(self._timeout) + super(socksocket, self).connect((dest_addr, dest_port)) return proxy_addr = self._proxy_addr() try: - # Initial connection to proxy server - _BaseSocket.connect(self, proxy_addr) + # Initial connection to proxy server. + super(socksocket, self).connect(proxy_addr) except socket.error as error: # Error while connecting to proxy @@ -671,6 +802,7 @@ class socksocket(_BaseSocket): msg = "Error connecting to {0} proxy {1}".format(printable_type, proxy_server) + log.debug("%s due to: %s", msg, error) raise ProxyConnectionError(msg, error) else: diff --git a/src/lib/PySocks/test/README b/src/lib/PySocks/test/README deleted file mode 100644 index e08608ef..00000000 --- a/src/lib/PySocks/test/README +++ /dev/null @@ -1,5 +0,0 @@ -Very rudimentary tests for Python 2 and Python 3. - -Requirements: tornado, twisted (available through pip) - -./test.sh diff --git a/src/lib/PySocks/test/httpproxy.py b/src/lib/PySocks/test/httpproxy.py deleted file mode 100644 index df0ad031..00000000 --- a/src/lib/PySocks/test/httpproxy.py +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/env python -# -# Simple asynchronous HTTP proxy with tunnelling (CONNECT). -# -# GET/POST proxying based on -# http://groups.google.com/group/python-tornado/msg/7bea08e7a049cf26 -# -# Copyright (C) 2012 Senko Rasic <senko.rasic@dobarkod.hr> -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -import sys -import socket - -import tornado.httpserver -import tornado.ioloop -import tornado.iostream -import tornado.web -import tornado.httpclient - -__all__ = ['ProxyHandler', 'run_proxy'] - - -class ProxyHandler(tornado.web.RequestHandler): - SUPPORTED_METHODS = ['GET', 'POST', 'CONNECT'] - - @tornado.web.asynchronous - def get(self): - - def handle_response(response): - if response.error and not isinstance(response.error, - tornado.httpclient.HTTPError): - self.set_status(500) - self.write('Internal server error:\n' + str(response.error)) - self.finish() - else: - self.set_status(response.code) - for header in ('Date', 'Cache-Control', 'Server', - 'Content-Type', 'Location'): - v = response.headers.get(header) - if v: - self.set_header(header, v) - if response.body: - self.write(response.body) - self.finish() - - req = tornado.httpclient.HTTPRequest(url=self.request.uri, - method=self.request.method, body=self.request.body, - headers=self.request.headers, follow_redirects=False, - allow_nonstandard_methods=True) - - client = tornado.httpclient.AsyncHTTPClient() - try: - client.fetch(req, handle_response) - except tornado.httpclient.HTTPError as e: - if hasattr(e, 'response') and e.response: - self.handle_response(e.response) - else: - self.set_status(500) - self.write('Internal server error:\n' + str(e)) - self.finish() - - @tornado.web.asynchronous - def post(self): - return self.get() - - @tornado.web.asynchronous - def connect(self): - host, port = self.request.uri.split(':') - client = self.request.connection.stream - - def read_from_client(data): - upstream.write(data) - - def read_from_upstream(data): - client.write(data) - - def client_close(data=None): - if upstream.closed(): - return - if data: - upstream.write(data) - upstream.close() - - def upstream_close(data=None): - if client.closed(): - return - if data: - client.write(data) - client.close() - - def start_tunnel(): - client.read_until_close(client_close, read_from_client) - upstream.read_until_close(upstream_close, read_from_upstream) - client.write(b'HTTP/1.0 200 Connection established\r\n\r\n') - - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) - upstream = tornado.iostream.IOStream(s) - upstream.connect((host, int(port)), start_tunnel) - - -def run_proxy(port=8080, start_ioloop=True): - """ - Run proxy on the specified port. If start_ioloop is True (default), - the tornado IOLoop will be started immediately. - """ - app = tornado.web.Application([ - (r'.*', ProxyHandler), - ]) - app.listen(port, address="127.0.0.1") - ioloop = tornado.ioloop.IOLoop.instance() - if start_ioloop: - ioloop.start() - -if __name__ == '__main__': - port = 8081 - if len(sys.argv) > 1: - port = int(sys.argv[1]) - - print ("Running HTTP proxy server") - run_proxy(port) diff --git a/src/lib/PySocks/test/mocks b/src/lib/PySocks/test/mocks deleted file mode 100644 index 5299a3f491d8f8b5a8c9d38b2ffd8c00a231371e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33596 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 JVzgrMzX9qHcW?jz diff --git a/src/lib/PySocks/test/mocks.conf b/src/lib/PySocks/test/mocks.conf deleted file mode 100644 index ab5ef590..00000000 --- a/src/lib/PySocks/test/mocks.conf +++ /dev/null @@ -1,104 +0,0 @@ -################################################# -# # -# Sample configuration file for MOCKS 0.0.2 # -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # -# # -# I recommend reading the examples in this file # -# and then extending it to suite your needs. # -# # -################################################# - - - -######################### -# -# General daemon config -# ~~~~~~~~~~~~~~~~~~~~~ -# -######################### - -PORT = 1081 # Port MOCKS is to listen to -MOCKS_ADDR = 127.0.0.1 # IP adress MOCKS is to bind to -LOG_FILE = mocks.log # MOCKS log file -PID_FILE = mocks.pid # File holding MOCKS's process ID -BUFFER_SIZE = 65536 # Traffic buffer size in bytes -BACKLOG = 5 # Backlog for listen() -NEGOTIATION_TIMEOUT = 5 -CONNECTION_IDLE_TIMEOUT = 300 -BIND_TIMEOUT = 30 -SHUTDOWN_TIMEOUT = 3 -MAX_CONNECTIONS = 50 - - - -########################################################################## -# -# Client filter config -# ~~~~~~~~~~~~~~~~~~~~ -# -# Client filtering means sorting out which clients are allowed -# connection and which are not. This is basically done like this: -# MOCKS has a default behaviour regarding filtering client -# connections. This behaviour is called the 'policy' and can either -# be to ALLOW or to DENY the connection. After setting the policy -# you can specify a list of exceptions. The action MOCKS takes -# for a client matching any of these exceptions is the opposite -# of the policy (that is, if the policy is set to ALLOW the exceptions -# are denied and if the policy is set to DENY the exceptions are allowed). -# An exception is specified in the form ip_address/mask, where mask -# is optional and is an integer ranging from 0 to 32 identifying the -# number of common heading bits that ip_address and the client's IP -# address must have in order to yield a match. If mask is missing, -# 32 will be assumed. For instance, 192.168.1.0/24 will match any IP -# ranging from 192.168.1.1 to 192.168.1.255. -# -# Let's take two examples, one for each type of policy. Let's say we -# only want to allow IPs 10.12.0.0 through 10.12.255.255, 172.23.2.5 and -# 192.168.52.26 to use MOCKS. What we have to to is this: -# -# FILTER_POLICY = DENY -# FILTER_EXCEPTION = 10.12.0.0/16 -# FILTER_EXCEPTION = 172.23.2.5 # implied /32 -# FILTER_EXCEPTION = 192.168.52.26 # implied /32 -# -# Now, let's say this is a public proxy server, but for some reason -# you don't want to let any IP ranging from 192.168.1.1 to 192.168.1.255 -# and neither 10.2.5.13 to connect to it: -# -# FILTER_POLICY = ALLOW -# FILTER_EXCEPTION = 192.168.1.0/24 -# FILTER_EXCEPTION = 10.2.5.13 -# -########################################################################### - -FILTER_POLICY = ALLOW - - - -############################################################################# -# -# Upstream proxy config -# ~~~~~~~~~~~~~~~~~~~~~ -# -# You can choose to further relay traffic through another proxy server. -# MOCKS supports upstream HTTP CONNECT, SOCKS4 and SOCKS5 proxies. You -# must specify the proxy type (one of HTTPCONNECT, SOCKS4 or SOCKS5), the -# proxy address and the proxy port. Optionally you can specify an user -# name and a password used to authenicate to the upstream proxy. This is -# pretty straight forward, so let's just take an example. Let's say you -# want to use the HTTP CONNECT server at httpconnectproxy.com, on port 3128, -# using the username 'foo' and the password 'bar'. You do it like this: -# -# UP_PROXY_TYPE = HTTPCONNECT -# UP_PROXY_ADDR = httpconnectproxy.com -# UP_PROXY_PORT = 3128 -# UP_PROXY_USER = foo # These two can be missing if you -# UP_PROXY_PASSWD = bar # are not required to authenticate -# -############################################################################# - -# UP_PROXY_TYPE = HTTPCONNECT -# UP_PROXY_ADDR = 192.168.1.12 -# UP_PROXY_PORT = 3128 - - diff --git a/src/lib/PySocks/test/socks4server.py b/src/lib/PySocks/test/socks4server.py deleted file mode 100644 index 05a54b93..00000000 --- a/src/lib/PySocks/test/socks4server.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python -from twisted.internet import reactor -from twisted.protocols.socks import SOCKSv4Factory - -def run_proxy(): - reactor.listenTCP(1080, SOCKSv4Factory("/dev/null"), interface="127.0.0.1") - try: - reactor.run() - except (KeyboardInterrupt, SystemExit): - reactor.stop() - -if __name__ == "__main__": - print "Running SOCKS4 proxy server" - run_proxy() diff --git a/src/lib/PySocks/test/sockstest.py b/src/lib/PySocks/test/sockstest.py deleted file mode 100644 index 526cb3fc..00000000 --- a/src/lib/PySocks/test/sockstest.py +++ /dev/null @@ -1,174 +0,0 @@ -import sys -sys.path.append("..") -import socks -import socket - -PY3K = sys.version_info[0] == 3 - -if PY3K: - import urllib.request as urllib2 -else: - import sockshandler - import urllib2 - -def raw_HTTP_request(): - req = "GET /ip HTTP/1.1\r\n" - req += "Host: ifconfig.me\r\n" - req += "User-Agent: Mozilla\r\n" - req += "Accept: text/html\r\n" - req += "\r\n" - return req.encode() - -def socket_HTTP_test(): - s = socks.socksocket() - s.set_proxy(socks.HTTP, "127.0.0.1", 8081) - s.connect(("ifconfig.me", 80)) - s.sendall(raw_HTTP_request()) - status = s.recv(2048).splitlines()[0] - assert status.startswith(b"HTTP/1.1 200") - -def socket_SOCKS4_test(): - s = socks.socksocket() - s.set_proxy(socks.SOCKS4, "127.0.0.1", 1080) - s.connect(("ifconfig.me", 80)) - s.sendall(raw_HTTP_request()) - status = s.recv(2048).splitlines()[0] - assert status.startswith(b"HTTP/1.1 200") - -def socket_SOCKS5_test(): - s = socks.socksocket() - s.set_proxy(socks.SOCKS5, "127.0.0.1", 1081) - s.connect(("ifconfig.me", 80)) - s.sendall(raw_HTTP_request()) - status = s.recv(2048).splitlines()[0] - assert status.startswith(b"HTTP/1.1 200") - -def SOCKS5_connect_timeout_test(): - s = socks.socksocket() - s.settimeout(0.0001) - s.set_proxy(socks.SOCKS5, "8.8.8.8", 80) - try: - s.connect(("ifconfig.me", 80)) - except socks.ProxyConnectionError as e: - assert str(e.socket_err) == "timed out" - -def SOCKS5_timeout_test(): - s = socks.socksocket() - s.settimeout(0.0001) - s.set_proxy(socks.SOCKS5, "127.0.0.1", 1081) - try: - s.connect(("ifconfig.me", 4444)) - except socks.GeneralProxyError as e: - assert str(e.socket_err) == "timed out" - - -def socket_SOCKS5_auth_test(): - # TODO: add support for this test. Will need a better SOCKS5 server. - s = socks.socksocket() - s.set_proxy(socks.SOCKS5, "127.0.0.1", 1081, username="a", password="b") - s.connect(("ifconfig.me", 80)) - s.sendall(raw_HTTP_request()) - status = s.recv(2048).splitlines()[0] - assert status.startswith(b"HTTP/1.1 200") - -def socket_HTTP_IP_test(): - s = socks.socksocket() - s.set_proxy(socks.HTTP, "127.0.0.1", 8081) - s.connect(("133.242.129.236", 80)) - s.sendall(raw_HTTP_request()) - status = s.recv(2048).splitlines()[0] - assert status.startswith(b"HTTP/1.1 200") - -def socket_SOCKS4_IP_test(): - s = socks.socksocket() - s.set_proxy(socks.SOCKS4, "127.0.0.1", 1080) - s.connect(("133.242.129.236", 80)) - s.sendall(raw_HTTP_request()) - status = s.recv(2048).splitlines()[0] - assert status.startswith(b"HTTP/1.1 200") - -def socket_SOCKS5_IP_test(): - s = socks.socksocket() - s.set_proxy(socks.SOCKS5, "127.0.0.1", 1081) - s.connect(("133.242.129.236", 80)) - s.sendall(raw_HTTP_request()) - status = s.recv(2048).splitlines()[0] - assert status.startswith(b"HTTP/1.1 200") - -def urllib2_HTTP_test(): - socks.set_default_proxy(socks.HTTP, "127.0.0.1", 8081) - socks.wrap_module(urllib2) - status = urllib2.urlopen("http://ifconfig.me/ip").getcode() - assert status == 200 - -def urllib2_SOCKS5_test(): - socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 1081) - socks.wrap_module(urllib2) - status = urllib2.urlopen("http://ifconfig.me/ip").getcode() - assert status == 200 - -def urllib2_handler_HTTP_test(): - opener = urllib2.build_opener(sockshandler.SocksiPyHandler(socks.HTTP, "127.0.0.1", 8081)) - status = opener.open("http://ifconfig.me/ip").getcode() - assert status == 200 - -def urllib2_handler_SOCKS5_test(): - opener = urllib2.build_opener(sockshandler.SocksiPyHandler(socks.SOCKS5, "127.0.0.1", 1081)) - status = opener.open("http://ifconfig.me/ip").getcode() - assert status == 200 - -def global_override_HTTP_test(): - socks.set_default_proxy(socks.HTTP, "127.0.0.1", 8081) - good = socket.socket - socket.socket = socks.socksocket - status = urllib2.urlopen("http://ifconfig.me/ip").getcode() - socket.socket = good - assert status == 200 - -def global_override_SOCKS5_test(): - default_proxy = (socks.SOCKS5, "127.0.0.1", 1081) - socks.set_default_proxy(*default_proxy) - good = socket.socket - socket.socket = socks.socksocket - status = urllib2.urlopen("http://ifconfig.me/ip").getcode() - socket.socket = good - assert status == 200 - assert socks.get_default_proxy()[1].decode() == default_proxy[1] - - -def main(): - print("Running tests...") - socket_HTTP_test() - print("1/12") - socket_SOCKS4_test() - print("2/12") - socket_SOCKS5_test() - print("3/12") - if not PY3K: - urllib2_handler_HTTP_test() - print("3.33/12") - urllib2_handler_SOCKS5_test() - print("3.66/12") - socket_HTTP_IP_test() - print("4/12") - socket_SOCKS4_IP_test() - print("5/12") - socket_SOCKS5_IP_test() - print("6/12") - SOCKS5_connect_timeout_test() - print("7/12") - SOCKS5_timeout_test() - print("8/12") - urllib2_HTTP_test() - print("9/12") - urllib2_SOCKS5_test() - print("10/12") - global_override_HTTP_test() - print("11/12") - global_override_SOCKS5_test() - print("12/12") - print("All tests ran successfully") - - -if __name__ == "__main__": - main() diff --git a/src/lib/PySocks/test/test.sh b/src/lib/PySocks/test/test.sh deleted file mode 100644 index 18479b9f..00000000 --- a/src/lib/PySocks/test/test.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -shopt -s expand_aliases -type python2 >/dev/null 2>&1 || alias python2='python' - -echo "Starting proxy servers..." -python2 socks4server.py > /dev/null & -python2 httpproxy.py > /dev/null & -./mocks start - -sleep 2 -echo "Python 2.6 tests" -python2.6 sockstest.py -exit - -sleep 2 -echo "Python 2.7 tests" -python2.7 sockstest.py - -sleep 2 -echo "Python 3.x tests" -python3 sockstest.py - -pkill python2 > /dev/null -./mocks shutdown -echo "Finished tests" diff --git a/src/lib/PySocks/win_inet_pton/LICENSE b/src/lib/PySocks/win_inet_pton/LICENSE new file mode 100644 index 00000000..3efb7f73 --- /dev/null +++ b/src/lib/PySocks/win_inet_pton/LICENSE @@ -0,0 +1,4 @@ +This software released into the public domain. Anyone is free to copy, +modify, publish, use, compile, sell, or distribute this software, +either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. \ No newline at end of file diff --git a/src/lib/PySocks/win_inet_pton/README b/src/lib/PySocks/win_inet_pton/README new file mode 100644 index 00000000..2929a82e --- /dev/null +++ b/src/lib/PySocks/win_inet_pton/README @@ -0,0 +1,29 @@ +win_inet_pton +============= + +Native inet_pton and inet_ntop implementation for Python on Windows (with ctypes). + + +Credit Where Credit Is Due +-------------------------- + +This package is based on code that was originally written by https://github.com/nnemkin here: https://gist.github.com/nnemkin/4966028 + + +Why? +---- + +I needed this functionality in https://github.com/SerenitySoftwareLLC/cahoots to get full windows support. I figured, since there were other people looking for a solution to this on the net, I should publish it. + + +Usage +----- + +Just import it, and it will auto-add the methods to the socket library. + + +import win_inet_pton +import socket + +socket.inet_pton(...) +socket.inet_ntop(...) \ No newline at end of file diff --git a/src/lib/PySocks/win_inet_pton/__init__.py b/src/lib/PySocks/win_inet_pton/__init__.py new file mode 100644 index 00000000..ae69f8f9 --- /dev/null +++ b/src/lib/PySocks/win_inet_pton/__init__.py @@ -0,0 +1 @@ +from win_inet_pton import * \ No newline at end of file diff --git a/src/lib/PySocks/win_inet_pton/setup.py b/src/lib/PySocks/win_inet_pton/setup.py new file mode 100644 index 00000000..9d9a2fda --- /dev/null +++ b/src/lib/PySocks/win_inet_pton/setup.py @@ -0,0 +1,20 @@ +from distutils.core import setup + +setup ( + name = 'win_inet_pton', + version = '1.0.1', + py_modules = ['win_inet_pton'], + url = 'https://github.com/hickeroar/win_inet_pton', + author = 'Ryan Vennell', + author_email = 'ryan.vennell@gmail.com', + description = 'Native inet_pton and inet_ntop implementation for Python on Windows (with ctypes).', + license = open('LICENSE', 'r').read(), + classifiers = [ + 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Developers', + 'Operating System :: OS Independent', + 'Operating System :: Microsoft :: Windows', + 'Programming Language :: Python :: 2.7', + 'Topic :: Utilities' + ] +) \ No newline at end of file diff --git a/src/lib/PySocks/win_inet_pton/win_inet_pton.py b/src/lib/PySocks/win_inet_pton/win_inet_pton.py new file mode 100644 index 00000000..12aaf46c --- /dev/null +++ b/src/lib/PySocks/win_inet_pton/win_inet_pton.py @@ -0,0 +1,84 @@ +# This software released into the public domain. Anyone is free to copy, +# modify, publish, use, compile, sell, or distribute this software, +# either in source code form or as a compiled binary, for any purpose, +# commercial or non-commercial, and by any means. + +import socket +import ctypes +import os + + +class sockaddr(ctypes.Structure): + _fields_ = [("sa_family", ctypes.c_short), + ("__pad1", ctypes.c_ushort), + ("ipv4_addr", ctypes.c_byte * 4), + ("ipv6_addr", ctypes.c_byte * 16), + ("__pad2", ctypes.c_ulong)] + +if hasattr(ctypes, 'windll'): + WSAStringToAddressA = ctypes.windll.ws2_32.WSAStringToAddressA + WSAAddressToStringA = ctypes.windll.ws2_32.WSAAddressToStringA +else: + def not_windows(): + raise SystemError( + "Invalid platform. ctypes.windll must be available." + ) + WSAStringToAddressA = not_windows + WSAAddressToStringA = not_windows + + +def inet_pton(address_family, ip_string): + addr = sockaddr() + addr.sa_family = address_family + addr_size = ctypes.c_int(ctypes.sizeof(addr)) + + if WSAStringToAddressA( + ip_string, + address_family, + None, + ctypes.byref(addr), + ctypes.byref(addr_size) + ) != 0: + raise socket.error(ctypes.FormatError()) + + if address_family == socket.AF_INET: + return ctypes.string_at(addr.ipv4_addr, 4) + if address_family == socket.AF_INET6: + return ctypes.string_at(addr.ipv6_addr, 16) + + raise socket.error('unknown address family') + + +def inet_ntop(address_family, packed_ip): + addr = sockaddr() + addr.sa_family = address_family + addr_size = ctypes.c_int(ctypes.sizeof(addr)) + ip_string = ctypes.create_string_buffer(128) + ip_string_size = ctypes.c_int(ctypes.sizeof(ip_string)) + + if address_family == socket.AF_INET: + if len(packed_ip) != ctypes.sizeof(addr.ipv4_addr): + raise socket.error('packed IP wrong length for inet_ntoa') + ctypes.memmove(addr.ipv4_addr, packed_ip, 4) + elif address_family == socket.AF_INET6: + if len(packed_ip) != ctypes.sizeof(addr.ipv6_addr): + raise socket.error('packed IP wrong length for inet_ntoa') + ctypes.memmove(addr.ipv6_addr, packed_ip, 16) + else: + raise socket.error('unknown address family') + + if WSAAddressToStringA( + ctypes.byref(addr), + addr_size, + None, + ip_string, + ctypes.byref(ip_string_size) + ) != 0: + raise socket.error(ctypes.FormatError()) + + return ip_string[:ip_string_size.value - 1] + +# Adding our two functions to the socket library +if os.name == 'nt': + socket.inet_pton = inet_pton + socket.inet_ntop = inet_ntop