"""passbook core authentication views""" from django.contrib import messages from django.contrib.auth import login, logout from django.contrib.auth.mixins import LoginRequiredMixin from django.http import HttpRequest, HttpResponse from django.shortcuts import get_object_or_404, redirect, reverse from django.utils.translation import ugettext as _ from django.views import View from structlog import get_logger from passbook.core.models import Nonce LOGGER = get_logger() class LogoutView(LoginRequiredMixin, View): """Log current user out""" def dispatch(self, request: HttpRequest) -> HttpResponse: """Log current user out""" logout(request) messages.success(request, _("You've successfully been logged out.")) return redirect(reverse("passbook_core:auth-login")) class PasswordResetView(View): """Temporarily authenticate User and allow them to reset their password""" def get(self, request: HttpRequest, nonce_uuid: str) -> HttpResponse: """Authenticate user with nonce and redirect to password change view""" # 3. (Optional) Trap user in password change view nonce = get_object_or_404(Nonce, uuid=nonce_uuid) # Workaround: hardcoded reference to ModelBackend, needs testing nonce.user.backend = "django.contrib.auth.backends.ModelBackend" login(request, nonce.user) nonce.delete() messages.success( request, _(("Temporarily authenticated, please change your password")), ) return redirect("passbook_core:user-change-password")