64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
|
from django.conf import settings
|
||
|
from django.http import HttpResponseRedirect
|
||
|
from django.urls import Resolver404, resolve, reverse
|
||
|
from django.utils.http import urlquote
|
||
|
|
||
|
|
||
|
class ShortCircuitMiddleware:
|
||
|
def __init__(self, get_response):
|
||
|
self.get_response = get_response
|
||
|
|
||
|
def __call__(self, request):
|
||
|
try:
|
||
|
callback, args, kwargs = resolve(request.path_info, getattr(request, 'urlconf', None))
|
||
|
except Resolver404:
|
||
|
callback, args, kwargs = None, None, None
|
||
|
|
||
|
if getattr(callback, 'short_circuit_middleware', False):
|
||
|
return callback(request, *args, **kwargs)
|
||
|
return self.get_response(request)
|
||
|
|
||
|
|
||
|
class DMOJLoginMiddleware(object):
|
||
|
def __init__(self, get_response):
|
||
|
self.get_response = get_response
|
||
|
|
||
|
def __call__(self, request):
|
||
|
if request.user.is_authenticated:
|
||
|
profile = request.profile = request.user.profile
|
||
|
login_2fa_path = reverse('login_2fa')
|
||
|
if (profile.is_totp_enabled and not request.session.get('2fa_passed', False) and
|
||
|
request.path not in (login_2fa_path, reverse('auth_logout')) and
|
||
|
not request.path.startswith(settings.STATIC_URL)):
|
||
|
return HttpResponseRedirect(login_2fa_path + '?next=' + urlquote(request.get_full_path()))
|
||
|
else:
|
||
|
request.profile = None
|
||
|
return self.get_response(request)
|
||
|
|
||
|
|
||
|
class DMOJImpersonationMiddleware(object):
|
||
|
def __init__(self, get_response):
|
||
|
self.get_response = get_response
|
||
|
|
||
|
def __call__(self, request):
|
||
|
if request.user.is_impersonate:
|
||
|
request.no_profile_update = True
|
||
|
request.profile = request.user.profile
|
||
|
return self.get_response(request)
|
||
|
|
||
|
|
||
|
class ContestMiddleware(object):
|
||
|
def __init__(self, get_response):
|
||
|
self.get_response = get_response
|
||
|
|
||
|
def __call__(self, request):
|
||
|
profile = request.profile
|
||
|
if profile:
|
||
|
profile.update_contest()
|
||
|
request.participation = profile.current_contest
|
||
|
request.in_contest = request.participation is not None
|
||
|
else:
|
||
|
request.in_contest = False
|
||
|
request.participation = None
|
||
|
return self.get_response(request)
|