update rocksock.py to latest
This commit is contained in:
82
rocksock.py
82
rocksock.py
@@ -56,6 +56,9 @@ class RocksockException(Exception):
|
|||||||
def get_error(self):
|
def get_error(self):
|
||||||
return self.error
|
return self.error
|
||||||
|
|
||||||
|
def get_errortype(self):
|
||||||
|
return self.errortype
|
||||||
|
|
||||||
def reraise(self):
|
def reraise(self):
|
||||||
import sys
|
import sys
|
||||||
ei = sys.exc_info()
|
ei = sys.exc_info()
|
||||||
@@ -161,13 +164,18 @@ class Rocksock():
|
|||||||
self.sock = None
|
self.sock = None
|
||||||
self.timeout = timeout
|
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):
|
def connect(self):
|
||||||
|
|
||||||
af, sa = self._resolve(self.proxychain[0].hostinfo, True)
|
af, sa = self._resolve(self.proxychain[0].hostinfo, True)
|
||||||
try:
|
try:
|
||||||
x = af+1
|
x = af+1
|
||||||
except TypeError:
|
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 "GOT A WEIRD AF"
|
||||||
# print af
|
# print af
|
||||||
# raise RocksockException(-6666, af, errortype=RS_ET_GAI)
|
# raise RocksockException(-6666, af, errortype=RS_ET_GAI)
|
||||||
@@ -177,9 +185,9 @@ class Rocksock():
|
|||||||
try:
|
try:
|
||||||
self.sock.connect((sa[0], sa[1]))
|
self.sock.connect((sa[0], sa[1]))
|
||||||
except socket.timeout:
|
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:
|
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)):
|
for pnum in xrange(1, len(self.proxychain)):
|
||||||
curr = self.proxychain[pnum]
|
curr = self.proxychain[pnum]
|
||||||
@@ -192,7 +200,7 @@ class Rocksock():
|
|||||||
except ssl.SSLError as e:
|
except ssl.SSLError as e:
|
||||||
reason = self._get_ssl_exception_reason(e)
|
reason = self._get_ssl_exception_reason(e)
|
||||||
#if hasattr(e, 'library'): subsystem = e.library
|
#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:
|
except socket.error as e:
|
||||||
raise RocksockException(e.errno, errortype=RS_ET_SYS)
|
raise RocksockException(e.errno, errortype=RS_ET_SYS)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -221,9 +229,9 @@ class Rocksock():
|
|||||||
def canread(self):
|
def canread(self):
|
||||||
return select.select([self.sock], [], [], 0)[0]
|
return select.select([self.sock], [], [], 0)[0]
|
||||||
|
|
||||||
def send(self, buf):
|
def send(self, buf, pnum=-1):
|
||||||
if self.sock is None:
|
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)
|
return self.sock.sendall(buf)
|
||||||
|
|
||||||
def _get_ssl_exception_reason(self, e):
|
def _get_ssl_exception_reason(self, e):
|
||||||
@@ -233,7 +241,7 @@ class Rocksock():
|
|||||||
elif hasattr(e, 'args'): s = e.args[0]
|
elif hasattr(e, 'args'): s = e.args[0]
|
||||||
return s
|
return s
|
||||||
|
|
||||||
def recv(self, count=-1):
|
def recv(self, count=-1, pnum=-1):
|
||||||
data = ''
|
data = ''
|
||||||
while count:
|
while count:
|
||||||
try:
|
try:
|
||||||
@@ -241,15 +249,15 @@ class Rocksock():
|
|||||||
if n >= 1024*1024: n = 1024*1024
|
if n >= 1024*1024: n = 1024*1024
|
||||||
chunk = self.sock.recv(n)
|
chunk = self.sock.recv(n)
|
||||||
except socket.timeout:
|
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:
|
except ssl.SSLError as e:
|
||||||
s = self._get_ssl_exception_reason(e)
|
s = self._get_ssl_exception_reason(e)
|
||||||
if s == 'The read operation timed out':
|
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:
|
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:
|
if len(chunk) == 0:
|
||||||
raise RocksockException(RS_E_REMOTE_DISCONNECTED)
|
raise RocksockException(RS_E_REMOTE_DISCONNECTED, failedproxy=self._failed_proxy(pnum))
|
||||||
data += chunk
|
data += chunk
|
||||||
if count == -1: break
|
if count == -1: break
|
||||||
else: count -= len(chunk)
|
else: count -= len(chunk)
|
||||||
@@ -318,7 +326,7 @@ class Rocksock():
|
|||||||
buf += '\0\0\0\x01'
|
buf += '\0\0\0\x01'
|
||||||
else:
|
else:
|
||||||
af, sa = self._resolve(dest, True)
|
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 += self._ip_to_bytes(sa[0])
|
||||||
buf += '\0'
|
buf += '\0'
|
||||||
if v4a: buf += dest.hostinfo.host + '\0'
|
if v4a: buf += dest.hostinfo.host + '\0'
|
||||||
@@ -326,18 +334,18 @@ class Rocksock():
|
|||||||
|
|
||||||
def _connect_socks4(self, header, pnum):
|
def _connect_socks4(self, header, pnum):
|
||||||
self.send(header)
|
self.send(header)
|
||||||
res = self.recv(8)
|
res = self.recv(8, pnum=pnum)
|
||||||
if len(res) < 8 or ord(res[0]) != 0:
|
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])
|
ch = ord(res[1])
|
||||||
if ch == 0x5a:
|
if ch == 0x5a:
|
||||||
pass
|
pass
|
||||||
elif ch == 0x5b:
|
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:
|
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:
|
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):
|
def _setup_socks5_header(self, proxy):
|
||||||
buf = '\x05'
|
buf = '\x05'
|
||||||
@@ -349,21 +357,21 @@ class Rocksock():
|
|||||||
|
|
||||||
def _connect_socks5(self, header, pnum):
|
def _connect_socks5(self, header, pnum):
|
||||||
self.send(header)
|
self.send(header)
|
||||||
res = self.recv(2)
|
res = self.recv(2, pnum=pnum)
|
||||||
if len(res) != 2 or res[0] != '\x05':
|
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':
|
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:
|
if ord(res[1]) == 2:
|
||||||
px = self.proxychain[pnum-1]
|
px = self.proxychain[pnum-1]
|
||||||
if px.username and px.password:
|
if px.username and px.password:
|
||||||
pkt = '\x01%c%s%c%s'%(len(px.username),px.username,len(px.password),px.password)
|
pkt = '\x01%c%s%c%s'%(len(px.username),px.username,len(px.password),px.password)
|
||||||
self.send(pkt)
|
self.send(pkt)
|
||||||
res = self.recv(2)
|
res = self.recv(2, pnum=pnum)
|
||||||
if len(res) < 2 or res[1] != '\0':
|
if len(res) < 2 or res[1] != '\0':
|
||||||
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, pnum-1)
|
else: raise RocksockException(RS_E_PROXY_AUTH_FAILED, failedproxy=self._failed_proxy(pnum))
|
||||||
dst = self.proxychain[pnum]
|
dst = self.proxychain[pnum]
|
||||||
numeric = self._isnumericipv4(dst.hostinfo.host)
|
numeric = self._isnumericipv4(dst.hostinfo.host)
|
||||||
if numeric:
|
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)
|
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)
|
self.send(pkt)
|
||||||
res = self.recv()
|
res = self.recv(pnum=pnum)
|
||||||
if len(res) < 2 or res[0] != '\x05':
|
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])
|
ch = ord(res[1])
|
||||||
if ch == 0: pass
|
if ch == 0: pass
|
||||||
elif ch == 1: raise RocksockException(RS_E_PROXY_GENERAL_FAILURE, 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, pnum-1)
|
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, pnum-1)
|
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, pnum-1)
|
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, pnum-1)
|
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, pnum-1)
|
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, pnum-1)
|
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, pnum-1)
|
elif ch == 8: raise RocksockException(RS_E_PROXY_ADDRESSTYPE_NOT_SUPPORTED, failedproxy=self._failed_proxy(pnum))
|
||||||
else: raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, pnum-1)
|
else: raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, failedproxy=self._failed_proxy(pnum))
|
||||||
|
|
||||||
|
|
||||||
def _connect_step(self, pnum):
|
def _connect_step(self, pnum):
|
||||||
@@ -407,11 +415,11 @@ class Rocksock():
|
|||||||
elif prev.type == RS_PT_HTTP:
|
elif prev.type == RS_PT_HTTP:
|
||||||
dest = self.proxychain[pnum]
|
dest = self.proxychain[pnum]
|
||||||
self.send("CONNECT %s:%d HTTP/1.1\r\n\r\n"%(dest.hostinfo.host, dest.hostinfo.port))
|
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:
|
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':
|
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__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
Reference in New Issue
Block a user