Skip to content

Commit c88e055

Browse files
authored
1092 fix solve count leak during freeze (CTFd#1095)
* Challenges properly get solve count during freeze time * Closes CTFd#1092
1 parent 941ca8f commit c88e055

File tree

2 files changed

+22
-5
lines changed

2 files changed

+22
-5
lines changed

CTFd/api/v1/challenges.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
from CTFd.utils.user import get_current_team
3939
from CTFd.utils.user import get_current_user
4040
from CTFd.plugins.challenges import get_chal_class
41-
from CTFd.utils.dates import ctf_ended, ctf_paused, ctftime
41+
from CTFd.utils.dates import ctf_ended, ctf_paused, ctftime, unix_time_to_utc
4242
from CTFd.utils.logging import log
4343
from CTFd.utils.security.signing import serialize
4444
from sqlalchemy.sql import and_
@@ -267,8 +267,14 @@ def get(self, challenge_id):
267267
Model.banned == False,
268268
Model.hidden == False,
269269
)
270-
.count()
271270
)
271+
272+
# Only show solves that happened before freeze time if configured
273+
freeze = get_config("freeze")
274+
if not is_admin() and freeze:
275+
solves = solves.filter(Solves.date < unix_time_to_utc(freeze))
276+
277+
solves = solves.count()
272278
response["solves"] = solves
273279
else:
274280
response["solves"] = None

tests/api/v1/test_challenges.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -536,14 +536,25 @@ def test_api_challenge_get_solves_ctf_frozen():
536536
chal2_id = chal2.id
537537

538538
with freeze_time("2017-10-8"):
539-
chal2 = gen_solve(app.db, user_id=2, challenge_id=chal2_id)
539+
# User ID 2 solves Challenge ID 2
540+
gen_solve(app.db, user_id=2, challenge_id=chal2_id)
541+
# User ID 3 solves Challenge ID 1
542+
gen_solve(app.db, user_id=3, challenge_id=chal_id)
543+
544+
# Challenge 1 has 2 solves
545+
# Challenge 2 has 1 solve
540546

541547
# There should now be two solves assigned to the same user.
542-
assert Solves.query.count() == 2
548+
assert Solves.query.count() == 3
543549

544550
client = login_as_user(app, name="user2")
545551

546-
# Challenge 1 should have one solve
552+
# Challenge 1 should have one solve (after freeze)
553+
r = client.get("/api/v1/challenges/1")
554+
data = r.get_json()["data"]
555+
assert data['solves'] == 1
556+
557+
# Challenge 1 should have one solve (after freeze)
547558
r = client.get("/api/v1/challenges/1/solves")
548559
data = r.get_json()["data"]
549560
assert len(data) == 1

0 commit comments

Comments
 (0)