Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def query_remote(self, sock):
try:
import fcntl
src = sock.getpeername()
dst = sock.getsockname()
src_ip = socket.inet_pton(sock.family, src[0])
dst_ip = socket.inet_pton(sock.family, dst[0])
pnl = bytearray(struct.pack('!16s16s32xHxxHxx8xBBxB', src_ip, dst_ip, src[1], dst[1], sock.family, socket.IPPROTO_TCP, 2))
if not hasattr(self, 'pf'):
self.pf = open('/dev/pf', 'a+b')
fcntl.ioctl(self.pf.fileno(), 0xc0544417, pnl)
return socket.inet_ntop(sock.family, pnl[48:48+len(src_ip)]), int.from_bytes(pnl[76:78], 'big')
except Exception:
pass
class Tunnel(Transparent):
def query_remote(self, sock):
if not self.param:
return 'tunnel', 0
host, _, port = self.param.partition(':')
dst = sock.getsockname()
host = host or dst[0]
port = int(port) if port else dst[1]
return host, port
async def connect(self, reader_remote, writer_remote, rauth, host_name, port, **kw):
writer_remote.write(rauth)
def udp_connect(self, rauth, host_name, port, data, **kw):
return rauth + data
class WS(BaseProtocol):
def correct_header(self, header, **kw):
return header and header.isalpha()
writer.write(f'{ver} 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {rseckey}\r\nSec-WebSocket-Protocol: chat\r\n\r\n'.encode())
self.patch_ws_stream(reader, writer, False)
if not self.param:
return 'tunnel', 0
host, _, port = self.param.partition(':')
dst = sock.getsockname()
host = host or dst[0]
port = int(port) if port else dst[1]
return host, port
async def connect(self, reader_remote, writer_remote, rauth, host_name, port, myhost, **kw):
seckey = base64.b64encode(os.urandom(16)).decode()
writer_remote.write(f'GET / HTTP/1.1\r\nHost: {myhost}\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: {seckey}\r\nSec-WebSocket-Protocol: chat\r\nSec-WebSocket-Version: 13'.encode() + (b'\r\nProxy-Authorization: Basic '+base64.b64encode(rauth) if rauth else b'') + b'\r\n\r\n')
await reader_remote.read_until(b'\r\n\r\n')
self.patch_ws_stream(reader_remote, writer_remote, True)
class Echo(Transparent):
def query_remote(self, sock):
return 'echo', 0
class Pack(BaseProtocol):
def reuse(self):
return True
def get_handler(self, reader, writer, verbose, tcp_handler=None, udp_handler=None):
class Handler:
def __init__(self):
self.sessions = {}
self.udpmap = {}
self.closed = False
self.ready = False
asyncio.ensure_future(self.reader_handler())
def __bool__(self):
return not self.closed
class Redir(Transparent):
def query_remote(self, sock):
try:
#if sock.family == socket.AF_INET:
if "." in sock.getsockname()[0]:
buf = sock.getsockopt(socket.SOL_IP, SO_ORIGINAL_DST, 16)
assert len(buf) == 16
return socket.inet_ntoa(buf[4:8]), int.from_bytes(buf[2:4], 'big')
else:
buf = sock.getsockopt(SOL_IPV6, SO_ORIGINAL_DST, 28)
assert len(buf) == 28
return socket.inet_ntop(socket.AF_INET6, buf[8:24]), int.from_bytes(buf[2:4], 'big')
except Exception:
pass
class Pf(Transparent):
def query_remote(self, sock):
try:
import fcntl
src = sock.getpeername()
dst = sock.getsockname()
src_ip = socket.inet_pton(sock.family, src[0])
dst_ip = socket.inet_pton(sock.family, dst[0])
pnl = bytearray(struct.pack('!16s16s32xHxxHxx8xBBxB', src_ip, dst_ip, src[1], dst[1], sock.family, socket.IPPROTO_TCP, 2))
if not hasattr(self, 'pf'):
self.pf = open('/dev/pf', 'a+b')
fcntl.ioctl(self.pf.fileno(), 0xc0544417, pnl)
return socket.inet_ntop(sock.family, pnl[48:48+len(src_ip)]), int.from_bytes(pnl[76:78], 'big')
except Exception:
pass
class Tunnel(Transparent):
if auth:
if (await reader.read_n(len(auth)-1)) != auth[1:]:
raise Exception(f'Unauthorized {self.name}')
authtable.set_authed()
remote = self.query_remote(sock)
return remote[0], remote[1]
def udp_parse(self, data, auth, sock, **kw):
reader = io.BytesIO(data)
if auth and reader.read(len(auth)) != auth:
return
remote = self.query_remote(sock)
return remote[0], remote[1], reader.read()
SO_ORIGINAL_DST = 80
SOL_IPV6 = 41
class Redir(Transparent):
def query_remote(self, sock):
try:
#if sock.family == socket.AF_INET:
if "." in sock.getsockname()[0]:
buf = sock.getsockopt(socket.SOL_IP, SO_ORIGINAL_DST, 16)
assert len(buf) == 16
return socket.inet_ntoa(buf[4:8]), int.from_bytes(buf[2:4], 'big')
else:
buf = sock.getsockopt(SOL_IPV6, SO_ORIGINAL_DST, 28)
assert len(buf) == 28
return socket.inet_ntop(socket.AF_INET6, buf[8:24]), int.from_bytes(buf[2:4], 'big')
except Exception:
pass
class Pf(Transparent):
def query_remote(self, sock):