Merge pull request #5497 from jumpserver/dev

Dev
pull/5556/head
Jiangjie.Bai 2021-01-20 19:31:33 +08:00 committed by GitHub
commit 3e55447327
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 47 additions and 43 deletions

View File

@ -57,7 +57,7 @@ class AuthBook(BaseUser):
同时设置自己的 is_latest=True, version=max_version + 1 同时设置自己的 is_latest=True, version=max_version + 1
""" """
username = kwargs['username'] username = kwargs['username']
asset = kwargs['asset'] asset = kwargs.get('asset') or kwargs.get('asset_id')
with transaction.atomic(): with transaction.atomic():
# 使用select_for_update限制并发创建相同的username、asset条目 # 使用select_for_update限制并发创建相同的username、asset条目
instances = cls.objects.select_for_update().filter(username=username, asset=asset) instances = cls.objects.select_for_update().filter(username=username, asset=asset)

View File

@ -125,7 +125,8 @@ def on_audits_log_create(sender, instance=None, **kwargs):
def get_login_backend(request): def get_login_backend(request):
backend = request.session.get(BACKEND_SESSION_KEY, '') backend = request.session.get('auth_backend', '') or request.session.get(BACKEND_SESSION_KEY, '')
backend = backend.rsplit('.', maxsplit=1)[-1] backend = backend.rsplit('.', maxsplit=1)[-1]
if backend in LOGIN_BACKEND: if backend in LOGIN_BACKEND:
return LOGIN_BACKEND[backend] return LOGIN_BACKEND[backend]

View File

@ -69,17 +69,16 @@ class LoginConfirmSetting(CommonModelMixin):
from tickets import const from tickets import const
from tickets.models import Ticket from tickets.models import Ticket
ticket_title = _('Login confirm') + ' {}'.format(self.user) ticket_title = _('Login confirm') + ' {}'.format(self.user)
ticket_applicant = self.user
ticket_meta = self.construct_confirm_ticket_meta(request) ticket_meta = self.construct_confirm_ticket_meta(request)
ticket_assignees = self.reviewers.all() ticket_assignees = self.reviewers.all()
data = { data = {
'title': ticket_title, 'title': ticket_title,
'type': const.TicketTypeChoices.login_confirm.value, 'type': const.TicketTypeChoices.login_confirm.value,
'applicant': ticket_applicant,
'meta': ticket_meta, 'meta': ticket_meta,
} }
ticket = Ticket.objects.create(**data) ticket = Ticket.objects.create(**data)
ticket.assignees.set(ticket_assignees) ticket.assignees.set(ticket_assignees)
ticket.open(self.user)
return ticket return ticket
def __str__(self): def __str__(self):

