From 4335bedeff9dbf1b147c0ef260171dd3eb83c795 Mon Sep 17 00:00:00 2001 From: Iris Morelle Date: Tue, 8 May 2018 02:24:50 -0300 Subject: [PATCH] wam: Allow using embedded data URIs as add-on icons [ci skip] --- changelog.md | 1 + data/tools/addon_manager/html.py | 61 ++++++++++++++++++-------------- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/changelog.md b/changelog.md index 2d6159b4d31e..418f6d0ee49f 100644 --- a/changelog.md +++ b/changelog.md @@ -148,6 +148,7 @@ * Fixed the wesnoth(6) manpage claiming the default log level is 'error' when it has been 'warning' since version 1.9.0. * Avoid trying to load invalid base64-encoded data URIs. + * wesnoth_addon_manager and the addons.wesnoth.org web index can now use data URIs. ## Version 1.13.12 ### Security fixes diff --git a/data/tools/addon_manager/html.py b/data/tools/addon_manager/html.py index 3416f9b930f9..4c1e95dd5713 100755 --- a/data/tools/addon_manager/html.py +++ b/data/tools/addon_manager/html.py @@ -4,6 +4,7 @@ import html import glob import os +import re import sys import time import urllib.parse @@ -260,32 +261,40 @@ def w(line): if icon: icon = icon.strip() - tilde = icon.find("~") - if tilde >= 0: - icon = icon[:tilde] - if "\\" in icon: - icon = icon.replace("\\", "/") - try: - os.mkdir(path + "/icons") - except OSError: - pass - if "." not in icon: - icon += ".png" - src = root_dir + icon - imgurl = "icons/" + os.path.basename(icon) - if not os.path.exists(src): - src = root_dir + "data/core/images/" + icon - if not os.path.exists(src): - src = root_dir + "images/" + icon - if not os.path.exists(src): - src = glob.glob(root_dir + "data/campaigns/*/images/" + icon) - if src: - src = src[0] - if not src or not os.path.exists(src): - sys.stderr.write("Cannot find icon " + icon + "\n") - src = root_dir + "images/misc/missing-image.png" - imgurl = "icons/missing-image.png" - images_to_tc.append((src, path + "/" + imgurl)) + uri_manifest = re.match('^data:(image/(?:png|jpeg));base64,', icon) + + if uri_manifest: + if uri_manifest.group(1) not in ('image/png', 'image/jpeg'): + sys.stderr.write("Data URI icon using unsupported content type " + uri_manifest.group(1)) + else: + imgurl = icon + else: + tilde = icon.find("~") + if tilde >= 0: + icon = icon[:tilde] + if "\\" in icon: + icon = icon.replace("\\", "/") + try: + os.mkdir(path + "/icons") + except OSError: + pass + if "." not in icon: + icon += ".png" + src = root_dir + icon + imgurl = "icons/" + os.path.basename(icon) + if not os.path.exists(src): + src = root_dir + "data/core/images/" + icon + if not os.path.exists(src): + src = root_dir + "images/" + icon + if not os.path.exists(src): + src = glob.glob(root_dir + "data/campaigns/*/images/" + icon) + if src: + src = src[0] + if not src or not os.path.exists(src): + sys.stderr.write("Cannot find icon " + icon + "\n") + src = root_dir + "images/misc/missing-image.png" + imgurl = "icons/missing-image.png" + images_to_tc.append((src, path + "/" + imgurl)) w('')