mirror of
https://github.com/jumpserver/jumpserver.git
synced 2026-01-14 12:06:23 +00:00
* [Update] 修改 success message, 添加资产组时可以添加资产 * [Update] system user form add label * [Update] set default cluster * [Update] 修改一些翻译 * [Bugfix] 修复重置密码bug * [Bugfix] 默认default cluster * [Bugfix] 用户添加报错 * 修改tab样式 * [Bugfix] 修复了一些显示上的bug * 修复全选按钮在搜索后仍然选择全部的问题 * [Bugfix] 修复以下bug 1. 查看执行历史异常 2. 用户授权资产页显示message * [Update] api 返回platform, 并增加web terminal nav * [Feature] 添加setting页面 * [Feature] 添加basic settings * [Update] 修改翻译 * [Update] 修改config * [Update] 启动加载common setting * [Bugfix] 修复cluster创建的bug * [Bugfix] 修复title显示Jumpserver * [Bugfix] setting tables not found * [Bugfix] settings add option * [Feature] 添加后端paging * [Bugfix] 资产列表选择别的页会报错 * [Update] check all 只选择当前页面 * [Bugfix] user login ip * [Bugfix] for login ip * [Bugfix] 修复资产列表显示bug * [Remove] labels * [Bugfix] task运行失败,因为tasks没有设置 * [Feature] 增加标签 * [Bugfix] 读取不到prefix * For storage * [Change] 修改部分翻译 * [Update] 启用ldap移动位置 * [Update] 修改翻译 * [Feature] 支持es存储命令 * Update README.md * [Feature] 添加es支持 * [update] 修改用户创建时 姓名和用户名的位置 * [Update] 修改install.md * [Update] remote default PAGE_SIZE stting * [Feature] terminal config load * [Feature] es support * [Update] 修改requirement * [Update] 修改requirements * [Update] 修改dictfiled * [Fix] 修改Logger * [Bugfix] 倒序显示 * [Update] 修改默认头像和logo * [Update] 修改django-celery-beat的版本 * [Feature] 添加修改用户密码api * add logo test * [Bugfix] 修复一些bug * [Update] 修改copyrite * [Update] 修改copyright * Update ISSUE_TEMPLATE.md * [Update] 修改禁止排序的颜色 * [Feature] 标签管理功能 * [Bugfix] git status * [Model] 修改create_by字段 * [Update] 修改位置 * [Update] 修改签名md5算法 * [Feature] 资产列表标签搜索 * [Feature] 添加资产详情标签 * [Bugfix] 修复资产搜索bug * [Update] ansible disk bug * [Update] ansible disk bug * [Bugfix] 修复获取kvmcpu的bug * [Bugfix] 修复bsd获取cpu数量bug * [Bugfix] 修改翻译 * [Bugfix] 资产model 太长 * [Bugfix] 修改项目结构描述 修正"项目多语言目录" * Update project_structure.md * [Update] add debug log * refactor: rename folder i18n * [Feature] 添加链接token * [Feature] Label 删除修改 * [Update] 修改部分翻译 * [Update] 修改小bug * [Update] 修复获取资产信息异常bug * [Bugfix] 修复系统用户上传秘钥的bug * [Update] 修改获取资产信息产生的异常 * [Update] 删除部分资产属性 * [Bugfix] 资产批量便捷 * [Update] 修改认证 * [Feature] 支持popover * [Feature] tree * [Feature] 添加资产树 * [Feature] 使用ztree * [Feature] tree增删功能 * [Bugfix] 修复组详情bug * [Bugfix] 修复组详情bug * [Bugfix] 修改创建label时报错的bug * [Bugfix] 修改label api bug * [Update] 去掉资产组添加 * [Update] 修改ztrr * Update README.md * [Update] 修改资产创建 * [Bugfix] 修复ldap认证bug * [Update] 修改一处翻译 * [Update] 更改授权规则前commit * [Abandon] ... * Update README.md * Update README.md * Update README.md * [Feature] 完成资产授权和资产添加 * [Update] 修改授权 * [Bugfix] 修改创建系统用户的bug * feat: rdp support * [Update] 拆分asset api module * [Update] 资产列表选中和移除资产 * [Feature] 更改perms api * [Update] 使用资产树,去掉集群和资产组 * [Update] 修改系统用户推送,拆分assets的部分模块 * [Update] 完成树形改造 * [Update] 完成资产书 * [Update] 修改资产model * ubuntu16.04 deb_requirements.txt update (#1007) * Update run server.py (#915) Fix for not callable error when config.py not exists * [Update]一些修改 * [Update] 修改初始 * feat: replay setting page and api * 增加隐藏树功能 * [Update] 修改翻译 * 对齐菜单文字。修改英文 * feat: update app setting * fix: app get replay storage * [Update] 修改文案 * [Docs] 初始化doc * [Bugfix] 用户csv导入编码问题 * [Update] 修改设置的一些require * [Bugfix] 修复管理用户无法查看的bug * [Update] 修改授权api, windows资产只有rdp协议,linux只有ssh协议 * [Update] terminal可以更改名称 * [Update] 统一copyright * [Update] 修改文档 * [Bugfix] 修复资产禁用还可以登录 * [Update] 修改文案 * [Update] 支持拖拽更新 * [Bugfix] 修复bug,修改celery beat版本依赖 * [Update] 修改一些小问题 * 添加普通用户使用内容 * [Update] 修改一些文案 * Update README.md * Update README.md * Update README.md * 用户列表 * [Update] 修改一些bug和文案 * [Delete] 删除build 页面 * [Update] 修改conf * [Update] bugfix * [Update] 更新文档地址 * [Update] 修改部分翻译和文档 * [Update] 修改一些bug * [Update] 修改链接 * [Update] 增加批量终端session api * [Update] 修改Node value唯一 * [Bugfix] 修复首页无法显示数据的bug * feat: s3 replay file get * feat: update * [Update] 修改bug
254 lines
7.5 KiB
Python
254 lines
7.5 KiB
Python
# ~*~ coding: utf-8 ~*~
|
|
|
|
from django import forms
|
|
from django.contrib.auth.forms import AuthenticationForm
|
|
from django.utils.translation import gettext_lazy as _
|
|
from captcha.fields import CaptchaField
|
|
|
|
from common.utils import validate_ssh_public_key
|
|
from perms.models import AssetPermission
|
|
from .models import User, UserGroup
|
|
|
|
|
|
class UserLoginForm(AuthenticationForm):
|
|
username = forms.CharField(label=_('Username'), max_length=100)
|
|
password = forms.CharField(
|
|
label=_('Password'), widget=forms.PasswordInput,
|
|
max_length=128, strip=False
|
|
)
|
|
captcha = CaptchaField()
|
|
|
|
|
|
class UserCreateUpdateForm(forms.ModelForm):
|
|
password = forms.CharField(
|
|
label=_('Password'), widget=forms.PasswordInput,
|
|
max_length=128, strip=False, required=False,
|
|
)
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = [
|
|
'username', 'name', 'email', 'groups', 'wechat',
|
|
'phone', 'role', 'date_expired', 'comment',
|
|
]
|
|
help_texts = {
|
|
'username': '* required',
|
|
'name': '* required',
|
|
'email': '* required',
|
|
}
|
|
widgets = {
|
|
'groups': forms.SelectMultiple(
|
|
attrs={
|
|
'class': 'select2',
|
|
'data-placeholder': _('Join user groups')
|
|
}
|
|
),
|
|
}
|
|
|
|
def save(self, commit=True):
|
|
password = self.cleaned_data.get('password')
|
|
user = super().save(commit=commit)
|
|
if password:
|
|
user.set_password(password)
|
|
user.save()
|
|
return user
|
|
|
|
|
|
class UserProfileForm(forms.ModelForm):
|
|
class Meta:
|
|
model = User
|
|
fields = [
|
|
'username', 'name', 'email',
|
|
'wechat', 'phone',
|
|
]
|
|
help_texts = {
|
|
'username': '* required',
|
|
'name': '* required',
|
|
'email': '* required',
|
|
}
|
|
|
|
|
|
class UserPasswordForm(forms.Form):
|
|
old_password = forms.CharField(
|
|
max_length=128, widget=forms.PasswordInput,
|
|
label=_("Old password")
|
|
)
|
|
new_password = forms.CharField(
|
|
min_length=5, max_length=128,
|
|
widget=forms.PasswordInput,
|
|
label=_("New password")
|
|
)
|
|
confirm_password = forms.CharField(
|
|
min_length=5, max_length=128,
|
|
widget=forms.PasswordInput,
|
|
label=_("Confirm 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 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
|
|
|
|
def save(self):
|
|
password = self.cleaned_data['new_password']
|
|
self.instance.set_password(password)
|
|
self.instance.save()
|
|
return self.instance
|
|
|
|
|
|
class UserPublicKeyForm(forms.Form):
|
|
public_key = forms.CharField(
|
|
label=_('ssh public key'), max_length=5000,
|
|
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 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']
|
|
self.instance.public_key = public_key
|
|
self.instance.save()
|
|
return self.instance
|
|
|
|
|
|
class UserBulkUpdateForm(forms.ModelForm):
|
|
users = forms.ModelMultipleChoiceField(
|
|
required=True,
|
|
help_text='* required',
|
|
label=_('Select users'),
|
|
queryset=User.objects.all(),
|
|
widget=forms.SelectMultiple(
|
|
attrs={
|
|
'class': 'select2',
|
|
'data-placeholder': _('Select users')
|
|
}
|
|
)
|
|
)
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = ['users', 'role', 'groups', 'date_expired']
|
|
widgets = {
|
|
"groups": forms.SelectMultiple(
|
|
attrs={
|
|
'class': 'select2',
|
|
'data-placeholder': _('Select users')
|
|
}
|
|
)
|
|
}
|
|
|
|
def save(self, commit=True):
|
|
changed_fields = []
|
|
for field in self._meta.fields:
|
|
if self.data.get(field) is not None:
|
|
changed_fields.append(field)
|
|
|
|
cleaned_data = {k: v for k, v in self.cleaned_data.items()
|
|
if k in changed_fields}
|
|
users = cleaned_data.pop('users', '')
|
|
groups = cleaned_data.pop('groups', [])
|
|
users = User.objects.filter(id__in=[user.id for user in users])
|
|
users.update(**cleaned_data)
|
|
if groups:
|
|
for user in users:
|
|
user.groups.set(groups)
|
|
return users
|
|
|
|
|
|
class UserGroupForm(forms.ModelForm):
|
|
users = forms.ModelMultipleChoiceField(
|
|
queryset=User.objects.exclude(role=User.ROLE_APP),
|
|
label=_("User"),
|
|
widget=forms.SelectMultiple(
|
|
attrs={
|
|
'class': 'select2',
|
|
'data-placeholder': _('Select users')
|
|
}
|
|
),
|
|
required=False,
|
|
)
|
|
|
|
def __init__(self, **kwargs):
|
|
instance = kwargs.get('instance')
|
|
if instance:
|
|
initial = kwargs.get('initial', {})
|
|
initial.update({
|
|
'users': instance.users.all(),
|
|
})
|
|
kwargs['initial'] = initial
|
|
super().__init__(**kwargs)
|
|
|
|
def save(self, commit=True):
|
|
group = super().save(commit=commit)
|
|
users = self.cleaned_data['users']
|
|
group.users.set(users)
|
|
return group
|
|
|
|
class Meta:
|
|
model = UserGroup
|
|
fields = [
|
|
'name', 'users', 'comment'
|
|
]
|
|
help_texts = {
|
|
'name': '* required'
|
|
}
|
|
|
|
|
|
class UserGroupPrivateAssetPermissionForm(forms.ModelForm):
|
|
def save(self, commit=True):
|
|
self.instance = super(UserGroupPrivateAssetPermissionForm, self)\
|
|
.save(commit=commit)
|
|
self.instance.user_groups = [self.user_group]
|
|
self.instance.save()
|
|
return self.instance
|
|
|
|
class Meta:
|
|
model = AssetPermission
|
|
fields = [
|
|
'assets', 'asset_groups', 'system_users', 'name',
|
|
]
|
|
widgets = {
|
|
'assets': forms.SelectMultiple(
|
|
attrs={'class': 'select2',
|
|
'data-placeholder': _('Select assets')}),
|
|
'asset_groups': forms.SelectMultiple(
|
|
attrs={'class': 'select2',
|
|
'data-placeholder': _('Select asset groups')}),
|
|
'system_users': forms.SelectMultiple(
|
|
attrs={'class': 'select2',
|
|
'data-placeholder': _('Select system users')}),
|
|
}
|
|
|
|
|
|
class FileForm(forms.Form):
|
|
file = forms.FileField()
|