Skip to content

Commit d13ff06

Browse files
committed
Use opaque_id instead of encrypted submission id in functional test suite
1 parent dd5f639 commit d13ff06

File tree

7 files changed

+54
-36
lines changed

7 files changed

+54
-36
lines changed

cms/server/admin/handlers/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,15 +212,15 @@
212212

213213
# Submissions
214214

215-
(r"/submission/([0-9]+)(?:/([0-9]+))?", SubmissionHandler),
215+
(r"/submission/((?:opaque_)?[0-9]+)(?:/([0-9]+))?", SubmissionHandler),
216216
(r"/submission/([0-9]+)(?:/([0-9]+))?/comment", SubmissionCommentHandler),
217217
(r"/submission/([0-9]+)(?:/([0-9]+))?/official", SubmissionOfficialStatusHandler),
218218
(r"/submission_file/([0-9]+)", SubmissionFileHandler),
219219
(r"/submission_diff/([0-9]+)/([0-9]+)", SubmissionDiffHandler),
220220

221221
# User tests
222222

223-
(r"/user_test/([0-9]+)(?:/([0-9]+))?", UserTestHandler),
223+
(r"/user_test/((?:opaque_)?[0-9]+)(?:/([0-9]+))?", UserTestHandler),
224224
(r"/user_test_file/([0-9]+)", UserTestFileHandler),
225225

226226
# The following prefixes are handled by WSGI middlewares:

cms/server/admin/handlers/submission.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,15 @@
3030
import logging
3131
import difflib
3232

33+
import collections
34+
try:
35+
collections.MutableMapping
36+
except:
37+
# Monkey-patch: Tornado 4.5.3 does not work on Python 3.11 by default
38+
collections.MutableMapping = collections.abc.MutableMapping
39+
40+
import tornado.web
41+
3342
from cms.db import Dataset, File, Submission
3443
from cms.grading.languagemanager import safe_get_lang_filename
3544
from cmscommon.datetime import make_datetime
@@ -47,8 +56,18 @@ class SubmissionHandler(BaseHandler):
4756
4857
"""
4958
@require_permission(BaseHandler.AUTHENTICATED)
50-
def get(self, submission_id, dataset_id=None):
51-
submission = self.safe_get_item(Submission, submission_id)
59+
def get(self, submission_id: str, dataset_id=None):
60+
if submission_id.startswith("opaque_"):
61+
oid = int(submission_id.removeprefix("opaque_"))
62+
submission = (
63+
self.sql_session.query(Submission)
64+
.filter(Submission.opaque_id == oid)
65+
.first()
66+
)
67+
if submission is None:
68+
raise tornado.web.HTTPError(404)
69+
else:
70+
submission = self.safe_get_item(Submission, submission_id)
5271
task = submission.task
5372
self.contest = task.contest
5473

cms/server/admin/handlers/usertest.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,15 @@
2020
2121
"""
2222

23+
import collections
24+
try:
25+
collections.MutableMapping
26+
except:
27+
# Monkey-patch: Tornado 4.5.3 does not work on Python 3.11 by default
28+
collections.MutableMapping = collections.abc.MutableMapping
29+
30+
import tornado.web
31+
2332
from cms.db import Dataset, UserTestFile, UserTest
2433
from cms.grading.languagemanager import safe_get_lang_filename
2534

@@ -29,8 +38,18 @@
2938
class UserTestHandler(BaseHandler):
3039
"""Shows the details of a user test."""
3140
@require_permission(BaseHandler.AUTHENTICATED)
32-
def get(self, user_test_id, dataset_id=None):
33-
user_test = self.safe_get_item(UserTest, user_test_id)
41+
def get(self, user_test_id: str, dataset_id=None):
42+
if user_test_id.startswith("opaque_"):
43+
oid = int(user_test_id.removeprefix("opaque_"))
44+
user_test = (
45+
self.sql_session.query(UserTest)
46+
.filter(UserTest.opaque_id == oid)
47+
.first()
48+
)
49+
if user_test is None:
50+
raise tornado.web.HTTPError(404)
51+
else:
52+
user_test = self.safe_get_item(UserTest, user_test_id)
3453
task = user_test.task
3554
self.contest = task.contest
3655

