2019-10-08 12:30:17 +00:00
|
|
|
"""passbook multi-factor authentication engine"""
|
|
|
|
from django.contrib import messages
|
|
|
|
from django.http import HttpRequest
|
|
|
|
from django.shortcuts import redirect, reverse
|
|
|
|
from django.utils.translation import gettext as _
|
|
|
|
from structlog import get_logger
|
|
|
|
|
|
|
|
from passbook.core.models import Nonce
|
|
|
|
from passbook.factors.base import AuthenticationFactor
|
|
|
|
from passbook.factors.email.tasks import send_mails
|
|
|
|
from passbook.factors.email.utils import TemplateEmailMessage
|
|
|
|
from passbook.lib.config import CONFIG
|
|
|
|
|
|
|
|
LOGGER = get_logger()
|
|
|
|
|
|
|
|
|
|
|
|
class EmailFactorView(AuthenticationFactor):
|
|
|
|
"""Dummy factor for testing with multiple factors"""
|
|
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
2019-12-31 11:51:16 +00:00
|
|
|
kwargs["show_password_forget_notice"] = CONFIG.y(
|
|
|
|
"passbook.password_reset.enabled"
|
|
|
|
)
|
2019-10-08 12:30:17 +00:00
|
|
|
return super().get_context_data(**kwargs)
|
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
|
|
nonce = Nonce.objects.create(user=self.pending_user)
|
|
|
|
# Send mail to user
|
|
|
|
message = TemplateEmailMessage(
|
2019-12-31 11:51:16 +00:00
|
|
|
subject=_("Forgotten password"),
|
|
|
|
template_name="email/account_password_reset.html",
|
2019-10-11 12:24:58 +00:00
|
|
|
to=[self.pending_user.email],
|
2019-10-08 12:30:17 +00:00
|
|
|
template_context={
|
2019-12-31 11:51:16 +00:00
|
|
|
"url": self.request.build_absolute_uri(
|
|
|
|
reverse(
|
|
|
|
"passbook_core:auth-password-reset",
|
|
|
|
kwargs={"nonce": nonce.uuid},
|
|
|
|
)
|
|
|
|
)
|
|
|
|
},
|
|
|
|
)
|
2019-10-08 12:30:17 +00:00
|
|
|
send_mails(self.authenticator.current_factor, message)
|
|
|
|
self.authenticator.cleanup()
|
2019-12-31 11:51:16 +00:00
|
|
|
messages.success(request, _("Check your E-Mails for a password reset link."))
|
|
|
|
return redirect("passbook_core:auth-login")
|
2019-10-08 12:30:17 +00:00
|
|
|
|
|
|
|
def post(self, request: HttpRequest):
|
|
|
|
"""Just redirect to next factor"""
|
|
|
|
return self.authenticator.user_ok()
|