9 Commits
Author SHA1 Message Date
clowwindy 2e9ce11ea1 bump 2015-01-18 18:32:04 +08:00
clowwindy 6efb3d00e4 fix #264 2015-01-16 18:52:40 +08:00
clowwindy 13413267dc Update README.md 2015-01-16 17:06:48 +08:00
clowwindy bd22e3ef75 try every dll that matches by name in PATH 2015-01-16 16:50:18 +08:00
clowwindy 5179e018e2 bump 2015-01-14 13:12:12 +08:00
clowwindy af6c6f3f23 also search lib* for library names 2015-01-14 12:59:43 +08:00
clowwindy 5c05a74727 fix a potential name conflict 2015-01-13 00:42:27 +08:00
clowwindy 53a7e4d0e4 remove print 2015-01-12 23:21:16 +08:00
clowwindy 5e476843ec fix python3 2015-01-12 23:19:24 +08:00
7 changed files with 54 additions and 25 deletions
+7 -1
View File
@@ -1,4 +1,10 @@
2.6.3 2015-01-03
2.6.5 2015-01-18
- Try both 32 bit and 64 bit dll on Windows
2.6.4 2015-01-14
- Also search lib* when searching libraries
2.6.3 2015-01-12
- Support --forbidden-ip to ban some IP, i.e. localhost
- Search OpenSSL and libsodium harder
- Now works on OpenWRT
+3 -3
View File
@@ -12,17 +12,17 @@ Server
### Install
#### Debian / Ubuntu:
Debian / Ubuntu:
apt-get install python-pip
pip install shadowsocks
#### CentOS:
CentOS:
yum install python-setuptools && easy_install pip
pip install shadowsocks
#### Windows:
Windows:
See [Install Server on Windows]
+1 -1
View File
@@ -7,7 +7,7 @@ with codecs.open('README.rst', encoding='utf-8') as f:
setup(
name="shadowsocks",
version="2.6.3",
version="2.6.5",
license='MIT',
description="A fast tunnel proxy that help you get through firewalls",
author='clowwindy',
+5 -8
View File
@@ -93,11 +93,12 @@ def build_address(address):
return b''.join(results)
def build_request(address, qtype, request_id):
header = struct.pack('!HBBHHHH', request_id, 1, 0, 1, 0, 0, 0)
def build_request(address, qtype):
request_id = os.urandom(2)
header = struct.pack('!BBHHHH', 1, 0, 1, 0, 0, 0)
addr = build_address(address)
qtype_qclass = struct.pack('!HH', qtype, QCLASS_IN)
return header + addr + qtype_qclass
return request_id + header + addr + qtype_qclass
def parse_ip(addrtype, data, length, offset):
@@ -270,7 +271,6 @@ class DNSResolver(object):
def __init__(self):
self._loop = None
self._request_id = 1
self._hosts = {}
self._hostname_status = {}
self._hostname_to_cb = {}
@@ -412,10 +412,7 @@ class DNSResolver(object):
del self._hostname_status[hostname]
def _send_req(self, hostname, qtype):
self._request_id += 1
if self._request_id > 32768:
self._request_id = 1
req = build_request(hostname, qtype, self._request_id)
req = build_request(hostname, qtype)
for server in self._servers:
logging.debug('resolving %s with type %d using server %s',
hostname, qtype, server)
+37 -10
View File
@@ -23,11 +23,30 @@
from __future__ import absolute_import, division, print_function, \
with_statement
import os
import logging
def find_library_nt(name):
# modified from ctypes.util
# ctypes.util.find_library just returns first result he found
# but we want to try them all
# because on Windows, users may have both 32bit and 64bit version installed
results = []
for directory in os.environ['PATH'].split(os.pathsep):
fname = os.path.join(directory, name)
if os.path.isfile(fname):
results.append(fname)
if fname.lower().endswith(".dll"):
continue
fname = fname + ".dll"
if os.path.isfile(fname):
results.append(fname)
return results
def find_library(possible_lib_names, search_symbol, library_name):
from ctypes.util import find_library
import ctypes.util
from ctypes import CDLL
paths = []
@@ -35,10 +54,18 @@ def find_library(possible_lib_names, search_symbol, library_name):
if type(possible_lib_names) not in (list, tuple):
possible_lib_names = [possible_lib_names]
for name in possible_lib_names:
path = find_library(name)
if path:
paths.append(path)
lib_names = []
for lib_name in possible_lib_names:
lib_names.append(lib_name)
lib_names.append('lib' + lib_name)
for name in lib_names:
if os.name == "nt":
paths.extend(find_library_nt(name))
else:
path = ctypes.util.find_library(name)
if path:
paths.append(path)
if not paths:
# We may get here when find_library fails because, for example,
@@ -46,13 +73,12 @@ def find_library(possible_lib_names, search_symbol, library_name):
# tools underlying find_library on linux.
import glob
for name in possible_lib_names:
for name in lib_names:
patterns = [
'/usr/local/lib*/lib%s.*' % name,
'/usr/lib*/lib%s.*' % name,
'lib%s.*' % name,
'%s.dll' % name,
'lib%s.dll' % name]
'%s.dll' % name]
for pat in patterns:
files = glob.glob(pat)
@@ -106,10 +132,11 @@ def test_find_library():
assert find_library('c', 'strcpy', 'libc') is not None
assert find_library(['c'], 'strcpy', 'libc') is not None
assert find_library(('c',), 'strcpy', 'libc') is not None
assert find_library('crypto', 'EVP_CipherUpdate', 'libcrypto') is not None
assert find_library(('crypto', 'eay32'), 'EVP_CipherUpdate',
'libcrypto') is not None
assert find_library('notexist', 'strcpy', 'libnotexist') is None
assert find_library('c', 'symbol_not_exist', 'c') is None
assert find_library(('notexist', 'c', 'crypto'),
assert find_library(('notexist', 'c', 'crypto', 'eay32'),
'EVP_CipherUpdate', 'libc') is not None
-1
View File
@@ -112,7 +112,6 @@ class UDPRelay(object):
self._closed = False
self._last_time = time.time()
self._sockets = set()
print(config)
if 'forbidden_ip' in config:
self._forbidden_iplist = config['forbidden_ip']
else:
+1 -1
View File
@@ -90,7 +90,6 @@ try:
for fd in r:
line = fd.readline()
sys.stderr.write(line)
if not line:
if stage == 2 and fd == p3.stdout:
stage = 3
@@ -98,6 +97,7 @@ try:
stage = 5
if bytes != str:
line = str(line, 'utf8')
sys.stderr.write(line)
if line.find('starting local') >= 0:
local_ready = True
if line.find('starting server') >= 0: