From b05f6152d3373d4a8360e4f4901f04bca091d5ce Mon Sep 17 00:00:00 2001 From: Kevin Chung Date: Fri, 22 Jul 2016 02:46:14 -0400 Subject: [PATCH] Custom themes (#131) * Adding preliminary custom themes * Fixing Windows compatibility https://github.com/pallets/jinja/issues/411 * Fixing template reloading and adding UI to change themes * Explicitly closing db connections * Themes now have custom static folders * Closes #128 --- .gitignore | 4 +- CTFd/__init__.py | 15 ++++- CTFd/admin.py | 28 +++++++-- CTFd/challenges.py | 36 ++++++++--- CTFd/config.py | 1 + CTFd/models.py | 2 +- .../static/{ => original}/admin/css/style.css | 0 .../{ => original}/admin/js/chalboard.js | 0 .../{ => original}/admin/js/multi-modal.js | 0 CTFd/static/{ => original}/admin/js/team.js | 0 CTFd/static/{ => original}/css/style.css | 0 .../css/vendor/bootstrap.min.css | 0 .../css/vendor/codemirror.min.css | 0 .../css/vendor/font-awesome/HELP-US-OUT.txt | 0 .../vendor/font-awesome/css/font-awesome.css | 0 .../font-awesome/css/font-awesome.min.css | 0 .../vendor/font-awesome/fonts/FontAwesome.otf | Bin .../fonts/fontawesome-webfont.eot | Bin .../fonts/fontawesome-webfont.svg | 0 .../fonts/fontawesome-webfont.ttf | Bin .../fonts/fontawesome-webfont.woff | Bin .../fonts/fontawesome-webfont.woff2 | Bin .../vendor/font-awesome/less/animated.less | 0 .../font-awesome/less/bordered-pulled.less | 0 .../css/vendor/font-awesome/less/core.less | 0 .../vendor/font-awesome/less/fixed-width.less | 0 .../font-awesome/less/font-awesome.less | 0 .../css/vendor/font-awesome/less/icons.less | 0 .../css/vendor/font-awesome/less/larger.less | 0 .../css/vendor/font-awesome/less/list.less | 0 .../css/vendor/font-awesome/less/mixins.less | 0 .../css/vendor/font-awesome/less/path.less | 0 .../font-awesome/less/rotated-flipped.less | 0 .../css/vendor/font-awesome/less/stacked.less | 0 .../vendor/font-awesome/less/variables.less | 0 .../vendor/font-awesome/scss/_animated.scss | 0 .../font-awesome/scss/_bordered-pulled.scss | 0 .../css/vendor/font-awesome/scss/_core.scss | 0 .../font-awesome/scss/_fixed-width.scss | 0 .../css/vendor/font-awesome/scss/_icons.scss | 0 .../css/vendor/font-awesome/scss/_larger.scss | 0 .../css/vendor/font-awesome/scss/_list.scss | 0 .../css/vendor/font-awesome/scss/_mixins.scss | 0 .../css/vendor/font-awesome/scss/_path.scss | 0 .../font-awesome/scss/_rotated-flipped.scss | 0 .../vendor/font-awesome/scss/_stacked.scss | 0 .../vendor/font-awesome/scss/_variables.scss | 0 .../font-awesome/scss/font-awesome.scss | 0 .../static/{ => original}/css/vendor/lato.css | 0 .../{ => original}/css/vendor/raleway.css | 0 .../fonts/lato/lato-v11-latin-regular.eot | Bin .../fonts/lato/lato-v11-latin-regular.svg | 0 .../fonts/lato/lato-v11-latin-regular.ttf | Bin .../fonts/lato/lato-v11-latin-regular.woff | Bin .../fonts/lato/lato-v11-latin-regular.woff2 | Bin .../fonts/raleway/raleway-v10-latin-500.eot | Bin .../fonts/raleway/raleway-v10-latin-500.svg | 0 .../fonts/raleway/raleway-v10-latin-500.ttf | Bin .../fonts/raleway/raleway-v10-latin-500.woff | Bin .../fonts/raleway/raleway-v10-latin-500.woff2 | Bin CTFd/static/{ => original}/img/ctfd.ai | 0 CTFd/static/{ => original}/img/ctfd.svg | 0 .../{ => original}/img/ctfd_transfer.svg | 0 CTFd/static/{ => original}/img/favicon.ico | Bin CTFd/static/{ => original}/img/logo.png | Bin CTFd/static/{ => original}/img/logo_old.png | Bin CTFd/static/{ => original}/js/chalboard.js | 57 ++++++++++++------ CTFd/static/{ => original}/js/scoreboard.js | 0 CTFd/static/{ => original}/js/style.js | 0 CTFd/static/{ => original}/js/team.js | 0 CTFd/static/{ => original}/js/utils.js | 0 .../{ => original}/js/vendor/bootstrap.min.js | 0 .../js/vendor/codemirror.min.js | 0 .../{ => original}/js/vendor/jquery.min.js | 0 .../{ => original}/js/vendor/marked.min.js | 0 .../{ => original}/js/vendor/moment.min.js | 0 .../{ => original}/js/vendor/plotly.min.js | 0 CTFd/templates/{ => original}/admin/base.html | 24 ++++---- .../templates/{ => original}/admin/chals.html | 6 +- .../{ => original}/admin/config.html | 10 +++ .../{ => original}/admin/containers.html | 0 .../{ => original}/admin/correct_keys.html | 4 +- .../{ => original}/admin/editor.html | 4 +- .../{ => original}/admin/graphs.html | 2 +- .../templates/{ => original}/admin/pages.html | 4 +- .../{ => original}/admin/scoreboard.html | 0 .../{ => original}/admin/statistics.html | 0 CTFd/templates/{ => original}/admin/team.html | 8 +-- .../templates/{ => original}/admin/teams.html | 0 .../{ => original}/admin/wrong_keys.html | 4 +- CTFd/templates/{ => original}/base.html | 22 +++---- CTFd/templates/{ => original}/chals.html | 24 +++----- CTFd/templates/{ => original}/confirm.html | 2 +- CTFd/templates/{ => original}/errors/403.html | 0 CTFd/templates/{ => original}/errors/404.html | 0 CTFd/templates/{ => original}/errors/500.html | 0 CTFd/templates/{ => original}/errors/502.html | 0 CTFd/templates/{ => original}/login.html | 2 +- CTFd/templates/{ => original}/profile.html | 2 +- CTFd/templates/{ => original}/register.html | 2 +- .../{ => original}/reset_password.html | 2 +- CTFd/templates/{ => original}/scoreboard.html | 6 +- CTFd/templates/{ => original}/setup.html | 2 +- CTFd/templates/{ => original}/team.html | 6 +- CTFd/templates/{ => original}/teams.html | 0 CTFd/utils.py | 16 +++++ CTFd/views.py | 3 +- 107 files changed, 195 insertions(+), 103 deletions(-) rename CTFd/static/{ => original}/admin/css/style.css (100%) rename CTFd/static/{ => original}/admin/js/chalboard.js (100%) rename CTFd/static/{ => original}/admin/js/multi-modal.js (100%) rename CTFd/static/{ => original}/admin/js/team.js (100%) rename CTFd/static/{ => original}/css/style.css (100%) rename CTFd/static/{ => original}/css/vendor/bootstrap.min.css (100%) rename CTFd/static/{ => original}/css/vendor/codemirror.min.css (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/HELP-US-OUT.txt (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/css/font-awesome.css (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/css/font-awesome.min.css (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/fonts/FontAwesome.otf (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/fonts/fontawesome-webfont.eot (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/fonts/fontawesome-webfont.svg (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/fonts/fontawesome-webfont.ttf (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/fonts/fontawesome-webfont.woff (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/fonts/fontawesome-webfont.woff2 (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/less/animated.less (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/less/bordered-pulled.less (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/less/core.less (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/less/fixed-width.less (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/less/font-awesome.less (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/less/icons.less (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/less/larger.less (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/less/list.less (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/less/mixins.less (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/less/path.less (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/less/rotated-flipped.less (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/less/stacked.less (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/less/variables.less (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/scss/_animated.scss (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/scss/_bordered-pulled.scss (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/scss/_core.scss (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/scss/_fixed-width.scss (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/scss/_icons.scss (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/scss/_larger.scss (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/scss/_list.scss (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/scss/_mixins.scss (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/scss/_path.scss (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/scss/_rotated-flipped.scss (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/scss/_stacked.scss (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/scss/_variables.scss (100%) rename CTFd/static/{ => original}/css/vendor/font-awesome/scss/font-awesome.scss (100%) rename CTFd/static/{ => original}/css/vendor/lato.css (100%) rename CTFd/static/{ => original}/css/vendor/raleway.css (100%) rename CTFd/static/{ => original}/fonts/lato/lato-v11-latin-regular.eot (100%) rename CTFd/static/{ => original}/fonts/lato/lato-v11-latin-regular.svg (100%) rename CTFd/static/{ => original}/fonts/lato/lato-v11-latin-regular.ttf (100%) rename CTFd/static/{ => original}/fonts/lato/lato-v11-latin-regular.woff (100%) rename CTFd/static/{ => original}/fonts/lato/lato-v11-latin-regular.woff2 (100%) rename CTFd/static/{ => original}/fonts/raleway/raleway-v10-latin-500.eot (100%) rename CTFd/static/{ => original}/fonts/raleway/raleway-v10-latin-500.svg (100%) rename CTFd/static/{ => original}/fonts/raleway/raleway-v10-latin-500.ttf (100%) rename CTFd/static/{ => original}/fonts/raleway/raleway-v10-latin-500.woff (100%) rename CTFd/static/{ => original}/fonts/raleway/raleway-v10-latin-500.woff2 (100%) rename CTFd/static/{ => original}/img/ctfd.ai (100%) rename CTFd/static/{ => original}/img/ctfd.svg (100%) rename CTFd/static/{ => original}/img/ctfd_transfer.svg (100%) rename CTFd/static/{ => original}/img/favicon.ico (100%) rename CTFd/static/{ => original}/img/logo.png (100%) rename CTFd/static/{ => original}/img/logo_old.png (100%) rename CTFd/static/{ => original}/js/chalboard.js (82%) rename CTFd/static/{ => original}/js/scoreboard.js (100%) rename CTFd/static/{ => original}/js/style.js (100%) rename CTFd/static/{ => original}/js/team.js (100%) rename CTFd/static/{ => original}/js/utils.js (100%) rename CTFd/static/{ => original}/js/vendor/bootstrap.min.js (100%) rename CTFd/static/{ => original}/js/vendor/codemirror.min.js (100%) rename CTFd/static/{ => original}/js/vendor/jquery.min.js (100%) rename CTFd/static/{ => original}/js/vendor/marked.min.js (100%) rename CTFd/static/{ => original}/js/vendor/moment.min.js (100%) rename CTFd/static/{ => original}/js/vendor/plotly.min.js (100%) rename CTFd/templates/{ => original}/admin/base.html (67%) rename CTFd/templates/{ => original}/admin/chals.html (98%) rename CTFd/templates/{ => original}/admin/config.html (97%) rename CTFd/templates/{ => original}/admin/containers.html (100%) rename CTFd/templates/{ => original}/admin/correct_keys.html (95%) rename CTFd/templates/{ => original}/admin/editor.html (91%) rename CTFd/templates/{ => original}/admin/graphs.html (97%) rename CTFd/templates/{ => original}/admin/pages.html (95%) rename CTFd/templates/{ => original}/admin/scoreboard.html (100%) rename CTFd/templates/{ => original}/admin/statistics.html (100%) rename CTFd/templates/{ => original}/admin/team.html (97%) rename CTFd/templates/{ => original}/admin/teams.html (100%) rename CTFd/templates/{ => original}/admin/wrong_keys.html (96%) rename CTFd/templates/{ => original}/base.html (72%) rename CTFd/templates/{ => original}/chals.html (83%) rename CTFd/templates/{ => original}/confirm.html (93%) rename CTFd/templates/{ => original}/errors/403.html (100%) rename CTFd/templates/{ => original}/errors/404.html (100%) rename CTFd/templates/{ => original}/errors/500.html (100%) rename CTFd/templates/{ => original}/errors/502.html (100%) rename CTFd/templates/{ => original}/login.html (96%) rename CTFd/templates/{ => original}/profile.html (98%) rename CTFd/templates/{ => original}/register.html (97%) rename CTFd/templates/{ => original}/reset_password.html (96%) rename CTFd/templates/{ => original}/scoreboard.html (74%) rename CTFd/templates/{ => original}/setup.html (96%) rename CTFd/templates/{ => original}/team.html (90%) rename CTFd/templates/{ => original}/teams.html (100%) diff --git a/.gitignore b/.gitignore index e296571f..bdb045ec 100644 --- a/.gitignore +++ b/.gitignore @@ -53,8 +53,10 @@ docs/_build/ # PyBuilder target/ +.DS_Store + *.db *.log .idea/ CTFd/static/uploads -.ctfd_secret_key \ No newline at end of file +.ctfd_secret_key diff --git a/CTFd/__init__.py b/CTFd/__init__.py index ceee401d..fcfd4aa2 100644 --- a/CTFd/__init__.py +++ b/CTFd/__init__.py @@ -3,14 +3,24 @@ from flask_sqlalchemy import SQLAlchemy from logging.handlers import RotatingFileHandler from flask_session import Session from sqlalchemy_utils import database_exists, create_database +from jinja2 import FileSystemLoader, TemplateNotFound +from utils import get_config, set_config import os import sqlalchemy +class ThemeLoader(FileSystemLoader): + def get_source(self, environment, template): + theme = get_config('ctf_theme') + template = "/".join([theme, template]) + return super(ThemeLoader, self).get_source(environment, template) + + def create_app(config='CTFd.config'): - app = Flask("CTFd") + app = Flask(__name__) with app.app_context(): app.config.from_object(config) + app.jinja_loader = ThemeLoader(os.path.join(app.root_path, app.template_folder), followlinks=True) from CTFd.models import db, Teams, Solves, Challenges, WrongKeys, Keys, Tags, Files, Tracking @@ -23,6 +33,9 @@ def create_app(config='CTFd.config'): app.db = db + if not get_config('ctf_theme'): + set_config('ctf_theme', 'original') + #Session(app) from CTFd.views import views diff --git a/CTFd/admin.py b/CTFd/admin.py index 091ddf00..4cd71c91 100644 --- a/CTFd/admin.py +++ b/CTFd/admin.py @@ -1,5 +1,7 @@ from flask import render_template, request, redirect, abort, jsonify, url_for, session, Blueprint -from CTFd.utils import sha512, is_safe_url, authed, admins_only, is_admin, unix_time, unix_time_millis, get_config, set_config, sendmail, rmdir, create_image, delete_image, run_image, container_status, container_ports, container_stop, container_start +from CTFd.utils import sha512, is_safe_url, authed, admins_only, is_admin, unix_time, unix_time_millis, get_config, \ + set_config, sendmail, rmdir, create_image, delete_image, run_image, container_status, container_ports, \ + container_stop, container_start, get_themes 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 itsdangerous import TimedSerializer, BadTimeSignature @@ -85,6 +87,7 @@ def admin_config(): mail_password = set_config("mail_password", request.form.get('mail_password', None)) ctf_name = set_config("ctf_name", request.form.get('ctf_name', None)) + ctf_theme = set_config("ctf_theme", request.form.get('ctf_theme', None)) mg_base_url = set_config("mg_base_url", request.form.get('mg_base_url', None)) mg_api_key = set_config("mg_api_key", request.form.get('mg_api_key', None)) @@ -101,9 +104,11 @@ def admin_config(): db.session.add(db_end) db.session.commit() + db.session.close() return redirect(url_for('admin.admin_config')) ctf_name = get_config('ctf_name') + ctf_theme = get_config('ctf_theme') max_tries = get_config('max_tries') mail_server = get_config('mail_server') @@ -150,8 +155,12 @@ def admin_config(): end = datetime.datetime.fromtimestamp(float(end)) end_days = calendar.monthrange(end.year, end.month)[1] + themes = get_themes() + themes.remove(ctf_theme) + return render_template('admin/config.html', ctf_name=ctf_name, + ctf_theme_config=ctf_theme, start=start, end=end, max_tries=max_tries, @@ -172,7 +181,8 @@ def admin_config(): months=months, curr_year=curr_year, start_days=start_days, - end_days=end_days) + end_days=end_days, + themes=themes) @admin.route('/admin/css', methods=['GET', 'POST']) @@ -208,10 +218,12 @@ def admin_pages(route): page.route = route page.html = html db.session.commit() + db.session.close() return redirect(url_for('admin.admin_pages')) page = Pages(route, html) db.session.add(page) db.session.commit() + db.session.close() return redirect(url_for('admin.admin_pages')) pages = Pages.query.all() return render_template('admin/pages.html', routes=pages, css=get_config('css')) @@ -223,6 +235,7 @@ def delete_page(pageroute): page = Pages.query.filter_by(route=pageroute).first() db.session.delete(page) db.session.commit() + db.session.close() return '1' @@ -516,6 +529,7 @@ def ban(teamid): user = Teams.query.filter_by(id=teamid).first() user.banned = True db.session.commit() + db.session.close() return redirect(url_for('admin.admin_scoreboard')) @@ -525,6 +539,7 @@ def unban(teamid): user = Teams.query.filter_by(id=teamid).first() user.banned = False db.session.commit() + db.session.close() return redirect(url_for('admin.admin_scoreboard')) @@ -537,6 +552,7 @@ def delete_team(teamid): Tracking.query.filter_by(team=teamid).delete() Teams.query.filter_by(id=teamid).delete() db.session.commit() + db.session.close() except DatabaseError: return '0' else: @@ -603,6 +619,7 @@ def create_award(): award.category = request.form.get('category') db.session.add(award) db.session.commit() + db.session.close() return "1" except Exception as e: print e @@ -616,6 +633,7 @@ def delete_award(award_id): award = Awards.query.filter_by(id=award_id).first() db.session.delete(award) db.session.commit() + db.session.close() return '1' except Exception as e: print e @@ -693,14 +711,13 @@ def delete_wrong_key(teamid, chalid): wrong_key = WrongKeys.query.filter_by(teamid=teamid, chalid=chalid).first() db.session.delete(wrong_key) db.session.commit() + db.session.close() return '1' @admin.route('/admin/statistics', methods=['GET']) @admins_only def admin_stats(): - db.session.commit() - teams_registered = db.session.query(db.func.count(Teams.id)).first()[0] wrong_count = db.session.query(db.func.count(WrongKeys.id)).first()[0] solve_count = db.session.query(db.func.count(Solves.id)).first()[0] @@ -716,7 +733,8 @@ def admin_stats(): least_solved_chal = Challenges.query.add_columns(solves_cnt) \ .outerjoin(solves_sub, solves_sub.columns.chalid == Challenges.id) \ .order_by(solves_cnt.asc()).first() - + + db.session.commit() db.session.close() return render_template('admin/statistics.html', team_count=teams_registered, diff --git a/CTFd/challenges.py b/CTFd/challenges.py index 8a0a75e8..7b0ad387 100644 --- a/CTFd/challenges.py +++ b/CTFd/challenges.py @@ -146,10 +146,6 @@ def chal(chalid): data = (time.strftime("%m/%d/%Y %X"), session['username'].encode('utf-8'), request.form['key'].encode('utf-8'), get_kpm(session['id'])) print("[{0}] {1} submitted {2} with kpm {3}".format(*data)) - # Hit max attempts - if fails >= int(get_config("max_tries")) and int(get_config("max_tries")) > 0: - return "4" #too many tries on this challenge - # Anti-bruteforce / submitting keys too quickly if get_kpm(session['id']) > 10: wrong = WrongKeys(session['id'], chalid, request.form['key']) @@ -157,7 +153,8 @@ def chal(chalid): db.session.commit() db.session.close() logger.warn("[{0}] {1} submitted {2} with kpm {3} [TOO FAST]".format(*data)) - return "3" # Submitting too fast + # return "3" # Submitting too fast + return jsonify({'status': '3', 'message': "You're submitting keys too fast. Slow down."}) solves = Solves.query.filter_by(teamid=session['id'], chalid=chalid).first() @@ -166,6 +163,15 @@ def chal(chalid): chal = Challenges.query.filter_by(id=chalid).first() key = str(request.form['key'].strip().lower()) keys = json.loads(chal.flags) + + # Hit max attempts + max_tries = int(get_config("max_tries")) + if fails >= max_tries > 0: + return jsonify({ + 'status': '0', + 'message': "You have 0 tries remaining" + }) + for x in keys: if x['type'] == 0: #static key print(x['flag'], key.strip().lower()) @@ -175,7 +181,8 @@ def chal(chalid): db.session.commit() db.session.close() logger.info("[{0}] {1} submitted {2} with kpm {3} [CORRECT]".format(*data)) - return "1" # key was correct + # return "1" # key was correct + return jsonify({'status':'1', 'message':'Correct'}) elif x['type'] == 1: #regex res = re.match(str(x['flag']), key, re.IGNORECASE) if res and res.group() == key: @@ -184,18 +191,29 @@ def chal(chalid): db.session.commit() db.session.close() logger.info("[{0}] {1} submitted {2} with kpm {3} [CORRECT]".format(*data)) - return "1" # key was correct + # return "1" # key was correct + return jsonify({'status': '1', 'message': 'Correct'}) wrong = WrongKeys(session['id'], chalid, request.form['key']) db.session.add(wrong) db.session.commit() db.session.close() logger.info("[{0}] {1} submitted {2} with kpm {3} [WRONG]".format(*data)) - return '0' # key was wrong + # return '0' # key was wrong + if max_tries: + attempts_left = max_tries - fails + tries_str = 'tries' + if attempts_left == 1: + tries_str = 'try' + return jsonify({'status': '0', 'message': 'Incorrect. You have {} {} remaining.'.format(attempts_left, tries_str)}) + else: + return jsonify({'status': '0', 'message': 'Incorrect'}) + # Challenge already solved else: logger.info("{0} submitted {1} with kpm {2} [ALREADY SOLVED]".format(*data)) - return "2" # challenge was already solved + # return "2" # challenge was already solved + return jsonify({'status': '2', 'message': 'You already solved this'}) else: return "-1" diff --git a/CTFd/config.py b/CTFd/config.py index f2e580ea..31a5770f 100644 --- a/CTFd/config.py +++ b/CTFd/config.py @@ -19,6 +19,7 @@ SESSION_COOKIE_HTTPONLY = True PERMANENT_SESSION_LIFETIME = 604800 # 7 days in seconds HOST = ".ctfd.io" UPLOAD_FOLDER = os.path.normpath('static/uploads') +TEMPLATES_AUTO_RELOAD = True TRUSTED_PROXIES = [ '^127\.0\.0\.1$', ## Remove the following proxies if you do not trust the local network diff --git a/CTFd/models.py b/CTFd/models.py index 1b15e309..b7a049e2 100644 --- a/CTFd/models.py +++ b/CTFd/models.py @@ -39,7 +39,7 @@ class Pages(db.Model): self.html = html def __repr__(self): - return "".format(self.tag, self.chal) + return "".format(self.tag, self.chal) class Containers(db.Model): diff --git a/CTFd/static/admin/css/style.css b/CTFd/static/original/admin/css/style.css similarity index 100% rename from CTFd/static/admin/css/style.css rename to CTFd/static/original/admin/css/style.css diff --git a/CTFd/static/admin/js/chalboard.js b/CTFd/static/original/admin/js/chalboard.js similarity index 100% rename from CTFd/static/admin/js/chalboard.js rename to CTFd/static/original/admin/js/chalboard.js diff --git a/CTFd/static/admin/js/multi-modal.js b/CTFd/static/original/admin/js/multi-modal.js similarity index 100% rename from CTFd/static/admin/js/multi-modal.js rename to CTFd/static/original/admin/js/multi-modal.js diff --git a/CTFd/static/admin/js/team.js b/CTFd/static/original/admin/js/team.js similarity index 100% rename from CTFd/static/admin/js/team.js rename to CTFd/static/original/admin/js/team.js diff --git a/CTFd/static/css/style.css b/CTFd/static/original/css/style.css similarity index 100% rename from CTFd/static/css/style.css rename to CTFd/static/original/css/style.css diff --git a/CTFd/static/css/vendor/bootstrap.min.css b/CTFd/static/original/css/vendor/bootstrap.min.css similarity index 100% rename from CTFd/static/css/vendor/bootstrap.min.css rename to CTFd/static/original/css/vendor/bootstrap.min.css diff --git a/CTFd/static/css/vendor/codemirror.min.css b/CTFd/static/original/css/vendor/codemirror.min.css similarity index 100% rename from CTFd/static/css/vendor/codemirror.min.css rename to CTFd/static/original/css/vendor/codemirror.min.css diff --git a/CTFd/static/css/vendor/font-awesome/HELP-US-OUT.txt b/CTFd/static/original/css/vendor/font-awesome/HELP-US-OUT.txt similarity index 100% rename from CTFd/static/css/vendor/font-awesome/HELP-US-OUT.txt rename to CTFd/static/original/css/vendor/font-awesome/HELP-US-OUT.txt diff --git a/CTFd/static/css/vendor/font-awesome/css/font-awesome.css b/CTFd/static/original/css/vendor/font-awesome/css/font-awesome.css similarity index 100% rename from CTFd/static/css/vendor/font-awesome/css/font-awesome.css rename to CTFd/static/original/css/vendor/font-awesome/css/font-awesome.css diff --git a/CTFd/static/css/vendor/font-awesome/css/font-awesome.min.css b/CTFd/static/original/css/vendor/font-awesome/css/font-awesome.min.css similarity index 100% rename from CTFd/static/css/vendor/font-awesome/css/font-awesome.min.css rename to CTFd/static/original/css/vendor/font-awesome/css/font-awesome.min.css diff --git a/CTFd/static/css/vendor/font-awesome/fonts/FontAwesome.otf b/CTFd/static/original/css/vendor/font-awesome/fonts/FontAwesome.otf similarity index 100% rename from CTFd/static/css/vendor/font-awesome/fonts/FontAwesome.otf rename to CTFd/static/original/css/vendor/font-awesome/fonts/FontAwesome.otf diff --git a/CTFd/static/css/vendor/font-awesome/fonts/fontawesome-webfont.eot b/CTFd/static/original/css/vendor/font-awesome/fonts/fontawesome-webfont.eot similarity index 100% rename from CTFd/static/css/vendor/font-awesome/fonts/fontawesome-webfont.eot rename to CTFd/static/original/css/vendor/font-awesome/fonts/fontawesome-webfont.eot diff --git a/CTFd/static/css/vendor/font-awesome/fonts/fontawesome-webfont.svg b/CTFd/static/original/css/vendor/font-awesome/fonts/fontawesome-webfont.svg similarity index 100% rename from CTFd/static/css/vendor/font-awesome/fonts/fontawesome-webfont.svg rename to CTFd/static/original/css/vendor/font-awesome/fonts/fontawesome-webfont.svg diff --git a/CTFd/static/css/vendor/font-awesome/fonts/fontawesome-webfont.ttf b/CTFd/static/original/css/vendor/font-awesome/fonts/fontawesome-webfont.ttf similarity index 100% rename from CTFd/static/css/vendor/font-awesome/fonts/fontawesome-webfont.ttf rename to CTFd/static/original/css/vendor/font-awesome/fonts/fontawesome-webfont.ttf diff --git a/CTFd/static/css/vendor/font-awesome/fonts/fontawesome-webfont.woff b/CTFd/static/original/css/vendor/font-awesome/fonts/fontawesome-webfont.woff similarity index 100% rename from CTFd/static/css/vendor/font-awesome/fonts/fontawesome-webfont.woff rename to CTFd/static/original/css/vendor/font-awesome/fonts/fontawesome-webfont.woff diff --git a/CTFd/static/css/vendor/font-awesome/fonts/fontawesome-webfont.woff2 b/CTFd/static/original/css/vendor/font-awesome/fonts/fontawesome-webfont.woff2 similarity index 100% rename from CTFd/static/css/vendor/font-awesome/fonts/fontawesome-webfont.woff2 rename to CTFd/static/original/css/vendor/font-awesome/fonts/fontawesome-webfont.woff2 diff --git a/CTFd/static/css/vendor/font-awesome/less/animated.less b/CTFd/static/original/css/vendor/font-awesome/less/animated.less similarity index 100% rename from CTFd/static/css/vendor/font-awesome/less/animated.less rename to CTFd/static/original/css/vendor/font-awesome/less/animated.less diff --git a/CTFd/static/css/vendor/font-awesome/less/bordered-pulled.less b/CTFd/static/original/css/vendor/font-awesome/less/bordered-pulled.less similarity index 100% rename from CTFd/static/css/vendor/font-awesome/less/bordered-pulled.less rename to CTFd/static/original/css/vendor/font-awesome/less/bordered-pulled.less diff --git a/CTFd/static/css/vendor/font-awesome/less/core.less b/CTFd/static/original/css/vendor/font-awesome/less/core.less similarity index 100% rename from CTFd/static/css/vendor/font-awesome/less/core.less rename to CTFd/static/original/css/vendor/font-awesome/less/core.less diff --git a/CTFd/static/css/vendor/font-awesome/less/fixed-width.less b/CTFd/static/original/css/vendor/font-awesome/less/fixed-width.less similarity index 100% rename from CTFd/static/css/vendor/font-awesome/less/fixed-width.less rename to CTFd/static/original/css/vendor/font-awesome/less/fixed-width.less diff --git a/CTFd/static/css/vendor/font-awesome/less/font-awesome.less b/CTFd/static/original/css/vendor/font-awesome/less/font-awesome.less similarity index 100% rename from CTFd/static/css/vendor/font-awesome/less/font-awesome.less rename to CTFd/static/original/css/vendor/font-awesome/less/font-awesome.less diff --git a/CTFd/static/css/vendor/font-awesome/less/icons.less b/CTFd/static/original/css/vendor/font-awesome/less/icons.less similarity index 100% rename from CTFd/static/css/vendor/font-awesome/less/icons.less rename to CTFd/static/original/css/vendor/font-awesome/less/icons.less diff --git a/CTFd/static/css/vendor/font-awesome/less/larger.less b/CTFd/static/original/css/vendor/font-awesome/less/larger.less similarity index 100% rename from CTFd/static/css/vendor/font-awesome/less/larger.less rename to CTFd/static/original/css/vendor/font-awesome/less/larger.less diff --git a/CTFd/static/css/vendor/font-awesome/less/list.less b/CTFd/static/original/css/vendor/font-awesome/less/list.less similarity index 100% rename from CTFd/static/css/vendor/font-awesome/less/list.less rename to CTFd/static/original/css/vendor/font-awesome/less/list.less diff --git a/CTFd/static/css/vendor/font-awesome/less/mixins.less b/CTFd/static/original/css/vendor/font-awesome/less/mixins.less similarity index 100% rename from CTFd/static/css/vendor/font-awesome/less/mixins.less rename to CTFd/static/original/css/vendor/font-awesome/less/mixins.less diff --git a/CTFd/static/css/vendor/font-awesome/less/path.less b/CTFd/static/original/css/vendor/font-awesome/less/path.less similarity index 100% rename from CTFd/static/css/vendor/font-awesome/less/path.less rename to CTFd/static/original/css/vendor/font-awesome/less/path.less diff --git a/CTFd/static/css/vendor/font-awesome/less/rotated-flipped.less b/CTFd/static/original/css/vendor/font-awesome/less/rotated-flipped.less similarity index 100% rename from CTFd/static/css/vendor/font-awesome/less/rotated-flipped.less rename to CTFd/static/original/css/vendor/font-awesome/less/rotated-flipped.less diff --git a/CTFd/static/css/vendor/font-awesome/less/stacked.less b/CTFd/static/original/css/vendor/font-awesome/less/stacked.less similarity index 100% rename from CTFd/static/css/vendor/font-awesome/less/stacked.less rename to CTFd/static/original/css/vendor/font-awesome/less/stacked.less diff --git a/CTFd/static/css/vendor/font-awesome/less/variables.less b/CTFd/static/original/css/vendor/font-awesome/less/variables.less similarity index 100% rename from CTFd/static/css/vendor/font-awesome/less/variables.less rename to CTFd/static/original/css/vendor/font-awesome/less/variables.less diff --git a/CTFd/static/css/vendor/font-awesome/scss/_animated.scss b/CTFd/static/original/css/vendor/font-awesome/scss/_animated.scss similarity index 100% rename from CTFd/static/css/vendor/font-awesome/scss/_animated.scss rename to CTFd/static/original/css/vendor/font-awesome/scss/_animated.scss diff --git a/CTFd/static/css/vendor/font-awesome/scss/_bordered-pulled.scss b/CTFd/static/original/css/vendor/font-awesome/scss/_bordered-pulled.scss similarity index 100% rename from CTFd/static/css/vendor/font-awesome/scss/_bordered-pulled.scss rename to CTFd/static/original/css/vendor/font-awesome/scss/_bordered-pulled.scss diff --git a/CTFd/static/css/vendor/font-awesome/scss/_core.scss b/CTFd/static/original/css/vendor/font-awesome/scss/_core.scss similarity index 100% rename from CTFd/static/css/vendor/font-awesome/scss/_core.scss rename to CTFd/static/original/css/vendor/font-awesome/scss/_core.scss diff --git a/CTFd/static/css/vendor/font-awesome/scss/_fixed-width.scss b/CTFd/static/original/css/vendor/font-awesome/scss/_fixed-width.scss similarity index 100% rename from CTFd/static/css/vendor/font-awesome/scss/_fixed-width.scss rename to CTFd/static/original/css/vendor/font-awesome/scss/_fixed-width.scss diff --git a/CTFd/static/css/vendor/font-awesome/scss/_icons.scss b/CTFd/static/original/css/vendor/font-awesome/scss/_icons.scss similarity index 100% rename from CTFd/static/css/vendor/font-awesome/scss/_icons.scss rename to CTFd/static/original/css/vendor/font-awesome/scss/_icons.scss diff --git a/CTFd/static/css/vendor/font-awesome/scss/_larger.scss b/CTFd/static/original/css/vendor/font-awesome/scss/_larger.scss similarity index 100% rename from CTFd/static/css/vendor/font-awesome/scss/_larger.scss rename to CTFd/static/original/css/vendor/font-awesome/scss/_larger.scss diff --git a/CTFd/static/css/vendor/font-awesome/scss/_list.scss b/CTFd/static/original/css/vendor/font-awesome/scss/_list.scss similarity index 100% rename from CTFd/static/css/vendor/font-awesome/scss/_list.scss rename to CTFd/static/original/css/vendor/font-awesome/scss/_list.scss diff --git a/CTFd/static/css/vendor/font-awesome/scss/_mixins.scss b/CTFd/static/original/css/vendor/font-awesome/scss/_mixins.scss similarity index 100% rename from CTFd/static/css/vendor/font-awesome/scss/_mixins.scss rename to CTFd/static/original/css/vendor/font-awesome/scss/_mixins.scss diff --git a/CTFd/static/css/vendor/font-awesome/scss/_path.scss b/CTFd/static/original/css/vendor/font-awesome/scss/_path.scss similarity index 100% rename from CTFd/static/css/vendor/font-awesome/scss/_path.scss rename to CTFd/static/original/css/vendor/font-awesome/scss/_path.scss diff --git a/CTFd/static/css/vendor/font-awesome/scss/_rotated-flipped.scss b/CTFd/static/original/css/vendor/font-awesome/scss/_rotated-flipped.scss similarity index 100% rename from CTFd/static/css/vendor/font-awesome/scss/_rotated-flipped.scss rename to CTFd/static/original/css/vendor/font-awesome/scss/_rotated-flipped.scss diff --git a/CTFd/static/css/vendor/font-awesome/scss/_stacked.scss b/CTFd/static/original/css/vendor/font-awesome/scss/_stacked.scss similarity index 100% rename from CTFd/static/css/vendor/font-awesome/scss/_stacked.scss rename to CTFd/static/original/css/vendor/font-awesome/scss/_stacked.scss diff --git a/CTFd/static/css/vendor/font-awesome/scss/_variables.scss b/CTFd/static/original/css/vendor/font-awesome/scss/_variables.scss similarity index 100% rename from CTFd/static/css/vendor/font-awesome/scss/_variables.scss rename to CTFd/static/original/css/vendor/font-awesome/scss/_variables.scss diff --git a/CTFd/static/css/vendor/font-awesome/scss/font-awesome.scss b/CTFd/static/original/css/vendor/font-awesome/scss/font-awesome.scss similarity index 100% rename from CTFd/static/css/vendor/font-awesome/scss/font-awesome.scss rename to CTFd/static/original/css/vendor/font-awesome/scss/font-awesome.scss diff --git a/CTFd/static/css/vendor/lato.css b/CTFd/static/original/css/vendor/lato.css similarity index 100% rename from CTFd/static/css/vendor/lato.css rename to CTFd/static/original/css/vendor/lato.css diff --git a/CTFd/static/css/vendor/raleway.css b/CTFd/static/original/css/vendor/raleway.css similarity index 100% rename from CTFd/static/css/vendor/raleway.css rename to CTFd/static/original/css/vendor/raleway.css diff --git a/CTFd/static/fonts/lato/lato-v11-latin-regular.eot b/CTFd/static/original/fonts/lato/lato-v11-latin-regular.eot similarity index 100% rename from CTFd/static/fonts/lato/lato-v11-latin-regular.eot rename to CTFd/static/original/fonts/lato/lato-v11-latin-regular.eot diff --git a/CTFd/static/fonts/lato/lato-v11-latin-regular.svg b/CTFd/static/original/fonts/lato/lato-v11-latin-regular.svg similarity index 100% rename from CTFd/static/fonts/lato/lato-v11-latin-regular.svg rename to CTFd/static/original/fonts/lato/lato-v11-latin-regular.svg diff --git a/CTFd/static/fonts/lato/lato-v11-latin-regular.ttf b/CTFd/static/original/fonts/lato/lato-v11-latin-regular.ttf similarity index 100% rename from CTFd/static/fonts/lato/lato-v11-latin-regular.ttf rename to CTFd/static/original/fonts/lato/lato-v11-latin-regular.ttf diff --git a/CTFd/static/fonts/lato/lato-v11-latin-regular.woff b/CTFd/static/original/fonts/lato/lato-v11-latin-regular.woff similarity index 100% rename from CTFd/static/fonts/lato/lato-v11-latin-regular.woff rename to CTFd/static/original/fonts/lato/lato-v11-latin-regular.woff diff --git a/CTFd/static/fonts/lato/lato-v11-latin-regular.woff2 b/CTFd/static/original/fonts/lato/lato-v11-latin-regular.woff2 similarity index 100% rename from CTFd/static/fonts/lato/lato-v11-latin-regular.woff2 rename to CTFd/static/original/fonts/lato/lato-v11-latin-regular.woff2 diff --git a/CTFd/static/fonts/raleway/raleway-v10-latin-500.eot b/CTFd/static/original/fonts/raleway/raleway-v10-latin-500.eot similarity index 100% rename from CTFd/static/fonts/raleway/raleway-v10-latin-500.eot rename to CTFd/static/original/fonts/raleway/raleway-v10-latin-500.eot diff --git a/CTFd/static/fonts/raleway/raleway-v10-latin-500.svg b/CTFd/static/original/fonts/raleway/raleway-v10-latin-500.svg similarity index 100% rename from CTFd/static/fonts/raleway/raleway-v10-latin-500.svg rename to CTFd/static/original/fonts/raleway/raleway-v10-latin-500.svg diff --git a/CTFd/static/fonts/raleway/raleway-v10-latin-500.ttf b/CTFd/static/original/fonts/raleway/raleway-v10-latin-500.ttf similarity index 100% rename from CTFd/static/fonts/raleway/raleway-v10-latin-500.ttf rename to CTFd/static/original/fonts/raleway/raleway-v10-latin-500.ttf diff --git a/CTFd/static/fonts/raleway/raleway-v10-latin-500.woff b/CTFd/static/original/fonts/raleway/raleway-v10-latin-500.woff similarity index 100% rename from CTFd/static/fonts/raleway/raleway-v10-latin-500.woff rename to CTFd/static/original/fonts/raleway/raleway-v10-latin-500.woff diff --git a/CTFd/static/fonts/raleway/raleway-v10-latin-500.woff2 b/CTFd/static/original/fonts/raleway/raleway-v10-latin-500.woff2 similarity index 100% rename from CTFd/static/fonts/raleway/raleway-v10-latin-500.woff2 rename to CTFd/static/original/fonts/raleway/raleway-v10-latin-500.woff2 diff --git a/CTFd/static/img/ctfd.ai b/CTFd/static/original/img/ctfd.ai similarity index 100% rename from CTFd/static/img/ctfd.ai rename to CTFd/static/original/img/ctfd.ai diff --git a/CTFd/static/img/ctfd.svg b/CTFd/static/original/img/ctfd.svg similarity index 100% rename from CTFd/static/img/ctfd.svg rename to CTFd/static/original/img/ctfd.svg diff --git a/CTFd/static/img/ctfd_transfer.svg b/CTFd/static/original/img/ctfd_transfer.svg similarity index 100% rename from CTFd/static/img/ctfd_transfer.svg rename to CTFd/static/original/img/ctfd_transfer.svg diff --git a/CTFd/static/img/favicon.ico b/CTFd/static/original/img/favicon.ico similarity index 100% rename from CTFd/static/img/favicon.ico rename to CTFd/static/original/img/favicon.ico diff --git a/CTFd/static/img/logo.png b/CTFd/static/original/img/logo.png similarity index 100% rename from CTFd/static/img/logo.png rename to CTFd/static/original/img/logo.png diff --git a/CTFd/static/img/logo_old.png b/CTFd/static/original/img/logo_old.png similarity index 100% rename from CTFd/static/img/logo_old.png rename to CTFd/static/original/img/logo_old.png diff --git a/CTFd/static/js/chalboard.js b/CTFd/static/original/js/chalboard.js similarity index 82% rename from CTFd/static/js/chalboard.js rename to CTFd/static/original/js/chalboard.js index 100f3be2..cd04db14 100644 --- a/CTFd/static/js/chalboard.js +++ b/CTFd/static/original/js/chalboard.js @@ -62,34 +62,51 @@ function submitkey(chal, key, nonce) { key: key, nonce: nonce }, function (data) { - if (data == -1){ + var result = $.parseJSON(JSON.stringify(data)); + + var result_message = $('#result-message'); + var result_notification = $('#result-notification'); + var answer_input = $("#answer-input"); + result_notification.removeClass(); + result_message.text(result.message); + + if (result.status == -1){ window.location="/login" return } - else if (data == 0){ // Incorrect key - $("#incorrect-key").slideDown(); - $("#answer-input").addClass("wrong"); - $("#answer-input").removeClass("correct"); - setTimeout(function() { - $("#answer-input").removeClass("wrong"); + else if (result.status == 0){ // Incorrect key + result_notification.addClass('alert alert-danger alert-dismissable'); + result_notification.slideDown(); + + answer_input.removeClass("correct"); + answer_input.addClass("wrong"); + setTimeout(function () { + answer_input.removeClass("wrong"); }, 3000); } - else if (data == 1){ // Challenge Solved - $("#correct-key").slideDown(); - $('.chal-solves').text((parseInt($('.chal-solves').text().split(" ")[0]) + 1 + " Solves") ) - $("#answer-input").val(""); - $("#answer-input").removeClass("wrong"); - $("#answer-input").addClass("correct"); + else if (result.status == 1){ // Challenge Solved + result_notification.addClass('alert alert-success alert-dismissable'); + result_notification.slideDown(); + + $('.chal-solves').text((parseInt($('.chal-solves').text().split(" ")[0]) + 1 + " Solves") ); + + answer_input.val(""); + answer_input.removeClass("wrong"); + answer_input.addClass("correct"); } - else if (data == 2){ // Challenge already solved - $("#already-solved").slideDown(); - $("#answer-input").addClass("correct"); + else if (result.status == 2){ // Challenge already solved + result_notification.addClass('alert alert-info alert-dismissable'); + result_notification.slideDown(); + + answer_input.addClass("correct"); } - else if (data == 3){ // Keys per minute too high - $("#too-fast").slideDown(); - $("#answer-input").addClass("wrong"); + else if (result.status == 3){ // Keys per minute too high + result_notification.addClass('alert alert-warning alert-dismissable'); + result_notification.slideDown(); + + answer_input.addClass("too-fast"); setTimeout(function() { - $("#answer-input").removeClass("wrong"); + answer_input.removeClass("too-fast"); }, 3000); } marksolves() diff --git a/CTFd/static/js/scoreboard.js b/CTFd/static/original/js/scoreboard.js similarity index 100% rename from CTFd/static/js/scoreboard.js rename to CTFd/static/original/js/scoreboard.js diff --git a/CTFd/static/js/style.js b/CTFd/static/original/js/style.js similarity index 100% rename from CTFd/static/js/style.js rename to CTFd/static/original/js/style.js diff --git a/CTFd/static/js/team.js b/CTFd/static/original/js/team.js similarity index 100% rename from CTFd/static/js/team.js rename to CTFd/static/original/js/team.js diff --git a/CTFd/static/js/utils.js b/CTFd/static/original/js/utils.js similarity index 100% rename from CTFd/static/js/utils.js rename to CTFd/static/original/js/utils.js diff --git a/CTFd/static/js/vendor/bootstrap.min.js b/CTFd/static/original/js/vendor/bootstrap.min.js similarity index 100% rename from CTFd/static/js/vendor/bootstrap.min.js rename to CTFd/static/original/js/vendor/bootstrap.min.js diff --git a/CTFd/static/js/vendor/codemirror.min.js b/CTFd/static/original/js/vendor/codemirror.min.js similarity index 100% rename from CTFd/static/js/vendor/codemirror.min.js rename to CTFd/static/original/js/vendor/codemirror.min.js diff --git a/CTFd/static/js/vendor/jquery.min.js b/CTFd/static/original/js/vendor/jquery.min.js similarity index 100% rename from CTFd/static/js/vendor/jquery.min.js rename to CTFd/static/original/js/vendor/jquery.min.js diff --git a/CTFd/static/js/vendor/marked.min.js b/CTFd/static/original/js/vendor/marked.min.js similarity index 100% rename from CTFd/static/js/vendor/marked.min.js rename to CTFd/static/original/js/vendor/marked.min.js diff --git a/CTFd/static/js/vendor/moment.min.js b/CTFd/static/original/js/vendor/moment.min.js similarity index 100% rename from CTFd/static/js/vendor/moment.min.js rename to CTFd/static/original/js/vendor/moment.min.js diff --git a/CTFd/static/js/vendor/plotly.min.js b/CTFd/static/original/js/vendor/plotly.min.js similarity index 100% rename from CTFd/static/js/vendor/plotly.min.js rename to CTFd/static/original/js/vendor/plotly.min.js diff --git a/CTFd/templates/admin/base.html b/CTFd/templates/original/admin/base.html similarity index 67% rename from CTFd/templates/admin/base.html rename to CTFd/templates/original/admin/base.html index 574bdf4e..ab4274bf 100644 --- a/CTFd/templates/admin/base.html +++ b/CTFd/templates/original/admin/base.html @@ -5,15 +5,15 @@ Admin Panel - - - - - - - - - + + + + + + + + + @@ -53,9 +53,9 @@ {% block content %} {% endblock %} - - - + + + {% block scripts %} {% endblock %} diff --git a/CTFd/templates/admin/chals.html b/CTFd/templates/original/admin/chals.html similarity index 98% rename from CTFd/templates/admin/chals.html rename to CTFd/templates/original/admin/chals.html index 74470cda..92f5e737 100644 --- a/CTFd/templates/admin/chals.html +++ b/CTFd/templates/original/admin/chals.html @@ -298,7 +298,7 @@ {% endblock %} {% block scripts %} - - - + + + {% endblock %} diff --git a/CTFd/templates/admin/config.html b/CTFd/templates/original/admin/config.html similarity index 97% rename from CTFd/templates/admin/config.html rename to CTFd/templates/original/admin/config.html index 1c78fb44..e7c85f20 100644 --- a/CTFd/templates/admin/config.html +++ b/CTFd/templates/original/admin/config.html @@ -21,6 +21,16 @@ +
+ + +
+
diff --git a/CTFd/templates/admin/containers.html b/CTFd/templates/original/admin/containers.html similarity index 100% rename from CTFd/templates/admin/containers.html rename to CTFd/templates/original/admin/containers.html diff --git a/CTFd/templates/admin/correct_keys.html b/CTFd/templates/original/admin/correct_keys.html similarity index 95% rename from CTFd/templates/admin/correct_keys.html rename to CTFd/templates/original/admin/correct_keys.html index 44716d08..e0662600 100644 --- a/CTFd/templates/admin/correct_keys.html +++ b/CTFd/templates/original/admin/correct_keys.html @@ -77,8 +77,8 @@ {% endblock %} {% block scripts %} - - + + + + + - - - + + + + - + + + @@ -63,9 +63,9 @@ {% endblock %}
- - - + + + {% block scripts %} {% endblock %} diff --git a/CTFd/templates/chals.html b/CTFd/templates/original/chals.html similarity index 83% rename from CTFd/templates/chals.html rename to CTFd/templates/original/chals.html index ea087351..cb98aa93 100644 --- a/CTFd/templates/chals.html +++ b/CTFd/templates/original/chals.html @@ -34,6 +34,11 @@ .input--filled .wrong { border-color: rgb(255, 190, 190); } + + .input-field:focus + .input-field, + .input--filled .too-fast { + border-color: rgb(252, 248, 227); + } a, button { color: #74716D; text-decoration: none; @@ -117,17 +122,8 @@
- - - -
@@ -154,7 +150,7 @@ {% endblock %} {% block scripts %} - - - + + + {% endblock %} diff --git a/CTFd/templates/confirm.html b/CTFd/templates/original/confirm.html similarity index 93% rename from CTFd/templates/confirm.html rename to CTFd/templates/original/confirm.html index e01028aa..dfff2394 100644 --- a/CTFd/templates/confirm.html +++ b/CTFd/templates/original/confirm.html @@ -44,6 +44,6 @@ {% endblock %} {% block scripts %} - + {% endblock %} diff --git a/CTFd/templates/errors/403.html b/CTFd/templates/original/errors/403.html similarity index 100% rename from CTFd/templates/errors/403.html rename to CTFd/templates/original/errors/403.html diff --git a/CTFd/templates/errors/404.html b/CTFd/templates/original/errors/404.html similarity index 100% rename from CTFd/templates/errors/404.html rename to CTFd/templates/original/errors/404.html diff --git a/CTFd/templates/errors/500.html b/CTFd/templates/original/errors/500.html similarity index 100% rename from CTFd/templates/errors/500.html rename to CTFd/templates/original/errors/500.html diff --git a/CTFd/templates/errors/502.html b/CTFd/templates/original/errors/502.html similarity index 100% rename from CTFd/templates/errors/502.html rename to CTFd/templates/original/errors/502.html diff --git a/CTFd/templates/login.html b/CTFd/templates/original/login.html similarity index 96% rename from CTFd/templates/login.html rename to CTFd/templates/original/login.html index cb5532a1..fad46565 100644 --- a/CTFd/templates/login.html +++ b/CTFd/templates/original/login.html @@ -67,6 +67,6 @@ {% endblock %} {% block scripts %} - + {% endblock %} diff --git a/CTFd/templates/profile.html b/CTFd/templates/original/profile.html similarity index 98% rename from CTFd/templates/profile.html rename to CTFd/templates/original/profile.html index adbba486..6d9f9112 100644 --- a/CTFd/templates/profile.html +++ b/CTFd/templates/original/profile.html @@ -132,5 +132,5 @@ {% endblock %} {% block scripts %} - + {% endblock %} diff --git a/CTFd/templates/register.html b/CTFd/templates/original/register.html similarity index 97% rename from CTFd/templates/register.html rename to CTFd/templates/original/register.html index dac19b26..e6571941 100644 --- a/CTFd/templates/register.html +++ b/CTFd/templates/original/register.html @@ -63,7 +63,7 @@ {% endblock %} {% block scripts %} - + + {% endblock %} diff --git a/CTFd/templates/scoreboard.html b/CTFd/templates/original/scoreboard.html similarity index 74% rename from CTFd/templates/scoreboard.html rename to CTFd/templates/original/scoreboard.html index 1c905cb7..2af2066e 100644 --- a/CTFd/templates/scoreboard.html +++ b/CTFd/templates/original/scoreboard.html @@ -31,7 +31,7 @@ {% endblock %} {% block scripts %} - - - + + + {% endblock %} diff --git a/CTFd/templates/setup.html b/CTFd/templates/original/setup.html similarity index 96% rename from CTFd/templates/setup.html rename to CTFd/templates/original/setup.html index 53c2a1ff..63f19108 100644 --- a/CTFd/templates/setup.html +++ b/CTFd/templates/original/setup.html @@ -63,5 +63,5 @@ {% endblock %} {% block scripts %} - + {% endblock %} diff --git a/CTFd/templates/team.html b/CTFd/templates/original/team.html similarity index 90% rename from CTFd/templates/team.html rename to CTFd/templates/original/team.html index 247e0c41..4defcbdd 100644 --- a/CTFd/templates/team.html +++ b/CTFd/templates/original/team.html @@ -81,7 +81,7 @@ {% endblock %} {% block scripts %} - - - + + + {% endblock %} diff --git a/CTFd/templates/teams.html b/CTFd/templates/original/teams.html similarity index 100% rename from CTFd/templates/teams.html rename to CTFd/templates/original/teams.html diff --git a/CTFd/utils.py b/CTFd/utils.py index a38f7345..fc85e8b5 100644 --- a/CTFd/utils.py +++ b/CTFd/utils.py @@ -26,6 +26,7 @@ import tempfile import subprocess import json + def init_logs(app): logger_keys = logging.getLogger('keys') logger_logins = logging.getLogger('logins') @@ -93,6 +94,7 @@ def init_utils(app): app.jinja_env.globals.update(can_register=can_register) app.jinja_env.globals.update(mailserver=mailserver) 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.context_processor @@ -135,6 +137,11 @@ def ctf_name(): return name if name else 'CTFd' +def ctf_theme(): + theme = get_config('ctf_theme') + return theme if theme else '' + + def pages(): pages = Pages.query.filter(Pages.route!="index").all() return pages @@ -143,6 +150,7 @@ def pages(): def authed(): return bool(session.get('id', False)) + def is_verified(): team = Teams.query.filter_by(id=session.get('id')).first() if team: @@ -150,6 +158,7 @@ def is_verified(): else: return False + def is_setup(): setup = Config.query.filter_by(key='setup').first() if setup: @@ -188,6 +197,7 @@ def view_after_ctf(): else: return False + def ctftime(): """ Checks whether it's CTF time or not. """ @@ -275,6 +285,12 @@ def get_kpm(teamid): # keys per minute return len(db.session.query(WrongKeys).filter(WrongKeys.teamid == teamid, WrongKeys.date >= one_min_ago).all()) +def get_themes(): + dir = os.path.join(app.root_path, app.template_folder) + return [name for name in os.listdir(dir) + if os.path.isdir(os.path.join(dir, name))] + + def get_config(key): config = Config.query.filter_by(key=key).first() if config and config.value: diff --git a/CTFd/views.py b/CTFd/views.py index fda03197..a8fd4f95 100644 --- a/CTFd/views.py +++ b/CTFd/views.py @@ -50,7 +50,7 @@ def setup(): ## Index page page = Pages('index', """
- +

Welcome to a cool CTF framework written by Kevin Chung of @isislab

@@ -88,6 +88,7 @@ def setup(): db.session.add(page) db.session.add(admin) db.session.commit() + db.session.close() app.setup = False return redirect(url_for('views.static_html')) return render_template('setup.html', nonce=session.get('nonce'))