From 1f33a632fb5307225193da51bfa7e3ba5ef74461 Mon Sep 17 00:00:00 2001 From: mickael Date: Sun, 6 Jan 2019 04:53:20 +0000 Subject: [PATCH] update rocksock.py to latest --- rocksock.py | 82 +++++++++++++++++++++++++++++------------------------ 1 file changed, 45 insertions(+), 37 deletions(-) diff --git a/rocksock.py b/rocksock.py index 4eb597f..1a70476 100644 --- a/rocksock.py +++ b/rocksock.py @@ -56,6 +56,9 @@ class RocksockException(Exception): def get_error(self): return self.error + def get_errortype(self): + return self.errortype + def reraise(self): import sys ei = sys.exc_info() @@ -161,13 +164,18 @@ class Rocksock(): self.sock = None self.timeout = timeout + def _failed_proxy(self, pnum): + if pnum < 0: return -1 + if pnum >= len(self.proxychain)-1: return -1 + return pnum + def connect(self): af, sa = self._resolve(self.proxychain[0].hostinfo, True) try: x = af+1 except TypeError: - raise RocksockException(-3, "unexpected problem resolving DNS, try again", errortype=RS_ET_GAI) + raise RocksockException(-3, "unexpected problem resolving DNS, try again", failedproxy=self._failed_proxy(0), errortype=RS_ET_GAI) # print "GOT A WEIRD AF" # print af # raise RocksockException(-6666, af, errortype=RS_ET_GAI) @@ -177,9 +185,9 @@ class Rocksock(): try: self.sock.connect((sa[0], sa[1])) except socket.timeout: - raise RocksockException(RS_E_HIT_TIMEOUT) + raise RocksockException(RS_E_HIT_TIMEOUT, failedproxy=self._failed_proxy(0)) except socket.error as e: - raise RocksockException(e.errno, errortype=RS_ET_SYS) + raise RocksockException(e.errno, errortype=RS_ET_SYS, failedproxy=self._failed_proxy(0)) for pnum in xrange(1, len(self.proxychain)): curr = self.proxychain[pnum] @@ -192,7 +200,7 @@ class Rocksock(): except ssl.SSLError as e: reason = self._get_ssl_exception_reason(e) #if hasattr(e, 'library'): subsystem = e.library - raise RocksockException(RS_E_SSL_GENERIC, reason, errortype=RS_ET_SSL) + raise RocksockException(RS_E_SSL_GENERIC, failedproxy=reason, errortype=RS_ET_SSL) except socket.error as e: raise RocksockException(e.errno, errortype=RS_ET_SYS) except Exception as e: @@ -221,9 +229,9 @@ class Rocksock(): def canread(self): return select.select([self.sock], [], [], 0)[0] - def send(self, buf): + def send(self, buf, pnum=-1): if self.sock is None: - raise RocksockException(RS_E_NO_SOCKET) + raise RocksockException(RS_E_NO_SOCKET, failedproxy=self._failed_proxy(pnum)) return self.sock.sendall(buf) def _get_ssl_exception_reason(self, e): @@ -233,7 +241,7 @@ class Rocksock(): elif hasattr(e, 'args'): s = e.args[0] return s - def recv(self, count=-1): + def recv(self, count=-1, pnum=-1): data = '' while count: try: @@ -241,15 +249,15 @@ class Rocksock(): if n >= 1024*1024: n = 1024*1024 chunk = self.sock.recv(n) except socket.timeout: - raise RocksockException(RS_E_HIT_TIMEOUT) + raise RocksockException(RS_E_HIT_TIMEOUT, failedproxy=self._failed_proxy(pnum)) except ssl.SSLError as e: s = self._get_ssl_exception_reason(e) if s == 'The read operation timed out': - raise RocksockException(RS_E_HIT_READTIMEOUT) + raise RocksockException(RS_E_HIT_READTIMEOUT, failedproxy=self._failed_proxy(pnum)) else: - raise RocksockException(RS_E_SSL_GENERIC, s, errortype=RS_ET_SSL) + raise RocksockException(RS_E_SSL_GENERIC, failedproxy=s, errortype=RS_ET_SSL) if len(chunk) == 0: - raise RocksockException(RS_E_REMOTE_DISCONNECTED) + raise RocksockException(RS_E_REMOTE_DISCONNECTED, failedproxy=self._failed_proxy(pnum)) data += chunk if count == -1: break else: count -= len(chunk) @@ -318,7 +326,7 @@ class Rocksock(): buf += '\0\0\0\x01' else: af, sa = self._resolve(dest, True) - if af != socket.AF_INET: raise RocksockException(RS_E_SOCKS4_NO_IP6) + if af != socket.AF_INET: raise RocksockException(RS_E_SOCKS4_NO_IP6, failedproxy=-1) buf += self._ip_to_bytes(sa[0]) buf += '\0' if v4a: buf += dest.hostinfo.host + '\0' @@ -326,18 +334,18 @@ class Rocksock(): def _connect_socks4(self, header, pnum): self.send(header) - res = self.recv(8) + res = self.recv(8, pnum=pnum) if len(res) < 8 or ord(res[0]) != 0: - raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, pnum-1) + raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, failedproxy=self._failed_proxy(pnum)) ch = ord(res[1]) if ch == 0x5a: pass elif ch == 0x5b: - raise RocksockException(RS_E_TARGETPROXY_CONNECT_FAILED, pnum-1) + raise RocksockException(RS_E_TARGETPROXY_CONNECT_FAILED, failedproxy=self._failed_proxy(pnum)) elif ch == 0x5c or ch == 0x5d: - return RocksockException(RS_E_PROXY_AUTH_FAILED, pnum-1) + return RocksockException(RS_E_PROXY_AUTH_FAILED, failedproxy=self._failed_proxy(pnum)) else: - raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, pnum-1) + raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, failedproxy=self._failed_proxy(pnum)) def _setup_socks5_header(self, proxy): buf = '\x05' @@ -349,21 +357,21 @@ class Rocksock(): def _connect_socks5(self, header, pnum): self.send(header) - res = self.recv(2) + res = self.recv(2, pnum=pnum) if len(res) != 2 or res[0] != '\x05': - raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, pnum-1) + raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, failedproxy=self._failed_proxy(pnum)) if res[1] == '\xff': - raise RocksockException(RS_E_PROXY_AUTH_FAILED, pnum-1) + raise RocksockException(RS_E_PROXY_AUTH_FAILED, failedproxy=self._failed_proxy(pnum)) if ord(res[1]) == 2: px = self.proxychain[pnum-1] if px.username and px.password: pkt = '\x01%c%s%c%s'%(len(px.username),px.username,len(px.password),px.password) self.send(pkt) - res = self.recv(2) + res = self.recv(2, pnum=pnum) if len(res) < 2 or res[1] != '\0': - raise RocksockException(RS_E_PROXY_AUTH_FAILED, pnum-1) - else: raise RocksockException(RS_E_PROXY_AUTH_FAILED, pnum-1) + raise RocksockException(RS_E_PROXY_AUTH_FAILED, failedproxy=self._failed_proxy(pnum)) + else: raise RocksockException(RS_E_PROXY_AUTH_FAILED, failedproxy=self._failed_proxy(pnum)) dst = self.proxychain[pnum] numeric = self._isnumericipv4(dst.hostinfo.host) if numeric: @@ -373,20 +381,20 @@ class Rocksock(): pkt = '\x05\x01\x00%c%s%c%c'% (1 if numeric else 3, dstaddr, dst.hostinfo.port / 256, dst.hostinfo.port % 256) self.send(pkt) - res = self.recv() + res = self.recv(pnum=pnum) if len(res) < 2 or res[0] != '\x05': - raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, pnum-1) + raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, failedproxy=self._failed_proxy(pnum)) ch = ord(res[1]) if ch == 0: pass - elif ch == 1: raise RocksockException(RS_E_PROXY_GENERAL_FAILURE, pnum-1) - elif ch == 2: raise RocksockException(RS_E_PROXY_AUTH_FAILED, pnum-1) - elif ch == 3: raise RocksockException(RS_E_TARGETPROXY_NET_UNREACHABLE, pnum-1) - elif ch == 4: raise RocksockException(RS_E_TARGETPROXY_HOST_UNREACHABLE, pnum-1) - elif ch == 5: raise RocksockException(RS_E_TARGETPROXY_CONN_REFUSED, pnum-1) - elif ch == 6: raise RocksockException(RS_E_TARGETPROXY_TTL_EXPIRED, pnum-1) - elif ch == 7: raise RocksockException(RS_E_PROXY_COMMAND_NOT_SUPPORTED, pnum-1) - elif ch == 8: raise RocksockException(RS_E_PROXY_ADDRESSTYPE_NOT_SUPPORTED, pnum-1) - else: raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, pnum-1) + elif ch == 1: raise RocksockException(RS_E_PROXY_GENERAL_FAILURE, failedproxy=self._failed_proxy(pnum)) + elif ch == 2: raise RocksockException(RS_E_PROXY_AUTH_FAILED, failedproxy=self._failed_proxy(pnum)) + elif ch == 3: raise RocksockException(RS_E_TARGETPROXY_NET_UNREACHABLE, failedproxy=self._failed_proxy(pnum)) + elif ch == 4: raise RocksockException(RS_E_TARGETPROXY_HOST_UNREACHABLE, failedproxy=self._failed_proxy(pnum)) + elif ch == 5: raise RocksockException(RS_E_TARGETPROXY_CONN_REFUSED, failedproxy=self._failed_proxy(pnum)) + elif ch == 6: raise RocksockException(RS_E_TARGETPROXY_TTL_EXPIRED, failedproxy=self._failed_proxy(pnum)) + elif ch == 7: raise RocksockException(RS_E_PROXY_COMMAND_NOT_SUPPORTED, failedproxy=self._failed_proxy(pnum)) + elif ch == 8: raise RocksockException(RS_E_PROXY_ADDRESSTYPE_NOT_SUPPORTED, failedproxy=self._failed_proxy(pnum)) + else: raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, failedproxy=self._failed_proxy(pnum)) def _connect_step(self, pnum): @@ -407,11 +415,11 @@ class Rocksock(): elif prev.type == RS_PT_HTTP: dest = self.proxychain[pnum] self.send("CONNECT %s:%d HTTP/1.1\r\n\r\n"%(dest.hostinfo.host, dest.hostinfo.port)) - resp = self.recv() + resp = self.recv(pnum=pnum) if len(resp) <12: - raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, pnum-1) + raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, failedproxy=self._failed_proxy(pnum)) if resp[9] != '2': - raise RocksockException(RS_E_TARGETPROXY_CONNECT_FAILED, pnum-1) + raise RocksockException(RS_E_TARGETPROXY_CONNECT_FAILED, failedproxy=self._failed_proxy(pnum)) if __name__ == '__main__':