django-cats/cats/views.py

99 lines
3 KiB
Python
Raw Permalink Normal View History

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