mirror of
https://github.com/donlon/cloudflare-error-page.git
synced 2025-12-19 14:59:28 +00:00
editor/server: add meta information in user-created pages
This commit is contained in:
@@ -3,7 +3,7 @@ import os
|
|||||||
import secrets
|
import secrets
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
|
|
||||||
from jinja2 import Environment, PackageLoader, select_autoescape
|
from jinja2 import Environment, PackageLoader, Template, select_autoescape
|
||||||
|
|
||||||
env = Environment(
|
env = Environment(
|
||||||
loader=PackageLoader("cloudflare_error_page"),
|
loader=PackageLoader("cloudflare_error_page"),
|
||||||
@@ -12,6 +12,7 @@ env = Environment(
|
|||||||
lstrip_blocks=True,
|
lstrip_blocks=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
default_template = env.get_template("error.html")
|
||||||
|
|
||||||
def get_resources_folder() -> str:
|
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')
|
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:
|
def fill_params(params: dict):
|
||||||
"""
|
|
||||||
Render a customized Cloudflare error page.
|
|
||||||
"""
|
|
||||||
params = {**params}
|
|
||||||
if not params.get('time'):
|
if not params.get('time'):
|
||||||
utc_now = datetime.now(timezone.utc)
|
utc_now = datetime.now(timezone.utc)
|
||||||
params['time'] = utc_now.strftime("%Y-%m-%d %H:%M:%S UTC")
|
params['time'] = utc_now.strftime("%Y-%m-%d %H:%M:%S UTC")
|
||||||
if not params.get('ray_id'):
|
if not params.get('ray_id'):
|
||||||
params['ray_id'] = secrets.token_hex(8)
|
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:
|
if not allow_html:
|
||||||
params['what_happened'] = html.escape(params.get('what_happened', ''))
|
params['what_happened'] = html.escape(params.get('what_happened', ''))
|
||||||
params['what_can_i_do'] = html.escape(params.get('what_can_i_do', ''))
|
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)
|
return template.render(params=params, resources_use_cdn=use_cdn)
|
||||||
|
|||||||
@@ -8,12 +8,14 @@
|
|||||||
<head>
|
<head>
|
||||||
{% set error_code = params.error_code or 500 %}
|
{% set error_code = params.error_code or 500 %}
|
||||||
{% set title = params.title or 'Internal server error' %}
|
{% set title = params.title or 'Internal server error' %}
|
||||||
<title>{{ params.html_title or ((error_code | string) + ': ' + title) }}</title>
|
{% set html_title = params.html_title or ((error_code | string) + ': ' + title) %}
|
||||||
|
<title>{{ html_title }}</title>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
|
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
|
||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||||||
|
{% block header %}{% endblock %}
|
||||||
<link rel="stylesheet" id="cf_styles-css" href="{{resources_cdn}}/cdn-cgi/styles/main.css" />
|
<link rel="stylesheet" id="cf_styles-css" href="{{resources_cdn}}/cdn-cgi/styles/main.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ from sqlalchemy.orm import DeclarativeBase
|
|||||||
|
|
||||||
root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../')
|
root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../')
|
||||||
sys.path.append(root_dir)
|
sys.path.append(root_dir)
|
||||||
from cloudflare_error_page import render as render_cf_error_page
|
|
||||||
|
|
||||||
class Base(DeclarativeBase):
|
class Base(DeclarativeBase):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ from flask import (
|
|||||||
send_from_directory,
|
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__)), '../../')
|
root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../')
|
||||||
res_folder = os.path.join(root_dir, 'editor/resources')
|
res_folder = os.path.join(root_dir, 'editor/resources')
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ from flask import (
|
|||||||
redirect,
|
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__)), '../../')
|
root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../')
|
||||||
examples_dir = os.path.join(root_dir, 'examples')
|
examples_dir = os.path.join(root_dir, 'examples')
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
import html
|
||||||
import random
|
import random
|
||||||
import string
|
import string
|
||||||
|
|
||||||
@@ -10,14 +11,38 @@ from flask import (
|
|||||||
jsonify,
|
jsonify,
|
||||||
url_for,
|
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 db
|
||||||
from . import limiter
|
from . import limiter
|
||||||
from . import models
|
from . import models
|
||||||
|
|
||||||
# root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../')
|
# root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../')
|
||||||
# examples_dir = os.path.join(root_dir, 'examples')
|
# 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 %}
|
||||||
|
<meta property="og:type" content="website" />
|
||||||
|
<meta property="og:site_name" content="moe::virt" />
|
||||||
|
<meta property="og:title" content="{{ html_title }}" />
|
||||||
|
<meta property="og:url" content="{{ url }}" />
|
||||||
|
<meta property="og:description" content="{{ description }}" />
|
||||||
|
|
||||||
|
<meta property="twitter:card" content="summary" />
|
||||||
|
<meta property="twitter:site" content="moe::virt" />
|
||||||
|
<meta property="twitter:title" content="{{ html_title }}" />
|
||||||
|
<meta property="twitter:description" content="{{ description }}" />
|
||||||
|
{% endblock %}
|
||||||
|
''')
|
||||||
|
|
||||||
bp = Blueprint('share', __name__, url_prefix='/')
|
bp = Blueprint('share', __name__, url_prefix='/')
|
||||||
|
|
||||||
@@ -68,19 +93,10 @@ def get(name: str):
|
|||||||
})
|
})
|
||||||
else:
|
else:
|
||||||
return abort(404)
|
return abort(404)
|
||||||
params = item.params
|
params: dict = item.params
|
||||||
params = {
|
|
||||||
**params,
|
|
||||||
**get_common_cf_template_params(),
|
|
||||||
}
|
|
||||||
params.pop('time')
|
params.pop('time')
|
||||||
params.pop('ray_id')
|
params.pop('ray_id')
|
||||||
params.pop('client_ip')
|
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:
|
if is_json:
|
||||||
return jsonify({
|
return jsonify({
|
||||||
@@ -88,4 +104,22 @@ def get(name: str):
|
|||||||
'parameters': params,
|
'parameters': params,
|
||||||
})
|
})
|
||||||
else:
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user