From 1d5c47f21d3f8c48eb09e295ec217049893332d9 Mon Sep 17 00:00:00 2001 From: Sinatras Date: Thu, 18 Jun 2026 02:33:08 +0300 Subject: [PATCH] Require secret leaderboard pass for public rankings --- kernelboard/api/leaderboard.py | 36 ++++++++++++++++++++++++ kernelboard/api/leaderboard_summaries.py | 18 ++++++++++++ kernelboard/index.py | 9 ++++++ kernelboard/leaderboard.py | 9 ++++++ ranking_worker.py | 9 ++++++ tests/api/test_leaderboard_api.py | 34 +++++++++++++++++++++- tests/data.sql | 3 +- 7 files changed, 116 insertions(+), 2 deletions(-) diff --git a/kernelboard/api/leaderboard.py b/kernelboard/api/leaderboard.py index e1ed9ba6..f22acf25 100644 --- a/kernelboard/api/leaderboard.py +++ b/kernelboard/api/leaderboard.py @@ -170,6 +170,15 @@ def _get_query(): AND r.score IS NOT NULL AND r.passed AND s.leaderboard_id = %(leaderboard_id)s + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr @@ -259,6 +268,15 @@ def get_custom_trend(leaderboard_id: int): AND r.score IS NOT NULL AND r.passed = true AND NOT r.secret + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr @@ -388,6 +406,15 @@ def get_user_trend(leaderboard_id: int): AND r.score IS NOT NULL AND r.passed = true AND NOT r.secret + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr @@ -482,6 +509,15 @@ def get_fastest_trend(leaderboard_id: int): AND r.score IS NOT NULL AND r.passed = true AND NOT r.secret + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr diff --git a/kernelboard/api/leaderboard_summaries.py b/kernelboard/api/leaderboard_summaries.py index a220e5c5..961c58de 100644 --- a/kernelboard/api/leaderboard_summaries.py +++ b/kernelboard/api/leaderboard_summaries.py @@ -370,6 +370,15 @@ def _get_query_for_ids(): AND r.score IS NOT NULL AND r.passed AND s.leaderboard_id IN %s + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr @@ -474,6 +483,15 @@ def _get_query(): WHERE NOT r.secret AND r.score IS NOT NULL AND r.passed + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr diff --git a/kernelboard/index.py b/kernelboard/index.py index c77f8faa..a45ee782 100644 --- a/kernelboard/index.py +++ b/kernelboard/index.py @@ -86,6 +86,15 @@ def index(): WHERE NOT r.secret AND r.score IS NOT NULL AND r.passed + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr diff --git a/kernelboard/leaderboard.py b/kernelboard/leaderboard.py index 353a0b5b..fdf5428b 100644 --- a/kernelboard/leaderboard.py +++ b/kernelboard/leaderboard.py @@ -46,6 +46,15 @@ def leaderboard(leaderboard_id: int): AND r.score IS NOT NULL AND r.passed AND s.leaderboard_id = %(leaderboard_id)s + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr diff --git a/ranking_worker.py b/ranking_worker.py index e9bfb5cc..d118f17f 100644 --- a/ranking_worker.py +++ b/ranking_worker.py @@ -130,6 +130,15 @@ def ensure_snapshot_table(conn): WHERE NOT r.secret AND r.score IS NOT NULL AND r.passed + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr diff --git a/tests/api/test_leaderboard_api.py b/tests/api/test_leaderboard_api.py index a27e5a2a..6c3d0cff 100644 --- a/tests/api/test_leaderboard_api.py +++ b/tests/api/test_leaderboard_api.py @@ -38,7 +38,8 @@ def test_failed_secret_benchmark_hides_public_leaderboard_run(client, app): (id, leaderboard_id, file_name, user_id, code_id, submission_time, done) VALUES (900001, 339, 'hidden_secret_fail.py', '123456789012345', 13, NOW(), TRUE), - (900002, 339, 'visible_public_pass.py', '234567890123456', 13, NOW(), TRUE) + (900002, 339, 'visible_public_pass.py', '234567890123456', 13, NOW(), TRUE), + (900003, 339, 'hidden_missing_secret.py', '345678901234567', 13, NOW(), TRUE) """ ) cur.execute( @@ -104,6 +105,36 @@ def test_failed_secret_benchmark_hides_public_leaderboard_run(client, app): '{}', '{}', '{}' + ), + ( + 900004, + 900002, + NOW(), + NOW(), + 'leaderboard', + TRUE, + 'H100', + -998, + TRUE, + '{}', + '{}', + '{}', + '{}' + ), + ( + 900005, + 900003, + NOW(), + NOW(), + 'leaderboard', + FALSE, + 'H100', + -997, + TRUE, + '{}', + '{}', + '{}', + '{}' ) """ ) @@ -117,4 +148,5 @@ def test_failed_secret_benchmark_hides_public_leaderboard_run(client, app): ranked_files = {row["file_name"] for row in h100_rankings} assert "hidden_secret_fail.py" not in ranked_files + assert "hidden_missing_secret.py" not in ranked_files assert "visible_public_pass.py" in ranked_files diff --git a/tests/data.sql b/tests/data.sql index 88080121..811fc100 100644 --- a/tests/data.sql +++ b/tests/data.sql @@ -80,7 +80,8 @@ CREATE TABLE leaderboard.leaderboard ( creator_id bigint DEFAULT '-1'::integer NOT NULL, forum_id bigint NOT NULL, secret_seed bigint DEFAULT floor((random() * ('2147483648'::bigint)::double precision)) NOT NULL, - description text NOT NULL + description text NOT NULL, + visibility text DEFAULT 'public'::text NOT NULL );