import time import logging from hashlib import sha256 from django.contrib import messages from django.contrib.auth import authenticate, login from django.contrib.auth.decorators import login_required from django.shortcuts import get_object_or_404 from django.http import HttpResponseRedirect, HttpResponse from django.urls import reverse_lazy from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ from .models import OneTimeLogin from .utils import one_time_login logger = logging.getLogger(__name__) def login_view(request, secret: str): """ View for one time login. """ # waste a little time as brute force protection time.sleep(1) logger.debug('one_time_login: secret %s', secret) (user, url) = one_time_login(request, secret) logger.debug('one_time_login: user %s, url %s', user, url) if user is not None: login(request, user) messages.add_message(request, messages.INFO, _('Login successful!')) if url is not None: logger.debug('one_time_login: redirecting to url %s', url) return HttpResponseRedirect(url) else: # pragma: no cover # would be an invalid OTL, which should never happen return HttpResponseRedirect('/') messages.add_message(request, messages.ERROR, _('Login failed!')) return HttpResponseRedirect('/') @login_required def protected_test(request): # pragma: no cover # this view is only used for a live server test case return HttpResponse('protected content')