mirror of https://github.com/jumpserver/jumpserver
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
5.4 KiB
176 lines
5.4 KiB
# -*- coding: utf-8 -*- |
|
# |
|
from django import forms |
|
from django.utils.translation import gettext_lazy as _ |
|
|
|
from common.utils import validate_ssh_public_key |
|
from authentication.forms import EncryptedField, CaptchaMixin |
|
from ..models import User |
|
|
|
__all__ = [ |
|
'UserProfileForm', 'UserMFAForm', 'UserFirstLoginFinishForm', |
|
'UserPasswordForm', 'UserPublicKeyForm', 'FileForm', |
|
'UserTokenResetPasswordForm', 'UserForgotPasswordForm', |
|
'UserCheckPasswordForm', 'UserCheckOtpCodeForm', |
|
'UserForgotPasswordPreviewingForm' |
|
] |
|
|
|
|
|
class UserCheckPasswordForm(forms.Form): |
|
password = EncryptedField( |
|
label=_('Password'), widget=forms.PasswordInput, |
|
max_length=1024, strip=False |
|
) |
|
|
|
|
|
class UserCheckOtpCodeForm(forms.Form): |
|
otp_code = forms.CharField(label=_('MFA code'), max_length=6) |
|
|
|
|
|
class UserProfileForm(forms.ModelForm): |
|
username = forms.CharField(disabled=True, label=_("Username")) |
|
name = forms.CharField(disabled=True, label=_("Name")) |
|
email = forms.CharField(disabled=True) |
|
|
|
class Meta: |
|
model = User |
|
fields = [ |
|
'username', 'name', 'email', |
|
'wechat', 'phone', |
|
] |
|
|
|
|
|
UserProfileForm.verbose_name = _("Profile") |
|
|
|
|
|
class UserMFAForm(forms.ModelForm): |
|
mfa_description = _( |
|
'When enabled, ' |
|
'you will enter the MFA binding process the next time you log in. ' |
|
'you can also directly bind in ' |
|
'"personal information -> quick modification -> change MFA Settings"!' |
|
) |
|
|
|
class Meta: |
|
model = User |
|
fields = ['mfa_level'] |
|
widgets = {'mfa_level': forms.RadioSelect()} |
|
help_texts = { |
|
'mfa_level': _('* Enable MFA to make the account more secure.'), |
|
} |
|
|
|
|
|
UserMFAForm.verbose_name = _("MFA") |
|
|
|
|
|
class UserFirstLoginFinishForm(forms.Form): |
|
finish_description = _( |
|
'In order to protect you and your company, ' |
|
'please keep your account, ' |
|
'password and key sensitive information properly. ' |
|
'(for example: setting complex password, enabling MFA)' |
|
) |
|
|
|
|
|
UserFirstLoginFinishForm.verbose_name = _("Finish") |
|
|
|
|
|
class UserTokenResetPasswordForm(forms.Form): |
|
new_password = EncryptedField( |
|
min_length=5, max_length=128, |
|
widget=forms.PasswordInput, |
|
label=_("New password") |
|
) |
|
confirm_password = EncryptedField( |
|
min_length=5, max_length=128, |
|
widget=forms.PasswordInput, |
|
label=_("Confirm password") |
|
) |
|
|
|
def clean_confirm_password(self): |
|
new_password = self.cleaned_data['new_password'] |
|
confirm_password = self.cleaned_data['confirm_password'] |
|
|
|
if new_password != confirm_password: |
|
raise forms.ValidationError(_('Password does not match')) |
|
return confirm_password |
|
|
|
|
|
class UserForgotPasswordForm(forms.Form): |
|
email = forms.CharField(label=_("Email"), required=False) |
|
country_code = forms.CharField(required=False) |
|
sms = forms.CharField( |
|
label=_('SMS'), required=False, |
|
help_text=_('The phone number must contain an area code, for example, +86') |
|
) |
|
code = forms.CharField(label=_('Verify code'), max_length=6, required=False) |
|
form_type = forms.ChoiceField( |
|
choices=[('sms', _('SMS')), ('email', _('Email'))], |
|
widget=forms.HiddenInput({'value': 'email'}) |
|
) |
|
|
|
|
|
class UserForgotPasswordPreviewingForm(CaptchaMixin): |
|
username = forms.CharField(label=_("Username")) |
|
|
|
|
|
class UserPasswordForm(UserTokenResetPasswordForm): |
|
old_password = EncryptedField( |
|
max_length=128, widget=forms.PasswordInput, |
|
label=_("Old password") |
|
) |
|
|
|
def __init__(self, *args, **kwargs): |
|
self.instance = kwargs.pop('instance') |
|
super().__init__(*args, **kwargs) |
|
|
|
def clean_old_password(self): |
|
old_password = self.cleaned_data['old_password'] |
|
if not self.instance.check_password(old_password): |
|
raise forms.ValidationError(_('Old password error')) |
|
return old_password |
|
|
|
def save(self): |
|
password = self.cleaned_data['new_password'] |
|
self.instance.reset_password(new_password=password) |
|
return self.instance |
|
|
|
|
|
class UserPublicKeyForm(forms.Form): |
|
pubkey_description = _('Automatically configure and download the SSH key') |
|
public_key = forms.CharField( |
|
label=_('ssh public key'), max_length=5000, required=False, |
|
widget=forms.Textarea(attrs={'placeholder': _('ssh-rsa AAAA...')}), |
|
help_text=_('Paste your id_rsa.pub here.') |
|
) |
|
|
|
def __init__(self, *args, **kwargs): |
|
if 'instance' in kwargs: |
|
self.instance = kwargs.pop('instance') |
|
else: |
|
self.instance = None |
|
super().__init__(*args, **kwargs) |
|
|
|
def clean_public_key(self): |
|
public_key = self.cleaned_data['public_key'] |
|
if self.instance.public_key and public_key == self.instance.public_key: |
|
msg = _('Public key should not be the same as your old one.') |
|
raise forms.ValidationError(msg) |
|
|
|
if public_key and not validate_ssh_public_key(public_key): |
|
raise forms.ValidationError(_('Not a valid ssh public key')) |
|
return public_key |
|
|
|
def save(self): |
|
public_key = self.cleaned_data['public_key'] |
|
if public_key: |
|
self.instance.public_key = public_key |
|
self.instance.save() |
|
return self.instance |
|
|
|
|
|
UserPublicKeyForm.verbose_name = _("Public key") |
|
|
|
|
|
class FileForm(forms.Form): |
|
file = forms.FileField()
|
|
|