Browse Source

Optional TLS client-server comms

Still primitive in that key and cert must be added in a subdirectory
'ssl'; self-signed is fine, so easy if openssl is available. But this
must be wrapped up for users before it can be a default (it is not
the default for now). Could be hard on e.g. Windows.
master
Adam Gibson 9 years ago
parent
commit
5d3fbe9a74
No known key found for this signature in database
GPG Key ID: B3AE09F1E9A3197A
  1. 17
      jmclient/jmclient/client_protocol.py
  2. 3
      jmclient/jmclient/configure.py
  3. 16
      scripts/joinmarketd.py

17
jmclient/jmclient/client_protocol.py

@ -1,7 +1,7 @@
#! /usr/bin/env python #! /usr/bin/env python
from __future__ import print_function from __future__ import print_function
from twisted.python.log import startLogging, err from twisted.python.log import startLogging, err
from twisted.internet import protocol, reactor from twisted.internet import protocol, reactor, ssl
from twisted.internet.task import LoopingCall from twisted.internet.task import LoopingCall
from twisted.internet.error import (ConnectionLost, ConnectionAborted, from twisted.internet.error import (ConnectionLost, ConnectionAborted,
ConnectionClosed, ConnectionDone) ConnectionClosed, ConnectionDone)
@ -9,6 +9,7 @@ from twisted.python import failure
from twisted.protocols import amp from twisted.protocols import amp
from twisted.internet.protocol import ClientFactory from twisted.internet.protocol import ClientFactory
from twisted.internet.endpoints import TCP4ClientEndpoint from twisted.internet.endpoints import TCP4ClientEndpoint
from twisted.internet.ssl import ClientContextFactory
from jmbase import commands from jmbase import commands
from sys import stdout from sys import stdout
@ -248,6 +249,7 @@ class JMTakerClientProtocolFactory(protocol.ClientFactory):
def start_reactor(host, port, factory, ish=True, daemon=False): #pragma: no cover def start_reactor(host, port, factory, ish=True, daemon=False): #pragma: no cover
#(Cannot start the reactor in tests) #(Cannot start the reactor in tests)
usessl = True if jm_single().config.get("DAEMON", "use_ssl") != 'false' else False
if daemon: if daemon:
try: try:
from jmdaemon import JMDaemonServerProtocolFactory from jmdaemon import JMDaemonServerProtocolFactory
@ -258,7 +260,16 @@ def start_reactor(host, port, factory, ish=True, daemon=False): #pragma: no cove
"section of the config. Quitting.") "section of the config. Quitting.")
return return
dfactory = JMDaemonServerProtocolFactory() dfactory = JMDaemonServerProtocolFactory()
reactor.listenTCP(port, dfactory) if usessl:
reactor.listenSSL(port, dfactory,
ssl.DefaultOpenSSLContextFactory(
"./ssl/key.pem", "./ssl/cert.pem"))
else:
reactor.listenTCP(port, dfactory)
reactor.connectTCP(host, port, factory) if usessl:
ctx = ClientContextFactory()
reactor.connectSSL(host, port, factory, ctx)
else:
reactor.connectTCP(host, port, factory)
reactor.run(installSignalHandlers=ish) reactor.run(installSignalHandlers=ish)

3
jmclient/jmclient/configure.py

@ -99,6 +99,9 @@ daemon_port = 27183
#currently, running the daemon on a remote host is #currently, running the daemon on a remote host is
#*NOT* supported, so don't change this variable #*NOT* supported, so don't change this variable
daemon_host = localhost daemon_host = localhost
#by default the client-daemon connection is plaintext, set to 'true' to use TLS;
#for this, you need to have a valid (self-signed) certificate installed
use_ssl = false
[BLOCKCHAIN] [BLOCKCHAIN]
blockchain_source = blockr blockchain_source = blockr

16
scripts/joinmarketd.py

@ -1,9 +1,9 @@
import sys import sys
from twisted.internet import reactor from twisted.internet import reactor, ssl
from twisted.python.log import startLogging, err from twisted.python.log import startLogging, err
import jmdaemon import jmdaemon
def startup_joinmarketd(port, finalizer=None, finalizer_args=None): def startup_joinmarketd(port, usessl, finalizer=None, finalizer_args=None):
"""Start event loop for joinmarket daemon here. """Start event loop for joinmarket daemon here.
Args: Args:
port : port over which to serve the daemon port : port over which to serve the daemon
@ -12,7 +12,11 @@ def startup_joinmarketd(port, finalizer=None, finalizer_args=None):
""" """
startLogging(sys.stdout) startLogging(sys.stdout)
factory = jmdaemon.JMDaemonServerProtocolFactory() factory = jmdaemon.JMDaemonServerProtocolFactory()
reactor.listenTCP(port, factory) if usessl:
reactor.listenSSL(port, factory, ssl.DefaultOpenSSLContextFactory(
"./ssl/key.pem", "./ssl/cert.pem"))
else:
reactor.listenTCP(port, factory)
if finalizer: if finalizer:
reactor.addSystemEventTrigger("after", "shutdown", finalizer, reactor.addSystemEventTrigger("after", "shutdown", finalizer,
finalizer_args) finalizer_args)
@ -24,4 +28,8 @@ if __name__ == "__main__":
port = 27183 port = 27183
else: else:
port = int(sys.argv[1]) port = int(sys.argv[1])
startup_joinmarketd(port) usessl = False
if len(sys.argv) > 2:
if int(sys.argv[2]) != 0:
usessl = True
startup_joinmarketd(port, usessl)

Loading…
Cancel
Save