From 342986d5701dd2d78cb98597a2eb410a01e001f5 Mon Sep 17 00:00:00 2001 From: Mikefrfr Date: Sat, 22 Feb 2025 16:16:47 +0530 Subject: [PATCH 1/5] Modified team model to add tableTN and edited team.py to POST /team/{id} --- src/pwncore/routes/team.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/pwncore/routes/team.py b/src/pwncore/routes/team.py index 6d9b0ed..a00df1a 100644 --- a/src/pwncore/routes/team.py +++ b/src/pwncore/routes/team.py @@ -26,6 +26,9 @@ class UserAddBody(BaseModel): class UserRemoveBody(BaseModel): tag: str +class TableTNBody(BaseModel): + table_tn: int | None + @router.get("/list") async def team_list(): @@ -116,3 +119,27 @@ async def get_team_containers(response: Response, jwt: RequireJwt): ) return result + +@atomic() +@router.post("/tabletn/{id}") +async def upsert_table_tn(id: int, data: TableTNBody, response: Response, jwt: RequireJwt): + # Admin-only access + if not jwt.get("is_admin", False): + response.status_code = 403 + return {"msg_code": "not_authorized"} + + # Get the team by ID + team = await Team.get_or_none(id=id) + if not team: + response.status_code = 404 + return {"msg_code": "team_not_found"} + + # Upsert the TableTN value + try: + team.table_tn = data.table_tn + await team.save() + except Exception: + response.status_code = 500 + return {"msg_code": "db_error"} + + return {"msg_code": "tabletn_upserted"} \ No newline at end of file From b1152b189fcb61b2e3c10cd85c66c6a5ce2e1953 Mon Sep 17 00:00:00 2001 From: Mikefrfr Date: Sat, 22 Feb 2025 16:25:08 +0530 Subject: [PATCH 2/5] modified team model and team.py --- src/pwncore/models/user.py | 3 ++- src/pwncore/routes/team.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pwncore/models/user.py b/src/pwncore/models/user.py index fad8b68..d8981dc 100644 --- a/src/pwncore/models/user.py +++ b/src/pwncore/models/user.py @@ -51,7 +51,8 @@ class Team(Model): secret_hash = fields.TextField() coins = fields.IntField(default=0) points = fields.IntField(default=0) - + table_tn = fields.IntField(null=True) + members: fields.ReverseRelation[User] containers: fields.ReverseRelation[Container] diff --git a/src/pwncore/routes/team.py b/src/pwncore/routes/team.py index a00df1a..405b6e1 100644 --- a/src/pwncore/routes/team.py +++ b/src/pwncore/routes/team.py @@ -121,7 +121,7 @@ async def get_team_containers(response: Response, jwt: RequireJwt): return result @atomic() -@router.post("/tabletn/{id}") +@router.post("/team/{id}") async def upsert_table_tn(id: int, data: TableTNBody, response: Response, jwt: RequireJwt): # Admin-only access if not jwt.get("is_admin", False): From 16f6a845368817a7ddb96c8b65ab93f4d4c85024 Mon Sep 17 00:00:00 2001 From: Mikefrfr Date: Fri, 28 Feb 2025 15:31:36 +0530 Subject: [PATCH 3/5] updated team.py --- src/pwncore/routes/team.py | 46 ++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/pwncore/routes/team.py b/src/pwncore/routes/team.py index 405b6e1..1023326 100644 --- a/src/pwncore/routes/team.py +++ b/src/pwncore/routes/team.py @@ -10,7 +10,7 @@ # from pwncore.routes.leaderboard import gcache -# Metadata at the top for instant accessibility +# Metadata at the top for instant caccessibility metadata = {"name": "team", "description": "Operations with teams"} router = APIRouter(prefix="/team", tags=["team"]) @@ -121,20 +121,52 @@ async def get_team_containers(response: Response, jwt: RequireJwt): return result @atomic() -@router.post("/team/{id}") -async def upsert_table_tn(id: int, data: TableTNBody, response: Response, jwt: RequireJwt): - # Admin-only access - if not jwt.get("is_admin", False): +@router.post("/remove") +async def remove_member(user_info: UserRemoveBody, response: Response, jwt: RequireJwt): + team_id = jwt["team_id"] + user = await User.get_or_none(team_id=team_id, tag=user_info.tag) + + if not user: response.status_code = 403 + return {"msg_code": config.msg_codes["user_not_in_team"]} + + try: + await user.delete() + except Exception: + response.status_code = 500 + return {"msg_code": config.msg_codes["db_error"]} + + return {"msg_code": config.msg_codes["user_removed"]} + + +@router.get("/containers") +async def get_team_containers(response: Response, jwt: RequireJwt): + containers = await Container.filter(team_id=jwt["team_id"]).prefetch_related( + "ports", "problem" + ) + + result = { + container.problem.id: await container.ports.all().values_list("port", flat=True) + for container in containers + } + + return result + + +@atomic() +@router.post("team/{id}") +async def upsert_table_tn(id: int, data: TableTNBody, request: Request, response: Response): + admin_password = (await request.body()).strip() + + if not bcrypt.verify(admin_password, ADMIN_HASH): + response.status_code = 401 return {"msg_code": "not_authorized"} - # Get the team by ID team = await Team.get_or_none(id=id) if not team: response.status_code = 404 return {"msg_code": "team_not_found"} - # Upsert the TableTN value try: team.table_tn = data.table_tn await team.save() From e098c193579fbc3d3f0b8497cb4ee7d1e75355eb Mon Sep 17 00:00:00 2001 From: Mikefrfr Date: Thu, 6 Mar 2025 11:48:10 +0530 Subject: [PATCH 4/5] removed the non-required changes, added the import message. --- src/pwncore/routes/team.py | 53 +++----------------------------------- 1 file changed, 3 insertions(+), 50 deletions(-) diff --git a/src/pwncore/routes/team.py b/src/pwncore/routes/team.py index 1023326..b0a764f 100644 --- a/src/pwncore/routes/team.py +++ b/src/pwncore/routes/team.py @@ -7,10 +7,11 @@ from pwncore.config import config from pwncore.models import Team, User, Team_Pydantic, User_Pydantic, Container from pwncore.routes.auth import RequireJwt +from pwncore.routes.admin import ADMIN_HASH # from pwncore.routes.leaderboard import gcache -# Metadata at the top for instant caccessibility +# Metadata at the top for instant accessibility metadata = {"name": "team", "description": "Operations with teams"} router = APIRouter(prefix="/team", tags=["team"]) @@ -120,58 +121,10 @@ async def get_team_containers(response: Response, jwt: RequireJwt): return result -@atomic() -@router.post("/remove") -async def remove_member(user_info: UserRemoveBody, response: Response, jwt: RequireJwt): - team_id = jwt["team_id"] - user = await User.get_or_none(team_id=team_id, tag=user_info.tag) - - if not user: - response.status_code = 403 - return {"msg_code": config.msg_codes["user_not_in_team"]} - - try: - await user.delete() - except Exception: - response.status_code = 500 - return {"msg_code": config.msg_codes["db_error"]} - - return {"msg_code": config.msg_codes["user_removed"]} - - -@router.get("/containers") -async def get_team_containers(response: Response, jwt: RequireJwt): - containers = await Container.filter(team_id=jwt["team_id"]).prefetch_related( - "ports", "problem" - ) - - result = { - container.problem.id: await container.ports.all().values_list("port", flat=True) - for container in containers - } - - return result - - @atomic() @router.post("team/{id}") async def upsert_table_tn(id: int, data: TableTNBody, request: Request, response: Response): admin_password = (await request.body()).strip() if not bcrypt.verify(admin_password, ADMIN_HASH): - response.status_code = 401 - return {"msg_code": "not_authorized"} - - team = await Team.get_or_none(id=id) - if not team: - response.status_code = 404 - return {"msg_code": "team_not_found"} - - try: - team.table_tn = data.table_tn - await team.save() - except Exception: - response.status_code = 500 - return {"msg_code": "db_error"} - - return {"msg_code": "tabletn_upserted"} \ No newline at end of file + response.status_code = 401 \ No newline at end of file From bae986d584f5966293fa7df8c1daa9e295f5298b Mon Sep 17 00:00:00 2001 From: Mikefrfr Date: Thu, 6 Mar 2025 12:37:07 +0530 Subject: [PATCH 5/5] made the requested change --- src/pwncore/routes/team.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/pwncore/routes/team.py b/src/pwncore/routes/team.py index b0a764f..a7afbd2 100644 --- a/src/pwncore/routes/team.py +++ b/src/pwncore/routes/team.py @@ -122,9 +122,21 @@ async def get_team_containers(response: Response, jwt: RequireJwt): return result @atomic() -@router.post("team/{id}") +@router.post("/team/{id}") async def upsert_table_tn(id: int, data: TableTNBody, request: Request, response: Response): admin_password = (await request.body()).strip() if not bcrypt.verify(admin_password, ADMIN_HASH): - response.status_code = 401 \ No newline at end of file + response.status_code = 401 + + team = await Team.get_or_none(id=id) + if not team: + response.status_code = 404 + + try: + team.table_tn = data.table_tn + await team.save() + except Exception: + response.status_code = 500 + + return {"msg_code": "tabletn_upserted"} \ No newline at end of file