cms/server/contest/handlers/tasksubmission.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@
5555
UnacceptableSubmission, accept_submission
5656
from cms.server.contest.tokening import \
5757
UnacceptableToken, TokenAlreadyPlayed, accept_token, tokens_available
58-
from cmscommon.crypto import encrypt_number
5958
from cmscommon.mimetypes import get_type_for_file_name
6059
from .contest import ContestHandler, FileHandler, api_login_required
6160
from ..phase_management import actual_phase_required
@@ -109,11 +108,9 @@ def post(self, task_name):
109108
self.notify_success(N_("Submission received"),
110109
N_("Your submission has been received "
111110
"and is currently being evaluated."))
112-
# The argument (encrypted submission id) is not used by CWS
113-
# (nor it discloses information to the user), but it is
114-
# useful for automatic testing to obtain the submission id).
115-
query_args["submission_id"] = \
116-
encrypt_number(submission.id, config.web_server.secret_key)
111+
# The argument is not used by CWS, but it is useful for automatic
112+
# testing to obtain the submission id.
113+
query_args["submission_id"] = submission.opaque_id
117114

118115
self.redirect(self.contest_url("tasks", task.name, "submissions",
119116
**query_args))

cms/server/contest/handlers/taskusertest.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
from cms.server import multi_contest
4747
from cms.server.contest.submission import get_submission_count, \
4848
TestingNotAllowed, UnacceptableUserTest, accept_user_test
49-
from cmscommon.crypto import encrypt_number
5049
from cmscommon.mimetypes import get_type_for_file_name
5150
from .contest import ContestHandler, FileHandler, api_login_required
5251
from ..phase_management import actual_phase_required
@@ -152,11 +151,9 @@ def post(self, task_name):
152151
self.notify_success(N_("Test received"),
153152
N_("Your test has been received "
154153
"and is currently being executed."))
155-
# The argument (encrypted user test id) is not used by CWS
156-
# (nor it discloses information to the user), but it is
157-
# useful for automatic testing to obtain the user test id).
158-
query_args["user_test_id"] = \
159-
encrypt_number(user_test.id, config.web_server.secret_key)
154+
# The argument is not used by CWS, but it is useful for automatic
155+
# testing to obtain the user test id.
156+
query_args["user_test_id"] = user_test.opaque_id
160157

161158
self.redirect(self.contest_url("testing", task_name=task.name,
162159
**query_args))

cmstestsuite/web/AWSRequests.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class AWSSubmissionViewRequest(GenericRequest):
4848
def __init__(self, browser, submission_id, base_url=None):
4949
GenericRequest.__init__(self, browser, base_url)
5050
self.submission_id = submission_id
51-
self.url = "%s/submission/%s" % (self.base_url, submission_id)
51+
self.url = "%s/submission/opaque_%s" % (self.base_url, submission_id)
5252

5353
def describe(self):
5454
return "check submission %s" % self.submission_id
@@ -105,7 +105,7 @@ class AWSUserTestViewRequest(GenericRequest):
105105
def __init__(self, browser, user_test_id, base_url=None):
106106
GenericRequest.__init__(self, browser, base_url)
107107
self.user_test_id = user_test_id
108-
self.url = "%s/user_test/%s" % (self.base_url, user_test_id)
108+
self.url = "%s/user_test/opaque_%s" % (self.base_url, user_test_id)
109109

110110
def describe(self):
111111
return "check user_test %s" % self.user_test_id

cmstestsuite/web/CWSRequests.py

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@
2828
import tempfile
2929
from urllib.parse import parse_qs, urlsplit
3030

31-
from cms import config
3231
from cms.grading.languagemanager import filename_to_language
33-
from cmscommon.crypto import decrypt_number
3432
from cmstestsuite.web import GenericRequest, LoginRequest
3533

3634

@@ -160,13 +158,7 @@ def get_submission_id(self):
160158
logger.warning("Redirected to an unexpected page: `%s'",
161159
self.redirected_to)
162160
return None
163-
try:
164-
submission_id = decrypt_number(query["submission_id"][0],
165-
config.web_server.secret_key)
166-
except Exception:
167-
logger.warning("Unable to decrypt submission id from page: `%s'",
168-
self.redirected_to)
169-
return None
161+
submission_id = int(query["submission_id"][0])
170162
return submission_id
171163

172164

@@ -227,13 +219,7 @@ def get_user_test_id(self):
227219
logger.warning("Redirected to an unexpected page: `%s'",
228220
self.redirected_to)
229221
return None
230-
try:
231-
user_test_id = decrypt_number(query["user_test_id"][0],
232-
config.web_server.secret_key)
233-
except Exception:
234-
logger.warning("Unable to decrypt user test id from page: `%s'",
235-
self.redirected_to)
236-
return None
222+
user_test_id = int(query["user_test_id"][0])
237223
return user_test_id
238224

239225

0 commit comments

Comments
 (0)