コード例 #1
0
ファイル: rest.py プロジェクト: nragupathy/ctfscoreboard
 def post(self):
     data = flask.request.get_json()
     answer = utils.normalize_input(data['answer'])
     try:
         correct = controllers.test_answer(data['cid'], answer)
     except errors.IntegrityError:
         raise errors.InvalidAnswerError('Invalid answer.')
     if not correct:
         raise errors.InvalidAnswerError('Invalid answer.')
     return dict(message='Answer OK.')
コード例 #2
0
def submit_answer(cid, answer):
    """Submits an answer.

    Returns:
      Number of points awarded for answer.
    """
    try:
        challenge = models.Challenge.query.get(cid)
        if not challenge.unlocked:
            raise errors.AccessDeniedError('Challenge is locked!')
        if challenge.verify_answer(answer):
            # Deductions for hints
            hints = models.UnlockedHint.query.filter(
                models.UnlockedHint.team == flask.g.team).all()
            deduction = sum(
                h.hint.cost for h in hints if h.hint.challenge_cid == cid)
            points = challenge.points - deduction
            flask.g.team.score += points
            models.Answer.create(challenge, flask.g.team, answer)
            correct = 'CORRECT'
            return points
        else:
            correct = 'WRONG'
            raise errors.InvalidAnswerError('Really?  Haha no....')
    finally:
        app.challenge_log.info(
            '[%s] Player %s <%s>(%d)/Team %s(%d) submitted "%s" for Challenge '
            '%s<%d>: %s', flask.request.access_route[0],
            flask.g.user.nick, flask.g.user.email, flask.g.user.uid,
            flask.g.team.name, flask.g.team.tid, answer, challenge.name,
            challenge.cid, correct)
コード例 #3
0
ファイル: controllers.py プロジェクト: x0xr00t/ctfscoreboard
def submit_answer(cid, answer, token):
    """Submits an answer.

    Args:
      cid: The ID of the challenge.
      answer: The answer to check.
      token: Provided proof of work token.

    Returns:
      Number of points awarded for answer.
    """
    correct = 'WRONG'
    nbits = app.config.get('PROOF_OF_WORK_BITS', 0)
    if nbits and not utils.validate_proof_of_work(answer, token, nbits):
        raise errors.InvalidAnswerError('Bad proof of work token!')
    team = models.Team.current()
    if not team:
        raise errors.AccessDeniedError('No team!')
    try:
        challenge = models.Challenge.query.get(cid)
        if not challenge.unlocked_for_team(team):
            raise errors.AccessDeniedError('Challenge is locked!')
        validator = validators.GetValidatorForChallenge(challenge)
        if validator.validate_answer(answer, team):
            points = save_team_answer(challenge, team, answer)
            if utils.GameTime.over():
                correct = 'CORRECT (Game Over)'
            else:
                correct = 'CORRECT'
            return points
        else:
            raise errors.InvalidAnswerError('Really?  Haha no....')
    except (errors.IntegrityError, errors.FlushError) as exc:
        app.logger.exception('Error saving flag: %s', exc)
        models.db.session.rollback()
        raise
    finally:
        user = models.User.current()
        app.challenge_log.info(
            'Player %s <%s>(%d)/Team %s(%d) submitted '
            '"%s" for Challenge %s<%d>: %s', user.nick, user.email, user.uid,
            team.name, team.tid, answer, challenge.name, challenge.cid,
            correct)
コード例 #4
0
def submit_answer(cid, answer):
    """Submits an answer.

    Returns:
      Number of points awarded for answer.
    """
    correct = 'WRONG'
    team = models.Team.current()
    if not team:
        raise errors.AccessDeniedError('No team!')
    try:
        challenge = models.Challenge.query.get(cid)
        if not challenge.unlocked_for_team(team):
            raise errors.AccessDeniedError('Challenge is locked!')
        validator = validators.GetValidatorForChallenge(challenge)
        if validator.validate_answer(answer, team):
            ans = models.Answer.create(challenge, team, answer)

            if utils.GameTime.over():
                correct = 'CORRECT (Game Over)'
            else:
                team.score += ans.current_points
                correct = 'CORRECT'

            team.last_solve = datetime.datetime.utcnow()
            models.ScoreHistory.add_entry(team)
            challenge.update_answers(exclude_team=team)

            if utils.GameTime.over():
                return 0
            else:
                return ans.current_points
        else:
            raise errors.InvalidAnswerError('Really?  Haha no....')
    except errors.IntegrityError:
        models.db.session.rollback()
        raise
    finally:
        user = models.User.current()
        app.challenge_log.info(
            'Player %s <%s>(%d)/Team %s(%d) submitted '
            '"%s" for Challenge %s<%d>: %s', user.nick, user.email, user.uid,
            team.name, team.tid, answer, challenge.name, challenge.cid,
            correct)
コード例 #5
0
def submit_answer(cid, answer):
    """Submits an answer.

    Args:
      cid: The ID of the challenge.
      answer: The answer to check.

    Returns:
      Number of points awarded for answer.
    """
    correct = 'WRONG'
    team = models.Team.current()
    if not team:
        raise errors.AccessDeniedError('No team!')
    try:
        challenge = models.Challenge.query.get(cid)
        if not challenge.unlocked_for_team(team):
            raise errors.AccessDeniedError('Challenge is locked!')
        validator = validators.GetValidatorForChallenge(challenge)
        if validator.validate_answer(answer, team):
            points = save_team_answer(challenge, team, answer)
            if utils.GameTime.over():
                correct = 'CORRECT (Game Over)'
            else:
                correct = 'CORRECT'
            return points
        else:
            raise errors.InvalidAnswerError('Really?  Haha no....')
    except errors.IntegrityError:
        models.db.session.rollback()
        raise
    finally:
        user = models.User.current()
        app.challenge_log.info(
            'Player %s <%s>(%d)/Team %s(%d) submitted '
            '"%s" for Challenge %s<%d>: %s', user.nick, user.email, user.uid,
            team.name, team.tid, answer, challenge.name, challenge.cid,
            correct)