diff --git a/cloudflare_error_page/__init__.py b/cloudflare_error_page/__init__.py index 8e30edb..28895a7 100644 --- a/cloudflare_error_page/__init__.py +++ b/cloudflare_error_page/__init__.py @@ -3,7 +3,7 @@ import os import secrets from datetime import datetime, timezone -from jinja2 import Environment, PackageLoader, select_autoescape +from jinja2 import Environment, PackageLoader, Template, select_autoescape env = Environment( loader=PackageLoader("cloudflare_error_page"), @@ -12,6 +12,7 @@ env = Environment( lstrip_blocks=True, ) +default_template = env.get_template("error.html") def get_resources_folder() -> str: """ @@ -21,19 +22,22 @@ def get_resources_folder() -> str: return os.path.join(os.path.dirname(os.path.abspath(__file__)), 'resources') -def render(params: dict, allow_html: bool=True, use_cdn: bool=True) -> str: - """ - Render a customized Cloudflare error page. - """ - params = {**params} +def fill_params(params: dict): if not params.get('time'): utc_now = datetime.now(timezone.utc) params['time'] = utc_now.strftime("%Y-%m-%d %H:%M:%S UTC") if not params.get('ray_id'): params['ray_id'] = secrets.token_hex(8) + + +def render(params: dict, allow_html: bool=True, use_cdn: bool=True) -> str: + """ + Render a customized Cloudflare error page. + """ + params = {**params} + fill_params(params) if not allow_html: params['what_happened'] = html.escape(params.get('what_happened', '')) params['what_can_i_do'] = html.escape(params.get('what_can_i_do', '')) - template = env.get_template("error.html") return template.render(params=params, resources_use_cdn=use_cdn) diff --git a/cloudflare_error_page/templates/error.html b/cloudflare_error_page/templates/error.html index ce42991..fe4bf59 100644 --- a/cloudflare_error_page/templates/error.html +++ b/cloudflare_error_page/templates/error.html @@ -8,12 +8,14 @@ {% set error_code = params.error_code or 500 %} {% set title = params.title or 'Internal server error' %} -{{ params.html_title or ((error_code | string) + ': ' + title) }} +{% set html_title = params.html_title or ((error_code | string) + ': ' + title) %} +{{ html_title }} +{% block header %}{% endblock %} diff --git a/editor/server/__init__.py b/editor/server/__init__.py index 68134c3..441de34 100644 --- a/editor/server/__init__.py +++ b/editor/server/__init__.py @@ -14,7 +14,6 @@ from sqlalchemy.orm import DeclarativeBase root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../') sys.path.append(root_dir) -from cloudflare_error_page import render as render_cf_error_page class Base(DeclarativeBase): pass diff --git a/editor/server/editor.py b/editor/server/editor.py index 788d9b1..6041e91 100644 --- a/editor/server/editor.py +++ b/editor/server/editor.py @@ -7,8 +7,6 @@ from flask import ( send_from_directory, ) -from . import get_common_cf_template_params, render_cf_error_page - root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../') res_folder = os.path.join(root_dir, 'editor/resources') diff --git a/editor/server/examples.py b/editor/server/examples.py index 5faec38..d5ae820 100644 --- a/editor/server/examples.py +++ b/editor/server/examples.py @@ -10,7 +10,8 @@ from flask import ( redirect, ) -from . import get_common_cf_template_params, render_cf_error_page +from . import get_common_cf_template_params +from cloudflare_error_page import render as render_cf_error_page root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../') examples_dir = os.path.join(root_dir, 'examples') diff --git a/editor/server/share.py b/editor/server/share.py index f0166a1..b89e2d2 100644 --- a/editor/server/share.py +++ b/editor/server/share.py @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MIT +import html import random import string @@ -10,14 +11,38 @@ from flask import ( jsonify, url_for, ) +from jinja2 import Environment, select_autoescape -from . import get_common_cf_template_params, render_cf_error_page +from cloudflare_error_page import render as render_cf_error_page, fill_params, default_template as cf_template + +from . import get_common_cf_template_params from . import db from . import limiter from . import models # 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, +) +template = env.from_string(''' +{% extends base %} + +{% block header %} + + + + + + + + + + +{% endblock %} +''') bp = Blueprint('share', __name__, url_prefix='/') @@ -68,19 +93,10 @@ def get(name: str): }) else: return abort(404) - params = item.params - params = { - **params, - **get_common_cf_template_params(), - } + params: dict = item.params params.pop('time') params.pop('ray_id') params.pop('client_ip') - params['creator_info'] = { - 'hidden': False, - 'text': 'CF Error Page Editor', - 'link': f'https://virt.moe/cloudflare-error-page/editor/#from={name}', - } if is_json: return jsonify({ @@ -88,4 +104,22 @@ def get(name: str): 'parameters': params, }) else: - return render_cf_error_page(params=params, allow_html=False, use_cdn=True), 200 + params = { + **params, + **get_common_cf_template_params(), + } + params['creator_info'] = { + 'hidden': False, + 'text': 'CF Error Page Editor', + 'link': f'https://virt.moe/cloudflare-error-page/editor/#from={name}', + } + fill_params(params) + params['what_happened'] = html.escape(params.get('what_happened', '')) # TODO: common render function? + params['what_can_i_do'] = html.escape(params.get('what_can_i_do', '')) + + return template.render(base=cf_template, + params=params, + url=request.url, + description='Cloudflare error page', + resources_use_cdn=True) + # return render_cf_error_page(params=params, allow_html=False, use_cdn=True), 200