From 6a2b70946f2322a354ac7a4de256128d8a84ffd9 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Tue, 10 Dec 2013 17:36:32 +0100 Subject: rpcserver: Consolidate __call__ in xmlclient and jsonclient_kerb The two classes had very similar __call__ methods, but the JSON server lacked error handling. Create a common class for the __call__ method. https://fedorahosted.org/freeipa/ticket/4069 --- ipaserver/rpcserver.py | 88 +++++++++++++++++++------------------------------- 1 file changed, 34 insertions(+), 54 deletions(-) (limited to 'ipaserver') diff --git a/ipaserver/rpcserver.py b/ipaserver/rpcserver.py index 92ab17dfc..a2a9db8ae 100644 --- a/ipaserver/rpcserver.py +++ b/ipaserver/rpcserver.py @@ -596,42 +596,39 @@ class KerberosSession(object): return [''] -class xmlserver(WSGIExecutioner, HTTP_Status, KerberosSession): - """ - Execution backend plugin for XML-RPC server. - - Also see the `ipalib.rpc.xmlclient` plugin. +class KerberosWSGIExecutioner(WSGIExecutioner, HTTP_Status, KerberosSession): + """Base class for xmlserver and jsonserver_kerb """ - content_type = 'text/xml' - key = '/xml' - def _on_finalize(self): - self.__system = { - 'system.listMethods': self.listMethods, - 'system.methodSignature': self.methodSignature, - 'system.methodHelp': self.methodHelp, - } - super(xmlserver, self)._on_finalize() + super(KerberosWSGIExecutioner, self)._on_finalize() self.kerb_session_on_finalize() def __call__(self, environ, start_response): - ''' - ''' - - self.debug('WSGI xmlserver.__call__:') + self.debug('KerberosWSGIExecutioner.__call__:') user_ccache=environ.get('KRB5CCNAME') - headers = [('Content-Type', 'text/xml; charset=utf-8')] + + headers = [('Content-Type', '%s; charset=utf-8' % self.content_type)] + if user_ccache is None: - self.internal_error(environ, start_response, - 'xmlserver.__call__: KRB5CCNAME not defined in HTTP request environment') + + status = HTTP_STATUS_SERVER_ERROR + response_headers = [('Content-Type', 'text/html; charset=utf-8')] + + self.log.error( + '%s: %s', status, + 'KerberosWSGIExecutioner.__call__: ' + 'KRB5CCNAME not defined in HTTP request environment') + return self.marshal(None, CCacheError()) try: self.create_context(ccache=user_ccache) - response = super(xmlserver, self).__call__(environ, start_response) - if getattr(context, 'session_data', None) is None and \ - self.env.context != 'lite': - self.finalize_kerberos_acquisition('xmlserver', user_ccache, environ, start_response, headers) + response = super(KerberosWSGIExecutioner, self).__call__( + environ, start_response) + session_data = getattr(context, 'session_data', None) + if (session_data is None and self.env.context != 'lite'): + self.finalize_kerberos_acquisition( + 'xmlserver', user_ccache, environ, start_response, headers) except PublicError, e: status = HTTP_STATUS_SUCCESS response = status @@ -641,6 +638,17 @@ class xmlserver(WSGIExecutioner, HTTP_Status, KerberosSession): destroy_context() return response + +class xmlserver(KerberosWSGIExecutioner): + """ + Execution backend plugin for XML-RPC server. + + Also see the `ipalib.rpc.xmlclient` plugin. + """ + + content_type = 'text/xml' + key = '/xml' + def listMethods(self, *params): return tuple(name.decode('UTF-8') for name in self.Command) @@ -769,41 +777,13 @@ class jsonserver_session(jsonserver, KerberosSession): return response -class jsonserver_kerb(jsonserver, KerberosSession): +class jsonserver_kerb(jsonserver, KerberosWSGIExecutioner): """ JSON RPC server protected with kerberos auth. """ key = '/json' - def _on_finalize(self): - super(jsonserver_kerb, self)._on_finalize() - self.kerb_session_on_finalize() - - def __call__(self, environ, start_response): - ''' - ''' - - self.debug('WSGI jsonserver_kerb.__call__:') - - user_ccache=environ.get('KRB5CCNAME') - if user_ccache is None: - self.internal_error(environ, start_response, - 'jsonserver_kerb.__call__: KRB5CCNAME not defined in HTTP request environment') - return self.marshal(None, CCacheError()) - self.create_context(ccache=user_ccache) - - try: - response = super(jsonserver_kerb, self).__call__(environ, start_response) - if (getattr(context, 'session_data', None) is None and - self.env.context != 'lite'): - self.finalize_kerberos_acquisition('jsonserver', user_ccache, - environ, start_response) - finally: - destroy_context() - - return response - class login_kerberos(Backend, KerberosSession, HTTP_Status): key = '/session/login_kerberos' -- cgit