def regen_all(cls, context): """重算所有缓存,只有通过命令行提权后才能调用""" User.test_permission(context) models.User.objects.all().delete() models.Expr.objects.all().delete() models.ExprFlag.objects.all().delete() for challenge in cls.get_all(context): for i, flag in enumerate(challenge.flags): if flag['type'] != 'expr': continue challenge._obj.expr_set.create(flag_index=i, expr=flag['flag']) for user in User.get_all(context): if not user.token: continue cls._add_user(user.pk) models.User.objects.create(user=user.pk)
def get(self, request): context = Context.from_request(request) try: return TemplateResponse( request, 'first.html', { 'filters': { 'group': request.GET.get('group', None), }, 'users': {u.pk: u.json for u in User.get_all(context)}, 'challenges': [c.json for c in Challenge.get_enabled(context)], }) except Error as e: messages.error(request, e.message) return redirect('hub')
def get(self, request): context = Context.from_request(request) try: return TemplateResponse( request, 'board.html', { 'filters': { 'category': request.GET.get('category', None), 'group': request.GET.get('group', None), }, 'users': {u.pk: u.display_name for u in User.get_all(context)}, }) except Error as e: messages.error(request, e.message) return redirect('hub')
def do_get_all(self, context): return [obj.json for obj in User.get_all(context)]
def get_extra_context(self, context): return { 'users': {u.pk: u.display_name for u in User.get_all(context)}, 'challenges': [c.json for c in Challenge.get_all(context)], }
def handle(self, fake_complex_challenges, fake_simple_challenges, fake_users, fake_submissions, game_started_seconds, **options): root = User.create( Context(elevated=True), group='other', nickname='root', ).user root.is_staff = True root.is_superuser = True root.save() root.refresh_from_db() Account.objects.create(provider='debug', identity='root', user=root) c1 = Challenge.create( Context(root), name='签到题', category='checkin', detail='签到题描述', url='https://example.com/{token}', prompt='flag{hackergame}', index=-100, enabled=True, flags=[{ 'name': '', 'score': 10, 'type': 'text', 'flag': 'flag{hackergame}', }], ) Submission.submit(Context(root), root.pk, c1.pk, 'flag{hackergame}') for i in range(1, fake_complex_challenges + 1): Challenge.create( Context(root), name=f'复杂题 {i}', category='complex', detail='<code>flag{FLAG_INDEX}</code> 或 ' '<code>flag{FLAG_INDEX:USER_ID}</code>', url='', prompt='flag{...}', index=random.randrange(100), enabled=random.choice((False, True, True, True, True)), flags=[{ 'name': f'flag {j}', 'score': random.randrange(100), 'type': ('expr', 'text')[j % 2], 'flag': ("f'flag{{%s:{token.partition(\":\")[0]}}}'" % j, f'flag{{{j}}}')[j % 2], } for j in range(random.randrange(1, 4))], ) for i in range(1, fake_simple_challenges + 1): Challenge.create( Context(root), name=f'简单题 {i}', category='simple', detail='', url='', prompt=('flag{0}', 'flag{0:USER_ID}')[i % 2], index=random.randrange(100), enabled=random.choice((False, True, True, True, True)), flags=[{ 'name': '', 'score': random.randrange(100), 'type': ('text', 'expr')[i % 2], 'flag': ('flag{0}', "'flag{0:'+token.partition(':')[0]+'}'")[i % 2], }], ) terms = Terms.create(Context(root), name='条款', content='1 2 3 ...', enabled=True) now = timezone.now() timestamps = [] for i in range(fake_submissions): delta = random.randrange(game_started_seconds) timestamps.append(now - timezone.timedelta(seconds=delta)) timestamps.sort() Trigger.create(Context(root), time=min(timestamps), state=True) groups = list(set(User.groups.keys()) - {'staff', 'banned'}) for i in range(fake_users): print('user', i, end='\r') u = User.create( Context(elevated=True), group=random.choice(groups), nickname='用户 ' * 8 + str(i), name='姓名', sno='PB11111111', tel='123456789', email='*****@*****.**', gender=random.choice(('female', 'male')), qq='12345', school='foo', grade='1', ) Terms.get(Context(u.user), terms.pk).agree(u.pk) Account.objects.create(provider='debug', identity=f'{i}', user=u.user) users = [i.pk for i in User.get_all(Context(root))] challenges = [i.pk for i in Challenge.get_all(Context(root))] for i in range(fake_submissions): print('submission', i, end='\r') try: u = random.choice(users) c = random.choice(challenges) fs = len(Challenge.get(Context(root), c).flags) Submission.submit( Context( User.get(Context(root), u).user, timestamps[i] ), u, c, f'flag{{{random.choice(range(fs))}:{u}}}' ) Submission.submit( Context( User.get(Context(root), u).user, timestamps[i] + timezone.timedelta(seconds=20) ), u, c, f'flag{{{random.choice(range(fs))}}}' ) except (NotFound, SlowDown): pass Challenge.create( Context(root), name='难题', category='hard', detail='难题描述', url='https://example.com/{token}', prompt='flag{hackergame}', index=100, enabled=True, flags=[{ 'name': '', 'score': 100, 'type': 'text', 'flag': 'flag{hackergame}', }], )