Ejemplo n.º 1
0
def submit_flag(team, challenge, flag):
    if g.redis.get("rl{}".format(team.id)):
        delta = config.competition_end - datetime.now()
        if delta.days > 0 or delta.seconds > (config.flag_rl * 6):
            return FLAG_SUBMISSION_TOO_FAST

    if team.solved(challenge):
        return FLAG_SUBMITTED_ALREADY
    elif not challenge.enabled:
        return FLAG_CANNOT_SUBMIT_WHILE_DISABLED
    elif flag.strip().lower() != challenge.flag.strip().lower():
        g.redis.set("rl{}".format(team.id), str(datetime.now()),
                    config.flag_rl)
        ChallengeFailure.create(team=team,
                                challenge=challenge,
                                attempt=flag,
                                time=datetime.now())
        return FLAG_INCORRECT
    else:
        if int(g.redis.hget("solves", challenge.id).decode()) == 0:
            if challenge.breakthrough_bonus:
                ScoreAdjustment.create(team=team,
                                       value=challenge.breakthrough_bonus,
                                       reason="First solve for {}".format(
                                           challenge.name))

        g.redis.hincrby("solves", challenge.id, 1)
        g.redis.delete("scoreboard")
        g.redis.delete("graph")
        ChallengeSolve.create(team=team,
                              challenge=challenge,
                              time=datetime.now())
        return SUCCESS
Ejemplo n.º 2
0
def submit_flag(team, challenge, flag):
    if g.redis.get("rl{}".format(team.id)):
        delta = config.competition_end - datetime.now()
        if delta.total_seconds() > (config.flag_rl * 6):
            return FLAG_SUBMISSION_TOO_FAST

    if team.solved(challenge):
        return FLAG_SUBMITTED_ALREADY
    elif not challenge.enabled:
        return FLAG_CANNOT_SUBMIT_WHILE_DISABLED
    elif flag.strip().lower() != challenge.flag.strip().lower():
        g.redis.set("rl{}".format(team.id), str(datetime.now()),
                    config.flag_rl)
        ChallengeFailure.create(team=team,
                                challenge=challenge,
                                attempt=flag,
                                time=datetime.now())
        return FLAG_INCORRECT
    else:
        g.redis.hincrby("solves", challenge.id, 1)
        if config.immediate_scoreboard:
            g.redis.delete("scoreboard")
            g.redis.delete("graph")
        ChallengeSolve.create(team=team,
                              challenge=challenge,
                              time=datetime.now())
        return SUCCESS
Ejemplo n.º 3
0
def challenge_show_solves(challenge):
    chal = Challenge.get(Challenge.id == challenge)
    solves = ChallengeSolve.select(ChallengeSolve, Team).join(Team).order_by(
        ChallengeSolve.time).where(ChallengeSolve.challenge == chal)
    return render_template("challenge_solves.html",
                           challenge=chal,
                           solves=solves)
Ejemplo n.º 4
0
def dashboard():
    if request.method == "GET":
        team_solves = ChallengeSolve.select(ChallengeSolve, Challenge).join(Challenge).where(ChallengeSolve.team == g.team)
        team_adjustments = ScoreAdjustment.select().where(ScoreAdjustment.team == g.team)
        team_score = sum([i.challenge.points for i in team_solves] + [i.value for i in team_adjustments])
        first_login = False
        if g.team.first_login:
            first_login = True
            g.team.first_login = False
            g.team.save()
        return render_template("dashboard.html", team_solves=team_solves, team_adjustments=team_adjustments, team_score=team_score, first_login=first_login)

    elif request.method == "POST":
        if g.redis.get("ul{}".format(session["team_id"])):
            flash("You're changing your information too fast!")
            return redirect(url_for('dashboard'))

        team_name = request.form["team_name"].strip()
        team_email = request.form["team_email"].strip()
        affiliation = request.form["affiliation"].strip()
        team_elig = "team_eligibility" in request.form

        if len(team_name) > 50 or not team_name:
            flash("You must have a team name!")
            return redirect(url_for('dashboard'))

        if not (team_email and "." in team_email and "@" in team_email):
            flash("You must have a valid team email!")
            return redirect(url_for('dashboard'))

        if not affiliation or len(affiliation) > 100:
            affiliation = "No affiliation"

        email_changed = (team_email != g.team.email)

        g.team.name = team_name
        g.team.email = team_email
        g.team.affiliation = affiliation
        if not g.team.eligibility_locked:
            g.team.eligible = team_elig

        g.redis.set("ul{}".format(session["team_id"]), str(datetime.now()), 120)

        if email_changed:
            if not email.is_valid_email(team_email):
                flash("You're lying")
                return redirect(url_for('dashboard'))

            g.team.email_confirmation_key = misc.generate_confirmation_key()
            g.team.email_confirmed = False

            email.send_confirmation_email(team_email, g.team.email_confirmation_key, g.team.key)
            flash("Changes saved. Please check your email for a new confirmation key.")
        else:
            flash("Changes saved.")
        g.team.save()


        return redirect(url_for('dashboard'))
