forked from premiere/premiere-libtorrent
more output and error handling in socks.py
This commit is contained in:
parent
d7be4659c8
commit
67219409a4
|
@ -2,8 +2,6 @@
|
||||||
|
|
||||||
"""Minimal non-feature complete socks proxy"""
|
"""Minimal non-feature complete socks proxy"""
|
||||||
|
|
||||||
import logging
|
|
||||||
from logging import error, info, debug
|
|
||||||
import random
|
import random
|
||||||
import socket
|
import socket
|
||||||
from SocketServer import StreamRequestHandler, ThreadingTCPServer
|
from SocketServer import StreamRequestHandler, ThreadingTCPServer
|
||||||
|
@ -11,6 +9,9 @@ from struct import pack, unpack
|
||||||
import threading
|
import threading
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
def debug(s):
|
||||||
|
print >>sys.stderr, 'socks.py: ', s
|
||||||
|
|
||||||
class MyTCPServer(ThreadingTCPServer):
|
class MyTCPServer(ThreadingTCPServer):
|
||||||
allow_reuse_address = True
|
allow_reuse_address = True
|
||||||
|
|
||||||
|
@ -19,8 +20,6 @@ class MyTCPServer(ThreadingTCPServer):
|
||||||
|
|
||||||
CLOSE = object()
|
CLOSE = object()
|
||||||
|
|
||||||
logging.basicConfig(stream=sys.stderr, level=logging.INFO)
|
|
||||||
|
|
||||||
VERSION = '\x05'
|
VERSION = '\x05'
|
||||||
NOAUTH = '\x00'
|
NOAUTH = '\x00'
|
||||||
USERPASS = '\x02'
|
USERPASS = '\x02'
|
||||||
|
@ -55,7 +54,7 @@ def forward(source, dest, name):
|
||||||
data = recv(source, 4000)
|
data = recv(source, 4000)
|
||||||
if data == CLOSE:
|
if data == CLOSE:
|
||||||
send(dest, CLOSE)
|
send(dest, CLOSE)
|
||||||
info('%s hung up' % name)
|
debug('%s hung up' % name)
|
||||||
return
|
return
|
||||||
debug('Sending (%d) %r' % (len(data), data))
|
debug('Sending (%d) %r' % (len(data), data))
|
||||||
send(dest, data)
|
send(dest, data)
|
||||||
|
@ -83,7 +82,7 @@ class SocksHandler(StreamRequestHandler):
|
||||||
def handle(self):
|
def handle(self):
|
||||||
# IMRPOVEMENT: Report who requests are from in logging
|
# IMRPOVEMENT: Report who requests are from in logging
|
||||||
# IMPROVEMENT: Timeout on client
|
# IMPROVEMENT: Timeout on client
|
||||||
info('Connection - authenticating')
|
debug('Connection - authenticating')
|
||||||
version = self.read(1)
|
version = self.read(1)
|
||||||
|
|
||||||
if allow_v4 and version == '\x04':
|
if allow_v4 and version == '\x04':
|
||||||
|
@ -129,7 +128,7 @@ class SocksHandler(StreamRequestHandler):
|
||||||
|
|
||||||
if password == None and NOAUTH in method_list:
|
if password == None and NOAUTH in method_list:
|
||||||
self.send_no_auth_method()
|
self.send_no_auth_method()
|
||||||
info('Authenticated (no-auth)')
|
debug('Authenticated (no-auth)')
|
||||||
elif USERPASS in method_list:
|
elif USERPASS in method_list:
|
||||||
self.send_user_pass_auth_method()
|
self.send_user_pass_auth_method()
|
||||||
auth_version = self.read(1)
|
auth_version = self.read(1)
|
||||||
|
@ -146,7 +145,7 @@ class SocksHandler(StreamRequestHandler):
|
||||||
error('Invalid username or password')
|
error('Invalid username or password')
|
||||||
self.close_request()
|
self.close_request()
|
||||||
return
|
return
|
||||||
info('Authenticated (user/password)')
|
debug('Authenticated (user/password)')
|
||||||
self.send_authenticated()
|
self.send_authenticated()
|
||||||
else:
|
else:
|
||||||
error('Server only supports NOAUTH and user/pass')
|
error('Server only supports NOAUTH and user/pass')
|
||||||
|
@ -192,7 +191,12 @@ class SocksHandler(StreamRequestHandler):
|
||||||
print e
|
print e
|
||||||
return
|
return
|
||||||
debug("Creating forwarder connection to %r", out_address)
|
debug("Creating forwarder connection to %r", out_address)
|
||||||
outbound_sock.connect(out_address)
|
|
||||||
|
try:
|
||||||
|
outbound_sock.connect(out_address)
|
||||||
|
except Exception, e:
|
||||||
|
print e
|
||||||
|
return
|
||||||
|
|
||||||
if address_type == IPV6:
|
if address_type == IPV6:
|
||||||
self.send_reply6(outbound_sock.getsockname())
|
self.send_reply6(outbound_sock.getsockname())
|
||||||
|
@ -209,14 +213,14 @@ class SocksHandler(StreamRequestHandler):
|
||||||
def send_reply(self, (bind_addr, bind_port)):
|
def send_reply(self, (bind_addr, bind_port)):
|
||||||
bind_tuple = tuple(map(int, bind_addr.split('.')))
|
bind_tuple = tuple(map(int, bind_addr.split('.')))
|
||||||
full_address = bind_tuple + (bind_port,)
|
full_address = bind_tuple + (bind_port,)
|
||||||
info('Setting up forwarding port %r' % (full_address,))
|
debug('Setting up forwarding port %r' % (full_address,))
|
||||||
msg = pack('>cccc4BH', VERSION, SUCCESS, '\x00', IPV4, *full_address)
|
msg = pack('>cccc4BH', VERSION, SUCCESS, '\x00', IPV4, *full_address)
|
||||||
self.wfile.write(msg)
|
self.wfile.write(msg)
|
||||||
|
|
||||||
def send_reply6(self, (bind_addr, bind_port, unused1, unused2)):
|
def send_reply6(self, (bind_addr, bind_port, unused1, unused2)):
|
||||||
bind_tuple = tuple(map(lambda x: int(x,16), bind_addr.split(':')))
|
bind_tuple = tuple(map(lambda x: int(x,16), bind_addr.split(':')))
|
||||||
full_address = bind_tuple + (bind_port,)
|
full_address = bind_tuple + (bind_port,)
|
||||||
info('Setting up forwarding port %r' % (full_address,))
|
debug('Setting up forwarding port %r' % (full_address,))
|
||||||
msg = pack('>cccc8HH', VERSION, SUCCESS, '\x00', IPV6, *full_address)
|
msg = pack('>cccc8HH', VERSION, SUCCESS, '\x00', IPV6, *full_address)
|
||||||
self.wfile.write(msg)
|
self.wfile.write(msg)
|
||||||
|
|
||||||
|
@ -253,12 +257,12 @@ if __name__ == '__main__':
|
||||||
elif sys.argv[i] == '--allow-v4':
|
elif sys.argv[i] == '--allow-v4':
|
||||||
allow_v4 = True
|
allow_v4 = True
|
||||||
else:
|
else:
|
||||||
if sys.argv[i] != '--help': info('unknown option "%s"' % sys.argv[i])
|
if sys.argv[i] != '--help': debug('unknown option "%s"' % sys.argv[i])
|
||||||
print('usage: socks.py [--username <user> --password <password>] [--port <listen-port>]')
|
print('usage: socks.py [--username <user> --password <password>] [--port <listen-port>]')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
info('Listening on port %d...' % listen_port)
|
debug('Listening on port %d...' % listen_port)
|
||||||
server = MyTCPServer(('localhost', listen_port), SocksHandler)
|
server = MyTCPServer(('localhost', listen_port), SocksHandler)
|
||||||
server.timeout = 120
|
server.timeout = 120
|
||||||
while True:
|
while True:
|
||||||
|
|
Loading…
Reference in New Issue