diff --git a/CTFd/plugins/__init__.py b/CTFd/plugins/__init__.py index 60559e62..223832cb 100644 --- a/CTFd/plugins/__init__.py +++ b/CTFd/plugins/__init__.py @@ -3,20 +3,19 @@ import importlib import os from collections import namedtuple -from flask.helpers import safe_join from flask import current_app as app, send_file, send_from_directory, abort from CTFd.utils.decorators import admins_only as admins_only_wrapper from CTFd.utils.plugins import ( override_template as utils_override_template, register_script as utils_register_plugin_script, register_stylesheet as utils_register_plugin_stylesheet, + register_admin_script as utils_register_admin_plugin_script, + register_admin_stylesheet as utils_register_admin_plugin_stylesheet ) from CTFd.utils.config.pages import get_pages Menu = namedtuple('Menu', ['title', 'route']) -ADMIN_PLUGIN_MENU_BAR = [] -USER_PAGE_MENU_BAR = [] def register_plugin_assets_directory(app, base_path, admins_only=False): @@ -83,6 +82,26 @@ def register_plugin_stylesheet(*args, **kwargs): utils_register_plugin_stylesheet(*args, **kwargs) +def register_admin_plugin_script(*args, **kwargs): + """ + Adds a given script to the base.html of the admin theme which all admin pages inherit from + :param args: + :param kwargs: + :return: + """ + utils_register_admin_plugin_script(*args, **kwargs) + + +def register_admin_plugin_stylesheet(*args, **kwargs): + """ + Adds a given stylesheet to the base.html of the admin theme which all admin pages inherit from + :param args: + :param kwargs: + :return: + """ + utils_register_admin_plugin_stylesheet(*args, **kwargs) + + def register_admin_plugin_menu_bar(title, route): """ Registers links on the Admin Panel menubar/navbar @@ -92,7 +111,7 @@ def register_admin_plugin_menu_bar(title, route): :return: """ am = Menu(title=title, route=route) - ADMIN_PLUGIN_MENU_BAR.append(am) + app.admin_plugin_menu_bar.append(am) def get_admin_plugin_menu_bar(): @@ -101,7 +120,7 @@ def get_admin_plugin_menu_bar(): :return: Returns a list of Menu namedtuples. They have name, and route attributes. """ - return ADMIN_PLUGIN_MENU_BAR + return app.admin_plugin_menu_bar def register_user_page_menu_bar(title, route): @@ -113,7 +132,7 @@ def register_user_page_menu_bar(title, route): :return: """ p = Menu(title=title, route=route) - USER_PAGE_MENU_BAR.append(p) + app.plugin_menu_bar.append(p) def get_user_page_menu_bar(): @@ -122,7 +141,7 @@ def get_user_page_menu_bar(): :return: Returns a list of Menu namedtuples. They have name, and route attributes. """ - return get_pages() + USER_PAGE_MENU_BAR + return get_pages() + app.plugin_menu_bar def bypass_csrf_protection(f): @@ -146,6 +165,14 @@ def init_plugins(app): :param app: A CTFd application :return: """ + app.admin_plugin_scripts = [] + app.admin_plugin_stylesheets = [] + app.plugin_scripts = [] + app.plugin_stylesheets = [] + + app.admin_plugin_menu_bar = [] + app.plugin_menu_bar = [] + if app.config.get('SAFE_MODE', False) is False: modules = sorted(glob.glob(os.path.dirname(__file__) + "/*")) blacklist = {'__pycache__'} diff --git a/CTFd/themes/admin/templates/base.html b/CTFd/themes/admin/templates/base.html index f06677a8..4d8cd56a 100644 --- a/CTFd/themes/admin/templates/base.html +++ b/CTFd/themes/admin/templates/base.html @@ -25,6 +25,15 @@ var user_mode = "{{ get_config('user_mode') }}"; {% block stylesheets %} {% endblock %} + {% for stylesheet in get_registered_admin_stylesheets() %} + {% if stylesheet.startswith('http') %} + + {% elif request.script_root %} + + {% else %} + + {% endif %} + {% endfor %}
@@ -135,6 +144,16 @@ {% block scripts %} {% endblock %} + + {% for script in get_registered_admin_scripts() %} + {% if script.startswith('http') %} + + {% elif request.script_root %} + + {% else %} + + {% endif %} + {% endfor %}