Compare commits

...

6 Commits
dev ... v2.8.2

Author SHA1 Message Date
ibuler
4055306cf8 perf: 修改表结构迁移,增加rdp terminal 2021-03-24 10:24:09 +08:00
xinwen
9e1c5bb64d fix: 授权树节点排序 2021-03-24 10:13:45 +08:00
ibuler
32df722e9d perf: 合并 2021-03-23 18:46:30 +08:00
ibuler
22f6f5c34c perf: session add rdp terminal login from 2021-03-23 18:31:42 +08:00
ibuler
6fb819ca53 perf: 优化登录ip限制提示 2021-03-23 18:31:24 +08:00
老广
043c4a7a0b Merge pull request #5813 from jumpserver/master
v2.8.1
2021-03-19 20:05:29 +08:00
6 changed files with 60 additions and 34 deletions

View File

@@ -31,7 +31,7 @@ reason_choices = {
reason_user_invalid: _('Disabled or expired'), reason_user_invalid: _('Disabled or expired'),
reason_user_inactive: _("This account is inactive."), reason_user_inactive: _("This account is inactive."),
reason_backend_not_match: _("Auth backend not match"), reason_backend_not_match: _("Auth backend not match"),
reason_acl_not_allow: _("ACL is not allowed") reason_acl_not_allow: _("Login IP is not allowed")
} }
old_reason_choices = { old_reason_choices = {
'0': '-', '0': '-',

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-03-19 14:34+0800\n" "POT-Creation-Date: 2021-03-22 14:42+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"
@@ -428,7 +428,7 @@ msgstr "激活"
#: assets/models/asset.py:196 assets/models/cluster.py:19 #: assets/models/asset.py:196 assets/models/cluster.py:19
#: assets/models/user.py:66 templates/_nav.html:44 #: assets/models/user.py:66 templates/_nav.html:44
#: xpack/plugins/cloud/models.py:92 xpack/plugins/cloud/serializers.py:138 #: xpack/plugins/cloud/models.py:92 xpack/plugins/cloud/serializers.py:137
msgid "Admin user" msgid "Admin user"
msgstr "管理用户" msgstr "管理用户"
@@ -693,7 +693,7 @@ msgstr "ssh私钥"
#: users/templates/users/user_asset_permission.html:41 #: users/templates/users/user_asset_permission.html:41
#: users/templates/users/user_asset_permission.html:73 #: users/templates/users/user_asset_permission.html:73
#: users/templates/users/user_asset_permission.html:158 #: users/templates/users/user_asset_permission.html:158
#: xpack/plugins/cloud/models.py:89 xpack/plugins/cloud/serializers.py:139 #: xpack/plugins/cloud/models.py:89 xpack/plugins/cloud/serializers.py:138
msgid "Node" msgid "Node"
msgstr "节点" msgstr "节点"
@@ -1140,7 +1140,7 @@ msgstr "启用"
msgid "-" msgid "-"
msgstr "" msgstr ""
#: audits/models.py:96 xpack/plugins/cloud/const.py:24 #: audits/models.py:96 xpack/plugins/cloud/const.py:23
msgid "Failed" msgid "Failed"
msgstr "失败" msgstr "失败"
@@ -1331,8 +1331,8 @@ msgid "Auth backend not match"
msgstr "没有匹配到认证后端" msgstr "没有匹配到认证后端"
#: authentication/errors.py:34 #: authentication/errors.py:34
msgid "ACL is not allowed" msgid "Login IP is not allowed"
msgstr "ACL 不被允许" msgstr "登录 IP 不被允许"
#: authentication/errors.py:44 #: authentication/errors.py:44
msgid "No session found, check your cookie" msgid "No session found, check your cookie"
@@ -2249,7 +2249,7 @@ msgstr "全局启用 MFA 认证"
#: settings/serializers/settings.py:133 #: settings/serializers/settings.py:133
msgid "All user enable MFA" msgid "All user enable MFA"
msgstr "强制每个启用多因子认证" msgstr "强制所有用户启用多因子认证"
#: settings/serializers/settings.py:136 #: settings/serializers/settings.py:136
msgid "Batch command execution" msgid "Batch command execution"
@@ -3784,7 +3784,7 @@ msgstr "安全令牌验证"
#: users/templates/users/_base_otp.html:14 users/templates/users/_user.html:13 #: users/templates/users/_base_otp.html:14 users/templates/users/_user.html:13
#: users/templates/users/user_profile_update.html:55 #: users/templates/users/user_profile_update.html:55
#: xpack/plugins/cloud/models.py:78 xpack/plugins/cloud/serializers.py:137 #: xpack/plugins/cloud/models.py:78 xpack/plugins/cloud/serializers.py:136
msgid "Account" msgid "Account"
msgstr "账户" msgstr "账户"
@@ -4774,46 +4774,42 @@ msgid "Azure (China)"
msgstr "Azure (中国)" msgstr "Azure (中国)"
#: xpack/plugins/cloud/const.py:12 #: xpack/plugins/cloud/const.py:12
msgid "Azure (International)"
msgstr "Azure (国际)"
#: xpack/plugins/cloud/const.py:13
msgid "Huawei Cloud" msgid "Huawei Cloud"
msgstr "华为云" msgstr "华为云"
#: xpack/plugins/cloud/const.py:14 #: xpack/plugins/cloud/const.py:13
msgid "Tencent Cloud" msgid "Tencent Cloud"
msgstr "腾讯云" msgstr "腾讯云"
#: xpack/plugins/cloud/const.py:15 #: xpack/plugins/cloud/const.py:14
msgid "VMware" msgid "VMware"
msgstr "" msgstr ""
#: xpack/plugins/cloud/const.py:19 #: xpack/plugins/cloud/const.py:18
msgid "Instance name" msgid "Instance name"
msgstr "实例名称" msgstr "实例名称"
#: xpack/plugins/cloud/const.py:20 #: xpack/plugins/cloud/const.py:19
msgid "Instance name and Partial IP" msgid "Instance name and Partial IP"
msgstr "实例名称和部分IP" msgstr "实例名称和部分IP"
#: xpack/plugins/cloud/const.py:25 #: xpack/plugins/cloud/const.py:24
msgid "Succeed" msgid "Succeed"
msgstr "成功" msgstr "成功"
#: xpack/plugins/cloud/const.py:29 #: xpack/plugins/cloud/const.py:28
msgid "Unsync" msgid "Unsync"
msgstr "未同步" msgstr "未同步"
#: xpack/plugins/cloud/const.py:30 #: xpack/plugins/cloud/const.py:29
msgid "New Sync" msgid "New Sync"
msgstr "新同步" msgstr "新同步"
#: xpack/plugins/cloud/const.py:31 #: xpack/plugins/cloud/const.py:30
msgid "Synced" msgid "Synced"
msgstr "已同步" msgstr "已同步"
#: xpack/plugins/cloud/const.py:32 #: xpack/plugins/cloud/const.py:31
msgid "Released" msgid "Released"
msgstr "已释放" msgstr "已释放"
@@ -4829,7 +4825,7 @@ msgstr "云服务商"
msgid "Cloud account" msgid "Cloud account"
msgstr "云账号" msgstr "云账号"
#: xpack/plugins/cloud/models.py:81 xpack/plugins/cloud/serializers.py:118 #: xpack/plugins/cloud/models.py:81 xpack/plugins/cloud/serializers.py:117
msgid "Regions" msgid "Regions"
msgstr "地域" msgstr "地域"
@@ -4837,7 +4833,7 @@ msgstr "地域"
msgid "Hostname strategy" msgid "Hostname strategy"
msgstr "主机名策略" msgstr "主机名策略"
#: xpack/plugins/cloud/models.py:95 xpack/plugins/cloud/serializers.py:141 #: xpack/plugins/cloud/models.py:95 xpack/plugins/cloud/serializers.py:140
msgid "Always update" msgid "Always update"
msgstr "总是更新" msgstr "总是更新"
@@ -5029,15 +5025,15 @@ msgstr ""
msgid "Subscription ID" msgid "Subscription ID"
msgstr "" msgstr ""
#: xpack/plugins/cloud/serializers.py:116 #: xpack/plugins/cloud/serializers.py:115
msgid "History count" msgid "History count"
msgstr "执行次数" msgstr "执行次数"
#: xpack/plugins/cloud/serializers.py:117 #: xpack/plugins/cloud/serializers.py:116
msgid "Instance count" msgid "Instance count"
msgstr "实例个数" msgstr "实例个数"
#: xpack/plugins/cloud/serializers.py:140 #: xpack/plugins/cloud/serializers.py:139
#: xpack/plugins/gathered_user/serializers.py:20 #: xpack/plugins/gathered_user/serializers.py:20
msgid "Periodic display" msgid "Periodic display"
msgstr "定时执行" msgstr "定时执行"
@@ -5130,6 +5126,9 @@ msgstr "旗舰版"
msgid "Community edition" msgid "Community edition"
msgstr "社区版" msgstr "社区版"
#~ msgid "Azure (International)"
#~ msgstr "Azure (国际)"
#~ msgid "Root organization only allow view and delete" #~ msgid "Root organization only allow view and delete"
#~ msgstr "全局组织仅支持 查看和删除" #~ msgstr "全局组织仅支持 查看和删除"

View File

@@ -488,11 +488,12 @@ class UserGrantedAssetsQueryUtils(UserGrantedUtilsBase):
if granted_status == NodeFrom.granted: if granted_status == NodeFrom.granted:
assets = Asset.objects.order_by().filter(nodes__id=node.id) assets = Asset.objects.order_by().filter(nodes__id=node.id)
return assets
elif granted_status == NodeFrom.asset: elif granted_status == NodeFrom.asset:
return self._get_indirect_granted_node_assets(node.id) assets = self._get_indirect_granted_node_assets(node.id)
else: else:
return Asset.objects.none() assets = Asset.objects.none()
assets = assets.order_by('hostname')
return assets
def _get_indirect_granted_node_assets(self, id) -> AssetQuerySet: def _get_indirect_granted_node_assets(self, id) -> AssetQuerySet:
assets = Asset.objects.order_by().filter(nodes__id=id).distinct() & self.get_direct_granted_assets() assets = Asset.objects.order_by().filter(nodes__id=id).distinct() & self.get_direct_granted_assets()
@@ -538,6 +539,10 @@ class UserGrantedAssetsQueryUtils(UserGrantedUtilsBase):
class UserGrantedNodesQueryUtils(UserGrantedUtilsBase): class UserGrantedNodesQueryUtils(UserGrantedUtilsBase):
def sort(self, nodes):
nodes = sorted(nodes, key=lambda x: x.value)
return nodes
def get_node_children(self, key): def get_node_children(self, key):
if not key: if not key:
return self.get_top_level_nodes() return self.get_top_level_nodes()
@@ -545,11 +550,13 @@ class UserGrantedNodesQueryUtils(UserGrantedUtilsBase):
node = PermNode.objects.get(key=key) node = PermNode.objects.get(key=key)
granted_status = node.get_granted_status(self.user) granted_status = node.get_granted_status(self.user)
if granted_status == NodeFrom.granted: if granted_status == NodeFrom.granted:
return PermNode.objects.filter(parent_key=key) nodes = PermNode.objects.filter(parent_key=key)
elif granted_status in (NodeFrom.asset, NodeFrom.child): elif granted_status in (NodeFrom.asset, NodeFrom.child):
return self.get_indirect_granted_node_children(key) nodes = self.get_indirect_granted_node_children(key)
else: else:
return PermNode.objects.none() nodes = PermNode.objects.none()
nodes = self.sort(nodes)
return nodes
def get_indirect_granted_node_children(self, key): def get_indirect_granted_node_children(self, key):
""" """
@@ -571,7 +578,8 @@ class UserGrantedNodesQueryUtils(UserGrantedUtilsBase):
def get_top_level_nodes(self): def get_top_level_nodes(self):
nodes = self.get_special_nodes() nodes = self.get_special_nodes()
nodes.extend(self.get_indirect_granted_node_children('')) real_nodes = self.get_indirect_granted_node_children('')
nodes.extend(self.sort(real_nodes))
return nodes return nodes
def get_ungrouped_node(self): def get_ungrouped_node(self):

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.1 on 2021-03-24 02:08
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('terminal', '0032_auto_20210302_1853'),
]
operations = [
migrations.AlterField(
model_name='session',
name='login_from',
field=models.CharField(choices=[('ST', 'SSH Terminal'), ('RT', 'RDP Terminal'), ('WT', 'Web Terminal')], default='ST', max_length=2, verbose_name='Login from'),
),
]

View File

@@ -20,6 +20,7 @@ from .terminal import Terminal
class Session(OrgModelMixin): class Session(OrgModelMixin):
class LOGIN_FROM(ChoiceSet): class LOGIN_FROM(ChoiceSet):
ST = 'ST', 'SSH Terminal' ST = 'ST', 'SSH Terminal'
RT = 'RT', 'RDP Terminal'
WT = 'WT', 'Web Terminal' WT = 'WT', 'Web Terminal'
class PROTOCOL(ChoiceSet): class PROTOCOL(ChoiceSet):