diff --git a/CTFd/admin/__init__.py b/CTFd/admin/__init__.py index ae002f37..33d74aea 100644 --- a/CTFd/admin/__init__.py +++ b/CTFd/admin/__init__.py @@ -2,13 +2,14 @@ import hashlib import json import os -from flask import current_app as app, render_template, request, redirect, jsonify, url_for, Blueprint +from flask import current_app as app, render_template, request, redirect, jsonify, url_for, Blueprint, \ + abort, render_template_string from passlib.hash import bcrypt_sha256 from sqlalchemy.sql import not_ from CTFd.utils import admins_only, is_admin, unix_time, get_config, \ set_config, sendmail, rmdir, create_image, delete_image, run_image, container_status, container_ports, \ - container_stop, container_start, get_themes, cache, upload_file + container_stop, container_start, get_themes, cache, upload_file, get_configurable_plugins from CTFd.models import db, Teams, Solves, Awards, Containers, Challenges, WrongKeys, Keys, Tags, Files, Tracking, Pages, Config, DatabaseError from CTFd.scoreboard import get_standings from CTFd.plugins.keys import get_key_class, KEY_CLASSES @@ -33,6 +34,20 @@ def admin_view(): return redirect(url_for('auth.login')) +@admin.route('/admin/plugins/', methods=['GET', 'POST']) +@admins_only +def admin_plugin_config(plugin): + if request.method == 'GET': + if plugin in get_configurable_plugins(): + config = open(os.path.join(app.root_path, 'plugins', plugin, 'config.html')).read() + return render_template('admin/page.html', content=config) + abort(404) + elif request.method == 'POST': + for k, v in request.form.items(): + set_config(k, v) + return '1' + + @admin.route('/admin/config', methods=['GET', 'POST']) @admins_only def admin_config(): @@ -160,4 +175,4 @@ def admin_config(): prevent_name_change=prevent_name_change, verify_emails=verify_emails, view_after_ctf=view_after_ctf, - themes=themes) \ No newline at end of file + themes=themes) diff --git a/CTFd/templates/admin/base.html b/CTFd/templates/admin/base.html index bc7c8bb5..197892c2 100644 --- a/CTFd/templates/admin/base.html +++ b/CTFd/templates/admin/base.html @@ -53,6 +53,14 @@
  • Challenges
  • Statistics
  • Config
  • +
  • + + +
  • diff --git a/CTFd/templates/admin/page.html b/CTFd/templates/admin/page.html new file mode 100644 index 00000000..d22236eb --- /dev/null +++ b/CTFd/templates/admin/page.html @@ -0,0 +1,79 @@ + + + + + Admin Panel + + + + + + + + + + + + + + + {% block stylesheets %} {% endblock %} + + + +
    + + +
    + {{ content | safe }} +
    +
    + + + + {% block scripts %} {% endblock %} + + + diff --git a/CTFd/utils.py b/CTFd/utils.py index dfa32711..7bb17f5c 100644 --- a/CTFd/utils.py +++ b/CTFd/utils.py @@ -100,6 +100,8 @@ def init_utils(app): app.jinja_env.globals.update(ctf_name=ctf_name) app.jinja_env.globals.update(ctf_theme=ctf_theme) app.jinja_env.globals.update(can_create_container=can_create_container) + app.jinja_env.globals.update(get_configurable_plugins=get_configurable_plugins) + app.jinja_env.globals.update(get_config=get_config) @app.context_processor def inject_user(): @@ -300,6 +302,12 @@ def get_themes(): if os.path.isdir(os.path.join(dir, name)) and name != 'admin'] +def get_configurable_plugins(): + dir = os.path.join(app.root_path, 'plugins') + return [name for name in os.listdir(dir) + if os.path.isfile(os.path.join(dir, name, 'config.html'))] + + def upload_file(file, chalid): filename = secure_filename(file.filename)