Ejemplo n.º 5
0
def admin_dashboard():
    teams = Team.select()
    solves = ChallengeSolve.select(ChallengeSolve, Challenge).join(Challenge)
    adjustments = ScoreAdjustment.select()
    scoredata = utils.scoreboard.get_all_scores(teams, solves, adjustments)
    lastsolvedata = utils.scoreboard.get_last_solves(teams, solves)
    tickets = list(TroubleTicket.select().where(TroubleTicket.active == True))
    return render_template("admin/dashboard.html", teams=teams, scoredata=scoredata, lastsolvedata=lastsolvedata, tickets=tickets)
Ejemplo n.º 6
0
def submit_flag(team, challenge, flag):
    if g.redis.get("rl{}".format(team.id)):
        delta = config.competition_end - datetime.now()
        if delta.total_seconds() > (config.flag_rl * 6):
            return FLAG_SUBMISSION_TOO_FAST

    if team.solved(challenge):
        return FLAG_SUBMITTED_ALREADY
    elif not challenge.enabled:
        return FLAG_CANNOT_SUBMIT_WHILE_DISABLED
    elif flag.strip().lower() != challenge.flag.strip().lower():
        g.redis.set("rl{}".format(team.id), str(datetime.now()), config.flag_rl)
        ChallengeFailure.create(team=team, challenge=challenge, attempt=flag, time=datetime.now())
        return FLAG_INCORRECT
    else:
        g.redis.hincrby("solves", challenge.id, 1)
        if config.immediate_scoreboard:
            g.redis.delete("scoreboard")
            g.redis.delete("graph")
        ChallengeSolve.create(team=team, challenge=challenge, time=datetime.now())
        return SUCCESS
Ejemplo n.º 7
0
def calculate_graph(scoredata):
    solves = list(ChallengeSolve.select(ChallengeSolve, Challenge).join(Challenge).order_by(ChallengeSolve.time))
    adjustments = list(ScoreAdjustment.select())
    scoredata = [i for i in scoredata if i[0]] # Only eligible teams are on the score graph
    graph_data = []
    for eligible, tid, name, affiliation, score in scoredata[:config.teams_on_graph]:
        our_solves = [i for i in solves if i.team_id == tid]
        team_data = []
        s = sum([i.value for i in adjustments if i.team_id == tid])
        for i in sorted(our_solves, key=lambda k: k.time):
            team_data.append((str(i.time), s))
            s += i.challenge.points
            team_data.append((str(i.time + timedelta(microseconds=1000)), s))
        team_data.append((str(datetime.now()), score))
        graph_data.append((name, team_data))
    return graph_data
Ejemplo n.º 8
0
def calculate_scores():
    solves = ChallengeSolve.select(ChallengeSolve, Challenge).join(Challenge)
    adjustments = ScoreAdjustment.select()
    teams = Team.select()

    team_solves = {team.id: [] for team in teams}
    team_mapping = {team.id: team for team in teams}
    scores = {team.id: 0 for team in teams}
    for solve in solves:
        scores[solve.team_id] += solve.challenge.points
        team_solves[solve.team_id].append(solve)
    for adjustment in adjustments:
        scores[adjustment.team_id] += adjustment.value

    most_recent_solve = {tid: max([i.time for i in team_solves[tid]]) for tid in team_solves if team_solves[tid]}
    scores = {i: j for i, j in scores.items() if i in most_recent_solve}
    # eligible, teamid, teamname, affiliation, score
    return [(team_mapping[i[0]].eligible, i[0], team_mapping[i[0]].name, team_mapping[i[0]].affiliation, i[1]) for idx, i in enumerate(sorted(scores.items(), key=lambda k: (-k[1], most_recent_solve[k[0]])))]
