diff --git a/oioioi/testrun/controllers.py b/oioioi/testrun/controllers.py index 8a53299a9..be4ba4346 100644 --- a/oioioi/testrun/controllers.py +++ b/oioioi/testrun/controllers.py @@ -123,9 +123,12 @@ def adjust_submission_form(self, request, form, problem_instance): if form.kind != 'TESTRUN': return + # We need to check using is_zipfile, as sioworkers do the same. + # Otherwise one could bypass checks and limits for example by + # uploading a zipfile without the '.zip' extension. def validate_file_size(file): if ( - file.name.upper().endswith(".ZIP") + is_zipfile(file) and file.size > self.get_testrun_zipped_input_limit() ): raise ValidationError(_("Zipped input file size limit exceeded.")) @@ -133,7 +136,7 @@ def validate_file_size(file): raise ValidationError(_("Input file size limit exceeded.")) def validate_zip(file): - if file.name.upper().endswith(".ZIP"): + if is_zipfile(file): archive = Archive(file, '.zip') if len(archive.filenames()) != 1: raise ValidationError(_("Archive should have only 1 file inside.")) @@ -279,7 +282,7 @@ def render_submission(self, request, submission): context={ 'submission': submission_template_context(request, sbm_testrun), 'supported_extra_args': self.get_supported_extra_args(submission), - 'input_is_zip': is_zipfile(sbm_testrun.input_file), + 'input_is_zip': is_zipfile(sbm_testrun.input_file.read_using_cache()), }, ) @@ -295,7 +298,7 @@ def _render_testrun_report( input_is_zip = False if testrun_report: input_is_zip = is_zipfile( - testrun_report.submission_report.submission.programsubmission.testrunprogramsubmission.input_file + testrun_report.submission_report.submission.programsubmission.testrunprogramsubmission.input_file.read_using_cache() ) return render_to_string( diff --git a/oioioi/testrun/views.py b/oioioi/testrun/views.py index b6450145e..6675a6998 100644 --- a/oioioi/testrun/views.py +++ b/oioioi/testrun/views.py @@ -1,3 +1,5 @@ +from zipfile import is_zipfile + from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse from django.urls import reverse @@ -127,7 +129,10 @@ def download_input_file_view(request, submission_id): submission = get_submission_or_error( request, submission_id, TestRunProgramSubmission ) - return stream_file(submission.input_file, name='input.in') + filename = 'input.in' + if is_zipfile(submission.input_file.read_using_cache()): + filename = 'input.zip' + return stream_file(submission.input_file, name=filename) @enforce_condition(contest_exists & can_enter_contest)