diff --git a/CTFd/admin/challenges.py b/CTFd/admin/challenges.py index b376681..55de281 100644 --- a/CTFd/admin/challenges.py +++ b/CTFd/admin/challenges.py @@ -1,10 +1,8 @@ -from flask import current_app as app, render_template, request, redirect, jsonify, render_template_string +from flask import current_app as app, render_template, render_template_string, url_for from CTFd.utils.decorators import admins_only -from CTFd.models import db, Teams, Solves, Awards, Challenges, Fails, Flags, Tags, Files, Tracking, Pages, Configs, Hints, Unlocks -from CTFd.plugins.flags import get_flag_class, FLAG_CLASSES -from CTFd.plugins.challenges import get_chal_class, CHALLENGE_CLASSES +from CTFd.models import Solves, Challenges, Flags +from CTFd.plugins.challenges import get_chal_class from CTFd.admin import admin -from CTFd.utils import config, validators, uploads import os @@ -24,15 +22,13 @@ def challenges_detail(challenge_id): flags = Flags.query.filter_by(challenge_id=challenge.id).all() challenge_class = get_chal_class(challenge.type) - static_path = os.path.basename(challenge_class.blueprint.static_url_path) - update_j2 = render_template_string( - challenge_class.blueprint.open_resource( - os.path.join(static_path, 'update.html') - ).read().decode('utf-8'), - # Python 3 - challenge=challenge - ) - update_script = os.path.join(challenge_class.route, 'update.js') + with open(os.path.join(app.root_path, challenge_class.templates['update'].lstrip('/'))) as update: + update_j2 = render_template_string( + update.read().decode('utf-8'), + challenge=challenge + ) + + update_script = url_for('views.static_html', route=challenge_class.scripts['update'].lstrip('/')) return render_template( 'admin/challenges/challenge.html', update_template=update_j2, diff --git a/CTFd/plugins/challenges/__init__.py b/CTFd/plugins/challenges/__init__.py index 513a682..7db8de7 100644 --- a/CTFd/plugins/challenges/__init__.py +++ b/CTFd/plugins/challenges/__init__.py @@ -114,21 +114,21 @@ class CTFdStandardChallenge(BaseChallenge): db.session.commit() @staticmethod - def attempt(chal, request): + def attempt(challenge, request): """ This method is used to check whether a given input is right or wrong. It does not make any changes and should return a boolean for correctness and a string to be shown to the user. It is also in charge of parsing the user's input from the request itself. - :param chal: The Challenge object from the database + :param challenge: The Challenge object from the database :param request: The request the user submitted :return: (boolean, string) """ data = request.form or request.get_json() submission = data['submission'].strip() - chal_keys = Flags.query.filter_by(challenge_id=chal.id).all() - for chal_key in chal_keys: - if get_flag_class(chal_key.type).compare(chal_key, submission): + flags = Flags.query.filter_by(challenge_id=challenge.id).all() + for flag in flags: + if get_flag_class(flag.type).compare(flag, submission): return True, 'Correct' return False, 'Incorrect' diff --git a/CTFd/plugins/challenges/assets/create.html b/CTFd/plugins/challenges/assets/create.html index a65aa22..79c72a9 100644 --- a/CTFd/plugins/challenges/assets/create.html +++ b/CTFd/plugins/challenges/assets/create.html @@ -8,6 +8,7 @@ +
+