def delete_challenge(challenge_id: int, **kwargs): """ Deletes the specified challenge """ challenge = Challenge.query.filter_by(id=challenge_id).first() if not challenge: return not_found() current_username = kwargs['userinfo'].get('preferred_username') if not current_username: return no_username() groups = kwargs['userinfo'].get('groups') if (current_username != challenge.submitter) and (not is_ctf_admin(groups)): return not_authorized() if challenge.filename: threading.Thread( target=delete_s3_object, args=(challenge.filename,) ).start() delete_challenge_tags(challenge.id) delete_flags(challenge.id) challenge.delete() return jsonify({ 'status': "success" }), 200
def single_flag(challenge_id: int = 0, flag_id: int = 0, **kwargs): # pylint: disable=unused-argument """ Deletes the flag specified """ flag = Flag.query.filter_by(id=flag_id).first() if not flag: return not_found() current_username = kwargs['userinfo'].get('preferred_username') if not current_username: return no_username() groups = kwargs['userinfo'].get('groups') if current_username != flag.challenge.submitter and not is_ctf_admin( groups): return not_authorized() delete_flag(flag.id) return jsonify({'status': "success"}), 200
def single_tag(challenge_id: int, tag_name: str, **kwargs): """ Creates a tag """ challenge = Challenge.query.filter_by(id=challenge_id).first() if not challenge: return not_found() tag = ChallengeTag.query.filter_by(tag=tag_name, challenge_id=challenge_id).first() if tag: return collision() current_username = kwargs['userinfo'].get('preferred_username') if not current_username: return no_username() groups = kwargs['userinfo'].get('groups') if current_username != challenge.submitter and not is_ctf_admin(groups): return not_authorized() new_tag = ChallengeTag.create(challenge_id, tag_name) return jsonify(new_tag), 201
def add_flag(challenge_id: int, **kwargs): """ Create a flag given parameters in application/json body """ challenge = Challenge.query.filter_by(id=challenge_id).first() if not challenge: return not_found() data = request.get_json() flag_exists = Flag.query.filter_by(challenge_id=challenge_id, flag=data['flag']).first() if flag_exists: return collision() current_username = kwargs['userinfo'].get('preferred_username') if not current_username: return no_username() groups = kwargs['userinfo'].get('groups') if current_username != challenge.submitter and not is_ctf_admin(groups): return not_authorized() new_flag = Flag.create(data['point_value'], data['flag'], challenge_id) return jsonify(new_flag), 201
def delete_tag(challenge_id: int, tag_name: str, **kwargs): """ Deletes the specified tag """ challenge = Challenge.query.filter_by(id=challenge_id).first() if not challenge: return not_found() tag = ChallengeTag.query.filter(func.lower(ChallengeTag.tag) == func.lower(tag_name), ChallengeTag.challenge_id == challenge_id).first() if not tag: return not_found() current_username = kwargs['userinfo'].get('preferred_username') if not current_username: return no_username() groups = kwargs['userinfo'].get('groups') if current_username != challenge.submitter and not is_ctf_admin(groups): return not_authorized() tag.delete() return jsonify({ 'status': "success" }), 200