From eb65fa6960d8dfdc6f7ec56b9f37226306c1df38 Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Oct 03 2022 10:47:30 +0000 Subject: [PATCH 1/2] encode invalid XML characters Related: https://pagure.io/koji/issue/3523 --- diff --git a/koji/xmlrpcplus.py b/koji/xmlrpcplus.py index 7da1593..29c5350 100644 --- a/koji/xmlrpcplus.py +++ b/koji/xmlrpcplus.py @@ -20,6 +20,8 @@ DateTime = xmlrpc_client.DateTime class ExtendedMarshaller(xmlrpc_client.Marshaller): dispatch = xmlrpc_client.Marshaller.dispatch.copy() + # https://www.w3.org/TR/xml/#Unicode + xml_forbidden_chars = re.compile('[\x00-\x08\x0b-\x0c\x0e-\x1f]', re.UNICODE) def _dump(self, value, write): # Parent class is unfriendly to subclasses :-/ @@ -59,6 +61,14 @@ class ExtendedMarshaller(xmlrpc_client.Marshaller): except AttributeError: dispatch[re._pattern_type] = dump_re + def dump_unicode_bytes(self, value, write): + # find illegal chars and encode them as a base64 + if self.xml_forbidden_chars.search(value): + return self.dump_bytes(value.encode(), write) + else: + return self.dump_unicode(value, write) + dispatch[str] = dump_unicode_bytes + if six.PY2: ExtendedMarshaller.dispatch[long] = ExtendedMarshaller.dump_int # noqa: F821 From 3c7ea28acc2fd160fd8104c004e265915fd1e79d Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Oct 07 2022 14:52:14 +0000 Subject: [PATCH 2/2] client-side parsing --- diff --git a/koji/__init__.py b/koji/__init__.py index 3a02419..9fdda53 100644 --- a/koji/__init__.py +++ b/koji/__init__.py @@ -2806,7 +2806,12 @@ class ClientSession(object): return ret def _read_xmlrpc_response(self, response): - p, u = getparser() + try: + # to convert encoded bytes + p, u = getparser(use_builtin_types=True) + except TypeError: + # fallback python < 3.4 + p, u = getparser() for chunk in response.iter_content(8192): if self.opts.get('debug_xmlrpc', False): self.logger.debug("body: %r" % chunk)