예제 #1
0
파일: problem.py 프로젝트: zaratec/picoCTF
def problem_feedback_hook():
    feedback = json.loads(request.form.get("feedback", ""))
    pid = request.form.get("pid", None)

    if feedback is None or pid is None:
        return WebError("Please supply a pid and feedback.")

    if not api.config.get_settings()["enable_feedback"]:
        return WebError("Problem feedback is not currently being accepted.")

    api.problem_feedback.add_problem_feedback(pid, api.auth.get_uid(), feedback)
    return WebSuccess("Your feedback has been accepted.")
예제 #2
0
def create_simple_user_hook():
    settings = api.config.get_settings()

    new_uid = api.user.create_simple_user_request(
        api.common.flat_multi(request.form))

    #Only automatically login if we don't have to verify
    if api.user.get_user(uid=new_uid)["verified"]:
        session['uid'] = new_uid

    return WebSuccess("User '{}' registered successfully!".format(
        request.form["username"]))
예제 #3
0
def get_problem_data_hook():
    has_instances = lambda p: len(p["instances"]) > 0
    problems = list(
        filter(has_instances, api.problem.get_all_problems(show_disabled=True)))

    for problem in problems:
        problem["reviews"] = api.problem_feedback.get_problem_feedback(
            pid=problem["pid"])

    data = {"problems": problems, "bundles": api.problem.get_all_bundles()}

    return WebSuccess(data=data)
예제 #4
0
def reassign_teams_hook():
    if not api.config.get_settings()["shell_servers"]["enable_sharding"]:
        return WebError(
            "Enable sharding first before assigning server numbers.")
    else:
        include_assigned = request.form.get("include_assigned", False)
        count = api.shell_servers.reassign_teams(
            include_assigned=include_assigned)
        if include_assigned:
            action = "reassigned."
        else:
            action = "assigned."
        return WebSuccess(str(count) + " teams " + action)
예제 #5
0
def status_hook():
    status = {
        "logged_in": api.auth.is_logged_in(),
        "admin": api.user.is_admin(),
        "teacher": api.auth.is_logged_in() and api.user.is_teacher(),
        "enable_teachers": api.config.enable_teachers,
        "shell": api.config.enable_shell,
        "enable_captcha": api.config.enable_captcha,
        "competition_active": api.utilities.check_competition_active(),
        "username": api.user.get_user()['username'] if api.auth.is_logged_in() else ""
    }

    return WebSuccess(data=status)
예제 #6
0
def get_group_score_hook():
    name = request.args.get("group-name")

    user = api.user.get_user()
    roles = api.group.get_roles_in_group(gid, uid=user["uid"])

    if not roles["teacher"]:
        return WebError("You are not a teacher for this group.")

    score = api.stats.get_group_scores(name=name)
    if score is None:
        return WebError("There was an error retrieving the group's score.")

    return WebSuccess(data={'score': score})
예제 #7
0
def check_status_of_shell_server():
    sid = request.args.get("sid", None)

    if sid is None:
        return WebError("Must provide sid to load from.")

    all_online, data = api.shell_servers.get_problem_status_from_server(sid)

    if all_online:
        return WebSuccess("All problems are online", data=data)
    else:
        return WebError(
            "One or more problems are offline. Please connect and fix the errors.",
            data=data)
예제 #8
0
def submit_key_hook():
    user_account = api.user.get_user()
    tid = user_account['tid']
    uid = user_account['uid']
    pid = request.form.get('pid', '')
    key = request.form.get('key', '')
    ip = request.remote_addr

    result = api.problem.submit_key(tid, pid, key, uid, ip)

    if result['correct']:
        return WebSuccess(result['message'], result['points'])
    else:
        return WebError(result['message'], {'code': 'wrong'})
예제 #9
0
def get_scoreboard_hook():
    result = {}
    result['public'] = api.stats.get_all_team_scores()
    result['groups'] = []

    if api.auth.is_logged_in():
        for group in api.team.get_groups():
            result['groups'].append({
                'gid': group['gid'],
                'name': group['name'],
                'scoreboard': api.stats.get_group_scores(gid=group['gid'])
            })

    return WebSuccess(data=result)
예제 #10
0
def get_problem_solves_hook():
    pid = request.args.get('pid', '')

    solves = api.stats.get_problem_solves(pid=pid)
    filtered = []
    for solve in solves:
        team = api.team.get_team(tid=solve["tid"])["team_name"]
        date = solve["timestamp"].strftime("%B %d, %Y %I:%M %p")
        data = {
            "team": team,
            "date": date
        }
        filtered.append(data)
    return WebSuccess(data=filtered)
