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

87 lines
2.6 KiB
Python
Raw Normal View History

2024-11-12 09:28:43 +00:00
from django.views.generic import FormView
from django import forms
2024-11-19 09:06:55 +00:00
from django.utils.translation import gettext_lazy as _
2024-11-12 09:28:43 +00:00
from authentication import errors
2024-12-06 10:19:36 +00:00
from authentication.mixins import AuthMixin
2024-11-12 09:28:43 +00:00
__all__ = ['UserFaceCaptureView', 'UserFaceEnableView',
'UserFaceDisableView']
2024-12-06 10:19:36 +00:00
from common.utils import FlashMessageUtil
2024-11-19 09:06:55 +00:00
2024-11-12 09:28:43 +00:00
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):
2024-11-19 09:06:55 +00:00
return super().form_valid(form)
2024-11-12 09:28:43 +00:00
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
2024-11-12 09:28:43 +00:00
if 'form' not in kwargs:
form = self.get_form()
context['form'] = form
if not context['form'].is_bound:
2024-11-12 09:28:43 +00:00
context.update({
"active": True,
})
return context
2024-11-12 09:28:43 +00:00
2024-12-06 10:19:36 +00:00
class UserFaceEnableView(UserFaceCaptureView):
2024-11-12 09:28:43 +00:00
def form_valid(self, form):
try:
code = self.get_face_code()
user = self.get_user_from_session()
user.face_vector = code
user.save(update_fields=['face_vector'])
except Exception as e:
form.add_error("code", str(e))
return super().form_invalid(form)
2024-11-12 09:28:43 +00:00
2024-11-19 09:06:55 +00:00
return super().form_valid(form)
def get_success_url(self):
message_data = {
2024-11-28 10:06:37 +00:00
'title': _('Face binding successful'),
'message': _('Face binding successful'),
'interval': 2,
'redirect_url': '/ui/#/profile/index'
2024-11-19 09:06:55 +00:00
}
url = FlashMessageUtil.gen_message_url(message_data)
return url
2024-11-12 09:28:43 +00:00
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'])
except (errors.MFAFailedError, errors.BlockMFAError) as e:
form.add_error('code', e.msg)
return super().form_invalid(form)
2024-11-19 09:06:55 +00:00
return super().form_valid(form)
def get_success_url(self):
message_data = {
2024-11-28 10:06:37 +00:00
'title': _('Face unbinding successful'),
'message': _('Face unbinding successful'),
'interval': 2,
'redirect_url': '/ui/#/profile/index'
2024-11-19 09:06:55 +00:00
}
url = FlashMessageUtil.gen_message_url(message_data)
return url