From bc118484e4c12d84e5c31a29caca0a7ac2dc69e1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 6 Dec 2024 12:23:27 +0100 Subject: [PATCH] index.xml: XML escaping from Python < 3.13 which stopped converting " index.xml is for old clients that are stuck in the past forever. So the format should not change at all. Python 3.13 changed minidom so it no longer converts " to an XML entity. https://github.com/python/cpython/commit/154477be722ae5c4e18d22d0860e284006b09c4f --- fdroidserver/index.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 5a174d51..096ace12 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -28,6 +28,7 @@ import os import re import ruamel.yaml import shutil +import sys import tempfile import urllib.parse import zipfile @@ -1309,6 +1310,29 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing os.remove(siglinkname) os.symlink(sigfile_path, siglinkname) + if sys.version_info.minor >= 13: + # Python 3.13 changed minidom so it no longer converts " to an XML entity. + # https://github.com/python/cpython/commit/154477be722ae5c4e18d22d0860e284006b09c4f + # This just puts back the previous implementation, with black code format. + import inspect + import xml.dom.minidom + + def _write_data(writer, text, attr): # pylint: disable=unused-argument + if text: + text = ( + text.replace('&', '&') + .replace('<', '<') + .replace('"', '"') + .replace('>', '>') + ) + writer.write(text) + + argnames = tuple(inspect.signature(xml.dom.minidom._write_data).parameters) + if argnames == ('writer', 'text', 'attr'): + xml.dom.minidom._write_data = _write_data + else: + logging.warning('Failed to monkey patch minidom for index.xml support!') + if common.options.pretty: output = doc.toprettyxml(encoding='utf-8') else: