diff --git a/src/pwncore/routes/auth.py b/src/pwncore/routes/auth.py index 87a067e..cec9710 100644 --- a/src/pwncore/routes/auth.py +++ b/src/pwncore/routes/auth.py @@ -2,6 +2,7 @@ import datetime import typing as t +from logging import getLogger import jwt from fastapi import APIRouter, Header, Response, HTTPException, Depends @@ -19,6 +20,7 @@ } router = APIRouter(prefix="/auth", tags=["auth"]) +logger = getLogger(__name__) class AuthBody(BaseModel): @@ -48,13 +50,14 @@ async def signup_team(team: SignupBody, response: Response): return {"msg_code": config.msg_codes["team_exists"]} q = await User.filter(tag__in=members) + # print(q, members) if len(q) != len(members): response.status_code = 404 return { "msg_code": config.msg_codes["users_not_found"], "tags": list(members - set(map(lambda h: h.tag, q))), } - in_teams = list(filter(lambda h: h.team is not None, q)) + in_teams = list(filter(lambda h: h.team, q)) if in_teams: response.status_code = 401 return { @@ -68,10 +71,13 @@ async def signup_team(team: SignupBody, response: Response): for user in q: # Mypy kinda not working - user.team = newteam # type: ignore[assignment] + user.team_id = newteam.id # type: ignore[attr-defined] if q: - await User.bulk_update(q, fields=["team"]) + b = User.bulk_update(q, fields=["team_id"]) + # print(b.sql()) + await b except Exception: + logger.exception("error in signup!") response.status_code = 500 return {"msg_code": config.msg_codes["db_error"]} return {"msg_code": config.msg_codes["signup_success"]} @@ -107,10 +113,12 @@ async def team_login(team_data: AuthBody, response: Response): def get_jwt(*, authorization: t.Annotated[str, Header()]) -> JwtInfo: try: token = authorization.split(" ")[1] # Remove Bearer + # print(token, authorization) decoded_token: JwtInfo = jwt.decode( token, config.jwt_secret, algorithms=["HS256"] ) - except Exception: # Will filter for invalid signature/expired tokens + except Exception as err: # Will filter for invalid signature/expired tokens + logger.warning("Invalid login", exc_info=err) raise HTTPException(status_code=401) return decoded_token diff --git a/src/pwncore/routes/ctf/__init__.py b/src/pwncore/routes/ctf/__init__.py index 209be76..eed51e6 100644 --- a/src/pwncore/routes/ctf/__init__.py +++ b/src/pwncore/routes/ctf/__init__.py @@ -52,6 +52,15 @@ class Flag(BaseModel): flag: str +@router.get("/completed") +async def completed_problem_get(jwt: RequireJwt): + team_id = jwt["team_id"] + problems = await Problem_Pydantic.from_queryset( + Problem.filter(solvedproblems__team_id=team_id, visible=True) + ) + return problems + + @router.get("/list") async def ctf_list(): problems = await Problem_Pydantic.from_queryset(Problem.filter(visible=True)) @@ -88,7 +97,9 @@ async def flag_post( ) if check_solved: hints = await Hint.filter( - problem_id=ctf_id, viewedhints__team_id=team_id, with_points=True + problem_id=ctf_id, + viewedhints__team_id=team_id, + viewedhints__with_points=True, ) pnlt = (100 - sum(map(lambda h: HINTPENALTY[h.order], hints))) / 100 @@ -147,15 +158,6 @@ async def viewed_problem_hints_get(ctf_id: int, jwt: RequireJwt): return viewed_hints -@router.get("/completed") -async def completed_problem_get(jwt: RequireJwt): - team_id = jwt["team_id"] - problems = await Problem_Pydantic.from_queryset( - 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 Problem_Pydantic.from_queryset( diff --git a/src/pwncore/routes/ctf/start.py b/src/pwncore/routes/ctf/start.py index ef62a98..241aa58 100644 --- a/src/pwncore/routes/ctf/start.py +++ b/src/pwncore/routes/ctf/start.py @@ -1,5 +1,7 @@ from __future__ import annotations +from logging import getLogger + from fastapi import APIRouter, Response import uuid from tortoise.transactions import atomic @@ -10,6 +12,7 @@ from pwncore.routes.auth import RequireJwt router = APIRouter(tags=["ctf"]) +logger = getLogger(__name__) @atomic() @@ -90,10 +93,11 @@ async def start_docker_container(ctf_id: int, response: Response, jwt: RequireJw ports.append(port) await Ports.create(port=port, container=db_container) - except Exception: + except Exception as err: # Stop the container if failed to make a DB record await container.stop() await container.delete() + logger.exception("Error while starting", exc_info=err) response.status_code = 500 return {"msg_code": config.msg_codes["db_error"]}