From f1f06491d6816576ffe3e2f0c773b423947a208f Mon Sep 17 00:00:00 2001 From: BaiJiangJie Date: Fri, 29 Jun 2018 14:59:43 +0800 Subject: [PATCH] =?UTF-8?q?[Feature]=20=E6=B7=BB=E5=8A=A0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD,=20=E6=94=AF=E6=8C=81=20telnet=20server.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/forms/asset.py | 4 +- apps/assets/forms/user.py | 3 +- apps/assets/models/asset.py | 14 ++ apps/assets/models/user.py | 2 + apps/assets/serializers/asset.py | 2 +- .../assets/templates/assets/_system_user.html | 11 +- .../assets/templates/assets/asset_create.html | 11 +- .../assets/templates/assets/asset_update.html | 1 + apps/i18n/zh/LC_MESSAGES/django.mo | Bin 35051 -> 35966 bytes apps/i18n/zh/LC_MESSAGES/django.po | 179 +++++++++--------- apps/perms/api.py | 8 +- 11 files changed, 131 insertions(+), 104 deletions(-) diff --git a/apps/assets/forms/asset.py b/apps/assets/forms/asset.py index f8f187b4d..5000c087d 100644 --- a/apps/assets/forms/asset.py +++ b/apps/assets/forms/asset.py @@ -16,7 +16,7 @@ class AssetCreateForm(forms.ModelForm): fields = [ 'hostname', 'ip', 'public_ip', 'port', 'comment', 'nodes', 'is_active', 'admin_user', 'labels', 'platform', - 'domain', + 'domain', 'protocol', ] widgets = { @@ -56,7 +56,7 @@ class AssetUpdateForm(forms.ModelForm): fields = [ 'hostname', 'ip', 'port', 'nodes', 'is_active', 'platform', 'public_ip', 'number', 'comment', 'admin_user', 'labels', - 'domain', + 'domain', 'protocol', ] widgets = { 'nodes': forms.SelectMultiple(attrs={ diff --git a/apps/assets/forms/user.py b/apps/assets/forms/user.py index c2a1d7b67..b25e19d87 100644 --- a/apps/assets/forms/user.py +++ b/apps/assets/forms/user.py @@ -94,10 +94,11 @@ class SystemUserForm(PasswordAndKeyAuthForm): system_user = super().save() password = self.cleaned_data.get('password', '') or None login_mode = self.cleaned_data.get('login_mode', '') or None + protocol = self.cleaned_data.get('protocol') or None auto_generate_key = self.cleaned_data.get('auto_generate_key', False) private_key, public_key = super().gen_keys() - if login_mode == SystemUser.MANUAL_LOGIN: + if login_mode == SystemUser.MANUAL_LOGIN or protocol == SystemUser.TELNET_PROTOCOL: system_user.auto_push = 0 system_user.save() diff --git a/apps/assets/models/asset.py b/apps/assets/models/asset.py index a974d3385..7a2b3fe57 100644 --- a/apps/assets/models/asset.py +++ b/apps/assets/models/asset.py @@ -57,13 +57,27 @@ class Asset(models.Model): ('MacOS', 'MacOS'), ('BSD', 'BSD'), ('Windows', 'Windows'), + ('Windows2016', 'Windows(2016)'), ('Other', 'Other'), ) + + SSH_PROTOCOL = 'ssh' + RDP_PROTOCOL = 'rdp' + TELNET_PROTOCOL = 'telnet' + PROTOCOL_CHOICES = ( + (SSH_PROTOCOL, 'ssh'), + (RDP_PROTOCOL, 'rdp'), + (TELNET_PROTOCOL, 'telnet (beta)'), + ) + id = models.UUIDField(default=uuid.uuid4, primary_key=True) ip = models.GenericIPAddressField(max_length=32, verbose_name=_('IP'), db_index=True) hostname = models.CharField(max_length=128, unique=True, verbose_name=_('Hostname')) + protocol = models.CharField(max_length=128, default=SSH_PROTOCOL, + choices=PROTOCOL_CHOICES, + verbose_name=_('Protocol')) port = models.IntegerField(default=22, verbose_name=_('Port')) platform = models.CharField(max_length=128, choices=PLATFORM_CHOICES, default='Linux', verbose_name=_('Platform')) diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py index f835e387f..5faca5da8 100644 --- a/apps/assets/models/user.py +++ b/apps/assets/models/user.py @@ -95,9 +95,11 @@ class AdminUser(AssetUser): class SystemUser(AssetUser): SSH_PROTOCOL = 'ssh' RDP_PROTOCOL = 'rdp' + TELNET_PROTOCOL = 'telnet' PROTOCOL_CHOICES = ( (SSH_PROTOCOL, 'ssh'), (RDP_PROTOCOL, 'rdp'), + (TELNET_PROTOCOL, 'telnet (beta)'), ) AUTO_LOGIN = 'auto' diff --git a/apps/assets/serializers/asset.py b/apps/assets/serializers/asset.py index a0fdfab73..e63735794 100644 --- a/apps/assets/serializers/asset.py +++ b/apps/assets/serializers/asset.py @@ -43,7 +43,7 @@ class AssetGrantedSerializer(serializers.ModelSerializer): fields = ( "id", "hostname", "ip", "port", "system_users_granted", "is_active", "system_users_join", "os", 'domain', - "platform", "comment" + "platform", "comment", "protocol", ) @staticmethod diff --git a/apps/assets/templates/assets/_system_user.html b/apps/assets/templates/assets/_system_user.html index cf8539293..4e1bc51a8 100644 --- a/apps/assets/templates/assets/_system_user.html +++ b/apps/assets/templates/assets/_system_user.html @@ -104,7 +104,14 @@ function protocolChange() { $.each(need_change_field, function (index, value) { $(value).closest('.form-group').addClass('hidden') }); - } else { + } + else if ($(protocol_id + " option:selected").text() === 'telnet (beta)') { + $('.auth-fields').removeClass('hidden'); + $.each(need_change_field, function (index, value) { + $(value).closest('.form-group').addClass('hidden') + }); + } + else { if($(login_mode_id).val() === 'manual'){ $(sudo_id).closest('.form-group').removeClass('hidden'); $(shell_id).closest('.form-group').removeClass('hidden'); @@ -133,8 +140,8 @@ function loginModeChange(){ } else if($(login_mode_id).val() === 'auto'){ $('#auth_title_id').removeClass('hidden'); - protocolChange(); $(password_id).closest('.form-group').removeClass('hidden') + protocolChange(); } } diff --git a/apps/assets/templates/assets/asset_create.html b/apps/assets/templates/assets/asset_create.html index 99703d2e3..55e233d0d 100644 --- a/apps/assets/templates/assets/asset_create.html +++ b/apps/assets/templates/assets/asset_create.html @@ -17,6 +17,7 @@ {% bootstrap_field form.hostname layout="horizontal" %} {% bootstrap_field form.platform layout="horizontal" %} {% bootstrap_field form.ip layout="horizontal" %} + {% bootstrap_field form.protocol layout="horizontal" %} {% bootstrap_field form.port layout="horizontal" %} {% bootstrap_field form.public_ip layout="horizontal" %} {% bootstrap_field form.domain layout="horizontal" %} @@ -85,14 +86,14 @@ $(document).ready(function () { allowClear: true, templateSelection: format }); - $("#id_platform").change(function (){ - var platform = $("#id_platform option:selected").text(); + $("#id_protocol").change(function (){ + var protocol = $("#id_protocol option:selected").text(); var port = 22; - if(platform === 'Windows'){ + if(protocol === 'rdp'){ port = 3389; } - if(platform === 'Other'){ - port = null; + if(protocol === 'telnet (beta)'){ + port = 23; } $("#id_port").val(port); }); diff --git a/apps/assets/templates/assets/asset_update.html b/apps/assets/templates/assets/asset_update.html index 3d42ca2b5..7ed1da05a 100644 --- a/apps/assets/templates/assets/asset_update.html +++ b/apps/assets/templates/assets/asset_update.html @@ -21,6 +21,7 @@

{% trans 'Basic' %}

{% bootstrap_field form.hostname layout="horizontal" %} {% bootstrap_field form.ip layout="horizontal" %} + {% bootstrap_field form.protocol layout="horizontal" %} {% bootstrap_field form.port layout="horizontal" %} {% bootstrap_field form.platform layout="horizontal" %} {% bootstrap_field form.public_ip layout="horizontal" %} diff --git a/apps/i18n/zh/LC_MESSAGES/django.mo b/apps/i18n/zh/LC_MESSAGES/django.mo index df59e43d67e7b758c445eae254496702a7583bf4..d842930e4e5b0eece76196f4cd257d50a9117912 100644 GIT binary patch delta 12296 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 delta 12043 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 I>>rr;f5cTk diff --git a/apps/i18n/zh/LC_MESSAGES/django.po b/apps/i18n/zh/LC_MESSAGES/django.po index b5d9a5c56..c596db6ac 100644 --- a/apps/i18n/zh/LC_MESSAGES/django.po +++ b/apps/i18n/zh/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Jumpserver 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-11 13:36+0800\n" +"POT-Creation-Date: 2018-06-25 12:19+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: Jumpserver team\n" @@ -29,7 +29,7 @@ msgstr "" msgid "测试节点下资产是否可连接: {}" msgstr "" -#: assets/forms/asset.py:24 assets/models/asset.py:75 assets/models/user.py:110 +#: assets/forms/asset.py:24 assets/models/asset.py:89 assets/models/user.py:112 #: assets/templates/assets/asset_detail.html:183 #: assets/templates/assets/asset_detail.html:191 #: assets/templates/assets/system_user_detail.html:179 perms/models.py:33 @@ -37,30 +37,30 @@ msgid "Nodes" msgstr "节点管理" #: assets/forms/asset.py:27 assets/forms/asset.py:66 assets/forms/asset.py:109 -#: assets/forms/asset.py:113 assets/models/asset.py:80 +#: assets/forms/asset.py:113 assets/models/asset.py:94 #: assets/models/cluster.py:19 assets/models/user.py:72 #: assets/templates/assets/asset_detail.html:73 templates/_nav.html:25 msgid "Admin user" msgstr "管理用户" #: assets/forms/asset.py:30 assets/forms/asset.py:69 assets/forms/asset.py:125 -#: assets/templates/assets/asset_create.html:35 -#: assets/templates/assets/asset_create.html:37 +#: assets/templates/assets/asset_create.html:36 +#: assets/templates/assets/asset_create.html:38 #: assets/templates/assets/asset_list.html:75 -#: assets/templates/assets/asset_update.html:40 -#: assets/templates/assets/asset_update.html:42 +#: assets/templates/assets/asset_update.html:41 +#: assets/templates/assets/asset_update.html:43 #: assets/templates/assets/user_asset_list.html:34 msgid "Label" msgstr "标签" -#: assets/forms/asset.py:34 assets/forms/asset.py:73 assets/models/asset.py:71 +#: assets/forms/asset.py:34 assets/forms/asset.py:73 assets/models/asset.py:85 #: assets/models/domain.py:46 msgid "Domain" msgstr "网域" #: assets/forms/asset.py:38 assets/forms/asset.py:63 assets/forms/asset.py:77 -#: assets/forms/asset.py:128 assets/templates/assets/asset_create.html:29 -#: assets/templates/assets/asset_update.html:34 perms/forms.py:40 +#: assets/forms/asset.py:128 assets/templates/assets/asset_create.html:30 +#: assets/templates/assets/asset_update.html:35 perms/forms.py:40 #: perms/forms.py:47 perms/models.py:76 #: perms/templates/perms/asset_permission_list.html:57 #: perms/templates/perms/asset_permission_list.html:142 @@ -90,7 +90,7 @@ msgstr "如果有多个的互相隔离的网络,设置资产属于的网域, msgid "Select assets" msgstr "选择资产" -#: assets/forms/asset.py:105 assets/models/asset.py:67 +#: assets/forms/asset.py:105 assets/models/asset.py:81 #: assets/models/domain.py:44 assets/templates/assets/admin_user_assets.html:53 #: assets/templates/assets/asset_detail.html:69 #: assets/templates/assets/domain_gateway_list.html:58 @@ -99,7 +99,7 @@ msgid "Port" msgstr "端口" #: assets/forms/domain.py:14 assets/forms/label.py:13 -#: assets/models/asset.py:223 assets/templates/assets/admin_user_list.html:25 +#: assets/models/asset.py:237 assets/templates/assets/admin_user_list.html:25 #: assets/templates/assets/domain_detail.html:60 #: assets/templates/assets/domain_list.html:15 #: assets/templates/assets/label_list.html:16 @@ -118,7 +118,7 @@ msgstr "端口" msgid "Asset" msgstr "资产" -#: assets/forms/domain.py:54 assets/forms/user.py:79 assets/forms/user.py:131 +#: assets/forms/domain.py:54 assets/forms/user.py:79 assets/forms/user.py:138 #: assets/models/base.py:21 assets/models/cluster.py:18 #: assets/models/domain.py:17 assets/models/group.py:20 #: assets/models/label.py:17 assets/templates/assets/admin_user_detail.html:56 @@ -147,7 +147,7 @@ msgstr "资产" msgid "Name" msgstr "名称" -#: assets/forms/domain.py:55 assets/forms/user.py:80 assets/forms/user.py:132 +#: assets/forms/domain.py:55 assets/forms/user.py:80 assets/forms/user.py:139 #: assets/models/base.py:22 assets/templates/assets/admin_user_detail.html:60 #: assets/templates/assets/admin_user_list.html:24 #: assets/templates/assets/domain_gateway_list.html:60 @@ -192,27 +192,27 @@ msgstr "ssh密钥不合法" msgid "Password and private key file must be input one" msgstr "密码和私钥, 必须输入一个" -#: assets/forms/user.py:118 +#: assets/forms/user.py:124 msgid "* Automatic login mode, must fill in the username." msgstr "自动登录模式,必须填写用户名" -#: assets/forms/user.py:137 +#: assets/forms/user.py:144 msgid "Auto push system user to asset" msgstr "自动推送系统用户到资产" -#: assets/forms/user.py:138 +#: assets/forms/user.py:145 msgid "" "High level will be using login asset as default, if user was granted more " "than 2 system user" msgstr "高优先级的系统用户将会作为默认登录用户" -#: assets/forms/user.py:139 +#: assets/forms/user.py:147 msgid "" "If you choose manual login mode, you do not need to fill in the username and " "password." msgstr "如果选择手动登录模式,用户名和密码则不需要填写" -#: assets/models/asset.py:63 assets/models/domain.py:43 +#: assets/models/asset.py:74 assets/models/domain.py:43 #: assets/templates/assets/_asset_list_modal.html:46 #: assets/templates/assets/admin_user_assets.html:52 #: assets/templates/assets/asset_detail.html:61 @@ -227,7 +227,7 @@ msgstr "如果选择手动登录模式,用户名和密码则不需要填写" msgid "IP" msgstr "IP" -#: assets/models/asset.py:66 assets/templates/assets/_asset_list_modal.html:45 +#: assets/models/asset.py:77 assets/templates/assets/_asset_list_modal.html:45 #: assets/templates/assets/admin_user_assets.html:51 #: assets/templates/assets/asset_detail.html:57 #: assets/templates/assets/asset_list.html:86 @@ -239,82 +239,91 @@ msgstr "IP" msgid "Hostname" msgstr "主机名" -#: assets/models/asset.py:69 assets/templates/assets/asset_detail.html:97 +#: assets/models/asset.py:80 assets/models/domain.py:45 +#: assets/models/user.py:115 +#: assets/templates/assets/domain_gateway_list.html:59 +#: assets/templates/assets/system_user_detail.html:70 +#: assets/templates/assets/system_user_list.html:28 +#: terminal/templates/terminal/session_list.html:75 +msgid "Protocol" +msgstr "协议" + +#: assets/models/asset.py:83 assets/templates/assets/asset_detail.html:97 msgid "Platform" msgstr "系统平台" -#: assets/models/asset.py:76 assets/models/domain.py:48 +#: assets/models/asset.py:90 assets/models/domain.py:48 #: assets/models/label.py:20 assets/templates/assets/asset_detail.html:105 msgid "Is active" msgstr "激活" -#: assets/models/asset.py:85 assets/templates/assets/asset_detail.html:65 +#: assets/models/asset.py:99 assets/templates/assets/asset_detail.html:65 msgid "Public IP" msgstr "公网IP" -#: assets/models/asset.py:87 assets/templates/assets/asset_detail.html:113 +#: assets/models/asset.py:101 assets/templates/assets/asset_detail.html:113 msgid "Asset number" msgstr "资产编号" -#: assets/models/asset.py:91 assets/templates/assets/asset_detail.html:77 +#: assets/models/asset.py:105 assets/templates/assets/asset_detail.html:77 msgid "Vendor" msgstr "制造商" -#: assets/models/asset.py:93 assets/templates/assets/asset_detail.html:81 +#: assets/models/asset.py:107 assets/templates/assets/asset_detail.html:81 msgid "Model" msgstr "型号" -#: assets/models/asset.py:95 assets/templates/assets/asset_detail.html:109 +#: assets/models/asset.py:109 assets/templates/assets/asset_detail.html:109 msgid "Serial number" msgstr "序列号" -#: assets/models/asset.py:98 +#: assets/models/asset.py:112 msgid "CPU model" msgstr "CPU型号" -#: assets/models/asset.py:99 +#: assets/models/asset.py:113 msgid "CPU count" msgstr "CPU数量" -#: assets/models/asset.py:100 +#: assets/models/asset.py:114 msgid "CPU cores" msgstr "CPU核数" -#: assets/models/asset.py:102 assets/templates/assets/asset_detail.html:89 +#: assets/models/asset.py:116 assets/templates/assets/asset_detail.html:89 msgid "Memory" msgstr "内存" -#: assets/models/asset.py:104 +#: assets/models/asset.py:118 msgid "Disk total" msgstr "硬盘大小" -#: assets/models/asset.py:106 +#: assets/models/asset.py:120 msgid "Disk info" msgstr "硬盘信息" -#: assets/models/asset.py:109 assets/templates/assets/asset_detail.html:101 +#: assets/models/asset.py:123 assets/templates/assets/asset_detail.html:101 msgid "OS" msgstr "操作系统" -#: assets/models/asset.py:111 +#: assets/models/asset.py:125 msgid "OS version" msgstr "系统版本" -#: assets/models/asset.py:113 +#: assets/models/asset.py:127 msgid "OS arch" msgstr "系统架构" -#: assets/models/asset.py:115 +#: assets/models/asset.py:129 msgid "Hostname raw" msgstr "主机名原始" -#: assets/models/asset.py:119 assets/templates/assets/asset_create.html:33 +#: assets/models/asset.py:133 assets/templates/assets/asset_create.html:34 #: assets/templates/assets/asset_detail.html:220 -#: assets/templates/assets/asset_update.html:38 templates/_nav.html:27 +#: assets/templates/assets/asset_update.html:39 templates/_nav.html:27 msgid "Labels" msgstr "标签管理" -#: assets/models/asset.py:121 assets/models/base.py:29 +#: assets/models/asset.py:135 assets/models/base.py:29 #: assets/models/cluster.py:28 assets/models/group.py:21 #: assets/templates/assets/admin_user_detail.html:68 #: assets/templates/assets/asset_detail.html:117 @@ -326,7 +335,7 @@ msgstr "标签管理" msgid "Created by" msgstr "创建者" -#: assets/models/asset.py:124 assets/models/cluster.py:26 +#: assets/models/asset.py:138 assets/models/cluster.py:26 #: assets/models/domain.py:20 assets/models/group.py:22 #: assets/models/label.py:23 assets/templates/assets/admin_user_detail.html:64 #: assets/templates/assets/domain_detail.html:68 @@ -339,7 +348,7 @@ msgstr "创建者" msgid "Date created" msgstr "创建日期" -#: assets/models/asset.py:126 assets/models/base.py:26 +#: assets/models/asset.py:140 assets/models/base.py:26 #: assets/models/cluster.py:29 assets/models/domain.py:18 #: assets/models/domain.py:47 assets/models/group.py:23 #: assets/models/label.py:21 assets/templates/assets/admin_user_detail.html:72 @@ -414,14 +423,6 @@ msgstr "默认Cluster" msgid "Cluster" msgstr "集群" -#: assets/models/domain.py:45 assets/models/user.py:113 -#: assets/templates/assets/domain_gateway_list.html:59 -#: assets/templates/assets/system_user_detail.html:70 -#: assets/templates/assets/system_user_list.html:28 -#: terminal/templates/terminal/session_list.html:75 -msgid "Protocol" -msgstr "协议" - #: assets/models/group.py:30 msgid "Asset group" msgstr "资产组" @@ -444,7 +445,7 @@ msgstr "默认资产组" #: terminal/templates/terminal/session_list.html:71 users/forms.py:282 #: users/models/user.py:31 users/models/user.py:333 #: users/templates/users/user_group_detail.html:78 -#: users/templates/users/user_group_list.html:13 users/views/user.py:359 +#: users/templates/users/user_group_list.html:13 users/views/user.py:361 msgid "User" msgstr "用户" @@ -461,15 +462,15 @@ msgstr "分类" msgid "Key" msgstr "" -#: assets/models/user.py:106 +#: assets/models/user.py:108 msgid "Automatic login" msgstr "自动登录" -#: assets/models/user.py:107 +#: assets/models/user.py:109 msgid "Manually login" msgstr "手动登录" -#: assets/models/user.py:111 +#: assets/models/user.py:113 #: assets/templates/assets/_asset_group_bulk_update_modal.html:11 #: assets/templates/assets/system_user_asset.html:21 #: assets/views/admin_user.py:29 assets/views/admin_user.py:47 @@ -487,30 +488,30 @@ msgstr "手动登录" msgid "Assets" msgstr "资产管理" -#: assets/models/user.py:112 +#: assets/models/user.py:114 msgid "Priority" msgstr "优先级" -#: assets/models/user.py:114 assets/templates/assets/_system_user.html:59 +#: assets/models/user.py:116 assets/templates/assets/_system_user.html:59 #: assets/templates/assets/system_user_detail.html:122 #: assets/templates/assets/system_user_update.html:10 msgid "Auto push" msgstr "自动推送" -#: assets/models/user.py:115 assets/templates/assets/system_user_detail.html:74 +#: assets/models/user.py:117 assets/templates/assets/system_user_detail.html:74 msgid "Sudo" msgstr "Sudo" -#: assets/models/user.py:116 assets/templates/assets/system_user_detail.html:79 +#: assets/models/user.py:118 assets/templates/assets/system_user_detail.html:79 msgid "Shell" msgstr "Shell" -#: assets/models/user.py:117 assets/templates/assets/system_user_detail.html:66 +#: assets/models/user.py:119 assets/templates/assets/system_user_detail.html:66 #: assets/templates/assets/system_user_list.html:29 msgid "Login mode" msgstr "登录模式" -#: assets/models/user.py:157 audits/models.py:12 +#: assets/models/user.py:159 audits/models.py:12 #: audits/templates/audits/ftp_log_list.html:49 #: audits/templates/audits/ftp_log_list.html:73 perms/forms.py:43 #: perms/models.py:34 perms/models.py:78 @@ -624,8 +625,8 @@ msgid "Basic" msgstr "基本" #: assets/templates/assets/_system_user.html:44 -#: assets/templates/assets/asset_create.html:25 -#: assets/templates/assets/asset_update.html:30 +#: assets/templates/assets/asset_create.html:26 +#: assets/templates/assets/asset_update.html:31 #: assets/templates/assets/gateway_create_update.html:45 #: users/templates/users/_user.html:21 msgid "Auth" @@ -636,8 +637,8 @@ msgid "Auto generate key" msgstr "自动生成密钥" #: assets/templates/assets/_system_user.html:65 -#: assets/templates/assets/asset_create.html:59 -#: assets/templates/assets/asset_update.html:63 +#: assets/templates/assets/asset_create.html:60 +#: assets/templates/assets/asset_update.html:64 #: assets/templates/assets/gateway_create_update.html:53 #: perms/templates/perms/asset_permission_create_update.html:45 #: terminal/templates/terminal/terminal_update.html:42 @@ -647,8 +648,8 @@ msgstr "其它" #: assets/templates/assets/_system_user.html:71 #: assets/templates/assets/admin_user_create_update.html:45 #: assets/templates/assets/asset_bulk_update.html:23 -#: assets/templates/assets/asset_create.html:66 -#: assets/templates/assets/asset_update.html:70 +#: assets/templates/assets/asset_create.html:67 +#: assets/templates/assets/asset_update.html:71 #: assets/templates/assets/domain_create_update.html:16 #: assets/templates/assets/gateway_create_update.html:58 #: assets/templates/assets/label_create_update.html:18 @@ -672,9 +673,9 @@ msgstr "重置" #: assets/templates/assets/_system_user.html:72 #: assets/templates/assets/admin_user_create_update.html:46 #: assets/templates/assets/asset_bulk_update.html:24 -#: assets/templates/assets/asset_create.html:67 +#: assets/templates/assets/asset_create.html:68 #: assets/templates/assets/asset_list.html:108 -#: assets/templates/assets/asset_update.html:71 +#: assets/templates/assets/asset_update.html:72 #: assets/templates/assets/domain_create_update.html:17 #: assets/templates/assets/gateway_create_update.html:59 #: assets/templates/assets/label_create_update.html:19 @@ -1025,7 +1026,7 @@ msgstr "删除" msgid "Asset Deleting failed." msgstr "删除失败" -#: assets/templates/assets/asset_update.html:59 +#: assets/templates/assets/asset_update.html:60 msgid "Configuration" msgstr "配置" @@ -1987,7 +1988,7 @@ msgstr "文档" #: users/templates/users/user_profile.html:17 #: users/templates/users/user_profile_update.html:37 #: users/templates/users/user_profile_update.html:57 -#: users/templates/users/user_pubkey_update.html:37 users/views/user.py:341 +#: users/templates/users/user_pubkey_update.html:37 users/views/user.py:343 msgid "Profile" msgstr "个人信息" @@ -2045,8 +2046,8 @@ msgstr "关闭" #: templates/_nav.html:10 users/views/group.py:28 users/views/group.py:44 #: users/views/group.py:62 users/views/group.py:79 users/views/group.py:95 #: users/views/login.py:277 users/views/login.py:335 users/views/user.py:65 -#: users/views/user.py:80 users/views/user.py:102 users/views/user.py:173 -#: users/views/user.py:328 users/views/user.py:378 users/views/user.py:413 +#: users/views/user.py:80 users/views/user.py:102 users/views/user.py:175 +#: users/views/user.py:330 users/views/user.py:380 users/views/user.py:415 msgid "Users" msgstr "用户管理" @@ -2680,7 +2681,7 @@ msgid "Reset link will be generated and sent to the user. " msgstr "生成重置密码连接,通过邮件发送给用户" #: users/templates/users/user_detail.html:19 -#: users/templates/users/user_granted_asset.html:18 users/views/user.py:174 +#: users/templates/users/user_granted_asset.html:18 users/views/user.py:176 msgid "User detail" msgstr "用户详情" @@ -2815,8 +2816,8 @@ msgstr "用户删除失败" msgid "Administrator Settings force MFA login" msgstr "管理员设置强制使用MFA登录" -#: users/templates/users/user_profile.html:116 users/views/user.py:203 -#: users/views/user.py:257 +#: users/templates/users/user_profile.html:116 users/views/user.py:205 +#: users/views/user.py:259 msgid "User groups" msgstr "用户组" @@ -2871,7 +2872,7 @@ msgid "Create account successfully" msgstr "创建账户成功" #: users/utils.py:43 -#, fuzzy, python-format +#, python-format msgid "" "\n" " Hello %(name)s:\n" @@ -3020,7 +3021,7 @@ msgstr "用户组授权资产" msgid "Please enable cookies and try again." msgstr "设置你的浏览器支持cookie" -#: users/views/login.py:128 users/views/user.py:498 users/views/user.py:523 +#: users/views/login.py:128 users/views/user.py:500 users/views/user.py:525 msgid "MFA code invalid" msgstr "MFA码认证失败" @@ -3061,7 +3062,7 @@ msgstr "Token错误或失效" msgid "Password not same" msgstr "密码不一致" -#: users/views/login.py:239 users/views/user.py:115 users/views/user.py:396 +#: users/views/login.py:239 users/views/user.py:118 users/views/user.py:398 msgid "* Your password does not meet the requirements" msgstr "* 您的密码不符合要求" @@ -3073,46 +3074,46 @@ msgstr "首次登陆" msgid "Login log list" msgstr "登录日志" -#: users/views/user.py:127 +#: users/views/user.py:129 msgid "Bulk update user success" msgstr "批量更新用户成功" -#: users/views/user.py:232 +#: users/views/user.py:234 msgid "Invalid file." msgstr "文件不合法" -#: users/views/user.py:329 +#: users/views/user.py:331 msgid "User granted assets" msgstr "用户授权资产" -#: users/views/user.py:360 +#: users/views/user.py:362 msgid "Profile setting" msgstr "个人信息设置" -#: users/views/user.py:379 +#: users/views/user.py:381 msgid "Password update" msgstr "密码更新" -#: users/views/user.py:414 +#: users/views/user.py:416 msgid "Public key update" msgstr "密钥更新" -#: users/views/user.py:455 +#: users/views/user.py:457 msgid "Password invalid" msgstr "用户名或密码无效" -#: users/views/user.py:549 +#: users/views/user.py:551 msgid "MFA enable success" msgstr "MFA 绑定成功" -#: users/views/user.py:550 +#: users/views/user.py:552 msgid "MFA enable success, return login page" msgstr "MFA 绑定成功,返回到登录页面" -#: users/views/user.py:552 +#: users/views/user.py:554 msgid "MFA disable success" msgstr "MFA 解绑成功" -#: users/views/user.py:553 +#: users/views/user.py:555 msgid "MFA disable success, return login page" msgstr "MFA 解绑成功,返回登录页面" diff --git a/apps/perms/api.py b/apps/perms/api.py index 33a027064..40366a19b 100644 --- a/apps/perms/api.py +++ b/apps/perms/api.py @@ -73,9 +73,9 @@ class UserGrantedAssetsApi(ListAPIView): util = AssetPermissionUtil(user) for k, v in util.get_assets().items(): if k.is_unixlike(): - system_users_granted = [s for s in v if s.protocol == 'ssh'] + system_users_granted = [s for s in v if s.protocol in ['ssh', 'telnet']] else: - system_users_granted = [s for s in v if s.protocol == 'rdp'] + system_users_granted = [s for s in v if s.protocol in ['rdp', 'telnet']] k.system_users_granted = system_users_granted queryset.append(k) return queryset @@ -124,9 +124,9 @@ class UserGrantedNodesWithAssetsApi(ListAPIView): assets = _assets.keys() for k, v in _assets.items(): if k.is_unixlike(): - system_users_granted = [s for s in v if s.protocol == 'ssh'] + system_users_granted = [s for s in v if s.protocol in ['ssh', 'telnet']] else: - system_users_granted = [s for s in v if s.protocol == 'rdp'] + system_users_granted = [s for s in v if s.protocol in ['rdp', 'telnet']] k.system_users_granted = system_users_granted node.assets_granted = assets queryset.append(node)