43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
from flask import Blueprint, jsonify, g, request
|
|
from database import Challenge, Notification, Team, Challenge, ChallengeSolve
|
|
from utils import decorators, flag, scoreboard
|
|
from ctferror import *
|
|
from datetime import datetime
|
|
import config
|
|
|
|
api = Blueprint("api", "api", url_prefix="/api")
|
|
@api.route("/submit/<int:challenge>.json", methods=["POST"])
|
|
@decorators.must_be_allowed_to("solve challenges")
|
|
@decorators.must_be_allowed_to("view challenges")
|
|
@decorators.competition_running_required
|
|
@decorators.confirmed_email_required
|
|
def submit_api(challenge):
|
|
chal = Challenge.get(Challenge.id == challenge)
|
|
flagval = request.form["flag"]
|
|
|
|
code, message = flag.submit_flag(g.team, chal, flagval)
|
|
return jsonify(dict(code=code, message=message))
|
|
|
|
@api.route("/dismiss/<int:nid>.json", methods=["POST"])
|
|
@decorators.login_required
|
|
def dismiss_notification(nid):
|
|
n = Notification.get(Notification.id == nid)
|
|
if g.team != n.team:
|
|
code, message = NOTIFICATION_NOT_YOURS
|
|
else:
|
|
Notification.delete().where(Notification.id == nid).execute()
|
|
code, message = SUCCESS
|
|
return jsonify(dict(code=code, message=message))
|
|
|
|
@api.route("/_ctftime/")
|
|
def ctftime_scoreboard_json():
|
|
if not config.immediate_scoreboard and datetime.now() < config.competition_end:
|
|
return "unavailable", 503
|
|
|
|
scores = scoreboard.calculate_scores()
|
|
standings = [dict(team=i[2], score=i[4], outward=not i[0]) for i in scores]
|
|
for index, standing in enumerate(standings):
|
|
standing["pos"] = index + 1
|
|
|
|
return jsonify(standings=standings)
|