jumpserver/apps/users/views/profile/face.py

63 lines
1.8 KiB
Python

from django.contrib.auth import logout as auth_logout
from django.shortcuts import redirect
from django.views.generic import FormView
from django import forms
from authentication import errors
from authentication.mixins import AuthMixin, MFAFaceMixin
__all__ = ['UserFaceCaptureView', 'UserFaceEnableView',
'UserFaceDisableView']
class UserFaceCaptureForm(forms.Form):
code = forms.CharField(label='MFA Code', max_length=128, required=False)
class UserFaceCaptureView(AuthMixin, FormView):
template_name = 'authentication/face_capture.html'
form_class = UserFaceCaptureForm
mfa_type = 'face'
code = ''
def form_valid(self, form):
raise NotImplementedError
def get_context_data(self, **kwargs):
context = super().get_context_data()
if not self.get_form().is_bound:
context.update({
"active": True,
})
kwargs.update(context)
return kwargs
class UserFaceEnableView(UserFaceCaptureView, MFAFaceMixin):
def form_valid(self, form):
code = self.get_face_code()
user = self.get_user_from_session()
user.face_vector = code
user.save(update_fields=['face_vector'])
auth_logout(self.request)
return redirect('authentication:login')
class UserFaceDisableView(UserFaceCaptureView):
def form_valid(self, form):
try:
self._do_check_user_mfa(self.code, self.mfa_type)
user = self.get_user_from_session()
user.face_vector = None
user.save(update_fields=['face_vector'])
auth_logout(self.request)
except (errors.MFAFailedError, errors.BlockMFAError) as e:
form.add_error('code', e.msg)
return super().form_invalid(form)
return redirect('authentication:login')