client-side support for SSL
This commit is contained in:
parent
27f4a0c28e
commit
87a28d31a4
|
@ -27,7 +27,7 @@ from util import print_error
|
|||
DEFAULT_TIMEOUT = 5
|
||||
DEFAULT_SERVERS = [
|
||||
'electrum.novit.ro:50001:t',
|
||||
'ecdsa.org:50001:t',
|
||||
#'ecdsa.org:50002:s',
|
||||
'electrum.bitcoins.sk:50001:t',
|
||||
'uncle-enzo.info:50001:t',
|
||||
'electrum.bytesized-hosting.com:50001:t',
|
||||
|
@ -55,12 +55,13 @@ def pick_random_interface():
|
|||
|
||||
class InterfaceAncestor(threading.Thread):
|
||||
|
||||
def __init__(self, host, port, proxy=None):
|
||||
def __init__(self, host, port, proxy=None, use_ssl=True):
|
||||
threading.Thread.__init__(self)
|
||||
self.daemon = True
|
||||
self.host = host
|
||||
self.port = port
|
||||
self.proxy = proxy
|
||||
self.use_ssl = use_ssl
|
||||
|
||||
self.servers = [] # actual list from IRC
|
||||
self.rtime = 0
|
||||
|
@ -125,9 +126,10 @@ class InterfaceAncestor(threading.Thread):
|
|||
class HttpStratumInterface(InterfaceAncestor):
|
||||
""" non-persistent connection. synchronous calls"""
|
||||
|
||||
def __init__(self, host, port, proxy=None):
|
||||
InterfaceAncestor.__init__(self, host, port, proxy)
|
||||
def __init__(self, host, port, proxy=None, use_ssl=True):
|
||||
InterfaceAncestor.__init__(self, host, port, proxy, use_ssl)
|
||||
self.session_id = None
|
||||
self.connection_msg = "http://%s:%d"%(self.host,self.port)
|
||||
|
||||
def get_history(self, address):
|
||||
self.send([('blockchain.address.get_history', [address] )])
|
||||
|
@ -182,7 +184,11 @@ class HttpStratumInterface(InterfaceAncestor):
|
|||
# poll with GET
|
||||
data_json = None
|
||||
|
||||
if self.use_ssl:
|
||||
host = 'https://%s:%d'%( self.host, self.port )
|
||||
else:
|
||||
host = 'http://%s:%d'%( self.host, self.port )
|
||||
|
||||
headers = {'content-type': 'application/json'}
|
||||
if self.session_id:
|
||||
headers['cookie'] = 'SESSION=%s'%self.session_id
|
||||
|
@ -220,29 +226,37 @@ class HttpStratumInterface(InterfaceAncestor):
|
|||
class TcpStratumInterface(InterfaceAncestor):
|
||||
"""json-rpc over persistent TCP connection, asynchronous"""
|
||||
|
||||
def __init__(self, host, port, proxy=None):
|
||||
InterfaceAncestor.__init__(self, host, port, proxy)
|
||||
def __init__(self, host, port, proxy=None, use_ssl=True):
|
||||
InterfaceAncestor.__init__(self, host, port, proxy, use_ssl)
|
||||
self.init_socket()
|
||||
|
||||
def init_socket(self):
|
||||
import ssl
|
||||
global proxy_modes
|
||||
self.connection_msg = "%s:%d"%(self.host,self.port)
|
||||
if self.proxy is None:
|
||||
self.s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
|
||||
s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
|
||||
else:
|
||||
self.connection_msg += " using proxy %s:%s:%s"%(self.proxy.get('mode'), self.proxy.get('host'), self.proxy.get('port'))
|
||||
import socks
|
||||
self.s = socks.socksocket()
|
||||
self.s.setproxy(proxy_modes.index(self.proxy["mode"]), self.proxy["host"], int(self.proxy["port"]) )
|
||||
self.s.settimeout(2)
|
||||
self.s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
|
||||
s = socks.socksocket()
|
||||
s.setproxy(proxy_modes.index(self.proxy["mode"]), self.proxy["host"], int(self.proxy["port"]) )
|
||||
|
||||
if self.use_ssl:
|
||||
s = ssl.wrap_socket(s, ssl_version=ssl.PROTOCOL_TLSv1)
|
||||
|
||||
s.settimeout(2)
|
||||
s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
|
||||
|
||||
try:
|
||||
self.s.connect(( self.host.encode('ascii'), int(self.port)))
|
||||
s.connect(( self.host.encode('ascii'), int(self.port)))
|
||||
s.settimeout(60)
|
||||
self.s = s
|
||||
self.is_connected = True
|
||||
self.s.settimeout(60)
|
||||
self.send([('server.version', [ELECTRUM_VERSION])])
|
||||
except:
|
||||
self.is_connected = False
|
||||
self.s = None
|
||||
|
||||
def run(self):
|
||||
try:
|
||||
|
@ -313,23 +327,22 @@ class Interface(TcpStratumInterface, HttpStratumInterface):
|
|||
self.server = host + ':%d:%s'%(port, protocol)
|
||||
|
||||
#print protocol, host, port
|
||||
if protocol == 't':
|
||||
TcpStratumInterface.__init__(self, host, port, proxy)
|
||||
elif protocol == 'h':
|
||||
HttpStratumInterface.__init__(self, host, port, proxy)
|
||||
if protocol in 'st':
|
||||
TcpStratumInterface.__init__(self, host, port, proxy, use_ssl=(protocol=='s'))
|
||||
elif protocol in 'gh':
|
||||
HttpStratumInterface.__init__(self, host, port, proxy, use_ssl=(protocol=='g'))
|
||||
else:
|
||||
print_error("Error: Unknown protocol")
|
||||
TcpStratumInterface.__init__(self, host, port, proxy)
|
||||
raise BaseException('Unknown protocol: %s'%protocol)
|
||||
|
||||
|
||||
def run(self):
|
||||
if self.protocol == 't':
|
||||
if self.protocol in 'st':
|
||||
TcpStratumInterface.run(self)
|
||||
else:
|
||||
HttpStratumInterface.run(self)
|
||||
|
||||
def send(self, messages):
|
||||
if self.protocol == 't':
|
||||
if self.protocol in 'st':
|
||||
TcpStratumInterface.send(self, messages)
|
||||
else:
|
||||
HttpStratumInterface.send(self, messages)
|
||||
|
|
Loading…
Reference in New Issue