This repository has been archived on 2026-03-30. You can view files and clone it, but cannot push or open issues or pull requests.
RepApp/repapp/one_time_login/views.py

53 lines
1.5 KiB
Python
Raw Normal View History

2023-08-27 20:47:19 +00:00
import time
2023-08-29 11:08:35 +00:00
import logging
2023-08-27 20:47:19 +00:00
from hashlib import sha256
from django.contrib import messages
from django.contrib.auth import authenticate, login
2023-08-29 11:08:35 +00:00
from django.contrib.auth.decorators import login_required
2023-08-27 20:47:19 +00:00
from django.shortcuts import get_object_or_404
2023-08-29 11:08:35 +00:00
from django.http import HttpResponseRedirect, HttpResponse
2023-08-27 20:47:19 +00:00
from django.urls import reverse_lazy
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
from .models import OneTimeLogin
2023-08-29 11:08:35 +00:00
from .utils import one_time_login
2023-08-27 20:47:19 +00:00
2023-08-29 11:08:35 +00:00
logger = logging.getLogger(__name__)
def login_view(request, secret: str):
2023-08-27 20:47:19 +00:00
"""
View for one time login.
"""
# waste a little time as brute force protection
time.sleep(1)
2023-08-29 11:08:35 +00:00
logger.debug('one_time_login: secret %s', secret)
2023-08-27 20:47:19 +00:00
2023-08-29 11:08:35 +00:00
(user, url) = one_time_login(request, secret)
2023-08-27 20:47:19 +00:00
2023-08-29 11:08:35 +00:00
logger.debug('one_time_login: user %s, url %s', user, url)
2023-08-27 20:47:19 +00:00
if user is not None:
login(request, user)
messages.add_message(request, messages.INFO, _('Login successful!'))
2023-08-29 11:08:35 +00:00
if url is not None:
logger.debug('one_time_login: redirecting to url %s', url)
return HttpResponseRedirect(url)
else:
return HttpResponseRedirect('/')
messages.add_message(request, messages.ERROR, _('Login failed!'))
return HttpResponseRedirect('/')
@login_required
def protected_test(request):
return HttpResponse('protected content')
@login_required
def dummy_content(request):
return HttpResponse("dummy content")