Пример #1
0
def get_records_dev(challenges: [Challenge]):
    """Get the records to add to the database for development"""
    flags = []
    for challenge in challenges:
        flags.append(
            Flag(challenge_id=challenge.id, is_regex=False, value='flag-JDIS'))
        flags.append(
            Flag(challenge_id=challenge.id, is_regex=True, value='regex-*'))

    return flags
Пример #2
0
def edit_challenge(current_admin: Administrator, challenge_id: int):
    """Edit a challenge and its associated ressources (flags, links, files)"""
    body = flask_rebar.get_validated_body()
    name = body["name"]
    points = body["points"]
    hidden = body["hidden"]
    description = body["description"]
    category_id = body["category_id"]
    flags = body["flags"]

    editable_challenge = Challenge.query.filter_by(id=challenge_id).first()

    if editable_challenge is None:
        raise errors.UnprocessableEntity("This challenge does not exist.")

    if not current_admin.is_admin_of_event(
            editable_challenge.category.event_id):
        raise errors.Unauthorized(
            "You do not have the permission to administer this challenge.")

    if category_id != editable_challenge.category_id:
        category = Category.query.filter_by(
            id=category_id,
            event_id=editable_challenge.category.event_id).first()

        if category is None:
            raise errors.UnprocessableEntity("The category doesn't exist.")

    if name != editable_challenge.name:
        if not name:
            raise errors.UnprocessableEntity("Name must not be empty.")

        challenge = Challenge.query.filter_by(name=name).first()

        if challenge is not None:
            raise errors.UnprocessableEntity(
                "A challenge with that name already exists.")

    if points != editable_challenge.points and points <= 0:
        raise errors.UnprocessableEntity("Points must be positive.")

    editable_challenge.name = name
    editable_challenge.points = points
    editable_challenge.hidden = hidden
    editable_challenge.description = description
    editable_challenge.category_id = category_id
    flag_objects = list(
        map(lambda flag: Flag(is_regex=flag['is_regex'], value=flag['value']),
            flags))
    editable_challenge.flags = flag_objects

    DB.session.commit()

    return editable_challenge
Пример #3
0
    def test_given_incorrect_flag_should_return_correct_false(
            self, flag_mock: MagicMock, _current_user_mock: MagicMock):
        _current_user_mock.get_team.return_value = A_TEAM
        flag_mock.query.filter_by.return_value.all.return_value = [
            Flag(id=1,
                 challenge_id=A_CHALLENGE.id,
                 is_regex=True,
                 value=self.REQUEST_BODY['flag'] + '1')
        ]

        result = submit_flag.func(event=A_EVENT, challenge=A_CHALLENGE)
        assert result == {'correct': False}
Пример #4
0
    def test_given_non_correct_regex_flag_should_persist_submission_with_is_correct_false(
            self, _db_mock: MagicMock, flag_mock: MagicMock,
            _current_user_mock: MagicMock):
        _current_user_mock.get_team.return_value = A_TEAM
        flag_mock.query.filter_by.return_value.all.return_value = [
            Flag(id=1,
                 challenge_id=A_CHALLENGE.id,
                 is_regex=True,
                 value=self.REQUEST_BODY['flag'] + '1')
        ]

        submit_flag.func(event=A_EVENT, challenge=A_CHALLENGE)

        _db_mock.session.add.assert_called_with(
            Submission(team_id=A_TEAM.id,
                       challenge_id=A_CHALLENGE.id,
                       input=self.REQUEST_BODY['flag'],
                       is_correct=False))
Пример #5
0
A_EVENT = Event(id=0, name="Test Event", teams=True)
AN_ADMINISTRATOR = Administrator(id=0, is_platform_admin=True, user_id=0)
AN_ADMINISTRATOR.event_administrators = \
    [EventAdministrator(id=0, administrator_id=0, event_id=0, event=A_EVENT)]
ANOTHER_ADMINISTRATOR = Administrator(id=1, is_platform_admin=False, user_id=1)

A_CATEGORY = Category(id=0, event_id=A_EVENT.id, name="Category")
A_CHALLENGE = Challenge(id=0,
                        name="Challenge name",
                        points=100,
                        hidden=False,
                        description="My description",
                        category=A_CATEGORY,
                        category_id=A_CATEGORY.id)
A_FLAG = Flag(id=None,
              challenge_id=A_CHALLENGE.id,
              is_regex=False,
              value="JDIS-FLAG")
A_CHALLENGE.flags = [A_FLAG]


class TestGetChallenge:
    @fixture(autouse=True)
    def _challenge_mock(self, challenge_mock: MagicMock):
        challenge_mock.side_effect = lambda *args, **kwargs: Challenge(
            *args, **kwargs)

    def test_given_non_existent_challenge_id_should_raise_not_found_error(
            self, challenge_mock: MagicMock, flag_mock: MagicMock):
        challenge_mock.query.filter_by.return_value.join.return_value.join.return_value.first.return_value = None
        flag_mock.query.filter_by.return_value.first.return_value = None