Binary file not shown.

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n" "Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-19 20:03+0800\n" "POT-Creation-Date: 2021-01-20 16:09+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: ibuler <ibuler@qq.com>\n" "Last-Translator: ibuler <ibuler@qq.com>\n"
"Language-Team: JumpServer team<ibuler@qq.com>\n" "Language-Team: JumpServer team<ibuler@qq.com>\n"
@ -268,7 +268,7 @@ msgstr "主机名"
#: assets/models/asset.py:194 assets/models/domain.py:54 #: assets/models/asset.py:194 assets/models/domain.py:54
#: assets/models/user.py:120 terminal/serializers/session.py:29 #: assets/models/user.py:120 terminal/serializers/session.py:29
#: terminal/serializers/storage.py:68 #: terminal/serializers/storage.py:69
msgid "Protocol" msgid "Protocol"
msgstr "协议" msgstr "协议"
@ -555,7 +555,7 @@ msgstr "默认资产组"
#: assets/models/label.py:15 audits/models.py:36 audits/models.py:56 #: assets/models/label.py:15 audits/models.py:36 audits/models.py:56
#: audits/models.py:69 audits/serializers.py:81 authentication/models.py:44 #: audits/models.py:69 audits/serializers.py:81 authentication/models.py:44
#: authentication/models.py:96 orgs/models.py:18 orgs/models.py:423 #: authentication/models.py:95 orgs/models.py:18 orgs/models.py:423
#: perms/models/asset_permission.py:173 perms/models/base.py:49 #: perms/models/asset_permission.py:173 perms/models/base.py:49
#: templates/index.html:78 terminal/backends/command/models.py:18 #: templates/index.html:78 terminal/backends/command/models.py:18
#: terminal/backends/command/serializers.py:12 terminal/models/session.py:37 #: terminal/backends/command/serializers.py:12 terminal/models/session.py:37
@ -653,7 +653,7 @@ msgstr "登录模式"
msgid "SFTP Root" msgid "SFTP Root"
msgstr "SFTP根路径" msgstr "SFTP根路径"
#: assets/models/user.py:127 authentication/models.py:94 #: assets/models/user.py:127 authentication/models.py:93
msgid "Token" msgid "Token"
msgstr "" msgstr ""
@ -726,7 +726,7 @@ msgstr "硬件信息"
msgid "Org name" msgid "Org name"
msgstr "组织名称" msgstr "组织名称"
#: assets/serializers/asset.py:162 assets/serializers/asset.py:193 #: assets/serializers/asset.py:162 assets/serializers/asset.py:201
msgid "Connectivity" msgid "Connectivity"
msgstr "连接" msgstr "连接"
@ -1129,7 +1129,7 @@ msgstr "是否成功"
msgid "Result" msgid "Result"
msgstr "结果" msgstr "结果"
#: audits/serializers.py:79 terminal/serializers/storage.py:177 #: audits/serializers.py:79 terminal/serializers/storage.py:178
msgid "Hosts" msgid "Hosts"
msgstr "主机" msgstr "主机"
@ -1324,7 +1324,7 @@ msgstr "审批人"
msgid "Login confirm" msgid "Login confirm"
msgstr "登录复核" msgstr "登录复核"
#: authentication/models.py:95 #: authentication/models.py:94
msgid "Expired" msgid "Expired"
msgstr "过期时间" msgstr "过期时间"
@ -2714,60 +2714,60 @@ msgstr "是否可重放"
msgid "Can join" msgid "Can join"
msgstr "是否可加入" msgstr "是否可加入"
#: terminal/serializers/storage.py:20 #: terminal/serializers/storage.py:21
msgid "Endpoint invalid: remove path `{}`" msgid "Endpoint invalid: remove path `{}`"
msgstr "端点无效: 移除路径 `{}`" msgstr "端点无效: 移除路径 `{}`"
#: terminal/serializers/storage.py:26 #: terminal/serializers/storage.py:27
msgid "Bucket" msgid "Bucket"
msgstr "桶名称" msgstr "桶名称"
#: terminal/serializers/storage.py:29 #: terminal/serializers/storage.py:30
msgid "Access key" msgid "Access key"
msgstr "" msgstr ""
#: terminal/serializers/storage.py:33 #: terminal/serializers/storage.py:34
msgid "Secret key" msgid "Secret key"
msgstr "" msgstr ""
#: terminal/serializers/storage.py:38 terminal/serializers/storage.py:50 #: terminal/serializers/storage.py:39 terminal/serializers/storage.py:51
#: terminal/serializers/storage.py:80 #: terminal/serializers/storage.py:81
msgid "Endpoint" msgid "Endpoint"
msgstr "端点" msgstr "端点"
#: terminal/serializers/storage.py:65 xpack/plugins/cloud/models.py:276 #: terminal/serializers/storage.py:66 xpack/plugins/cloud/models.py:276
msgid "Region" msgid "Region"
msgstr "地域" msgstr "地域"
#: terminal/serializers/storage.py:90 #: terminal/serializers/storage.py:91
msgid "Container name" msgid "Container name"
msgstr "容器名称" msgstr "容器名称"
#: terminal/serializers/storage.py:92 #: terminal/serializers/storage.py:93
msgid "Account name" msgid "Account name"
msgstr "账户名称" msgstr "账户名称"
#: terminal/serializers/storage.py:93 #: terminal/serializers/storage.py:94
msgid "Account key" msgid "Account key"
msgstr "账户密钥" msgstr "账户密钥"
#: terminal/serializers/storage.py:96 #: terminal/serializers/storage.py:97
msgid "Endpoint suffix" msgid "Endpoint suffix"
msgstr "端点后缀" msgstr "端点后缀"
#: terminal/serializers/storage.py:154 #: terminal/serializers/storage.py:155
msgid "The address format is incorrect" msgid "The address format is incorrect"
msgstr "地址格式不正确" msgstr "地址格式不正确"
#: terminal/serializers/storage.py:161 #: terminal/serializers/storage.py:162
msgid "Host invalid" msgid "Host invalid"
msgstr "主机无效" msgstr "主机无效"
#: terminal/serializers/storage.py:164 #: terminal/serializers/storage.py:165
msgid "Port invalid" msgid "Port invalid"
msgstr "端口无效" msgstr "端口无效"
#: terminal/serializers/storage.py:180 #: terminal/serializers/storage.py:181
msgid "Index" msgid "Index"
msgstr "索引" msgstr "索引"
@ -2911,8 +2911,8 @@ msgid "Approved actions"
msgstr "批准的动作" msgstr "批准的动作"
#: tickets/handler/base.py:62 #: tickets/handler/base.py:62
msgid "User {} {} the ticket" msgid "{} {} the ticket"
msgstr "用户 {} {} 这个工单" msgstr "{} {}工单"
#: tickets/handler/base.py:91 #: tickets/handler/base.py:91
msgid "Ticket title" msgid "Ticket title"
@ -3236,7 +3236,7 @@ msgid "Join user groups"
msgstr "添加到用户组" msgstr "添加到用户组"
#: users/forms/user.py:103 users/views/profile/password.py:59 #: users/forms/user.py:103 users/views/profile/password.py:59
#: users/views/profile/reset.py:127 #: users/views/profile/reset.py:126
msgid "* Your password does not meet the requirements" msgid "* Your password does not meet the requirements"
msgstr "* 您的密码不符合要求" msgstr "* 您的密码不符合要求"
@ -3867,7 +3867,7 @@ msgstr "新的公钥已设置成功,请下载对应的私钥"
msgid "Update user" msgid "Update user"
msgstr "更新用户" msgstr "更新用户"
#: users/templates/users/user_update.html:22 users/views/profile/reset.py:120 #: users/templates/users/user_update.html:22 users/views/profile/reset.py:119
msgid "User auth from {}, go there change password" msgid "User auth from {}, go there change password"
msgstr "用户认证源来自 {}, 请去相应系统修改密码" msgstr "用户认证源来自 {}, 请去相应系统修改密码"
@ -3975,7 +3975,7 @@ msgstr ""
" <br>\n" " <br>\n"
" " " "
#: users/utils.py:116 users/views/profile/reset.py:80 #: users/utils.py:116 users/views/profile/reset.py:79
msgid "Reset password success" msgid "Reset password success"
msgstr "重置密码成功" msgstr "重置密码成功"
@ -4188,20 +4188,20 @@ msgid ""
"password" "password"
msgstr "用户来自 {} 请去相应系统修改密码" msgstr "用户来自 {} 请去相应系统修改密码"
#: users/views/profile/reset.py:66 #: users/views/profile/reset.py:65
msgid "Send reset password message" msgid "Send reset password message"
msgstr "发送重置密码邮件" msgstr "发送重置密码邮件"
#: users/views/profile/reset.py:67 #: users/views/profile/reset.py:66
msgid "Send reset password mail success, login your mail box and follow it " msgid "Send reset password mail success, login your mail box and follow it "
msgstr "" msgstr ""
"发送重置邮件成功, 请登录邮箱查看, 按照提示操作 (如果没收到,请等待3-5分钟)" "发送重置邮件成功, 请登录邮箱查看, 按照提示操作 (如果没收到,请等待3-5分钟)"
#: users/views/profile/reset.py:81 #: users/views/profile/reset.py:80
msgid "Reset password success, return to login page" msgid "Reset password success, return to login page"
msgstr "重置密码成功,返回到登录页面" msgstr "重置密码成功,返回到登录页面"
#: users/views/profile/reset.py:105 users/views/profile/reset.py:115 #: users/views/profile/reset.py:104 users/views/profile/reset.py:114
msgid "Token invalid or expired" msgid "Token invalid or expired"
msgstr "Token错误或失效" msgstr "Token错误或失效"

