X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fserver%2Fthreadedserver.py;h=7a26ad272f7f65e2ad4e4be57af5d6212e3d0bc7;hb=06768bd605e5d47fadfc90a35c74e30f267226a5;hp=86d39cf745afdc1d6de4895feaa775b35d2784d5;hpb=d7783df8ee22afb550dcd6916c8ac47a67bd9fe8;p=sfa.git diff --git a/sfa/server/threadedserver.py b/sfa/server/threadedserver.py index 86d39cf7..7a26ad27 100644 --- a/sfa/server/threadedserver.py +++ b/sfa/server/threadedserver.py @@ -21,10 +21,10 @@ from sfa.util.config import Config from sfa.util.cache import Cache from sfa.trust.certificate import Certificate from sfa.trust.trustedroots import TrustedRoots -#seems useless -#from sfa.trust.credential import * -#can we get rid of that ? -from sfa.plc.api import SfaAPI +from sfa.util.py23 import xmlrpc_client + +# don't hard code an api class anymore here +from sfa.generic import Generic ## # Verification callback for pyOpenSSL. We do our own checking of keys because @@ -43,6 +43,7 @@ def verify_callback(conn, x509, err, depth, preverify): # and ignore them # XXX SMBAKER: I don't know what this error is, but it's being returned + # xxx thierry: this most likely means the cert has a validity range in the future # by newer pl nodes. if err == 9: #print " X509_V_ERR_CERT_NOT_YET_VALID" @@ -72,7 +73,11 @@ def verify_callback(conn, x509, err, depth, preverify): #print " X509_V_ERR_CERT_UNTRUSTED" return 1 - print " error", err, "in verify_callback" + # ignore X509_V_ERR_CERT_SIGNATURE_FAILURE + if err == 7: + return 1 + + logger.debug(" error %s in verify_callback"%err) return 0 @@ -97,17 +102,24 @@ class SecureXMLRpcRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): try: peer_cert = Certificate() peer_cert.load_from_pyopenssl_x509(self.connection.get_peer_certificate()) - self.api = SfaAPI(peer_cert = peer_cert, - interface = self.server.interface, - key_file = self.server.key_file, - cert_file = self.server.cert_file, - cache = self.cache) + generic=Generic.the_flavour() + self.api = generic.make_api (peer_cert = peer_cert, + interface = self.server.interface, + key_file = self.server.key_file, + cert_file = self.server.cert_file, + cache = self.cache) + #logger.info("SecureXMLRpcRequestHandler.do_POST:") + #logger.info("interface=%s"%self.server.interface) + #logger.info("key_file=%s"%self.server.key_file) + #logger.info("api=%s"%self.api) + #logger.info("server=%s"%self.server) + #logger.info("handler=%s"%self) # get arguments request = self.rfile.read(int(self.headers["content-length"])) remote_addr = (remote_ip, remote_port) = self.connection.getpeername() self.api.remote_addr = remote_addr response = self.api.handle(remote_addr, request, self.server.method_map) - except Exception, fault: + except Exception as fault: # This should only happen if the module is buggy # internal error, report as HTTP server error logger.log_exc("server.do_POST") @@ -115,26 +127,31 @@ class SecureXMLRpcRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): #self.send_response(500) #self.end_headers() - # got a valid response - self.send_response(200) - self.send_header("Content-type", "text/xml") - self.send_header("Content-length", str(len(response))) - self.end_headers() - self.wfile.write(response) - - # shut down the connection - self.wfile.flush() - self.connection.shutdown() # Modified here! + # avoid session/connection leaks : do this no matter what + finally: + self.send_response(200) + self.send_header("Content-type", "text/xml") + self.send_header("Content-length", str(len(response))) + self.end_headers() + self.wfile.write(response) + self.wfile.flush() + # close db connection + self.api.close_dbsession() + # shut down the connection + self.connection.shutdown() # Modified here! ## # Taken from the web (XXX find reference). Implements an HTTPS xmlrpc server class SecureXMLRPCServer(BaseHTTPServer.HTTPServer,SimpleXMLRPCServer.SimpleXMLRPCDispatcher): + def __init__(self, server_address, HandlerClass, key_file, cert_file, logRequests=True): - """Secure XML-RPC server. + """ + Secure XML-RPC server. It it very similar to SimpleXMLRPCServer but it uses HTTPS for transporting XML data. """ - logger.debug("SecureXMLRPCServer.__init__, server_address=%s, cert_file=%s"%(server_address,cert_file)) + logger.debug("SecureXMLRPCServer.__init__, server_address=%s, " + "cert_file=%s, key_file=%s"%(server_address,cert_file,key_file)) self.logRequests = logRequests self.interface = None self.key_file = key_file @@ -178,7 +195,7 @@ class SecureXMLRPCServer(BaseHTTPServer.HTTPServer,SimpleXMLRPCServer.SimpleXMLR # can't use format_exc() as it is not available in jython yet # (even in trunk). type, value, tb = sys.exc_info() - raise xmlrpclib.Fault(1,''.join(traceback.format_exception(type, value, tb))) + raise xmlrpc_client.Fault(1,''.join(traceback.format_exception(type, value, tb))) # override this one from the python 2.7 code # originally defined in class TCPServer