diff --git a/dmoj/settings.py b/dmoj/settings.py index 7acabd59f7..cec86b05b6 100644 --- a/dmoj/settings.py +++ b/dmoj/settings.py @@ -63,6 +63,7 @@ DMOJ_PROBLEM_MAX_TIME_LIMIT = 60 # seconds DMOJ_PROBLEM_MIN_MEMORY_LIMIT = 0 # kilobytes DMOJ_PROBLEM_MAX_MEMORY_LIMIT = 1048576 # kilobytes +DMOJ_PROBLEM_MAX_OUTPUT_LIMIT = 104857600 # bytes (100MB) DMOJ_PROBLEM_MIN_PROBLEM_POINTS = 0 DMOJ_PROBLEM_MIN_USER_POINTS_VOTE = 1 # when voting on problem, minimum point value user can select DMOJ_PROBLEM_MAX_USER_POINTS_VOTE = 50 # when voting on problem, maximum point value user can select diff --git a/judge/models/problem_data.py b/judge/models/problem_data.py index 5b182e523c..57d77c0e7e 100644 --- a/judge/models/problem_data.py +++ b/judge/models/problem_data.py @@ -1,6 +1,8 @@ import errno import os +from django.conf import settings +from django.core.validators import MaxValueValidator from django.db import models from django.utils.translation import gettext_lazy as _ @@ -39,7 +41,8 @@ class ProblemData(models.Model): generator = models.FileField(verbose_name=_('generator file'), storage=problem_data_storage, null=True, blank=True, upload_to=problem_directory_file) output_prefix = models.IntegerField(verbose_name=_('output prefix length'), blank=True, null=True) - output_limit = models.IntegerField(verbose_name=_('output limit length'), blank=True, null=True) + output_limit = models.IntegerField(verbose_name=_('output limit length'), blank=True, null=True, + validators=[MaxValueValidator(settings.DMOJ_PROBLEM_MAX_OUTPUT_LIMIT)]) feedback = models.TextField(verbose_name=_('init.yml generation feedback'), blank=True) checker = models.CharField(max_length=10, verbose_name=_('checker'), choices=CHECKERS, blank=True) unicode = models.BooleanField(verbose_name=_('enable unicode'), null=True, blank=True) @@ -90,7 +93,8 @@ class ProblemTestCase(models.Model): points = models.IntegerField(verbose_name=_('point value'), blank=True, null=True) is_pretest = models.BooleanField(verbose_name=_('case is pretest?')) output_prefix = models.IntegerField(verbose_name=_('output prefix length'), blank=True, null=True) - output_limit = models.IntegerField(verbose_name=_('output limit length'), blank=True, null=True) + output_limit = models.IntegerField(verbose_name=_('output limit length'), blank=True, null=True, + validators=[MaxValueValidator(settings.DMOJ_PROBLEM_MAX_OUTPUT_LIMIT)]) checker = models.CharField(max_length=10, verbose_name=_('checker'), choices=CHECKERS, blank=True) checker_args = models.TextField(verbose_name=_('checker arguments'), blank=True, help_text=_('checker arguments as a JSON object'))