View File

@ -9,7 +9,7 @@ class SessionCommandSerializer(serializers.Serializer):
"""使用这个类作为基础Command Log Serializer类, 用来序列化""" """使用这个类作为基础Command Log Serializer类, 用来序列化"""
id = serializers.UUIDField(read_only=True) id = serializers.UUIDField(read_only=True)
user = serializers.CharField(max_length=64, label=_("User")) user = serializers.CharField(label=_("User")) # 限制 64 字符,见 validate_user
asset = serializers.CharField(max_length=128, label=_("Asset")) asset = serializers.CharField(max_length=128, label=_("Asset"))
system_user = serializers.CharField(max_length=64, label=_("System user")) system_user = serializers.CharField(max_length=64, label=_("System user"))
input = serializers.CharField(max_length=128, label=_("Command")) input = serializers.CharField(max_length=128, label=_("Command"))
@ -25,6 +25,11 @@ class SessionCommandSerializer(serializers.Serializer):
risk_mapper = dict(AbstractSessionCommand.RISK_LEVEL_CHOICES) risk_mapper = dict(AbstractSessionCommand.RISK_LEVEL_CHOICES)
return risk_mapper.get(obj.risk_level) return risk_mapper.get(obj.risk_level)
def validate_user(self, value):
if len(value) > 64:
value = value[:32] + value[-32:]
return value
class InsecureCommandAlertSerializer(serializers.Serializer): class InsecureCommandAlertSerializer(serializers.Serializer):
input = serializers.CharField() input = serializers.CharField()

