def failed_capture(self, flag, submission): user = self.get_current_user() if submission is not None and flag not in user.team.flags: if flag.is_file: submission = Flag.digest(submission) Penalty.create_attempt(team=user.team, flag=flag, submission=submission) if not self.config.penalize_flag_value: return False attempts = Penalty.by_count(flag, user.team) if attempts < self.config.flag_start_penalty: return False if attempts >= self.config.flag_stop_penalty: return False penalty = int( flag.dynamic_value(user.team) * self.config.flag_penalty_cost * 0.01) logging.info("%s (%s) capture failed '%s' - lost %s" % (user.handle, user.team.name, flag.name, penalty)) user.team.money -= penalty user.money -= penalty self.dbsession.add(user.team) self.dbsession.flush() self.event_manager.flag_penalty(user, flag) self.dbsession.commit() # Fire capture failed webhook send_capture_failed_webhook(user, flag) return penalty return False
def post(self, *args, **kwargs): ''' Reset the Game ''' errors = [] success = None try: users = User.all() for user in users: user.money = 0 teams = Team.all() for team in teams: if options.banking: team.money = options.starting_team_money else: team.money = 0 team.flags = [] team.hints = [] team.boxes = [] team.items = [] team.purchased_source_code = [] level_0 = GameLevel.by_number(0) if not level_0: level_0 = GameLevel.all()[0] team.game_levels = [level_0] self.dbsession.add(team) self.dbsession.commit() self.dbsession.flush() for team in teams: for paste in team.pastes: self.dbsession.delete(paste) for shared_file in team.files: shared_file.delete_data() self.dbsession.delete(shared_file) self.dbsession.commit() self.dbsession.flush() Penalty.clear() Notification.clear() snapshot = Snapshot.all() for snap in snapshot: self.dbsession.delete(snap) self.dbsession.commit() snapshot_team = SnapshotTeam.all() for snap in snapshot_team: self.dbsession.delete(snap) self.dbsession.commit() game_history = GameHistory.instance() game_history.take_snapshot() # Take starting snapshot flags = Flag.all() for flag in flags: flag.value = flag._original_value if flag._original_value else flag.value self.dbsession.add(flag) self.dbsession.commit() self.dbsession.flush() success = "Successfully Reset Game" self.render('admin/reset.html', success=success, errors=errors) except BaseException as e: errors.append("Failed to Reset Game") logging.error(str(e)) self.render('admin/reset.html', success=None, errors=errors)
def failed_capture(self, flag, submission): user = self.get_current_user() if submission is not None and flag not in user.team.flags: if flag.is_file: submission = Flag.digest(submission) Penalty.create_attempt( team=user.team, flag=flag, submission=submission, ) if not self.config.penalize_flag_value: return False attempts = Penalty.by_count(flag, user.team) if attempts < self.config.flag_start_penalty: return False if attempts >= self.config.flag_stop_penalty: return False penalty = int(flag.value * self.config.flag_penalty_cost * .01) logging.info("%s (%s) capture failed '%s' - lost %s" % ( user.handle, user.team.name, flag.name, penalty )) user.team.money -= penalty user.money -= penalty self.dbsession.add(user.team) self.dbsession.flush() self.event_manager.flag_penalty(user, flag) self.dbsession.commit() return penalty return False
def post(self, *args, **kwargs): """ Purchase a hint """ uuid = self.get_argument("uuid", "") hint = Hint.by_uuid(uuid) if hint is not None: user = self.get_current_user() flag = hint.flag if (flag and flag.box.flag_submission_type != FlagsSubmissionType.SINGLE_SUBMISSION_BOX and Penalty.by_count( flag, user.team) >= self.config.max_flag_attempts): self.render_page( hint.box, info=["You can no longer purchase this hint."]) elif hint.price <= user.team.money: logging.info( "%s (%s) purchased a hint for $%d on %s" % (user.handle, user.team.name, hint.price, hint.box.name)) self._purchase_hint(hint, user.team) self.render_page(hint.box) else: self.render_page( hint.box, info=["You cannot afford to purchase this hint."]) else: self.render("public/404.html")
def attempts(self, flag): attempts = [] teamcount = {} for item in Penalty.by_flag_id(flag.id): team = Team.by_id(item.team_id) if team.id in teamcount: teamcount.update({team.id: teamcount[team.id] + 1}) else: teamcount.update({team.id: 1}) if team: if team.id in teamcount: teamcount.update({team.id: teamcount[team.id] + 1}) else: teamcount.update({team.id: 1}) entries = { "name": team.name, "token": item.token, "flag": flag.uuid, "team": team.uuid, "type": flag.type, } if options.penalize_flag_value: penalty = "-" if options.banking: penalty += "$" if (teamcount[team.id] < options.flag_start_penalty or teamcount[team.id] > options.flag_stop_penalty): penalty += "0" else: penalty += str( int(flag.value * (options.flag_penalty_cost * 0.01))) entries.update({"penalty": penalty}) attempts.append(entries) return attempts
def post(self, *args, **kwargs): ''' Check validity of flag submissions ''' flag = Flag.by_uuid(self.get_argument('uuid', '')) user = self.get_current_user() if flag and flag in user.team.flags: self.render_page(flag) elif flag is not None and flag.game_level in user.team.game_levels: submission = '' if flag.is_file: if hasattr(self.request, 'files') and 'flag' in self.request.files: submission = self.request.files['flag'][0]['body'] else: submission = self.get_argument('token', '') old_reward = flag.value if self.attempt_capture(flag, submission): self.add_content_policy('script', "'unsafe-eval'") if self.config.story_mode: self.render('missions/captured.html', flag=flag, reward=old_reward) else: success = self.success_capture(flag) self.render_page(flag, success=success) else: if Penalty.by_token_count(flag, user.team, submission) == 0: if self.config.teams: teamval = "team's " else: teamval = "" penalty = self.failed_capture(flag, submission) penalty_dialog = "Sorry - Try Again" if penalty: if self.config.banking: penalty_dialog = "$" + str( penalty ) + " has been deducted from your " + teamval + "account." else: if penalty == 1: point = " point has" else: point = " points have" penalty_dialog = str( penalty ) + point + " been deducted from your " + teamval + "score." self.render_page(flag, errors=[penalty_dialog]) else: if self.config.teams: teamdup = " by your team. Try Again" else: teamdup = " by you. Try Again" self.render_page( flag, info=[ "Duplicate submission - this answer has already been attempted" + teamdup ]) else: self.render('public/404.html')
def post(self, *args, **kwargs): game_objects = { 'game_level': GameLevel, 'corporation': Corporation, 'flag': Flag, 'box': Box, 'hint': Hint, } obj_name = self.get_argument('obj', '') uuid = self.get_argument('uuid', '') if obj_name in game_objects.keys(): obj = game_objects[obj_name].by_uuid(uuid) if obj is not None: self.write(obj.to_dict()) else: self.write({'Error': 'Invalid uuid.'}) elif obj_name == "stats": flag = Flag.by_uuid(uuid) if flag is not None: if options.banking: flaginfo = [{"name": flag.name, "token": flag.token, "price": "$" + str(flag.value)}] else: flaginfo = [{"name": flag.name, "token": flag.token, "price": str(flag.value) + " points"}] captures = [] for item in Flag.captures(flag.id): team = Team.by_id(item[0]) if team: captures.append({"name": team.name}) attempts = [] for item in Penalty.by_flag_id(flag.id): team = Team.by_id(item.team_id) if team: attempts.append({"name": team.name, "token": item.token}) hints = [] for item in Hint.taken_by_flag(flag.id): team = Team.by_id(item.team_id) hint = Hint.by_id(item.hint_id) if team: if options.banking: hints.append({"name": team.name, "price": "$" + str(hint.price)}) else: hints.append({"name": team.name, "price": str(hint.price) + " points"}) obj = { "flag": flaginfo, "captures": captures, "attempts": attempts, "hints": hints, } self.write(obj) else: self.write({'Error': 'Invalid uuid.'}) else: self.write({'Error': 'Invalid object type.'}) self.finish()
def failed_attempt(self, flag, user, submission, box_id): if flag is None or Penalty.by_token_count(flag, user.team, submission) == 0: if self.config.teams: teamval = "team's " else: teamval = "" penalty = self.failed_capture(flag, submission) if flag is not None else 0 penalty_dialog = "Sorry - Try Again" if penalty: if self.config.banking: penalty_dialog = ( "$" + str(penalty) + " has been deducted from your " + teamval + "account." ) else: if penalty == 1: point = " point has" else: point = " points have" penalty_dialog = ( str(penalty) + point + " been deducted from your " + teamval + "score." ) if flag is None: self.render_page_by_box_id(box_id, errors=[penalty_dialog]) else: self.render_page_by_flag(flag, errors=[penalty_dialog]) return else: if self.config.teams: teamdup = " by your team. Try Again" else: teamdup = " by you. Try Again" self.render_page_by_flag( flag, info=[ "Duplicate submission - this answer has already been attempted" + teamdup ], ) return
def post(self, *args, **kwargs): if args[0] == "statistics" or args[0] == "game_objects": uri = { "game_objects": "admin/view/game_objects.html", "statistics": "admin/view/statistics.html", } flag_uuid = self.get_argument("flag_uuid", "") team_uuid = self.get_argument("team_uuid", "") flag = Flag.by_uuid(flag_uuid) team = Team.by_uuid(team_uuid) errors = [] success = [] if flag: point_restore = self.get_argument("point_restore", "") accept_answer = self.get_argument("accept_answer", "") answer_token = self.get_argument("answer_token", "") if point_restore == "on" and options.penalize_flag_value and team: value = int( flag.dynamic_value(team) * (options.flag_penalty_cost * 0.01)) team.money += value penalty = Penalty.by_team_token(flag, team, answer_token) if penalty: self.dbsession.delete(penalty) self.dbsession.add(team) self.dbsession.commit() self.event_manager.admin_score_update( team, "%s penalty reversed - score has been updated." % team.name, value, ) if flag not in team.flags: flag_value = flag.dynamic_value(team) if (self.config.dynamic_flag_value and self.config.dynamic_flag_type == "decay_all"): for item in Flag.captures(flag.id): tm = Team.by_id(item[0]) deduction = flag.dynamic_value(tm) - flag_value tm.money = int(tm.money - deduction) self.dbsession.add(tm) self.event_manager.flag_decayed(tm, flag) team.money += flag_value team.flags.append(flag) self.dbsession.add(team) self.dbsession.commit() self.event_manager.flag_captured(team, flag) self._check_level(flag, team) success.append("%s awarded %d" % (team.name, flag_value)) if (accept_answer == "on" and (flag.type == "static" or flag.type == "regex") and not flag.capture(answer_token)): flag.type = "regex" if flag.token.startswith("(") and flag.token.endwith(")"): token = "%s|(%s)" % (flag.token, answer_token) else: token = "(%s)|(%s)" % (flag.token, answer_token) if len(token) < 256: flag.token = token self.dbsession.add(flag) self.dbsession.commit() success.append("Token successfully added for Flag %s" % flag.name) else: errors.append( "Flag token too long. Can not expand token.") self.render(uri[args[0]], errors=errors, success=success) else: self.render("public/404.html")
def post(self, *args, **kwargs): ''' Purchase a hint ''' uuid = self.get_argument('uuid', '') hint = Hint.by_uuid(uuid) if hint is not None: user = self.get_current_user() if self.application.settings['game_started'] or user.is_admin(): flag = hint.flag if flag and flag.box.flag_submission_type != FlagsSubmissionType.SINGLE_SUBMISSION_BOX and Penalty.by_count( flag, user.team) >= self.config.max_flag_attempts: self.render_page( hint.box, info=["You can no longer purchase this hint."]) elif hint.price <= user.team.money: logging.info("%s (%s) purchased a hint for $%d on %s" % (user.handle, user.team.name, hint.price, hint.box.name)) self._purchase_hint(hint, user.team) self.render_page(hint.box) else: self.render_page( hint.box, info=["You cannot afford to purchase this hint."]) else: self.render('missions/status.html', errors=None, info=["The game has not started yet"]) else: self.render('public/404.html')
def post(self, *args, **kwargs): ''' Check validity of flag submissions ''' box_id = self.get_argument('box_id', None) uuid = self.get_argument('uuid', '') token = self.get_argument('token', '') user = self.get_current_user() if not self.application.settings['game_started'] and not user.is_admin( ): self.render('missions/status.html', errors=None, info=["The game has not started yet"]) return if (box_id is not None and token is not None): flag = Flag.by_token_and_box_id(token, box_id) else: flag = Flag.by_uuid(uuid) if flag is not None and Penalty.by_count( flag, user.team) >= self.config.max_flag_attempts: self.render_page_by_flag( flag, info=[ "Max attempts reached - you can no longer answer this flag." ]) return if flag and flag in user.team.flags: self.render_page_by_flag(flag) elif flag is None or flag.game_level.type == 'none' or flag.game_level in user.team.game_levels: submission = '' if flag is not None and flag.is_file: if hasattr(self.request, 'files') and 'flag' in self.request.files: submission = self.request.files['flag'][0]['body'] else: submission = self.get_argument('token', '') if len(submission) == 0: self.render_page_by_flag( flag, info=["No flag was provided - try again."]) old_reward = flag.value if flag is not None else 0 if flag is not None and self.attempt_capture(flag, submission): self.add_content_policy('script', "'unsafe-eval'") if self.config.story_mode and flag.capture_message and len( flag.capture_message) > 0: self.render('missions/captured.html', flag=flag, reward=old_reward) else: success = self.success_capture(flag, old_reward) self.render_page_by_flag(flag, success=success) else: if flag is None or Penalty.by_token_count( flag, user.team, submission) == 0: if self.config.teams: teamval = "team's " else: teamval = "" penalty = self.failed_capture( flag, submission) if flag is not None else 0 penalty_dialog = "Sorry - Try Again" if penalty: if self.config.banking: penalty_dialog = "$" + str( penalty ) + " has been deducted from your " + teamval + "account." else: if penalty == 1: point = " point has" else: point = " points have" penalty_dialog = str( penalty ) + point + " been deducted from your " + teamval + "score." if flag is None: self.render_page_by_box_id(box_id, errors=[penalty_dialog]) else: self.render_page_by_flag(flag, errors=[penalty_dialog]) else: if self.config.teams: teamdup = " by your team. Try Again" else: teamdup = " by you. Try Again" self.render_page_by_flag( flag, info=[ "Duplicate submission - this answer has already been attempted" + teamdup ]) else: self.render('public/404.html')
def post(self, *args, **kwargs): """ Check validity of flag submissions """ box_id = self.get_argument("box_id", None) uuid = self.get_argument("uuid", "") token = self.get_argument("token", "") user = self.get_current_user() if (box_id and Box.by_id(box_id).locked) or ( box_id is None and uuid and Flag.by_uuid(uuid).box.locked): self.render( "missions/status.html", errors=None, info=["This box is currently locked by the Admin."], ) return if (token is not None and box_id is not None and Box.by_id(box_id).flag_submission_type == FlagsSubmissionType.SINGLE_SUBMISSION_BOX): flag = Flag.by_token_and_box_id(token, box_id) else: flag = Flag.by_uuid(uuid) if (flag is not None and Penalty.by_count(flag, user.team) >= self.config.max_flag_attempts): self.render_page_by_flag( flag, info=[ "Max attempts reached - you can no longer answer this flag." ], ) return if flag and flag in user.team.flags: self.render_page_by_flag(flag) return elif (flag is None or flag.game_level.type == "none" or flag.game_level in user.team.game_levels): submission = "" if flag is not None and flag.is_file: if hasattr(self.request, "files") and "flag" in self.request.files: submission = self.request.files["flag"][0]["body"] else: submission = self.get_argument("token", "").replace("__quote__", '"') if len(submission) == 0: self.render_page_by_flag( flag, info=["No flag was provided - try again."]) return old_reward = flag.dynamic_value( user.team) if flag is not None else 0 if flag is not None and self.attempt_capture(flag, submission): self.add_content_policy("script", "'unsafe-eval'") success = self.success_capture(flag, old_reward) if self.config.story_mode: box = flag.box if not (len(box.capture_message) > 0 and box.is_complete(user)): box = None has_capture_message = (len(flag.capture_message) > 0 or box is not None) if has_capture_message: self.render( "missions/captured.html", flag=flag, box=box, reward=old_reward, success=success, ) return self.render_page_by_flag(flag, success=success) return else: self.failed_attempt(flag, user, submission, box_id) else: self.render("public/404.html")
def post(self, *args, **kwargs): """ Reset the Game """ errors = [] success = None try: users = User.all() for user in users: user.money = 0 teams = Team.all() for team in teams: if options.banking: team.money = options.starting_team_money else: team.money = 0 team.flags = [] team.hints = [] team.boxes = [] team.items = [] team.purchased_source_code = [] level_0 = GameLevel.by_number(0) if not level_0: level_0 = GameLevel.all()[0] team.game_levels = [level_0] self.dbsession.add(team) self.dbsession.commit() self.dbsession.flush() for team in teams: for paste in team.pastes: self.dbsession.delete(paste) for shared_file in team.files: shared_file.delete_data() self.dbsession.delete(shared_file) self.dbsession.commit() self.dbsession.flush() Penalty.clear() Notification.clear() snapshot = Snapshot.all() for snap in snapshot: self.dbsession.delete(snap) self.dbsession.commit() snapshot_team = SnapshotTeam.all() for snap in snapshot_team: self.dbsession.delete(snap) self.dbsession.commit() game_history = GameHistory.instance() game_history.take_snapshot() # Take starting snapshot flags = Flag.all() for flag in flags: # flag.value = flag.value allows a fallback to when original_value was used # Allows for the flag value to be reset if dynamic scoring was used # Can be removed after depreciation timeframe flag.value = flag.value self.dbsession.add(flag) self.dbsession.commit() self.dbsession.flush() self.event_manager.push_score_update() self.flush_memcached() success = "Successfully Reset Game" self.render("admin/reset.html", success=success, errors=errors) except BaseException as e: errors.append("Failed to Reset Game") logging.error(str(e)) self.render("admin/reset.html", success=None, errors=errors)
def post(self, *args, **kwargs): """ Check validity of flag submissions """ box_id = self.get_argument("box_id", None) uuid = self.get_argument("uuid", "") token = self.get_argument("token", "") user = self.get_current_user() if not self.application.settings["game_started"] and not user.is_admin(): self.render( "missions/status.html", errors=None, info=["The game has not started yet"], ) return if box_id is not None and token is not None: flag = Flag.by_token_and_box_id(token, box_id) else: flag = Flag.by_uuid(uuid) if ( flag is not None and Penalty.by_count(flag, user.team) >= self.config.max_flag_attempts ): self.render_page_by_flag( flag, info=["Max attempts reached - you can no longer answer this flag."], ) return if flag and flag in user.team.flags: self.render_page_by_flag(flag) return elif ( flag is None or flag.game_level.type == "none" or flag.game_level in user.team.game_levels ): submission = "" if flag is not None and flag.is_file: if hasattr(self.request, "files") and "flag" in self.request.files: submission = self.request.files["flag"][0]["body"] else: submission = self.get_argument("token", "") if len(submission) == 0: self.render_page_by_flag( flag, info=["No flag was provided - try again."] ) return old_reward = flag.value if flag is not None else 0 if flag is not None and self.attempt_capture(flag, submission): self.add_content_policy("script", "'unsafe-eval'") success = self.success_capture(flag, old_reward) if self.config.story_mode: box = flag.box if not (len(box.capture_message) > 0 and box.is_complete(user)): box = None has_capture_message = ( len(flag.capture_message) > 0 or box is not None ) if has_capture_message: self.render( "missions/captured.html", flag=flag, box=box, reward=old_reward, success=success, ) return self.render_page_by_flag(flag, success=success) return else: self.failed_attempt(flag, user, submission, box_id) else: self.render("public/404.html")
def post(self, *args, **kwargs): ''' Check validity of flag submissions ''' box_id = self.get_argument('box_id', None) uuid = self.get_argument('uuid', '') token = self.get_argument('token', '') user = self.get_current_user() if not self.application.settings['game_started'] and not user.is_admin(): self.render('missions/status.html', errors=None, info=["The game has not started yet"]) return if(box_id is not None and token is not None): flag = Flag.by_token_and_box_id(token, box_id) else: flag = Flag.by_uuid(uuid) if flag is not None and Penalty.by_count(flag, user.team) >= self.config.max_flag_attempts: self.render_page_by_flag(flag, info=["Max attempts reached - you can no longer answer this flag."]) return if flag and flag in user.team.flags: self.render_page_by_flag(flag) elif flag is None or flag.game_level.type == 'none' or flag.game_level in user.team.game_levels: submission = '' if flag is not None and flag.is_file: if hasattr(self.request, 'files') and 'flag' in self.request.files: submission = self.request.files['flag'][0]['body'] else: submission = self.get_argument('token', '') if len(submission) == 0: self.render_page_by_flag(flag, info=["No flag was provided - try again."]) old_reward = flag.value if flag is not None else 0 if flag is not None and self.attempt_capture(flag, submission): self.add_content_policy('script', "'unsafe-eval'") if self.config.story_mode and flag.capture_message and len(flag.capture_message) > 0: self.render('missions/captured.html', flag=flag, reward=old_reward) else: success = self.success_capture(flag, old_reward) self.render_page_by_flag(flag, success=success) else: if flag is None or Penalty.by_token_count(flag, user.team, submission) == 0: if self.config.teams: teamval = "team's " else: teamval = "" penalty = self.failed_capture(flag, submission) if flag is not None else 0 penalty_dialog = "Sorry - Try Again" if penalty: if self.config.banking: penalty_dialog = "$" + str(penalty) + " has been deducted from your " + teamval + "account." else: if penalty == 1: point = " point has" else: point = " points have" penalty_dialog = str(penalty) + point + " been deducted from your " + teamval + "score." if flag is None: self.render_page_by_box_id(box_id, errors=[penalty_dialog]) else: self.render_page_by_flag(flag, errors=[penalty_dialog]) else: if self.config.teams: teamdup = " by your team. Try Again" else: teamdup = " by you. Try Again" self.render_page_by_flag(flag, info=["Duplicate submission - this answer has already been attempted" + teamdup]) else: self.render('public/404.html')
def post(self, *args, **kwargs): ''' Purchase a hint ''' uuid = self.get_argument('uuid', '') hint = Hint.by_uuid(uuid) if hint is not None: user = self.get_current_user() if self.application.settings['game_started'] or user.is_admin(): flag = hint.flag if flag and flag.box.flag_submission_type != FlagsSubmissionType.SINGLE_SUBMISSION_BOX and Penalty.by_count(flag, user.team) >= self.config.max_flag_attempts: self.render_page( hint.box, info=["You can no longer purchase this hint."]) elif hint.price <= user.team.money: logging.info("%s (%s) purchased a hint for $%d on %s" % ( user.handle, user.team.name, hint.price, hint.box.name )) self._purchase_hint(hint, user.team) self.render_page(hint.box) else: self.render_page( hint.box, info=["You cannot afford to purchase this hint."]) else: self.render('missions/status.html', errors=None, info=["The game has not started yet"]) else: self.render('public/404.html')
def post(self, *args, **kwargs): """ Check validity of flag submissions """ box_id = self.get_argument("box_id", None) uuid = self.get_argument("uuid", "") token = self.get_argument("token", "") user = self.get_current_user() if not self.application.settings["game_started"] and not user.is_admin( ): self.render( "missions/status.html", errors=None, info=["The game has not started yet"], ) return if box_id is not None and token is not None: flag = Flag.by_token_and_box_id(token, box_id) else: flag = Flag.by_uuid(uuid) if (flag is not None and Penalty.by_count(flag, user.team) >= self.config.max_flag_attempts): self.render_page_by_flag( flag, info=[ "Max attempts reached - you can no longer answer this flag." ], ) return if flag and flag in user.team.flags: self.render_page_by_flag(flag) elif (flag is None or flag.game_level.type == "none" or flag.game_level in user.team.game_levels): submission = "" if flag is not None and flag.is_file: if hasattr(self.request, "files") and "flag" in self.request.files: submission = self.request.files["flag"][0]["body"] else: submission = self.get_argument("token", "") if len(submission) == 0: self.render_page_by_flag( flag, info=["No flag was provided - try again."]) old_reward = flag.value if flag is not None else 0 if flag is not None and self.attempt_capture(flag, submission): self.add_content_policy("script", "'unsafe-eval'") success = self.success_capture(flag, old_reward) if self.config.story_mode: box = flag.box if not (len(box.capture_message) > 0 and box.is_complete(user)): box = None has_capture_message = (len(flag.capture_message) > 0 or box is not None) if has_capture_message: self.render( "missions/captured.html", flag=flag, box=box, reward=old_reward, success=success, ) return self.render_page_by_flag(flag, success=success) else: if (flag is None or Penalty.by_token_count( flag, user.team, submission) == 0): if self.config.teams: teamval = "team's " else: teamval = "" penalty = (self.failed_capture(flag, submission) if flag is not None else 0) penalty_dialog = "Sorry - Try Again" if penalty: if self.config.banking: penalty_dialog = ("$" + str(penalty) + " has been deducted from your " + teamval + "account.") else: if penalty == 1: point = " point has" else: point = " points have" penalty_dialog = (str(penalty) + point + " been deducted from your " + teamval + "score.") if flag is None: self.render_page_by_box_id(box_id, errors=[penalty_dialog]) else: self.render_page_by_flag(flag, errors=[penalty_dialog]) else: if self.config.teams: teamdup = " by your team. Try Again" else: teamdup = " by you. Try Again" self.render_page_by_flag( flag, info=[ "Duplicate submission - this answer has already been attempted" + teamdup ], ) else: self.render("public/404.html")