Source code for oioioi.mailsubmit.utils

import hashlib
import hmac

from django.conf import settings

from oioioi.base.permissions import make_request_condition
from oioioi.base.utils import request_cached
from oioioi.contests.models import ProblemInstance
from oioioi.default_settings import MAILSUBMIT_CONFIRMATION_HASH_LENGTH
from oioioi.mailsubmit.models import MailSubmissionConfig


@make_request_condition
[docs]def is_mailsubmit_used(request): try: _msc = request.contest.mail_submission_config return True except MailSubmissionConfig.DoesNotExist: return False
@make_request_condition
[docs]def is_mailsubmit_allowed(request): try: msc = request.contest.mail_submission_config return ( msc.enabled and msc.start_date is not None and msc.start_date <= request.timestamp and (msc.end_date is None or request.timestamp < msc.end_date) ) except MailSubmissionConfig.DoesNotExist: return False
@make_request_condition @request_cached
[docs]def has_any_mailsubmittable_problem(request): return bool(mailsubmittable_problem_instances(request))
@request_cached
[docs]def mailsubmittable_problem_instances(request): controller = request.contest.controller queryset = ( ProblemInstance.objects.filter(contest=request.contest) .select_related('problem') .prefetch_related('round') ) return [ pi for pi in queryset if controller.can_submit(request, pi, check_round_times=False) ]
[docs]def accept_mail_submission(request, mailsubmission): ccontroller = request.contest.controller submission = ccontroller.create_submission( request, mailsubmission.problem_instance, { 'user': mailsubmission.user, 'file': mailsubmission.source_file, 'kind': 'NORMAL', }, ) mailsubmission.submission = submission mailsubmission.accepted_by = request.user mailsubmission.save() return submission
[docs]def mail_submission_hashes(mailsubmission): source_hash = hashlib.sha256() for chunk in mailsubmission.source_file.read_using_cache().chunks(): source_hash.update(chunk) source_hash = source_hash.hexdigest() pi = mailsubmission.problem_instance msg = '%d-%s-%d-%s' % (mailsubmission.id, pi.contest.id, pi.id, source_hash) msg = msg.encode('utf-8') submission_hash = hmac.new( settings.SECRET_KEY.encode('utf-8'), msg, 'sha256' # Name of the hashing algorithm is required from Python3.8. ).hexdigest()[:MAILSUBMIT_CONFIRMATION_HASH_LENGTH] return source_hash, submission_hash