Ejemplo n.º 9
0
def dynamic_display():
    chal_failed = ChallengeFailure.select()
    chal_solved = ChallengeSolve.select()
    submits = dynamics.sort(chal_failed,chal_solved)
    results = dynamics.handle_solving(submits)

    result = []
    page,per_page,offset=get_page_args()
    if int(page) == int(len(results)/per_page) + 1:
        for i in range((page-1)*per_page, len(results)):
            if results[i] is not None:
                result.append(results[i])
    else:
        for i in range((page-1)*per_page, page*per_page):
            if results[i] is not None:
                result.append(results[i])
    pagination = Pagination(page=page,total=len(results),per_page=per_page,record_name='result')
    notices = NewsItem.select().order_by(-NewsItem.time)
    return render_template("dynamics.html", notices=notices, result=result, pagination=pagination)
Ejemplo n.º 10
0
def team_dashboard():
    if request.method == "GET":
        if "team_id" in session:
            team_solves = ChallengeSolve.select(ChallengeSolve, Challenge).join(Challenge).where(
            ChallengeSolve.team == g.team)
            team_adjustments = ScoreAdjustment.select().where(ScoreAdjustment.team == g.team)
            team_score = sum([i.challenge.points for i in team_solves] + [i.value for i in team_adjustments])
            first_login = False
            if g.team.first_login:
                first_login = True
                g.team.first_login = False
                g.team.save()
            if g.team.team_leader.id == g.user.id:
                team_members = User.select().join(TeamMember).join(Team).where(Team.id == g.team.id)
                users = TeamMember.select().where(TeamMember.team == g.team)
                return render_template("team_dashboard.html", team_solves=team_solves, team_adjustments=team_adjustments,
        team_score=team_score, first_login=first_login, team_members=team_members, users=users)
            else:
                return render_template("team_dashboard.html", team_solves=team_solves, team_adjustments=team_adjustments,
        team_score=team_score, first_login=first_login)
        else:
            return render_template("team_dashboard.html")
Ejemplo n.º 11
0
def challenge_show_solves(challenge):
    chal = Challenge.get(Challenge.id == challenge)
    solves = ChallengeSolve.select(ChallengeSolve, Team).join(Team).order_by(ChallengeSolve.time).where(ChallengeSolve.challenge == chal)
    return render_template("challenge_solves.html", challenge=chal, solves=solves)
Ejemplo n.º 12
0
def dashboard():
    if request.method == "GET":
        team_solves = ChallengeSolve.select(
            ChallengeSolve,
            Challenge).join(Challenge).where(ChallengeSolve.team == g.team)
        team_adjustments = ScoreAdjustment.select().where(
            ScoreAdjustment.team == g.team)
        team_score = sum([i.challenge.points for i in team_solves] +
                         [i.value for i in team_adjustments])
        first_login = False
        if g.team.first_login:
            first_login = True
            g.team.first_login = False
            g.team.save()
        return render_template("dashboard.html",
                               team_solves=team_solves,
                               team_adjustments=team_adjustments,
                               team_score=team_score,
                               first_login=first_login)

    elif request.method == "POST":
        if g.redis.get("ul{}".format(session["team_id"])):
            flash("You're changing your information too fast!")
            return redirect(url_for('dashboard'))

        team_name = request.form["team_name"].strip()
        team_email = request.form["team_email"].strip()
        affiliation = request.form["affiliation"].strip()
        team_elig = "team_eligibility" in request.form

        if len(team_name) > 50 or not team_name:
            flash("You must have a team name!")
            return redirect(url_for('dashboard'))

        if not (team_email and "." in team_email and "@" in team_email):
            flash("You must have a valid team email!")
            return redirect(url_for('dashboard'))

        if not affiliation or len(affiliation) > 100:
            affiliation = "No affiliation"

        email_changed = (team_email != g.team.email)

        g.team.name = team_name
        g.team.email = team_email
        g.team.affiliation = affiliation
        if not g.team.eligibility_locked:
            g.team.eligible = team_elig

        g.redis.set("ul{}".format(session["team_id"]), str(datetime.now()),
                    120)

        if email_changed:
            if not email.is_valid_email(team_email):
                flash("You're lying")
                return redirect(url_for('dashboard'))

            g.team.email_confirmation_key = misc.generate_confirmation_key()
            g.team.email_confirmed = False

            email.send_confirmation_email(team_email,
                                          g.team.email_confirmation_key,
                                          g.team.key)
            flash(
                "Changes saved. Please check your email for a new confirmation key."
            )
        else:
            flash("Changes saved.")
        g.team.save()

        return redirect(url_for('dashboard'))