예제 #11
0
def force_leave_group_hook():
    gid = request.form.get("gid")
    tid = request.form.get("tid")

    if gid is None or tid is None:
        return WebError("You must specify a gid and tid.")

    user = api.user.get_user()
    roles = api.group.get_roles_in_group(gid, uid=user["uid"])
    if not roles["teacher"]:
        return WebError("You must be a teacher of a group to remove a team.")

    api.group.leave_group(gid, tid)

    return WebSuccess("Team has successfully left the group.")
예제 #12
0
def change_group_settings_hook():
    gid = request.form.get("gid")
    settings = json.loads(request.form.get("settings"))

    user = api.user.get_user()
    group = api.group.get_group(gid=gid)

    roles = api.group.get_roles_in_group(gid=group["gid"], uid=user["uid"])

    if roles["teacher"]:
        api.group.change_group_settings(group["gid"], settings)
        return WebSuccess(message="Group settings changed successfully.")
    else:
        return WebError(
            message="You do not have sufficient privilege to do that.")
예제 #13
0
def bundle_dependencies():
    bid = request.form.get("bid", None)
    state = request.form.get("state", None)

    if bid is None:
        return WebError("Must provide bid to load from.")

    if state is None:
        return WebError("Must provide a state to set.")

    state = bson.json_util.loads(state)

    api.problem.set_bundle_dependencies_enabled(bid, state)

    return WebSuccess(
        "Dependencies are now {}.".format("enabled" if state else "disabled"))
예제 #14
0
def change_problem_availability_hook():
    pid = request.form.get("pid", None)
    desired_state = request.form.get("state", None)

    state = None

    # This feels really bad. Why doesn't Flask serialize it to the correct type?
    if desired_state == "true":
        state = True
    elif desired_state == "false":
        state = False
    else:
        return WebError("Problems are either enabled or disabled.")

    api.admin.set_problem_availability(pid, state)
    return WebSuccess(data="Problem state changed successfully.")
예제 #15
0
def get_flag_shares():
    gid = request.args.get("gid", None)

    if gid is None:
        return WebError(
            "You must specify a gid when looking at flag sharing statistics.")

    user = api.user.get_user()
    roles = api.group.get_roles_in_group(gid, uid=user["uid"])
    if not roles["teacher"]:
        return WebError(
            "You must be a teacher of a group to see its flag sharing statistics."
        )

    return WebSuccess(data=api.stats.check_invalid_instance_submissions(
        gid=gid))
예제 #16
0
def get_all_players_achievements_hook():
    achievements = api.achievement.get_earned_achievement_instances()

    for instance_achievement in achievements:
        achievement = api.achievement.get_achievement(
            aid=instance_achievement["aid"])
        team = api.team.get_team(tid=instance_achievement["tid"])

        #Make sure not to override name or description.
        achievement.pop("name")
        achievement.pop("description")
        instance_achievement["team"] = team["team_name"]

        instance_achievement.update(achievement)
        instance_achievement.pop("data", None)

    return WebSuccess(data=achievements)
예제 #17
0
def get_group_hook():
    name = request.form.get("group-name")
    owner = request.form.get("group-owner")
    gid = request.form.get("gid")

    owner_tid = None
    if not gid or len(gid) == 0:
        owner_tid = api.team.get_team(name=owner)["tid"]

    group = api.group.get_group(gid=gid, name=name, owner_tid=owner_tid)

    user = api.user.get_user()
    roles = api.group.get_roles_in_group(gid=group["gid"], uid=user["uid"])

    if not roles["member"] and not roles["teacher"]:
        return WebError("You are not a member of this group.")

    return WebSuccess(data=group)
예제 #18
0
def request_problem_hint_hook():
    @log_action
    def hint(pid, source):
        return None

    source = request.args.get("source")
    pid = request.args.get("pid")

    if pid is None:
        return WebError("Please supply a pid.")
    if source is None:
        return WebError("You have to supply the source of the hint.")

    tid = api.user.get_team()["tid"]
    if pid not in api.problem.get_unlocked_pids(tid):
        return WebError("Your team hasn't unlocked this problem yet!")

    hint(pid, source)
    return WebSuccess("Hint noted.")
