Bring the changes from SecureXMLRPCServer.py

bzr revid: p_christ@hol.gr-20081223161823-xq6npt18t19hegri
This commit is contained in:
P. Christeas 2008-12-23 18:18:23 +02:00
parent a8229141bc
commit a89ae314d2
2 changed files with 38 additions and 5 deletions

View File

@ -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)

View File

@ -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)