2024-09-20 13:59:51 +00:00
|
|
|
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
|
2024-09-20 10:42:37 +00:00
|
|
|
from django.utils.translation import gettext as _
|
2024-09-20 13:59:51 +00:00
|
|
|
from django.views.generic import TemplateView
|
|
|
|
|
|
|
|
from .authentication import get_certificate_information, get_user_for_certificate
|
2024-09-20 10:42:37 +00:00
|
|
|
|
2024-09-17 15:39:46 +00:00
|
|
|
|
|
|
|
# Create your views here.
|
2024-09-20 13:59:51 +00:00
|
|
|
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
|
|
|
|
)
|
2024-09-20 10:42:37 +00:00
|
|
|
|
2024-09-20 13:59:51 +00:00
|
|
|
user = authenticate(self.request, certificate=certificate_information)
|
2024-09-20 10:42:37 +00:00
|
|
|
|
2024-09-20 13:59:51 +00:00
|
|
|
if not user:
|
|
|
|
return HttpResponseForbidden(
|
|
|
|
_("you have not sent a valid client certificate")
|
|
|
|
)
|
2024-09-20 10:42:37 +00:00
|
|
|
|
2024-09-20 13:59:51 +00:00
|
|
|
login(self.request, user)
|
2024-09-20 10:42:37 +00:00
|
|
|
|
2024-09-20 13:59:51 +00:00
|
|
|
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")
|
2024-09-20 10:42:37 +00:00
|
|
|
|
|
|
|
|
|
|
|
def home_page(request):
|
2024-09-20 13:59:51 +00:00
|
|
|
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
|