def get(self, task_name, user_test_num, filename): if not self.r_params["testing_enabled"]: raise tornado.web.HTTPError(404) task = self.get_task(task_name) if task is None: raise tornado.web.HTTPError(404) user_test = self.get_user_test(task, user_test_num) if user_test is None: raise tornado.web.HTTPError(404) # filename is the name used by the browser, hence is something # like 'foo.c' (and the extension is CMS's preferred extension # for the language). To retrieve the right file, we need to # decode it to 'foo.%l'. stored_filename = filename if user_test.language is not None: extension = get_language(user_test.language).source_extension stored_filename = re.sub(r'%s$' % extension, '.%l', filename) if stored_filename in user_test.files: digest = user_test.files[stored_filename].digest elif stored_filename in user_test.managers: digest = user_test.managers[stored_filename].digest else: raise tornado.web.HTTPError(404) self.sql_session.close() mimetype = get_type_for_file_name(filename) if mimetype is None: mimetype = 'application/octet-stream' self.fetch(digest, mimetype, filename)
def get(self, task_name, user_test_num, filename): if not self.r_params["testing_enabled"]: raise tornado.web.HTTPError(404) task = self.get_task(task_name) if task is None: raise tornado.web.HTTPError(404) user_test = self.get_user_test(task, user_test_num) if user_test is None: raise tornado.web.HTTPError(404) # filename is the name used by the browser, hence is something # like 'foo.c' (and the extension is CMS's preferred extension # for the language). To retrieve the right file, we need to # decode it to 'foo.%l'. stored_filename = filename if user_test.language is not None: extension = get_language(user_test.language).source_extension stored_filename = re.sub(r'%s$' % extension, '.%l', filename) if stored_filename in user_test.files: digest = user_test.files[stored_filename].digest elif stored_filename in user_test.managers: digest = user_test.managers[stored_filename].digest else: raise tornado.web.HTTPError(404) self.sql_session.close() mimetype = get_type_for_file_name(filename) if mimetype is None: mimetype = 'application/octet-stream' self.fetch(digest, mimetype, filename)
def get(self): this_captcha = self.captcha.captcha() captcha_clear = ''.join([str(x) for x in this_captcha[0]]) captcha_bs = this_captcha[1] mimetype = get_type_for_file_name("captcha.png") if mimetype is None: mimetype = 'application/octet-stream' self.add_header('Content-Type', mimetype) #We require an identifier so a captcha's cookie is restricted #in use for a specific action. try: identifier = self.get_argument("identifier") if not 1 <= len(identifier) <= self.MAX_INPUT_LENGTH: raise ValueError() if not re.match(r"^[A-Za-z0-9_-]+$", identifier): raise ValueError() except (tornado_web.MissingArgumentError, ValueError): raise tornado_web.HTTPError(400) #We don't use a reference to the running contest, so the answer #to a captcha in one contest could be used for the same action in #another. Won't fix #identifier should be signed so it can't be tempered with, which is taken #care of by set_secure_cookie. #captcha_clear should additionally not be accessible for the user, #so we only include its signature and compare that later to the signature #of the user's input cookie = self.signature(captcha_clear) + "_" + identifier cookie_name = "captcha" self.set_secure_cookie(cookie_name, cookie, expires_days=None) self.write(captcha_bs)
def get(self, task_name, submission_num, filename): if not self.contest.submissions_download_allowed: raise tornado.web.HTTPError(404) participation = self.current_user try: task = self.contest.get_task(task_name) except KeyError: raise tornado.web.HTTPError(404) submission = self.sql_session.query(Submission)\ .filter(Submission.participation == participation)\ .filter(Submission.task == task)\ .order_by(Submission.timestamp)\ .offset(int(submission_num) - 1)\ .first() if submission is None: raise tornado.web.HTTPError(404) # The following code assumes that submission.files is a subset # of task.submission_format. CWS will always ensure that for new # submissions, yet, if the submission_format changes during the # competition, this may not hold anymore for old submissions. # filename follows our convention (e.g. 'foo.%l'), real_filename # follows the one we present to the user (e.g. 'foo.c'). real_filename = filename if submission.language is not None: if filename in submission.files: real_filename = filename.replace("%l", submission.language) else: # We don't recognize this filename. Let's try to 'undo' # the '%l' -> 'c|cpp|pas' replacement before giving up. filename = re.sub(r'\.%s$' % submission.language, '.%l', filename) if filename not in submission.files: raise tornado.web.HTTPError(404) digest = submission.files[filename].digest self.sql_session.close() mimetype = get_type_for_file_name(real_filename) if mimetype is None: mimetype = 'application/octet-stream' self.fetch(digest, mimetype, real_filename)
def get(self, task_name, submission_num, filename): if not self.contest.submissions_download_allowed: raise tornado.web.HTTPError(404) participation = self.current_user try: task = self.contest.get_task(task_name) except KeyError: raise tornado.web.HTTPError(404) submission = self.sql_session.query(Submission)\ .filter(Submission.participation == participation)\ .filter(Submission.task == task)\ .order_by(Submission.timestamp)\ .offset(int(submission_num) - 1)\ .first() if submission is None: raise tornado.web.HTTPError(404) # The following code assumes that submission.files is a subset # of task.submission_format. CWS will always ensure that for new # submissions, yet, if the submission_format changes during the # competition, this may not hold anymore for old submissions. # filename follows our convention (e.g. 'foo.%l'), real_filename # follows the one we present to the user (e.g. 'foo.c'). real_filename = filename if submission.language is not None: if filename in submission.files: real_filename = filename.replace("%l", submission.language) else: # We don't recognize this filename. Let's try to 'undo' # the '%l' -> 'c|cpp|pas' replacement before giving up. filename = re.sub(r'\.%s$' % submission.language, '.%l', filename) if filename not in submission.files: raise tornado.web.HTTPError(404) digest = submission.files[filename].digest self.sql_session.close() mimetype = get_type_for_file_name(real_filename) if mimetype is None: mimetype = 'application/octet-stream' self.fetch(digest, mimetype, real_filename)
def get(self, task_name, filename): task = self.get_task(task_name) if task is None: raise tornado.web.HTTPError(404) if filename not in task.spoilers: raise tornado.web.HTTPError(404) spoiler = task.spoilers[filename].digest self.sql_session.close() mimetype = get_type_for_file_name(filename) if mimetype is None: mimetype = 'application/octet-stream' self.fetch(spoiler, mimetype, filename)
def get(self, task_name, filename): task = self.get_task(task_name) if task is None: raise tornado.web.HTTPError(404) if filename not in task.attachments: raise tornado.web.HTTPError(404) attachment = task.attachments[filename].digest self.sql_session.close() mimetype = get_type_for_file_name(filename) if mimetype is None: mimetype = 'application/octet-stream' self.fetch(attachment, mimetype, filename)
def get(self, task_name, submission_num, filename): if not self.contest.submissions_download_allowed: raise tornado.web.HTTPError(404) participation = self.current_user try: task = self.contest.get_task(task_name) except KeyError: raise tornado.web.HTTPError(404) if self.contest.restrict_level and self.current_user.user.level != task.level and self.current_user.user.level != "x" and task.level != "x": raise tornado.web.HTTPError(404) submission = self.sql_session.query(Submission)\ .filter(Submission.participation == participation)\ .filter(Submission.task == task)\ .order_by(Submission.timestamp)\ .offset(int(submission_num) - 1)\ .first() if submission is None: raise tornado.web.HTTPError(404) # The following code assumes that submission.files is a subset # of task.submission_format. CWS will always ensure that for new # submissions, yet, if the submission_format changes during the # competition, this may not hold anymore for old submissions. # filename is the name used by the browser, hence is something # like 'foo.c' (and the extension is CMS's preferred extension # for the language). To retrieve the right file, we need to # decode it to 'foo.%l'. stored_filename = filename if submission.language is not None: extension = get_language(submission.language).source_extension stored_filename = re.sub(r'%s$' % extension, '.%l', filename) if stored_filename not in submission.files: raise tornado.web.HTTPError(404) digest = submission.files[stored_filename].digest self.sql_session.close() mimetype = get_type_for_file_name(filename) if mimetype is None: mimetype = 'application/octet-stream' self.fetch(digest, mimetype, filename)
def get(self, task_name, submission_num, filename): if not self.contest.submissions_download_allowed: raise tornado.web.HTTPError(404) participation = self.current_user try: task = self.contest.get_task(task_name) except KeyError: raise tornado.web.HTTPError(404) if self.contest.restrict_level and self.current_user.user.level != task.level and self.current_user.user.level != "x" and task.level != "x": raise tornado.web.HTTPError(404) submission = self.sql_session.query(Submission)\ .filter(Submission.participation == participation)\ .filter(Submission.task == task)\ .order_by(Submission.timestamp)\ .offset(int(submission_num) - 1)\ .first() if submission is None: raise tornado.web.HTTPError(404) # The following code assumes that submission.files is a subset # of task.submission_format. CWS will always ensure that for new # submissions, yet, if the submission_format changes during the # competition, this may not hold anymore for old submissions. # filename is the name used by the browser, hence is something # like 'foo.c' (and the extension is CMS's preferred extension # for the language). To retrieve the right file, we need to # decode it to 'foo.%l'. stored_filename = filename if submission.language is not None: extension = get_language(submission.language).source_extension stored_filename = re.sub(r'%s$' % extension, '.%l', filename) if stored_filename not in submission.files: raise tornado.web.HTTPError(404) digest = submission.files[stored_filename].digest self.sql_session.close() mimetype = get_type_for_file_name(filename) if mimetype is None: mimetype = 'application/octet-stream' self.fetch(digest, mimetype, filename)
def get(self, task_name, filename): try: task = self.contest.get_task(task_name) except KeyError: raise tornado.web.HTTPError(404) if filename not in task.attachments: raise tornado.web.HTTPError(404) attachment = task.attachments[filename].digest self.sql_session.close() mimetype = get_type_for_file_name(filename) if mimetype is None: mimetype = 'application/octet-stream' self.fetch(attachment, mimetype, filename)
def get(self, task_name, user_test_num, filename): participation = self.current_user if not self.r_params["testing_enabled"]: raise tornado.web.HTTPError(404) try: task = self.contest.get_task(task_name) except KeyError: raise tornado.web.HTTPError(404) if self.contest.restrict_level and self.current_user.user.level != task.level and self.current_user.user.level != "x" and task.level != "x": raise tornado.web.HTTPError(404) user_test = self.sql_session.query(UserTest)\ .filter(UserTest.participation == participation)\ .filter(UserTest.task == task)\ .order_by(UserTest.timestamp)\ .offset(int(user_test_num) - 1)\ .first() if user_test is None: raise tornado.web.HTTPError(404) # filename is the name used by the browser, hence is something # like 'foo.c' (and the extension is CMS's preferred extension # for the language). To retrieve the right file, we need to # decode it to 'foo.%l'. stored_filename = filename if user_test.language is not None: extension = get_language(user_test.language).source_extension stored_filename = re.sub(r'%s$' % extension, '.%l', filename) if stored_filename in user_test.files: digest = user_test.files[stored_filename].digest elif stored_filename in user_test.managers: digest = user_test.managers[stored_filename].digest else: raise tornado.web.HTTPError(404) self.sql_session.close() mimetype = get_type_for_file_name(filename) if mimetype is None: mimetype = 'application/octet-stream' self.fetch(digest, mimetype, filename)
def get(self, task_name, filename): try: task = self.contest.get_task(task_name) except KeyError: raise tornado.web.HTTPError(404) if self.contest.restrict_level and self.current_user.user.level != task.level and self.current_user.user.level != "x" and task.level != "x": raise tornado.web.HTTPError(404) if filename not in task.attachments: raise tornado.web.HTTPError(404) attachment = task.attachments[filename].digest self.sql_session.close() mimetype = get_type_for_file_name(filename) if mimetype is None: mimetype = 'application/octet-stream' self.fetch(attachment, mimetype, filename)
def get(self, task_name, user_test_num, filename): participation = self.current_user if not self.r_params["testing_enabled"]: raise tornado.web.HTTPError(404) try: task = self.contest.get_task(task_name) except KeyError: raise tornado.web.HTTPError(404) user_test = self.sql_session.query(UserTest)\ .filter(UserTest.participation == participation)\ .filter(UserTest.task == task)\ .order_by(UserTest.timestamp)\ .offset(int(user_test_num) - 1)\ .first() if user_test is None: raise tornado.web.HTTPError(404) # filename is the name used by the browser, hence is something # like 'foo.c' (and the extension is CMS's preferred extension # for the language). To retrieve the right file, we need to # decode it to 'foo.%l'. stored_filename = filename if user_test.language is not None: extension = get_language(user_test.language).source_extension stored_filename = re.sub(r'%s$' % extension, '.%l', filename) if stored_filename in user_test.files: digest = user_test.files[stored_filename].digest elif stored_filename in user_test.managers: digest = user_test.managers[stored_filename].digest else: raise tornado.web.HTTPError(404) self.sql_session.close() mimetype = get_type_for_file_name(filename) if mimetype is None: mimetype = 'application/octet-stream' self.fetch(digest, mimetype, filename)
def get(self, task_name, user_test_num, filename): participation = self.current_user if not self.r_params["testing_enabled"]: raise tornado.web.HTTPError(404) try: task = self.contest.get_task(task_name) except KeyError: raise tornado.web.HTTPError(404) user_test = self.sql_session.query(UserTest)\ .filter(UserTest.participation == participation)\ .filter(UserTest.task == task)\ .order_by(UserTest.timestamp)\ .offset(int(user_test_num) - 1)\ .first() if user_test is None: raise tornado.web.HTTPError(404) # filename follows our convention (e.g. 'foo.%l'), real_filename # follows the one we present to the user (e.g. 'foo.c'). real_filename = filename if user_test.language is not None: real_filename = filename.replace("%l", user_test.language) if filename in user_test.files: digest = user_test.files[filename].digest elif filename in user_test.managers: digest = user_test.managers[filename].digest else: raise tornado.web.HTTPError(404) self.sql_session.close() mimetype = get_type_for_file_name(real_filename) if mimetype is None: mimetype = 'application/octet-stream' self.fetch(digest, mimetype, real_filename)
def get(self, task_name, user_test_num, filename): participation = self.current_user if not self.r_params["testing_enabled"]: raise tornado.web.HTTPError(404) try: task = self.contest.get_task(task_name) except KeyError: raise tornado.web.HTTPError(404) user_test = self.sql_session.query(UserTest)\ .filter(UserTest.participation == participation)\ .filter(UserTest.task == task)\ .order_by(UserTest.timestamp)\ .offset(int(user_test_num) - 1)\ .first() if user_test is None: raise tornado.web.HTTPError(404) # filename follows our convention (e.g. 'foo.%l'), real_filename # follows the one we present to the user (e.g. 'foo.c'). real_filename = filename if user_test.language is not None: real_filename = filename.replace("%l", user_test.language) if filename in user_test.files: digest = user_test.files[filename].digest elif filename in user_test.managers: digest = user_test.managers[filename].digest else: raise tornado.web.HTTPError(404) self.sql_session.close() mimetype = get_type_for_file_name(real_filename) if mimetype is None: mimetype = 'application/octet-stream' self.fetch(digest, mimetype, real_filename)
def get(self, task_name, submission_num, filename): if not self.contest.submissions_download_allowed: raise tornado.web.HTTPError(404) task = self.get_task(task_name) if task is None: raise tornado.web.HTTPError(404) submission = self.get_submission(task, submission_num) if submission is None: raise tornado.web.HTTPError(404) # The following code assumes that submission.files is a subset # of task.submission_format. CWS will always ensure that for new # submissions, yet, if the submission_format changes during the # competition, this may not hold anymore for old submissions. # filename is the name used by the browser, hence is something # like 'foo.c' (and the extension is CMS's preferred extension # for the language). To retrieve the right file, we need to # decode it to 'foo.%l'. stored_filename = filename if submission.language is not None: extension = get_language(submission.language).source_extension stored_filename = re.sub(r'%s$' % extension, '.%l', filename) if stored_filename not in submission.files: raise tornado.web.HTTPError(404) digest = submission.files[stored_filename].digest self.sql_session.close() mimetype = get_type_for_file_name(filename) if mimetype is None: mimetype = 'application/octet-stream' self.fetch(digest, mimetype, filename)
def get(self, task_name, submission_num, filename): if not self.contest.submissions_download_allowed: raise tornado.web.HTTPError(404) task = self.get_task(task_name) if task is None: raise tornado.web.HTTPError(404) submission = self.get_submission(task, submission_num) if submission is None: raise tornado.web.HTTPError(404) # The following code assumes that submission.files is a subset # of task.submission_format. CWS will always ensure that for new # submissions, yet, if the submission_format changes during the # competition, this may not hold anymore for old submissions. # filename is the name used by the browser, hence is something # like 'foo.c' (and the extension is CMS's preferred extension # for the language). To retrieve the right file, we need to # decode it to 'foo.%l'. stored_filename = filename if submission.language is not None: extension = get_language(submission.language).source_extension stored_filename = re.sub(r'%s$' % extension, '.%l', filename) if stored_filename not in submission.files: raise tornado.web.HTTPError(404) digest = submission.files[stored_filename].digest self.sql_session.close() mimetype = get_type_for_file_name(filename) if mimetype is None: mimetype = 'application/octet-stream' self.fetch(digest, mimetype, filename)
def test_unknown(self): self.assertIsNone(get_type_for_file_name("foobar"))
def test_filename(self): self.assertEqual(get_type_for_file_name("Makefile"), "text/x-makefile")
def test_unknown(self): self.assertIsNone(get_type_for_file_name("foobar"))
def test_extension(self): self.assertEqual(get_type_for_file_name("foo.pdf"), "application/pdf")
def test_filename(self): self.assertEqual(get_type_for_file_name("Makefile"), "text/x-makefile")
def test_extension(self): self.assertEqual(get_type_for_file_name("foo.pdf"), "application/pdf")