コード例 #1
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)
コード例 #2
0
ファイル: controllers.py プロジェクト: google/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:
        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)
コード例 #3
0
ファイル: utils_test.py プロジェクト: google/ctfscoreboard
 def testValidateProofOfWork_FailsInvalidBase64(self):
     val = "foo"
     key = "!!"
     nbits = 12
     self.assertFalse(utils.validate_proof_of_work(val, key, nbits))
コード例 #4
0
ファイル: utils_test.py プロジェクト: google/ctfscoreboard
 def testValidateProofOfWork_FailsMoreBits(self):
     val = "foo"
     key = "N77manQK9CvjvPRXB8U7ftJxys1d36xVfcBkGvM-jq"
     nbits = 16
     self.assertFalse(utils.validate_proof_of_work(val, key, nbits))
コード例 #5
0
ファイル: utils_test.py プロジェクト: google/ctfscoreboard
 def testValidateProofOfWork_FailsWrongVal(self):
     val = "bar"
     key = "N77manQK9CvjvPRXB8U7ftJxys1d36xVfcBkGvM-jqM"
     nbits = 12
     self.assertFalse(utils.validate_proof_of_work(val, key, nbits))
コード例 #6
0
ファイル: utils_test.py プロジェクト: google/ctfscoreboard
 def testValidateProofOfWork_SucceedsUnicode(self):
     val = u"foo"
     key = u"N77manQK9CvjvPRXB8U7ftJxys1d36xVfcBkGvM-jqM"
     nbits = 12
     self.assertTrue(utils.validate_proof_of_work(val, key, nbits))
コード例 #7
0
ファイル: utils_test.py プロジェクト: nitrek/ctfscoreboard
 def testValidateProofOfWork_FailsInvalidBase64(self):
     val = "foo"
     key = "!!"
     nbits = 12
     self.assertFalse(utils.validate_proof_of_work(val, key, nbits))
コード例 #8
0
ファイル: utils_test.py プロジェクト: nitrek/ctfscoreboard
 def testValidateProofOfWork_FailsMoreBits(self):
     val = "foo"
     key = "N77manQK9CvjvPRXB8U7ftJxys1d36xVfcBkGvM-jq"
     nbits = 16
     self.assertFalse(utils.validate_proof_of_work(val, key, nbits))
コード例 #9
0
ファイル: utils_test.py プロジェクト: nitrek/ctfscoreboard
 def testValidateProofOfWork_FailsWrongVal(self):
     val = "bar"
     key = "N77manQK9CvjvPRXB8U7ftJxys1d36xVfcBkGvM-jqM"
     nbits = 12
     self.assertFalse(utils.validate_proof_of_work(val, key, nbits))
コード例 #10
0
ファイル: utils_test.py プロジェクト: nitrek/ctfscoreboard
 def testValidateProofOfWork_SucceedsUnicode(self):
     val = u"foo"
     key = u"N77manQK9CvjvPRXB8U7ftJxys1d36xVfcBkGvM-jqM"
     nbits = 12
     self.assertTrue(utils.validate_proof_of_work(val, key, nbits))