fix: editTeam endpoint + leaderboard live name resolution + domains in team set + apt-insecure.conf in all service dirs
This commit is contained in:
+37
-4
@@ -391,23 +391,46 @@ async def api_teams(req: Request):
|
||||
|
||||
@app.post("/api/teams/set")
|
||||
async def api_teams_set(req: Request):
|
||||
"""Set/create N teams (idempotent: creates missing, keeps existing)."""
|
||||
"""Set/create N teams (idempotent: creates missing, keeps existing).
|
||||
|
||||
body: {count, labels: {"1": "Tim Satu"}, domains: {"1": "tim-satu"}}"""
|
||||
require_login(req)
|
||||
data = await req.json()
|
||||
n = int(data.get("count", 0))
|
||||
if n < 0 or n > 50:
|
||||
raise HTTPException(400, "Team count must be 0-50")
|
||||
labels = data.get("labels") or {} # { "1": "Tim Satu", ... }
|
||||
domains = data.get("domains") or {} # { "1": "mycustom", ... }
|
||||
created = []
|
||||
for i in range(1, n + 1):
|
||||
td = orch.TEAMS_DIR / f"team{i}"
|
||||
if not td.exists():
|
||||
label = labels.get(str(i)) or labels.get(i) or f"Tim {i}"
|
||||
st = orch.create_team(i, label)
|
||||
dom = domains.get(str(i)) or domains.get(i) or None
|
||||
st = orch.create_team(i, label, domain=dom)
|
||||
created.append(st["index"])
|
||||
else:
|
||||
# team exists: apply any label/domain overrides
|
||||
label = labels.get(str(i)) or labels.get(i)
|
||||
dom = domains.get(str(i)) or domains.get(i)
|
||||
if label or dom:
|
||||
orch.update_team(i, label=label, domain=dom)
|
||||
orch.ensure_team_domains()
|
||||
return {"created": created, "total": len(orch.list_teams())}
|
||||
|
||||
@app.put("/api/teams/{idx}")
|
||||
async def api_team_update(idx: int, req: Request):
|
||||
"""Update a team's custom name and/or domain (applies live)."""
|
||||
require_login(req)
|
||||
if not (orch.TEAMS_DIR / f"team{idx}" / "state.json").exists():
|
||||
raise HTTPException(404, "Team not found")
|
||||
data = await req.json()
|
||||
try:
|
||||
st = orch.update_team(idx, label=data.get("label"), domain=data.get("domain"))
|
||||
return {"ok": True, "team": st}
|
||||
except FileNotFoundError as e:
|
||||
raise HTTPException(404, str(e))
|
||||
|
||||
@app.post("/api/teams/start")
|
||||
async def api_teams_start(req: Request):
|
||||
require_login(req)
|
||||
@@ -553,16 +576,26 @@ async def api_attacks(req: Request):
|
||||
|
||||
@app.get("/api/leaderboard")
|
||||
async def api_leaderboard(req: Request):
|
||||
"""Leaderboard of solves so far."""
|
||||
"""Leaderboard of solves so far. Team names resolved LIVE from state.json
|
||||
so renaming a team updates leaderboard + topology everywhere."""
|
||||
lb_path = orch.TEAMS_DIR / "leaderboard.json"
|
||||
if lb_path.exists():
|
||||
lb = json.loads(lb_path.read_text())
|
||||
else:
|
||||
lb = {"solves": []}
|
||||
# live name lookup: state.json label fallback to snapshot
|
||||
def team_name(idx):
|
||||
try:
|
||||
st = json.loads((orch.TEAMS_DIR / f"team{idx}" / "state.json").read_text())
|
||||
return st.get("label") or f"Team {idx}"
|
||||
except Exception:
|
||||
return f"Team {idx}"
|
||||
# aggregate per team
|
||||
teams = {}
|
||||
for e in lb["solves"]:
|
||||
t = teams.setdefault(e["team"], {"team": e["team"], "name": e["team_name"], "solves": 0, "challs": []})
|
||||
name = team_name(e["team"])
|
||||
t = teams.setdefault(e["team"], {"team": e["team"], "name": name, "solves": 0, "challs": []})
|
||||
t["name"] = name
|
||||
t["solves"] += 1
|
||||
t["challs"].append(e["challenge"])
|
||||
return {"solves": lb["solves"], "teams": sorted(teams.values(), key=lambda x: -x["solves"])}
|
||||
|
||||
Reference in New Issue
Block a user