diff options
Diffstat (limited to 'ipaserver')
-rw-r--r-- | ipaserver/__init__.py | 28 | ||||
-rwxr-xr-x | ipaserver/mod_python_xmlrpc.py | 94 | ||||
-rw-r--r-- | ipaserver/plugins/b_ldap.py | 2 | ||||
-rw-r--r-- | ipaserver/plugins/b_ra.py | 3 | ||||
-rw-r--r-- | ipaserver/rpcserver.py | 26 |
5 files changed, 69 insertions, 84 deletions
diff --git a/ipaserver/__init__.py b/ipaserver/__init__.py index b0be96bd..35f96c7f 100644 --- a/ipaserver/__init__.py +++ b/ipaserver/__init__.py @@ -20,3 +20,31 @@ """ Package containing server backend. """ + +from xmlrpclib import dumps, Fault +from ipalib import api + +try: + from mod_python import apache + api.bootstrap(context='server', log=None, debug=True) + api.finalize() +except ImportError: + pass + + +def xmlrpc(req): + if req.method != 'POST': + req.allow_methods(['POST'], 1) + return apache.HTTP_METHOD_NOT_ALLOWED + + if apache.mpm_query(apache.AP_MPMQ_IS_THREADED): + response = dumps( + Fault(3, 'Apache must use the forked model'), methodresponse=True + ) + else: + response = api.Backend.xmlserver.marshaled_dispatch(req.read(), None) + + req.content_type = 'text/xml' + req.set_content_length(len(response)) + req.write(response) + return apache.OK diff --git a/ipaserver/mod_python_xmlrpc.py b/ipaserver/mod_python_xmlrpc.py index 372376ac..42a7c28c 100755 --- a/ipaserver/mod_python_xmlrpc.py +++ b/ipaserver/mod_python_xmlrpc.py @@ -29,29 +29,21 @@ Production XML-RPC server using mod_python. import sys import os - - import time import traceback import pprint -from xmlrpclib import Marshaller,loads,dumps,Fault +import logging +import string +from ipalib import api + +# We only initialize api when actually running under mod_python: try: from mod_python import apache + api.bootstrap(context='server', in_server=True, log=None) + api.finalize() except ImportError: pass -import logging -import ldap -from ipalib import api -from ipalib import config -from ipaserver import conn -from ipaserver.servercore import context -from ipaserver.servercore import ipautil -from ipalib.util import xmlrpc_unmarshal - -import string - -api.load_plugins() # Global list of available functions gfunctions = {} @@ -116,57 +108,14 @@ class ModXMLRPCRequestHandler(object): context.opts['remoteuser'] = req.user - if req.subprocess_env.get("KRB5CCNAME") is not None: - krbccache = req.subprocess_env.get("KRB5CCNAME") - else: - response = dumps(Fault(5, "Did not receive Kerberos credentials.")) - return response - - debuglevel = logging.INFO - if pythonopts.get("IPADebug"): - context.opts['ipadebug'] = pythonopts.get("IPADebug").lower() - - if context.opts['ipadebug'] == "on": - debuglevel = logging.DEBUG - - if not context.opts.get('ipadebug'): - context.opts['ipadebug'] = "off" - - logging.basicConfig(level=debuglevel, - format='[%(asctime)s] [%(levelname)s] %(message)s', - datefmt='%a %b %d %H:%M:%S %Y', - stream=sys.stderr) - - logging.info("Interpreter: %s" % req.interpreter) - - -# if opts['ipadebug'] == "on": -# for o in opts: -# logging.debug("IPA: setting option %s: %s" % (o, opts[o])) -# for e in req.subprocess_env: -# logging.debug("IPA: environment %s: %s" % (e, req.subprocess_env[e])) - - context.conn = conn.IPAConn(api.env.ldaphost, api.env.ldapport, krbccache, context.opts.get('ipadebug')) - - start = time.time() - # generate response try: - response = self._dispatch(method, params) - # wrap response in a singleton tuple - response = (response,) - response = dumps(response, methodresponse=1, allow_none=1) - except Fault, e: - response = dumps(Fault(e.faultCode, e.faultString)) - except: - self.traceback = True - # report exception back to server - e_class, e = sys.exc_info()[:2] - faultCode = getattr(e_class,'faultCode',1) - tb_str = ''.join(traceback.format_exception(*sys.exc_info())) - faultString = tb_str - response = dumps(Fault(faultCode, faultString)) - - return response + ccache = req.subprocess_env.get('KRB5CCNAME') + return api.Backend.xmlserver.marshaled_dispatch(data, ccache) + except Exception, e: + api.log.exception( + 'mod_python_xmlrpc: caught error in _marshaled_dispatch()' + ) + raise e def _dispatch(self,method,params): func = self.funcs.get(method,None) @@ -347,22 +296,7 @@ def load_modules(): PythonHandler ipaxmlrpc """ - # setup up the logger with a DEBUG level. It may get reset to INFO - # once we start processing requests. We don't have access to the - # Apache configuration yet. - setup_logger(logging.DEBUG) - - api.finalize() - - # Initialize our environment - config.set_default_env(api.env) - env_dict = config.read_config() - env_dict['server_context'] = True - api.env.update(env_dict) - # Get and register all the methods for cmd in api.Command: logging.debug("registering XML-RPC call %s" % cmd) register_function(api.Command[cmd], cmd) - - return diff --git a/ipaserver/plugins/b_ldap.py b/ipaserver/plugins/b_ldap.py index c1262f52..f12e6155 100644 --- a/ipaserver/plugins/b_ldap.py +++ b/ipaserver/plugins/b_ldap.py @@ -42,6 +42,8 @@ class ldap(CrudBackend): super(ldap, self).__init__() def create_connection(self, ccache): + if ccache is None: + raise errors2.CCacheError() conn = ipaldap.IPAdmin(self.env.ldap_host, self.env.ldap_port) principle = krbV.CCache( name=ccache, context=krbV.default_context() diff --git a/ipaserver/plugins/b_ra.py b/ipaserver/plugins/b_ra.py index f0363bf1..69674cd0 100644 --- a/ipaserver/plugins/b_ra.py +++ b/ipaserver/plugins/b_ra.py @@ -67,6 +67,7 @@ class ra(Backend): self.__create_nss_db() self.__import_ca_chain() self.__request_ipa_certificate(self.__generate_ipa_request()) + assert False super(ra, self).__init__() @@ -404,4 +405,4 @@ class ra(Backend): # api.log.debug("IPA-RA: stderr: '%s'" % stderr) return (p.returncode, stdout, stderr) -api.register(ra) +#api.register(ra) diff --git a/ipaserver/rpcserver.py b/ipaserver/rpcserver.py index cb0a464c..36742b09 100644 --- a/ipaserver/rpcserver.py +++ b/ipaserver/rpcserver.py @@ -46,15 +46,35 @@ class xmlserver(Executioner): Also see the `ipalib.rpc.xmlclient` plugin. """ + def finalize(self): + self.__system = { + 'system.listMethods': self.listMethods, + 'system.methodSignature': self.methodSignature, + 'system.methodHelp': self.methodHelp, + } + super(xmlserver, self).finalize() + + def listMethods(self, *params): + return tuple(name.encode('UTF-8') for name in self.Command) + + def methodSignature(self, *params): + return 'methodSignature not supported' + + def methodHelp(self, *params): + return 'methodHelp not supported' + def marshaled_dispatch(self, data, ccache): """ Execute the XML-RPC request in contained in ``data``. """ try: - self.create_context(ccache=ccache) + #self.create_context(ccache=ccache) (params, name) = xml_loads(data) - (args, options) = params_2_args_options(params) - response = (self.execute(name, *args, **options),) + if name in self.__system: + response = (self.__system[name](*params),) + else: + (args, options) = params_2_args_options(params) + response = (self.execute(name, *args, **options),) except PublicError, e: self.info('response: %s: %s', e.__class__.__name__, str(e)) response = Fault(e.errno, e.strerror) |