From 0b5b560a70b952df5fbc72444fc5ac472ef39975 Mon Sep 17 00:00:00 2001 From: WizzyGeek Date: Sun, 14 Jan 2024 02:10:32 +0530 Subject: [PATCH 1/2] add: problem visibility --- src/pwncore/models/ctf.py | 1 + src/pwncore/routes/ctf/__init__.py | 10 +++++----- src/pwncore/routes/ctf/start.py | 4 +++- src/pwncore/routes/leaderboard.py | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/pwncore/models/ctf.py b/src/pwncore/models/ctf.py index 34456c7..47373c4 100644 --- a/src/pwncore/models/ctf.py +++ b/src/pwncore/models/ctf.py @@ -34,6 +34,7 @@ class Problem(BaseProblem): mi = fields.IntField(default=100) # Arbitrary meaning full defaults ma = fields.IntField(default=600) + visible = fields.BooleanField(default=True) hints: fields.ReverseRelation[Hint] diff --git a/src/pwncore/routes/ctf/__init__.py b/src/pwncore/routes/ctf/__init__.py index e39e879..89df855 100644 --- a/src/pwncore/routes/ctf/__init__.py +++ b/src/pwncore/routes/ctf/__init__.py @@ -54,7 +54,7 @@ class Flag(BaseModel): @router.get("/list") async def ctf_list(): - problems = await BaseProblem_Pydantic.from_queryset(Problem.all()) + problems = await BaseProblem_Pydantic.from_queryset(Problem.filter(visible=True)) return problems @@ -73,7 +73,7 @@ async def flag_post( req: Request, ctf_id: int, flag: Flag, response: Response, jwt: RequireJwt ): team_id = jwt["team_id"] - problem = await Problem.get_or_none(id=ctf_id) + problem = await Problem.get_or_none(id=ctf_id, visible=True) if not problem: response.status_code = 404 return {"msg_code": config.msg_codes["ctf_not_found"]} @@ -102,7 +102,7 @@ async def flag_post( @router.get("/{ctf_id}/hint") async def hint_get(ctf_id: int, response: Response, jwt: RequireJwt): team_id = jwt["team_id"] - problem = await Problem.exists(id=ctf_id) + problem = await Problem.exists(id=ctf_id, visible=True) if not problem: response.status_code = 404 return {"msg_code": config.msg_codes["ctf_not_found"]} @@ -151,14 +151,14 @@ async def viewed_problem_hints_get(ctf_id: int, jwt: RequireJwt): async def completed_problem_get(jwt: RequireJwt): team_id = jwt["team_id"] problems = await BaseProblem_Pydantic.from_queryset( - Problem.filter(solvedproblems__team_id=team_id) + Problem.filter(solvedproblems__team_id=team_id, visible=True) ) return problems @router.get("/{ctf_id}") async def ctf_get(ctf_id: int, response: Response): - problem = await BaseProblem_Pydantic.from_queryset(Problem.filter(id=ctf_id)) + problem = await BaseProblem_Pydantic.from_queryset(Problem.filter(id=ctf_id, visible=True)) if not problem: response.status_code = 404 return {"msg_code": config.msg_codes["ctf_not_found"]} diff --git a/src/pwncore/routes/ctf/start.py b/src/pwncore/routes/ctf/start.py index 23ad2f9..ef62a98 100644 --- a/src/pwncore/routes/ctf/start.py +++ b/src/pwncore/routes/ctf/start.py @@ -26,7 +26,7 @@ async def start_docker_container(ctf_id: int, response: Response, jwt: RequireJw } """ - ctf = await Problem.get_or_none(id=ctf_id) + ctf = await Problem.get_or_none(id=ctf_id, visible=True) if not ctf: response.status_code = 404 return {"msg_code": config.msg_codes["ctf_not_found"]} @@ -131,6 +131,8 @@ async def stopall_docker_container(response: Response, jwt: RequireJwt): @atomic() @router.post("/{ctf_id}/stop") async def stop_docker_container(ctf_id: int, response: Response, jwt: RequireJwt): + # Let this work on invisible problems incase + # we mess up the database while making problems visible ctf = await Problem.get_or_none(id=ctf_id) if not ctf: response.status_code = 404 diff --git a/src/pwncore/routes/leaderboard.py b/src/pwncore/routes/leaderboard.py index ed07e2c..2f9d0fe 100644 --- a/src/pwncore/routes/leaderboard.py +++ b/src/pwncore/routes/leaderboard.py @@ -27,7 +27,7 @@ def __init__(self, period: float) -> None: async def _do_update(self): self.data = dict( await Team.all() - .filter(solved_problem__problem__id__gt=-1) + .filter(solved_problem__problem__visible=True) .annotate( tpoints=Sum( RawSQL( From 8dccb8bd75c9688a7d579547851cd0a55117edc1 Mon Sep 17 00:00:00 2001 From: WizzyGeek Date: Sun, 14 Jan 2024 02:32:27 +0530 Subject: [PATCH 2/2] chore: format --- src/pwncore/routes/ctf/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pwncore/routes/ctf/__init__.py b/src/pwncore/routes/ctf/__init__.py index 89df855..6fe1943 100644 --- a/src/pwncore/routes/ctf/__init__.py +++ b/src/pwncore/routes/ctf/__init__.py @@ -158,7 +158,9 @@ async def completed_problem_get(jwt: RequireJwt): @router.get("/{ctf_id}") async def ctf_get(ctf_id: int, response: Response): - problem = await BaseProblem_Pydantic.from_queryset(Problem.filter(id=ctf_id, visible=True)) + problem = await BaseProblem_Pydantic.from_queryset( + Problem.filter(id=ctf_id, visible=True) + ) if not problem: response.status_code = 404 return {"msg_code": config.msg_codes["ctf_not_found"]}