From eb0d5a7d5556d9256d09fc7a2e888b77f113f238 Mon Sep 17 00:00:00 2001 From: Anthony Donlon Date: Wed, 17 Dec 2025 01:21:43 +0800 Subject: [PATCH] editor: support page icon --- cloudflare_error_page/__init__.py | 1 + editor/server/config.example.toml | 6 ++++ editor/server/examples.py | 9 +++-- editor/server/share.py | 48 ++++---------------------- editor/server/utils.py | 55 ++++++++++++++++++++++++++++-- editor/web/icon.png | Bin 0 -> 708 bytes editor/web/index.html | 1 + 7 files changed, 71 insertions(+), 49 deletions(-) create mode 100644 editor/web/icon.png diff --git a/cloudflare_error_page/__init__.py b/cloudflare_error_page/__init__.py index 3c3b9cb..5dc5988 100644 --- a/cloudflare_error_page/__init__.py +++ b/cloudflare_error_page/__init__.py @@ -20,6 +20,7 @@ env = Environment( lstrip_blocks=True, ) +# TODO: rename to base_template default_template: Template = env.get_template("error.html") diff --git a/editor/server/config.example.toml b/editor/server/config.example.toml index b9cc60c..bbc8456 100644 --- a/editor/server/config.example.toml +++ b/editor/server/config.example.toml @@ -7,6 +7,12 @@ SHARE_LINK_DIGITS = 7 # Use short share url (without '/s' path) SHORT_SHARE_URL = false +# Icon URL for rendered pages +PAGE_ICON_URL = '' + +# MIME type of page icon +PAGE_ICON_TYPE = 'image/png' + # Set to true if trust X-Forwarded-For/X-Forwarded-Proto header BEHIND_PROXY = true diff --git a/editor/server/examples.py b/editor/server/examples.py index e94da8e..cbb2c63 100644 --- a/editor/server/examples.py +++ b/editor/server/examples.py @@ -12,8 +12,9 @@ from flask import ( ) from cloudflare_error_page import ErrorPageParams -from cloudflare_error_page import render as render_cf_error_page -from .utils import fill_cf_template_params +from .utils import ( + render_extended_template, +) root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../') examples_dir = os.path.join(root_dir, 'examples') @@ -50,7 +51,5 @@ def index(name: str): if params is None: abort(404) - fill_cf_template_params(params) - # Render the error page - return render_cf_error_page(params) + return render_extended_template(params=params) diff --git a/editor/server/share.py b/editor/server/share.py index 02ccc5d..ff044a5 100644 --- a/editor/server/share.py +++ b/editor/server/share.py @@ -1,6 +1,5 @@ # SPDX-License-Identifier: MIT -import html import random import string @@ -13,49 +12,20 @@ from flask import ( redirect, url_for, ) -from jinja2 import Environment, select_autoescape - -from cloudflare_error_page import ( - default_template as cf_template, - render as render_cf_error_page, -) from . import ( db, limiter, - models + models, ) - -from .utils import fill_cf_template_params, sanitize_page_param_links - -# root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../') -# examples_dir = os.path.join(root_dir, 'examples') -env = Environment( - autoescape=select_autoescape(), - trim_blocks=True, - lstrip_blocks=True, +from .utils import ( + render_extended_template, + sanitize_page_param_links, ) -template = env.from_string(''' -{% extends base %} - -{% block header %} - - - - - - - - - - -{% endblock %} -''') bp = Blueprint('share', __name__, url_prefix='/') bp_short = Blueprint('share_short', __name__, url_prefix='/') - rand_charset = string.ascii_lowercase + string.digits def get_rand_name(digits=8): @@ -131,15 +101,9 @@ def get(name: str): 'text': 'CF Error Page Editor', 'link': request.host_url[:-1] + url_for('editor.index') + f'#from={name}', } - fill_cf_template_params(params) sanitize_page_param_links(params) - - return render_cf_error_page(params=params, - allow_html=False, - template=template, - base=cf_template, - url=request.url, - description='Cloudflare error page') + return render_extended_template(params=params, + allow_html=False) @bp.get('/') diff --git a/editor/server/utils.py b/editor/server/utils.py index f19d676..9e241d4 100644 --- a/editor/server/utils.py +++ b/editor/server/utils.py @@ -1,11 +1,47 @@ import json import os +from typing import Any -from cloudflare_error_page import ErrorPageParams -from flask import request +from cloudflare_error_page import ( + ErrorPageParams, + default_template as base_template, + render as render_cf_error_page, +) +from flask import current_app, request +from jinja2 import Environment, select_autoescape from . import root_dir +env = Environment( + autoescape=select_autoescape(), + trim_blocks=True, + lstrip_blocks=True, +) +template = env.from_string(''' +{% extends base %} + +{% block header %} +{% if page_icon_url %} +{% if page_icon_type %} + +{% else %} + +{% endif %} +{% endif %} + + + + + + + + + + + +{% endblock %} +''') + loc_data: dict = None @@ -74,3 +110,18 @@ def sanitize_page_param_links(param: ErrorPageParams): link = perf_sec_by.get('link') if link: perf_sec_by['link'] = sanitize_user_link(link) + + +def render_extended_template(params: ErrorPageParams, + *args: Any, + **kwargs: Any) -> str: + fill_cf_template_params(params) + return render_cf_error_page(params=params, + template=template, + base=base_template, + page_icon_url=current_app.config.get('PAGE_ICON_URL'), + page_icon_type=current_app.config.get('PAGE_ICON_TYPE'), + url=request.url, + description='Cloudflare error page', + *args, + **kwargs) diff --git a/editor/web/icon.png b/editor/web/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4658a5862cbd79725c971c9900660f7cd39c4e33 GIT binary patch literal 708 zcmV;#0z3VQP)ai9oSy6eR5dm*g06MI-Oe1pt~0a;pfYCZ~10K7}vuPss?ls9@txD*}#QgtAsD&HW_ddR>bGmSzFp6 zKEF;Re3hq1JF=-JaUO{0gs2Ss9PgG^lXSY|7lMIFIzllghA q0a`jysJN{)lz>rU?0-gM7w{8sg~K(`NeLqW0000 +