summaryrefslogtreecommitdiff
path: root/bin/service/http_server.py
diff options
context:
space:
mode:
Diffstat (limited to 'bin/service/http_server.py')
-rw-r--r--bin/service/http_server.py242
1 files changed, 121 insertions, 121 deletions
diff --git a/bin/service/http_server.py b/bin/service/http_server.py
index 9c63bec907b..f9d35ed2ef7 100644
--- a/bin/service/http_server.py
+++ b/bin/service/http_server.py
@@ -46,15 +46,15 @@ except ImportError:
fcntl = None
try:
- from ssl import SSLError
+ from ssl import SSLError
except ImportError:
- class SSLError(Exception): pass
+ class SSLError(Exception): pass
class ThreadedHTTPServer(ConnThreadingMixIn, SimpleXMLRPCDispatcher, HTTPServer):
""" A threaded httpd server, with all the necessary functionality for us.
- It also inherits the xml-rpc dispatcher, so that some xml-rpc functions
- will be available to the request handler
+ It also inherits the xml-rpc dispatcher, so that some xml-rpc functions
+ will be available to the request handler
"""
encoding = None
allow_none = False
@@ -81,46 +81,46 @@ class ThreadedHTTPServer(ConnThreadingMixIn, SimpleXMLRPCDispatcher, HTTPServer)
""" Override the error handler
"""
import traceback
- netsvc.Logger().notifyChannel("init", netsvc.LOG_ERROR,"Server error in request from %s:\n%s" %
- (client_address,traceback.format_exc()))
+ netsvc.Logger().notifyChannel("init", netsvc.LOG_ERROR,"Server error in request from %s:\n%s" %
+ (client_address,traceback.format_exc()))
class MultiHandler2(MultiHTTPHandler):
def log_message(self, format, *args):
- netsvc.Logger().notifyChannel('http',netsvc.LOG_DEBUG,format % args)
+ netsvc.Logger().notifyChannel('http',netsvc.LOG_DEBUG,format % args)
def log_error(self, format, *args):
- netsvc.Logger().notifyChannel('http',netsvc.LOG_ERROR,format % args)
+ netsvc.Logger().notifyChannel('http',netsvc.LOG_ERROR,format % args)
class SecureMultiHandler2(SecureMultiHTTPHandler):
def log_message(self, format, *args):
- netsvc.Logger().notifyChannel('https',netsvc.LOG_DEBUG,format % args)
+ netsvc.Logger().notifyChannel('https',netsvc.LOG_DEBUG,format % args)
def getcert_fnames(self):
tc = tools.config
fcert = tc.get_misc('httpsd','sslcert', 'ssl/server.cert')
- fkey = tc.get_misc('httpsd','sslkey', 'ssl/server.key')
- return (fcert,fkey)
+ fkey = tc.get_misc('httpsd','sslkey', 'ssl/server.key')
+ return (fcert,fkey)
def log_message(self, format, *args):
- netsvc.Logger().notifyChannel('http',netsvc.LOG_DEBUG,format % args)
+ netsvc.Logger().notifyChannel('http',netsvc.LOG_DEBUG,format % args)
def log_error(self, format, *args):
- netsvc.Logger().notifyChannel('http',netsvc.LOG_ERROR,format % args)
+ netsvc.Logger().notifyChannel('http',netsvc.LOG_ERROR,format % args)
class HttpDaemon(threading.Thread, netsvc.Server):
def __init__(self, interface, port):
threading.Thread.__init__(self)
- netsvc.Server.__init__(self)
+ netsvc.Server.__init__(self)
self.__port = port
self.__interface = interface
try:
self.server = ThreadedHTTPServer((interface, port), MultiHandler2)
- self.server.vdirs = []
- self.server.logRequests = True
- netsvc.Logger().notifyChannel("web-services", netsvc.LOG_INFO,
- "starting HTTP service at %s port %d" % (interface or '0.0.0.0', port,))
+ self.server.vdirs = []
+ self.server.logRequests = True
+ netsvc.Logger().notifyChannel("web-services", netsvc.LOG_INFO,
+ "starting HTTP service at %s port %d" % (interface or '0.0.0.0', port,))
except Exception, e:
netsvc.Logger().notifyChannel('httpd', netsvc.LOG_CRITICAL, "Error occur when starting the server daemon: %s" % (e,))
raise
@@ -146,16 +146,16 @@ class HttpDaemon(threading.Thread, netsvc.Server):
class HttpSDaemon(threading.Thread, netsvc.Server):
def __init__(self, interface, port):
threading.Thread.__init__(self)
- netsvc.Server.__init__(self)
+ netsvc.Server.__init__(self)
self.__port = port
self.__interface = interface
try:
- self.server = ThreadedHTTPServer((interface, port), SecureMultiHandler2)
- self.server.vdirs = []
- self.server.logRequests = True
- netsvc.Logger().notifyChannel("web-services", netsvc.LOG_INFO,
- "starting HTTPS service at %s port %d" % (interface or '0.0.0.0', port,))
+ self.server = ThreadedHTTPServer((interface, port), SecureMultiHandler2)
+ self.server.vdirs = []
+ self.server.logRequests = True
+ netsvc.Logger().notifyChannel("web-services", netsvc.LOG_INFO,
+ "starting HTTPS service at %s port %d" % (interface or '0.0.0.0', port,))
except SSLError, e:
netsvc.Logger().notifyChannel('httpd-ssl', netsvc.LOG_CRITICAL, "Can not load the certificate and/or the private key files")
raise
@@ -184,32 +184,32 @@ httpd = None
httpsd = None
def init_servers():
- global httpd, httpsd
- if tools.config.get_misc('httpd','enable', True):
- httpd = HttpDaemon(tools.config.get_misc('httpd','interface', ''), \
- tools.config.get_misc('httpd','port', 8069))
+ global httpd, httpsd
+ if tools.config.get_misc('httpd','enable', True):
+ httpd = HttpDaemon(tools.config.get_misc('httpd','interface', ''), \
+ tools.config.get_misc('httpd','port', 8069))
- if tools.config.get_misc('httpsd','enable', False):
- httpsd = HttpSDaemon(tools.config.get_misc('httpsd','interface', ''), \
- tools.config.get_misc('httpsd','port', 8071))
+ if tools.config.get_misc('httpsd','enable', False):
+ httpsd = HttpSDaemon(tools.config.get_misc('httpsd','interface', ''), \
+ tools.config.get_misc('httpsd','port', 8071))
def reg_http_service(hts, secure_only = False):
- """ Register some handler to httpd.
- hts must be an HTTPDir
- """
- global httpd, httpsd
- if not isinstance(hts, HTTPDir):
- raise Exception("Wrong class for http service")
-
- if httpd and not secure_only:
- httpd.server.vdirs.append(hts)
-
- if httpsd:
- httpsd.server.vdirs.append(hts)
-
- if (not httpd) and (not httpsd):
- netsvc.Logger().notifyChannel('httpd',netsvc.LOG_WARNING,"No httpd available to register service %s" % hts.path)
- return
+ """ Register some handler to httpd.
+ hts must be an HTTPDir
+ """
+ global httpd, httpsd
+ if not isinstance(hts, HTTPDir):
+ raise Exception("Wrong class for http service")
+
+ if httpd and not secure_only:
+ httpd.server.vdirs.append(hts)
+
+ if httpsd:
+ httpsd.server.vdirs.append(hts)
+
+ if (not httpd) and (not httpsd):
+ netsvc.Logger().notifyChannel('httpd',netsvc.LOG_WARNING,"No httpd available to register service %s" % hts.path)
+ return
import SimpleXMLRPCServer
class XMLRPCRequestHandler(netsvc.OpenERPDispatcher,FixSendError,SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
@@ -223,7 +223,7 @@ class XMLRPCRequestHandler(netsvc.OpenERPDispatcher,FixSendError,SimpleXMLRPCSer
raise xmlrpclib.Fault(tools.exception_to_unicode(e.exception), e.traceback)
def log_message(self, format, *args):
- netsvc.Logger().notifyChannel('xmlrpc',netsvc.LOG_DEBUG_RPC,format % args)
+ netsvc.Logger().notifyChannel('xmlrpc',netsvc.LOG_DEBUG_RPC,format % args)
def handle(self):
pass
@@ -233,87 +233,87 @@ class XMLRPCRequestHandler(netsvc.OpenERPDispatcher,FixSendError,SimpleXMLRPCSer
def setup(self):
self.connection = dummyconn()
- if not len(XMLRPCRequestHandler.rpc_paths):
- XMLRPCRequestHandler.rpc_paths = map(lambda s: '/%s' % s, netsvc.ExportService._services.keys())
+ if not len(XMLRPCRequestHandler.rpc_paths):
+ XMLRPCRequestHandler.rpc_paths = map(lambda s: '/%s' % s, netsvc.ExportService._services.keys())
pass
def init_xmlrpc():
- if not tools.config.get_misc('xmlrpc','enable', True):
- return
- reg_http_service(HTTPDir('/xmlrpc/',XMLRPCRequestHandler))
- # Example of http file serving:
- # reg_http_service(HTTPDir('/test/',HTTPHandler))
- netsvc.Logger().notifyChannel("web-services", netsvc.LOG_INFO,
- "Registered XML-RPC over HTTP")
-
+ if not tools.config.get_misc('xmlrpc','enable', True):
+ return
+ reg_http_service(HTTPDir('/xmlrpc/',XMLRPCRequestHandler))
+ # Example of http file serving:
+ # reg_http_service(HTTPDir('/test/',HTTPHandler))
+ netsvc.Logger().notifyChannel("web-services", netsvc.LOG_INFO,
+ "Registered XML-RPC over HTTP")
+
class OerpAuthProxy(AuthProxy):
- """ Require basic authentication..
-
- This is a copy of the BasicAuthProxy, which however checks/caches the db
- as well.
- """
- def __init__(self,provider):
- AuthProxy.__init__(self,provider)
- self.auth_creds = {}
- self.auth_tries = 0
- self.last_auth = None
-
- def checkRequest(self,handler,path = '/'):
- if self.auth_creds:
- return True
- auth_str = handler.headers.get('Authorization',False)
- try:
- db = handler.get_db_from_path(path)
- print "Got db:",db
- except:
- if path.startswith('/'):
- path = path[1:]
- psp= path.split('/')
- if len(psp)>1:
- db = psp[0]
- else:
- #FIXME!
- self.provider.log("Wrong path: %s, failing auth" %path)
- raise AuthRejectedExc("Authorization failed. Wrong sub-path.")
-
- if auth_str and auth_str.startswith('Basic '):
- auth_str=auth_str[len('Basic '):]
- (user,passwd) = base64.decodestring(auth_str).split(':')
- self.provider.log("Found user=\"%s\", passwd=\"***\" for db=\"%s\"" %(user,db))
- acd = self.provider.authenticate(db,user,passwd,handler.client_address)
- if acd != False:
- self.auth_creds[db] = acd
- self.last_auth=db
- return True
- if self.auth_tries > 5:
- self.provider.log("Failing authorization after 5 requests w/o password")
- raise AuthRejectedExc("Authorization failed.")
- self.auth_tries += 1
- raise AuthRequiredExc(atype = 'Basic', realm=self.provider.realm)
+ """ Require basic authentication..
+
+ This is a copy of the BasicAuthProxy, which however checks/caches the db
+ as well.
+ """
+ def __init__(self,provider):
+ AuthProxy.__init__(self,provider)
+ self.auth_creds = {}
+ self.auth_tries = 0
+ self.last_auth = None
+
+ def checkRequest(self,handler,path = '/'):
+ if self.auth_creds:
+ return True
+ auth_str = handler.headers.get('Authorization',False)
+ try:
+ db = handler.get_db_from_path(path)
+ print "Got db:",db
+ except:
+ if path.startswith('/'):
+ path = path[1:]
+ psp= path.split('/')
+ if len(psp)>1:
+ db = psp[0]
+ else:
+ #FIXME!
+ self.provider.log("Wrong path: %s, failing auth" %path)
+ raise AuthRejectedExc("Authorization failed. Wrong sub-path.")
+
+ if auth_str and auth_str.startswith('Basic '):
+ auth_str=auth_str[len('Basic '):]
+ (user,passwd) = base64.decodestring(auth_str).split(':')
+ self.provider.log("Found user=\"%s\", passwd=\"***\" for db=\"%s\"" %(user,db))
+ acd = self.provider.authenticate(db,user,passwd,handler.client_address)
+ if acd != False:
+ self.auth_creds[db] = acd
+ self.last_auth=db
+ return True
+ if self.auth_tries > 5:
+ self.provider.log("Failing authorization after 5 requests w/o password")
+ raise AuthRejectedExc("Authorization failed.")
+ self.auth_tries += 1
+ raise AuthRequiredExc(atype = 'Basic', realm=self.provider.realm)
import security
class OpenERPAuthProvider(AuthProvider):
- def __init__(self,realm = 'OpenERP User'):
- self.realm = realm
-
- def setupAuth(self, multi, handler):
- if not multi.sec_realms.has_key(self.realm):
- multi.sec_realms[self.realm] = OerpAuthProxy(self)
- handler.auth_proxy = multi.sec_realms[self.realm]
-
- def authenticate(self, db, user, passwd, client_address):
- try:
- uid = security.login(db,user,passwd)
- if uid is False:
- return False
- return (user, passwd, db, uid)
- except Exception,e:
- netsvc.Logger().notifyChannel("auth",netsvc.LOG_DEBUG,"Fail auth:"+ str(e))
- return False
-
- def log(self, msg):
- netsvc.Logger().notifyChannel("auth",netsvc.LOG_INFO,msg)
+ def __init__(self,realm = 'OpenERP User'):
+ self.realm = realm
+
+ def setupAuth(self, multi, handler):
+ if not multi.sec_realms.has_key(self.realm):
+ multi.sec_realms[self.realm] = OerpAuthProxy(self)
+ handler.auth_proxy = multi.sec_realms[self.realm]
+
+ def authenticate(self, db, user, passwd, client_address):
+ try:
+ uid = security.login(db,user,passwd)
+ if uid is False:
+ return False
+ return (user, passwd, db, uid)
+ except Exception,e:
+ netsvc.Logger().notifyChannel("auth",netsvc.LOG_DEBUG,"Fail auth:"+ str(e))
+ return False
+
+ def log(self, msg):
+ netsvc.Logger().notifyChannel("auth",netsvc.LOG_INFO,msg)
#eof