From a89ae314d25cd47b527cb50dbdc18dc44ad79213 Mon Sep 17 00:00:00 2001 From: "P. Christeas" Date: Tue, 23 Dec 2008 18:18:23 +0200 Subject: [PATCH] Bring the changes from SecureXMLRPCServer.py bzr revid: p_christ@hol.gr-20081223161823-xq6npt18t19hegri --- bin/netsvc.py | 34 ++++++++++++++++++++++++++++++++++ bin/tools/config.py | 9 ++++----- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/bin/netsvc.py b/bin/netsvc.py index 8eb7023bd90..56bccf3bf03 100644 --- a/bin/netsvc.py +++ b/bin/netsvc.py @@ -318,6 +318,7 @@ class SSLSocket(object): ctx = SSL.Context(SSL.SSLv23_METHOD) ctx.use_privatekey_file(tools.config['secure_pkey_file']) ctx.use_certificate_file(tools.config['secure_cert_file']) + self.socket = SSL.Connection(ctx, socket) else: self.socket = socket @@ -327,6 +328,21 @@ class SSLSocket(object): def __getattr__(self, name): return getattr(self.socket, name) + +class doesitgohere(): + def recv(self, bufsize): + """ Another bugfix: SSL's recv() may raise + recoverable exceptions, which simply need us to retry + the call + """ + while True: + try: + return self.socket.recv(bufsize) + except SSL.WantReadError: + pass + except SSL.WantWriteError: + pass + class SimpleXMLRPCRequestHandler(GenericXMLRPCRequestHandler, SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): rpc_paths = map(lambda s: '/xmlrpc/%s' % s, _service) @@ -338,10 +354,20 @@ class SecureXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): self.wfile = socket._fileobject(self.request, "wb", self.wbufsize) class SimpleThreadedXMLRPCServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer): + encoding = None + allow_none = False + def server_bind(self): self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) SimpleXMLRPCServer.SimpleXMLRPCServer.server_bind(self) + def handle_error(self, request, client_address): + """ Override the error handler + """ + import traceback + Logger().notifyChannel("init", LOG_ERROR,"Server error in request from %s:\n%s" % + (client_address,traceback.format_exc())) + class SecureThreadedXMLRPCServer(SimpleThreadedXMLRPCServer): def __init__(self, server_address, HandlerClass, logRequests=1): SimpleThreadedXMLRPCServer.__init__(self, server_address, HandlerClass, logRequests) @@ -349,6 +375,14 @@ class SecureThreadedXMLRPCServer(SimpleThreadedXMLRPCServer): self.server_bind() self.server_activate() + def handle_error(self, request, client_address): + """ Override the error handler + """ + import traceback + e_type, e_value, e_traceback = sys.exc_info() + Logger().notifyChannel("init", LOG_ERROR,"SSL Request handler error in request from %s: %s\n%s" % + (client_address,str(e_type),traceback.format_exc())) + class HttpDaemon(threading.Thread): def __init__(self, interface, port, secure=False): threading.Thread.__init__(self) diff --git a/bin/tools/config.py b/bin/tools/config.py index 3717f0b6a5e..81c9f57aa55 100644 --- a/bin/tools/config.py +++ b/bin/tools/config.py @@ -191,20 +191,19 @@ class configmanager(object): keys = ['interface', 'port', 'db_name', 'db_user', 'db_password', 'db_host', 'db_port', 'logfile', 'pidfile', 'smtp_port', 'email_from', 'smtp_server', 'smtp_user', 'smtp_password', 'price_accuracy', - 'netinterface', 'netport', 'db_maxconn', 'import_partial', 'addons_path'] + 'netinterface', 'netport', 'db_maxconn', 'import_partial', 'addons_path', + 'netrpc', 'xmlrpc', 'syslog', 'without_demo'] if hasSSL: keys.extend(['smtp_ssl', 'secure_cert_file', 'secure_pkey_file']) + keys.append('secure') for arg in keys: if getattr(opt, arg): self.options[arg] = getattr(opt, arg) keys = ['language', 'translate_out', 'translate_in', 'upgrade', 'debug_mode', - 'stop_after_init', 'without_demo', 'netrpc', 'xmlrpc', 'syslog'] - - if hasSSL: - keys.append('secure') + 'stop_after_init'] for arg in keys: self.options[arg] = getattr(opt, arg)