예제 #19
0
def create_group_hook():
    """
    Creates a new group. Validates forms.
    All required arguments are assumed to be keys in params.
    """

    params = api.common.flat_multi(request.form)
    validate(register_group_schema, params)

    # Current user is the prospective owner.
    team = api.user.get_team()

    if safe_fail(api.group.get_group,
                 name=params["group-name"],
                 owner_tid=team["tid"]) is not None:
        raise WebException("A group with that name already exists!")

    gid = api.group.create_group(team["tid"], params["group-name"])
    return WebSuccess("Successfully created group.", data=gid)
예제 #20
0
def join_group_hook():
    """
    Tries to place a team into a group. Validates forms.
    All required arguments are assumed to be keys in params.
    """

    params = api.common.flat_multi(request.form)
    validate(join_group_schema, params)

    owner_team = safe_fail(api.team.get_team, name=params["group-owner"])

    if not owner_team:
        raise WebException("No teacher exists with that name!")

    if safe_fail(api.group.get_group,
                 name=params["group-name"],
                 owner_tid=owner_team["tid"]) is None:
        raise WebException("No classroom exists with that name!")

    group = api.group.get_group(name=params["group-name"],
                                owner_tid=owner_team["tid"])

    group_settings = api.group.get_group_settings(gid=group["gid"])

    team = api.team.get_team()

    if group_settings["email_filter"]:
        for member_uid in api.team.get_team_uids(tid=team["tid"]):
            member = api.user.get_user(uid=member_uid)
            if not api.user.verify_email_in_whitelist(
                    member["email"], group_settings["email_filter"]):
                raise WebException(
                    "{}'s email does not belong to the whitelist for that classroom. Your team may not join this classroom at this time."
                    .format(member["username"]))

    roles = api.group.get_roles_in_group(group["gid"], tid=team["tid"])
    if roles["teacher"] or roles["member"]:
        raise WebException("Your team is already a member of that classroom!")

    api.group.join_group(group["gid"], team["tid"])

    return WebSuccess("Successfully joined classroom")
예제 #21
0
def get_scoreboard_hook():
    result = {}
    result['public'] = api.stats.get_all_team_scores(eligible=True)
    result['groups'] = []

    if api.auth.is_logged_in():
        user = api.user.get_user()
        if not api.team.get_team(tid=user["tid"])["eligible"]:
            result['ineligible'] = api.stats.get_all_team_scores(eligible=False)
        for group in api.team.get_groups(uid=user["uid"]):
            result['groups'].append({
                'gid':
                group['gid'],
                'name':
                group['name'],
                'scoreboard':
                api.stats.get_group_scores(gid=group['gid'])
            })

    return WebSuccess(data=result)
예제 #22
0
def leave_group_hook():
    """
    Tries to remove a team from a group. Validates forms.
    All required arguments are assumed to be keys in params.
    """

    params = api.common.flat_multi(request.form)

    validate(leave_group_schema, params)
    owner_team = api.team.get_team(name=params["group-owner"])

    group = api.group.get_group(name=params["group-name"],
                                owner_tid=owner_team["tid"])

    team = api.user.get_team()
    roles = api.group.get_roles_in_group(group["gid"], tid=team["tid"])

    if not roles["member"] and not roles["teacher"]:
        raise WebException("Your team is not a member of that class!")

    api.group.leave_group(group["gid"], team["tid"])

    return WebSuccess("Successfully left group.")
예제 #23
0
def get_single_problem_hook(pid):
    problem_info = api.problem.get_problem(pid, tid=api.user.get_user()['tid'])
    return WebSuccess(data=problem_info)
예제 #24
0
def get_unlocked_problems_hook():
    return WebSuccess(
        data=api.problem.get_unlocked_problems(api.user.get_user()['tid']))
예제 #25
0
def get_all_problems_count_hook(category):
    return WebSuccess(data=api.problem.count_all_problems(category=category))
예제 #26
0
def get_visible_problems_hook(category):
    return WebSuccess(data=api.problem.get_visible_problems(
        api.user.get_user()['tid'], category=category))
예제 #27
0
def clear_all_submissions_hook():
    api.problem.clear_all_submissions()
    return WebSuccess("All submissions reset.")
예제 #28
0
def load_problems():
    data = json.loads(request.form.get("competition_data", ""))

    api.problem.load_published(data)
    return WebSuccess("Inserted {} problems.".format(len(data["problems"])))
예제 #29
0
def problem_reviews_hook():
    uid = api.user.get_user()['uid']
    return WebSuccess(data=api.problem_feedback.get_problem_feedback(uid=uid))
예제 #30
0
def get_group_top_teams_score_progressions_hook():
    gid = request.args.get("gid", None)
    return WebSuccess(data=api.stats.get_top_teams_score_progressions(
        gid=gid, eligible=True))