def attempt_capture(self, flag, submission): """ Compares a user provided token to the token in the db """ user = self.get_current_user() team = user.team logging.info("%s (%s) capture the flag '%s'" % (user.handle, team.name, flag.name)) if submission is not None and flag not in team.flags: if flag.capture(submission): 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 user.money += flag_value team.flags.append(flag) self.dbsession.add(user) self.dbsession.add(team) self.dbsession.commit() self.event_manager.flag_captured(team, flag) return True return False
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: price = "$" + str(flag.value) else: price = str(flag.value) + " points" flaginfo = [ { "name": flag.name, "description": flag.description, "token": flag.token, "price": price, } ] captures = [] for item in Flag.captures(flag.id): team = Team.by_id(item[0]) if team: captures.append({"name": team.name}) attempts = self.attempts(flag) 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: price = "$" + str(hint.price) else: price = str(hint.price) + " points" hints.append({"name": team.name, "price": price}) 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 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 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")