View File

@ -6,6 +6,7 @@ from urllib.parse import urlparse
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.db.models import TextChoices from django.db.models import TextChoices
from common.drf.serializers import MethodSerializer from common.drf.serializers import MethodSerializer
from common.drf.fields import ReadableHiddenField
from ..models import ReplayStorage, CommandStorage from ..models import ReplayStorage, CommandStorage
from .. import const from .. import const
@ -170,7 +171,7 @@ class CommandStorageTypeESSerializer(serializers.Serializer):
hosts_help_text = ''' hosts_help_text = '''
Tip: If there are multiple hosts, use a comma (,) to separate them. Tip: If there are multiple hosts, use a comma (,) to separate them.
(eg: http://www.jumpserver.a.com, http://www.jumpserver.b.com) (eg: http://www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)
''' '''
HOSTS = serializers.ListField( HOSTS = serializers.ListField(
child=serializers.CharField(validators=[command_storage_es_host_format_validator]), child=serializers.CharField(validators=[command_storage_es_host_format_validator]),
@ -179,9 +180,8 @@ class CommandStorageTypeESSerializer(serializers.Serializer):
INDEX = serializers.CharField( INDEX = serializers.CharField(
max_length=1024, default='jumpserver', label=_('Index'), allow_null=True max_length=1024, default='jumpserver', label=_('Index'), allow_null=True
) )
DOC_TYPE = serializers.CharField( DOC_TYPE = ReadableHiddenField(default='command', label=_('Doc type'), allow_null=True)
max_length=1024, read_only=True, default='command', label=_('Doc type'), allow_null=True
)
# mapping # mapping

View File

@ -59,7 +59,7 @@ class BaseHandler(object):
user_display = str(user) user_display = str(user)
action_display = self.ticket.get_action_display() action_display = self.ticket.get_action_display()
data = { data = {
'body': _('User {} {} the ticket'.format(user_display, action_display)), 'body': _('{} {} the ticket').format(user_display, action_display),
'user': user, 'user': user,
'user_display': user_display 'user_display': user_display
} }

View File

@ -49,8 +49,7 @@ class UserForgotPasswordView(FormView):
if not user.is_local: if not user.is_local:
error = _( error = _(
'The user is from {}, please go to the corresponding system to change the password' 'The user is from {}, please go to the corresponding system to change the password'
''.format(user.get_source_display()) ).format(user.get_source_display())
)
form.add_error('email', error) form.add_error('email', error)
return self.form_invalid(form) return self.form_invalid(form)