50 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """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):
 | |
|         kwargs["show_password_forget_notice"] = CONFIG.y(
 | |
|             "passbook.password_reset.enabled"
 | |
|         )
 | |
|         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(
 | |
|             subject=_("Forgotten password"),
 | |
|             template_name="email/account_password_reset.html",
 | |
|             to=[self.pending_user.email],
 | |
|             template_context={
 | |
|                 "url": self.request.build_absolute_uri(
 | |
|                     reverse(
 | |
|                         "passbook_core:auth-password-reset",
 | |
|                         kwargs={"nonce": nonce.uuid},
 | |
|                     )
 | |
|                 )
 | |
|             },
 | |
|         )
 | |
|         send_mails(self.authenticator.current_factor, message)
 | |
|         self.authenticator.cleanup()
 | |
|         messages.success(request, _("Check your E-Mails for a password reset link."))
 | |
|         return redirect("passbook_core:auth-login")
 | |
| 
 | |
|     def post(self, request: HttpRequest):
 | |
|         """Just redirect to next factor"""
 | |
|         return self.authenticator.user_ok()
 | 
