From bc6c1247e1fba44b8d51be8c29b046be7f139ef1 Mon Sep 17 00:00:00 2001 From: James Wang Date: Sat, 16 Apr 2016 20:01:21 -0400 Subject: [PATCH] Rudimentary implementation of config interface --- server/api/__init__.py | 1 + server/api/admin.py | 12 ++++++++++++ server/api/models.py | 9 +++++++++ server/api/settings.py | 36 +++++++++++++++++++++++++++++++++++ server/app.py | 3 ++- server/config.py | 3 --- web/js/easyctf.js | 14 ++++++++++++++ web/pages/admin/settings.html | 33 ++++++++++++++++++++++++++++++++ web/pages/settings.html | 2 +- 9 files changed, 108 insertions(+), 5 deletions(-) create mode 100644 server/api/settings.py create mode 100644 web/pages/admin/settings.html diff --git a/server/api/__init__.py b/server/api/__init__.py index 4c362a8..a52d0a0 100644 --- a/server/api/__init__.py +++ b/server/api/__init__.py @@ -3,6 +3,7 @@ import logger import models import problem import user +import settings import stats import team import utils diff --git a/server/api/admin.py b/server/api/admin.py index d9e78f8..f79a2e0 100644 --- a/server/api/admin.py +++ b/server/api/admin.py @@ -3,6 +3,8 @@ from decorators import admins_only, api_wrapper from models import db, Problems, Files from schemas import verify_to_schema, check +import settings + import cPickle as pickle blueprint = Blueprint("admin", __name__) @@ -28,6 +30,16 @@ def problem_data(): problems_return.sort(key=lambda prob: prob["value"]) return { "success": 1, "problems": problems_return } +@blueprint.route("/settings", methods=["GET"]) +@api_wrapper +@admins_only +def settings_data(): + # data = settings.get_all() + settings_return = {} + settings_return["ctf_begin"] = settings.get("ctf_begin") + settings_return["ctf_end"] = settings.get("ctf_end") + return { "success": 1, "settings": settings_return } + """ @blueprint.route("/problems/submit", methods=["POST"]) @api_wrapper diff --git a/server/api/models.py b/server/api/models.py index a872856..2366a22 100644 --- a/server/api/models.py +++ b/server/api/models.py @@ -211,3 +211,12 @@ class TeamInvitations(db.Model): self.rtype = rtype self.frid = frid self.toid = toid + +class Settings(db.Model): + sid = db.Column(db.Integer, primary_key=True) + key = db.Column(db.Text, unique=True) + value = db.Column(db.Text) + + def __init__(self, key, value): + self.key = key + self.value = value diff --git a/server/api/settings.py b/server/api/settings.py new file mode 100644 index 0000000..358ee97 --- /dev/null +++ b/server/api/settings.py @@ -0,0 +1,36 @@ +from flask import Blueprint, request + +from models import db, Settings +from decorators import admins_only, api_wrapper, WebException + +blueprint = Blueprint("setting", __name__) + +@blueprint.route("/update", methods=["POST"]) +@admins_only +@api_wrapper +def update_setting(): + for key in request.form.keys(): + value = request.form[key] + set(key, value) + return { "success": 1, "message": "Success!" } + +def set(key, value): + setting = Settings.query.filter_by(key=key).first() + if setting: + setting.value = value + else: + setting = Settings(key, value) + db.session.add(setting) + db.session.commit() + return setting + +def get_all(): + settings = {} + for setting in Settings.query.all(): + settings[setting.key] = setting.value + +def get(key): + setting = Settings.query.filter_by(key=key).first() + if setting: + return setting.value + return set(key, None) diff --git a/server/app.py b/server/app.py index 6b4a282..43a22d6 100644 --- a/server/app.py +++ b/server/app.py @@ -24,7 +24,7 @@ if not os.path.exists("pfp"): os.makedirs("pfp") with app.app_context(): - from api.models import db, Files, Teams, Problems, Solves, Users + from api.models import db, Files, Teams, Problems, Settings, Solves, Users db.init_app(app) db.create_all() @@ -34,6 +34,7 @@ app.secret_key = config.SECRET_KEY app.register_blueprint(api.admin.blueprint, url_prefix="/api/admin") app.register_blueprint(api.problem.blueprint, url_prefix="/api/problem") +app.register_blueprint(api.settings.blueprint, url_prefix="/api/settings") app.register_blueprint(api.stats.blueprint, url_prefix="/api/stats") app.register_blueprint(api.team.blueprint, url_prefix="/api/team") app.register_blueprint(api.user.blueprint, url_prefix="/api/user") diff --git a/server/config.py b/server/config.py index f1d7569..ab757b0 100644 --- a/server/config.py +++ b/server/config.py @@ -18,9 +18,6 @@ SQLALCHEMY_TRACK_MODIFICATIONS = False UPLOAD_FOLDER = os.path.normpath("../web/files") GRADER_FOLDER = os.path.normpath("graders") -CTF_BEGIN = 0 # To be used later -CTF_END = 0 # To be used later - MG_HOST = "" MG_API_KEY = "" ADMIN_EMAIL = "" diff --git a/web/js/easyctf.js b/web/js/easyctf.js index afa9f86..72c8d32 100644 --- a/web/js/easyctf.js +++ b/web/js/easyctf.js @@ -68,6 +68,10 @@ app.config(function($routeProvider, $locationProvider) { templateUrl: "pages/admin/problems.html", controller: "adminProblemsController" }) + .when("/admin/settings", { + templateUrl: "pages/admin/settings.html", + controller: "adminSettingsController" + }) .otherwise({ templateUrl: "pages/404.html", controller: "mainController" @@ -247,6 +251,16 @@ app.controller("adminProblemsController", ["$controller", "$scope", "$http", fun }); }]); +app.controller("adminSettingsController", ["$controller", "$scope", "$http", function($controller, $scope, $http) { + $controller("adminController", { $scope: $scope }); + api_call("GET", "/api/admin/settings", {}, function(result) { + if (result["success"] == 1) { + $scope.settings = result["settings"]; + } + $scope.$apply(); + }); +}]); + app.controller("settingsController", ["$controller", "$scope", "$http", function($controller, $scope, $http) { $controller("loginController", { $scope: $scope }); api_call("GET", "/api/user/info", {}, function(result) { diff --git a/web/pages/admin/settings.html b/web/pages/admin/settings.html new file mode 100644 index 0000000..712497e --- /dev/null +++ b/web/pages/admin/settings.html @@ -0,0 +1,33 @@ +
+

CTF Settings

+
+
+
+ +
+ +
+ +
+
+
+ + diff --git a/web/pages/settings.html b/web/pages/settings.html index d2bc0fe..39e61a7 100644 --- a/web/pages/settings.html +++ b/web/pages/settings.html @@ -189,4 +189,4 @@ document.getElementById("file").addEventListener("change", uploadListener, false); }; }); - \ No newline at end of file +