From e8d56dc8a882f60d732d72ed6f47b8d11a38edf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Tue, 4 Mar 2008 16:11:42 +0100 Subject: [PATCH] Add ssl to webdav --- trytond/netsvc.py | 40 ++++++++++++++++++++++++++++++++++++---- trytond/trytond.py | 2 +- trytond/webdavsvc.py | 15 +++++++++++++-- 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/trytond/netsvc.py b/trytond/netsvc.py index 87ae608dea..aee1f53e6b 100644 --- a/trytond/netsvc.py +++ b/trytond/netsvc.py @@ -254,7 +254,7 @@ class SecureXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): def setup(self): self.connection = self.request - self.rfile = socket.fileobject(self.request, "rb", self.rbufsize) + self.rfile = socket._fileobject(self.request, "rb", self.rbufsize) self.wfile = socket._fileobject(self.request, "wb", self.wbufsize) @@ -486,18 +486,50 @@ class BaseThreadedHTTPServer6(BaseThreadedHTTPServer): address_family = socket.AF_INET6 +class SecureThreadedHTTPServer(BaseThreadedHTTPServer): + + def __init__(self, server_address, HandlerClass): + from OpenSSL import SSL + BaseThreadedHTTPServer.__init__(self, server_address, HandlerClass) + ctx = SSL.Context(SSL.SSLv23_METHOD) + ctx.use_privatekey_file(CONFIG['privatekey']) + ctx.use_certificate_file(CONFIG['certificate']) + self.socket = SSL.Connection(ctx, socket.socket(self.address_family, + self.socket_type)) + self.server_bind() + self.server_activate() + + +class SecureThreadedHTTPServer6(SecureThreadedHTTPServer): + address_family = socket.AF_INET6 + + class WebDAVServerThread(threading.Thread): def __init__(self, interface, port, secure=False): - from webdavsvc import WebDAVAuthRequestHandler, TrytonDAVInterface + from webdavsvc import WebDAVAuthRequestHandler, SecureWebDAVAuthRequestHandler, \ + TrytonDAVInterface threading.Thread.__init__(self) self.secure = secure self.running = False if secure: - raise + handler = SecureWebDAVAuthRequestHandler + handler.IFACE_CLASS = TrytonDAVInterface(interface, port, secure) + server_class = SecureThreadedHTTPServer + if socket.has_ipv6: + try: + socket.getaddrinfo(interface or None, port, socket.AF_INET6) + server_class = SecureThreadedHTTPServer6 + if not interface: + interface = '::' + except: + pass + if not interface: + interface = '0.0.0.0' + self.server = server_class((interface, port), handler) else: handler = WebDAVAuthRequestHandler - handler.IFACE_CLASS = TrytonDAVInterface(interface, port) + handler.IFACE_CLASS = TrytonDAVInterface(interface, port, secure) server_class = BaseThreadedHTTPServer if socket.has_ipv6: try: diff --git a/trytond/trytond.py b/trytond/trytond.py index 2ad3bb1b5e..93e2db4a54 100644 --- a/trytond/trytond.py +++ b/trytond/trytond.py @@ -170,7 +170,7 @@ class TrytonServer(object): "invalid port '%s'!" % (CONFIG['webdavport'],)) sys.exit(1) - webdavd = netsvc.WebDAVServerThread(interface, port, False) + webdavd = netsvc.WebDAVServerThread(interface, port, secure) self.logger.notify_channel('web-services', netsvc.LOG_INFO, 'starting webdav service, port ' + str(port)) diff --git a/trytond/webdavsvc.py b/trytond/webdavsvc.py index f2b91bff0a..7c8b93f9b2 100644 --- a/trytond/webdavsvc.py +++ b/trytond/webdavsvc.py @@ -38,8 +38,12 @@ if DAV_VERSION == '0.6': class TrytonDAVInterface(iface.dav_interface): - def __init__(self, interface, port): - self.baseuri = 'http://%s:%s/' % (interface or socket.gethostname(), port) + def __init__(self, interface, port, secure=False): + if secure: + protocol = 'https' + else: + protocol = 'http' + self.baseuri = '%s://%s:%s/' % (protocol, interface or socket.gethostname(), port) def _get_dburi(self, uri): uri = urlparse.urlsplit(uri)[2] @@ -290,3 +294,10 @@ class WebDAVAuthRequestHandler(AuthServer.BufferedAuthRequestHandler, if int(USER_ID): return 1 return 0 + +class SecureWebDAVAuthRequestHandler(WebDAVAuthRequestHandler): + + def setup(self): + self.connection = self.request + self.rfile = socket._fileobject(self.request, "rb", self.rbufsize) + self.wfile = socket._fileobject(self.request, "wb", self.wbufsize)