-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathclient.py
137 lines (114 loc) · 4.22 KB
/
client.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import SocketServer
import getpass
import os
import socket
import string
import struct
import urllib
import json
import ConfigParser
import select
import sys
import threading
config = ConfigParser.RawConfigParser()
SETTING_PATH = os.path.expanduser("~/.720proxy_profile")
API_URL='http://720proxy.com/api/'
def initConfig():
if config.has_section('720Proxy'):
config.remove_section('720Proxy')
config.add_section('720Proxy')
config.set('720Proxy', 'socksPort', '2333')
config.set('720Proxy', 'token', '')
config.set('720Proxy', 'server_host', '')
config.set('720Proxy', 'server_socks_port', '')
def saveConfig():
config.write(open(SETTING_PATH, 'w+'))
def loadConfig():
config.read(SETTING_PATH)
if not config.has_section('720Proxy'):
initConfig()
saveConfig()
def login():
print "Attempting login to 720 proxy...."
email = raw_input("Email:")
password = getpass.getpass("Password:")
url = API_URL+'auth?email=' + urllib.quote(email) + '&password=' + urllib.quote(password)
result = json.load(urllib.urlopen(url))
if result['status'] == 'ok':
token = result['token']
config.set('720Proxy', 'token', token)
print "Please select the server to use, "
servers=result['servers']
for i in range(len(servers)):
print '%d - %s:%d' % (i,servers[i]['host'],servers[i]['socksPort'])
seleceted = int(raw_input("Select a server[0-%d]:"%(len(servers)-1)))
config.set('720Proxy', 'server_host', servers[seleceted]['host'])
config.set('720Proxy', 'server_socks_port', servers[seleceted]['socksPort'])
saveConfig()
print "Logged in, credential saved in " + SETTING_PATH
elif result['status'] == 'false_credential':
print "Password or Email incorrect, retrying..."
login()
else:
print "Unexpected error, " + result['status']
class ThreadingTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
SocketServer.ThreadingMixIn.daemon_threads = True
allow_reuse_address=True
pass
class ProxyTCPHandler(SocketServer.StreamRequestHandler):
ENCRYPT_TABLE = string.maketrans('', '')[::-1]
def decode(self, data):
return str(data).translate(self.ENCRYPT_TABLE)
def encode(self, data):
return str(data).translate(self.ENCRYPT_TABLE)
def handle_tcp(self, sock, remote):
try:
fdset = [sock, remote]
while True:
r, w, e = select.select(fdset, [], [])
if sock in r:
if remote.send(self.encode(sock.recv(4096))) <= 0:
break
if remote in r:
if sock.send(self.decode(remote.recv(4096))) <= 0:
break
finally:
sock.close()
remote.close()
def handle(self):
sock = self.connection
remote = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
host = config.get('720Proxy', 'server_host')
port = int(config.get('720Proxy', 'server_socks_port'))
remote.connect((host, port))
except socket.error:
print "Failed to connect to server %s:%d. If this continues to happen, this server may have failed, consider using other servers instead. "%(host,port)
return
token = config.get('720Proxy', 'token').strip()
buffer = struct.pack('!BB', 1, len(token)) + token
remote.send(self.encode(buffer+sock.recv(4096)))
reply = remote.recv(1)
if reply == '\x23':
self.handle_tcp(sock, remote)
else:
sock.close()
remote.close()
loadConfig()
if not config.get('720Proxy', 'token'):
login()
else:
print "Saved credential loaded"
HOST, PORT = "localhost", int(config.get('720Proxy', 'socksPort'))
# Create the server, binding to localhost on port 9999
server = SocketServer.ThreadingTCPServer((HOST, PORT), ProxyTCPHandler)
print "SOCKS V5 proxy started on %s port %d" % (HOST,PORT)
server_thread = threading.Thread(target=server.serve_forever)
server_thread.daemon = True
server_thread.start()
try:
server_thread.join(sys.maxint)
except KeyboardInterrupt:
pass
server.shutdown()
print "Proxy shutdown!"