django-cats/cats/views.py
Jan Dittberner 564a00d46d Finish login and registration flow
- add template for login page
- add logout URL
- display user information
2024-09-20 15:59:51 +02:00

98 lines
3 KiB
Python

from http import HTTPStatus
from django.conf import settings
from django.contrib.auth import authenticate, login
from django.contrib.auth.views import RedirectURLMixin
from django.http import HttpResponse, HttpResponseForbidden, HttpResponseRedirect
from django.shortcuts import render, resolve_url
from django.urls import reverse
from django.utils.translation import get_language_from_request
from django.utils.translation import gettext as _
from django.views.generic import TemplateView
from .authentication import get_certificate_information, get_user_for_certificate
# Create your views here.
class CertificateLoginView(RedirectURLMixin, TemplateView):
template_name = "login.html"
def get_default_redirect_url(self):
"""Return the default redirect URL."""
if self.next_page:
return resolve_url(self.next_page)
else:
return resolve_url(settings.LOGIN_REDIRECT_URL)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
certificate = self.request.META.get("HTTP_X_SSL_CERT", None)
certificate_information = get_certificate_information(
encoded_certificate=certificate
)
context.update(
{
"certificate": certificate_information,
"certificate_user": (
get_user_for_certificate(certificate_information)
if certificate
else None
),
}
)
return context
def post(self, *args, **kwargs):
certificate = self.request.META.get("HTTP_X_SSL_CERT", None)
certificate_information = get_certificate_information(
encoded_certificate=certificate
)
user = authenticate(self.request, certificate=certificate_information)
if not user:
return HttpResponseForbidden(
_("you have not sent a valid client certificate")
)
login(self.request, user)
return HttpResponseRedirect(self.get_success_url())
def get_challenge_wiki_url(request):
language = get_language_from_request(request)
url_map = {
"cz": "https://wiki.cacert.org/AssurerChallenge/CZ",
"de": "https://wiki.cacert.org/AssurerChallenge/DE",
"fr": "https://wiki.cacert.org/AssurerChallenge/fr",
"nl": "https://wiki.cacert.org/AssurerChallenge/NL",
}
return url_map.get(language, "https://wiki.cacert.org/AssurerChallenge")
def home_page(request):
return render(
request,
"home.html",
context={"challenge_wiki_url": get_challenge_wiki_url(request)},
)
def switch_language(request):
if request.method != "POST":
return HttpResponse(status=HTTPStatus.METHOD_NOT_ALLOWED)
language = request.POST.get("choose_language", get_language_from_request(request))
next_page = request.GET.get("next", reverse("home"))
response = HttpResponseRedirect(next_page)
response.set_cookie(settings.LANGUAGE_COOKIE_NAME, language)
return response