summaryrefslogtreecommitdiffstats
path: root/ipaserver
diff options
context:
space:
mode:
authorPetr Viktorin <pviktori@redhat.com>2013-12-10 17:36:32 +0100
committerPetr Viktorin <pviktori@redhat.com>2013-12-10 17:36:32 +0100
commit6a2b70946f2322a354ac7a4de256128d8a84ffd9 (patch)
tree126c210a2466e2096e5f0a4a600a53755cf323ff /ipaserver
parentb7f1531262723d9a9c50bedad21c3b3cc51e34e9 (diff)
downloadfreeipa.git-6a2b70946f2322a354ac7a4de256128d8a84ffd9.tar.gz
freeipa.git-6a2b70946f2322a354ac7a4de256128d8a84ffd9.tar.xz
freeipa.git-6a2b70946f2322a354ac7a4de256128d8a84ffd9.zip
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
Diffstat (limited to 'ipaserver')
-rw-r--r--ipaserver/rpcserver.py88
1 files changed, 34 insertions, 54 deletions
diff --git a/ipaserver/rpcserver.py b/ipaserver/rpcserver.py
index 92ab17df..a2a9db8a 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'