X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=apps%2Fpatchwork%2Fviews%2Fxmlrpc.py;h=89c6bd6bb446dec5357a198944410c182fbf65e1;hb=ea39a9952e3fa647ebcb4bf16981ce941ec5236a;hp=f493cf780f4dc66382ee5bc39077d3e2d116e67a;hpb=a66875053f1014de3767937b1a918949c667ac74;p=patchwork diff --git a/apps/patchwork/views/xmlrpc.py b/apps/patchwork/views/xmlrpc.py index f493cf7..89c6bd6 100644 --- a/apps/patchwork/views/xmlrpc.py +++ b/apps/patchwork/views/xmlrpc.py @@ -39,22 +39,37 @@ class PatchworkXMLRPCDispatcher(SimpleXMLRPCDispatcher): if sys.version_info[:3] >= (2,5,): SimpleXMLRPCDispatcher.__init__(self, allow_none=False, encoding=None) + def _dumps(obj, *args, **kwargs): + kwargs['allow_none'] = self.allow_none + kwargs['encoding'] = self.encoding + return xmlrpclib.dumps(obj, *args, **kwargs) else: + def _dumps(obj, *args, **kwargs): + return xmlrpclib.dumps(obj, *args, **kwargs) SimpleXMLRPCDispatcher.__init__(self) + self.dumps = _dumps + # map of name => (auth, func) self.func_map = {} - def register_function(self, fn, auth_required): self.func_map[fn.__name__] = (auth_required, fn) def _user_for_request(self, request): - if not request.META.has_key('HTTP_AUTHORIZATION'): + auth_header = None + + if request.META.has_key('HTTP_AUTHORIZATION'): + auth_header = request.META.get('HTTP_AUTHORIZATION') + elif request.META.has_key('Authorization'): + auth_header = request.META.get('Authorization') + + if auth_header is None or auth_header == '': raise Exception("No authentication credentials given") - str = request.META.get('HTTP_AUTHORIZATION').strip() + str = auth_header.strip() + if not str.startswith('Basic '): raise Exception("Authentication scheme not supported") @@ -91,16 +106,13 @@ class PatchworkXMLRPCDispatcher(SimpleXMLRPCDispatcher): response = self._dispatch(request, method, params) # wrap response in a singleton tuple response = (response,) - response = xmlrpclib.dumps(response, methodresponse=1, - allow_none=self.allow_none, encoding=self.encoding) + response = self.dumps(response, methodresponse=1) except xmlrpclib.Fault, fault: - response = xmlrpclib.dumps(fault, allow_none=self.allow_none, - encoding=self.encoding) + response = self.dumps(fault) except: # report exception back to server - response = xmlrpclib.dumps( + response = self.dumps( xmlrpclib.Fault(1, "%s:%s" % (sys.exc_type, sys.exc_value)), - encoding=self.encoding, allow_none=self.allow_none, ) return response @@ -161,7 +173,7 @@ def person_to_dict(obj): 'id' : obj.id, 'email' : obj.email, 'name' : obj.name, - 'user' : str(obj.user), + 'user' : unicode(obj.user).encode("utf-8"), } def patch_to_dict(obj): @@ -170,17 +182,17 @@ def patch_to_dict(obj): return \ { 'id' : obj.id, - 'date' : str(obj.date), + 'date' : unicode(obj.date).encode("utf-8"), 'filename' : obj.filename(), 'msgid' : obj.msgid, 'name' : obj.name, - 'project' : str(obj.project), + 'project' : unicode(obj.project).encode("utf-8"), 'project_id' : obj.project_id, - 'state' : str(obj.state), + 'state' : unicode(obj.state).encode("utf-8"), 'state_id' : obj.state_id, - 'submitter' : str(obj.submitter), + 'submitter' : unicode(obj.submitter).encode("utf-8"), 'submitter_id' : obj.submitter_id, - 'delegate' : str(obj.delegate), + 'delegate' : unicode(obj.delegate).encode("utf-8"), 'delegate_id' : max(obj.delegate_id, 0), 'commit_ref' : max(obj.commit_ref, ''), } @@ -334,6 +346,15 @@ def patch_get(patch_id): except: return {} +@xmlrpc_method(False) +def patch_get_by_hash(hash): + """Return structure for the given patch hash.""" + try: + patch = Patch.objects.filter(hash = hash)[0] + return patch_to_dict(patch) + except: + return {} + @xmlrpc_method(False) def patch_get_mbox(patch_id): """Return mbox string for the given patch ID."""