From 327febaf59a4d8b7b2314131993ee23a0296376b Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 24 Jun 2019 20:39:45 +0800 Subject: [PATCH] =?UTF-8?q?[Update]=20=E6=9B=B4=E6=94=B9=E6=9F=A5=E7=9C=8B?= =?UTF-8?q?=E8=AE=A4=E8=AF=81=E9=9C=80=E8=A6=81=E7=9A=84MFA=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E9=97=B4=E9=9A=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/api/asset_user.py | 18 +- .../templates/assets/_asset_user_list.html | 5 +- apps/authentication/api/auth.py | 2 +- apps/common/permissions.py | 8 + apps/jumpserver/conf.py | 2 +- apps/jumpserver/context_processor.py | 1 + apps/jumpserver/settings.py | 1 + apps/locale/zh/LC_MESSAGES/django.mo | Bin 77458 -> 77349 bytes apps/locale/zh/LC_MESSAGES/django.po | 376 +++++++++--------- 9 files changed, 216 insertions(+), 197 deletions(-) diff --git a/apps/assets/api/asset_user.py b/apps/assets/api/asset_user.py index ae8032cba..c3dc518fa 100644 --- a/apps/assets/api/asset_user.py +++ b/apps/assets/api/asset_user.py @@ -10,7 +10,7 @@ from rest_framework import filters from rest_framework_bulk import BulkModelViewSet from django.shortcuts import get_object_or_404 -from common.permissions import IsOrgAdminOrAppUser +from common.permissions import IsOrgAdminOrAppUser, NeedMFAVerify from common.utils import get_object_or_none, get_logger from common.mixins import IDInCacheFilterMixin from ..backends import AssetUserManager @@ -57,7 +57,7 @@ class AssetUserSearchBackend(filters.BaseFilterBackend): class AssetUserViewSet(IDInCacheFilterMixin, BulkModelViewSet): pagination_class = LimitOffsetPagination serializer_class = serializers.AssetUserSerializer - permission_classes = (IsOrgAdminOrAppUser, ) + permission_classes = [IsOrgAdminOrAppUser] http_method_names = ['get', 'post'] filter_fields = [ "id", "ip", "hostname", "username", "asset_id", "node_id", @@ -111,22 +111,16 @@ class AssetUserExportViewSet(AssetUserViewSet): serializer_class = serializers.AssetUserExportSerializer http_method_names = ['get'] - def list(self, request, *args, **kwargs): - otp_last_verify = request.session.get("OTP_LAST_VERIFY_TIME") - if not otp_last_verify or time.time() - int(otp_last_verify) > 600: - return Response({"error": "Need MFA confirm mfa auth"}, status=403) - return super().list(request, *args, **kwargs) + def get_permissions(self): + self.permission_classes.append(NeedMFAVerify) + return super().get_permissions() class AssetUserAuthInfoApi(generics.RetrieveAPIView): serializer_class = serializers.AssetUserAuthInfoSerializer - permission_classes = (IsOrgAdminOrAppUser,) + permission_classes = [IsOrgAdminOrAppUser, NeedMFAVerify] def retrieve(self, request, *args, **kwargs): - otp_last_verify = request.session.get("OTP_LAST_VERIFY_TIME") - if not otp_last_verify or time.time() - int(otp_last_verify) > 600: - return Response({"error": "Need MFA confirm mfa auth"}, status=403) - instance = self.get_object() serializer = self.get_serializer(instance) status_code = status.HTTP_200_OK diff --git a/apps/assets/templates/assets/_asset_user_list.html b/apps/assets/templates/assets/_asset_user_list.html index af90c017b..52cd94b52 100644 --- a/apps/assets/templates/assets/_asset_user_list.html +++ b/apps/assets/templates/assets/_asset_user_list.html @@ -32,8 +32,9 @@ var assetUserListUrl = "{% url "api-assets:asset-user-list" %}"; var assetUserTable; var needPush = false; var prefer = null; -var lastMFATime = "{{ request.session.OTP_LAST_VERIFY_TIME }}"; +var lastMFATime = "{{ request.session.MFA_VERIFY_TIME }}"; var testDatetime = "{% trans 'Test datetime: ' %}"; +var mfaVerifyTTL = "{{ SECURITY_MFA_VERIFY_TTL }}"; function initAssetUserTable() { var options = { @@ -109,7 +110,7 @@ $(document).ready(function(){ authUsername = $(this).data('user'); var now = new Date(); var nowTime = now.getTime() / 1000; - if ( !lastMFATime || nowTime - lastMFATime > 60*10 ) { + if ( !lastMFATime || nowTime - lastMFATime > mfaVerifyTTL ) { mfaFor = "viewAuth"; $("#mfa_auth_confirm").modal("show"); } else { diff --git a/apps/authentication/api/auth.py b/apps/authentication/api/auth.py index 42c196c51..042150517 100644 --- a/apps/authentication/api/auth.py +++ b/apps/authentication/api/auth.py @@ -194,7 +194,7 @@ class UserOtpVerifyApi(CreateAPIView): code = serializer.validated_data["code"] if request.user.check_otp(code): - request.session["OTP_LAST_VERIFY_TIME"] = int(time.time()) + request.session["MFA_VERIFY_TIME"] = int(time.time()) return Response({"ok": "1"}) else: return Response({"error": "Code not valid"}, status=400) diff --git a/apps/common/permissions.py b/apps/common/permissions.py index ec004df0b..776c50e4d 100644 --- a/apps/common/permissions.py +++ b/apps/common/permissions.py @@ -132,3 +132,11 @@ class PermissionsMixin(UserPassesTestMixin): if not permission_class().has_permission(self.request, self): return False return True + + +class NeedMFAVerify(permissions.BasePermission): + def has_permission(self, request, view): + mfa_verify_time = request.session.get('MFA_VERIFY_TIME', 0) + if time.time() - mfa_verify_time < settings.SECURITY_MFA_VERIFY_TTL: + return True + return False diff --git a/apps/jumpserver/conf.py b/apps/jumpserver/conf.py index 0362a68e3..8368cb993 100644 --- a/apps/jumpserver/conf.py +++ b/apps/jumpserver/conf.py @@ -374,7 +374,7 @@ defaults = { 'HTTP_LISTEN_PORT': 8080, 'LOGIN_LOG_KEEP_DAYS': 90, 'ASSETS_PERM_CACHE_TIME': 3600, - + 'SECURITY_MFA_VERIFY_TTL': 3600, } diff --git a/apps/jumpserver/context_processor.py b/apps/jumpserver/context_processor.py index 148611359..91a720fd7 100644 --- a/apps/jumpserver/context_processor.py +++ b/apps/jumpserver/context_processor.py @@ -17,6 +17,7 @@ def jumpserver_processor(request): 'VERSION': settings.VERSION, 'COPYRIGHT': 'FIT2CLOUD 飞致云' + ' © 2014-2019', 'SECURITY_COMMAND_EXECUTION': settings.SECURITY_COMMAND_EXECUTION, + 'SECURITY_MFA_VERIFY_TTL': settings.SECURITY_MFA_VERIFY_TTL, } return context diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py index cc93909d3..63ebabfe0 100644 --- a/apps/jumpserver/settings.py +++ b/apps/jumpserver/settings.py @@ -565,6 +565,7 @@ SECURITY_PASSWORD_RULES = [ 'SECURITY_PASSWORD_NUMBER', 'SECURITY_PASSWORD_SPECIAL_CHAR' ] +SECURITY_MFA_VERIFY_TTL = CONFIG.SECURITY_MFA_VERIFY_TTL TERMINAL_PASSWORD_AUTH = CONFIG.TERMINAL_PASSWORD_AUTH TERMINAL_PUBLIC_KEY_AUTH = CONFIG.TERMINAL_PUBLIC_KEY_AUTH diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index c4e24380b3cf885b4f8afcd4e1406bd158425e35..68cbba8db1680026e55e1bc6f240d39c58ef3efd 100644 GIT binary patch delta 22799 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\n" "Language-Team: Jumpserver team\n" @@ -76,9 +76,9 @@ msgstr "运行参数" #: applications/templates/applications/remote_app_list.html:22 #: applications/templates/applications/user_remote_app_list.html:18 #: assets/forms/domain.py:15 assets/forms/label.py:13 -#: assets/models/asset.py:315 assets/models/authbook.py:27 -#: assets/serializers/admin_user.py:24 assets/serializers/asset_user.py:105 -#: assets/serializers/system_user.py:28 +#: assets/models/asset.py:298 assets/models/authbook.py:24 +#: assets/serializers/admin_user.py:35 assets/serializers/asset_user.py:106 +#: assets/serializers/system_user.py:29 #: assets/templates/assets/admin_user_list.html:49 #: assets/templates/assets/domain_detail.html:60 #: assets/templates/assets/domain_list.html:26 @@ -112,7 +112,7 @@ msgstr "资产" #: applications/templates/applications/remote_app_detail.html:61 #: applications/templates/applications/remote_app_list.html:23 #: applications/templates/applications/user_remote_app_list.html:19 -#: assets/models/user.py:251 assets/templates/assets/user_asset_list.html:172 +#: assets/models/user.py:160 assets/templates/assets/user_asset_list.html:172 #: audits/models.py:20 audits/templates/audits/ftp_log_list.html:49 #: audits/templates/audits/ftp_log_list.html:72 #: perms/forms/asset_permission.py:52 perms/models/asset_permission.py:39 @@ -135,7 +135,7 @@ msgstr "系统用户" #: applications/templates/applications/remote_app_list.html:20 #: applications/templates/applications/user_remote_app_list.html:16 #: assets/forms/domain.py:73 assets/forms/user.py:84 assets/forms/user.py:148 -#: assets/models/asset.py:72 assets/models/base.py:27 +#: assets/models/asset.py:70 assets/models/base.py:27 #: assets/models/cluster.py:18 assets/models/cmd_filter.py:20 #: assets/models/domain.py:20 assets/models/group.py:20 #: assets/models/label.py:18 assets/templates/assets/admin_user_detail.html:56 @@ -206,7 +206,7 @@ msgstr "参数" #: applications/models/remote_app.py:43 #: applications/templates/applications/remote_app_detail.html:77 -#: assets/models/asset.py:132 assets/models/base.py:35 +#: assets/models/asset.py:130 assets/models/base.py:35 #: assets/models/cluster.py:28 assets/models/cmd_filter.py:25 #: assets/models/cmd_filter.py:58 assets/models/group.py:21 #: assets/templates/assets/admin_user_detail.html:68 @@ -230,10 +230,9 @@ msgstr "创建者" # msgstr "创建者" #: applications/models/remote_app.py:46 #: applications/templates/applications/remote_app_detail.html:73 -#: assets/models/asset.py:133 assets/models/base.py:33 +#: assets/models/asset.py:131 assets/models/base.py:33 #: assets/models/cluster.py:26 assets/models/domain.py:23 #: assets/models/group.py:22 assets/models/label.py:25 -#: assets/serializers/admin_user.py:38 #: assets/templates/assets/admin_user_detail.html:64 #: assets/templates/assets/cmd_filter_detail.html:69 #: assets/templates/assets/domain_detail.html:68 @@ -259,7 +258,7 @@ msgstr "创建日期" #: applications/templates/applications/remote_app_detail.html:81 #: applications/templates/applications/remote_app_list.html:24 #: applications/templates/applications/user_remote_app_list.html:20 -#: assets/models/asset.py:134 assets/models/base.py:32 +#: assets/models/asset.py:132 assets/models/base.py:32 #: assets/models/cluster.py:29 assets/models/cmd_filter.py:22 #: assets/models/cmd_filter.py:55 assets/models/domain.py:21 #: assets/models/domain.py:53 assets/models/group.py:23 @@ -391,7 +390,7 @@ msgstr "提交" #: assets/templates/assets/cmd_filter_rule_list.html:19 #: assets/templates/assets/domain_detail.html:18 #: assets/templates/assets/domain_gateway_list.html:20 -#: assets/templates/assets/system_user_asset.html:18 +#: assets/templates/assets/system_user_assets.html:18 #: assets/templates/assets/system_user_detail.html:18 #: ops/templates/ops/adhoc_history.html:130 #: ops/templates/ops/task_adhoc.html:116 @@ -412,13 +411,13 @@ msgstr "详情" #: applications/templates/applications/remote_app_detail.html:21 #: applications/templates/applications/remote_app_list.html:56 -#: assets/templates/assets/_asset_user_list.html:62 +#: assets/templates/assets/_asset_user_list.html:69 #: assets/templates/assets/admin_user_detail.html:24 #: assets/templates/assets/admin_user_list.html:29 -#: assets/templates/assets/admin_user_list.html:112 +#: assets/templates/assets/admin_user_list.html:114 #: assets/templates/assets/asset_detail.html:27 #: assets/templates/assets/asset_list.html:86 -#: assets/templates/assets/asset_list.html:190 +#: assets/templates/assets/asset_list.html:196 #: assets/templates/assets/cmd_filter_detail.html:29 #: assets/templates/assets/cmd_filter_list.html:58 #: assets/templates/assets/cmd_filter_rule_list.html:86 @@ -429,7 +428,7 @@ msgstr "详情" #: assets/templates/assets/label_list.html:39 #: assets/templates/assets/system_user_detail.html:26 #: assets/templates/assets/system_user_list.html:33 -#: assets/templates/assets/system_user_list.html:118 audits/models.py:33 +#: assets/templates/assets/system_user_list.html:119 audits/models.py:33 #: perms/templates/perms/asset_permission_detail.html:30 #: perms/templates/perms/asset_permission_list.html:181 #: perms/templates/perms/remote_app_permission_detail.html:30 @@ -458,9 +457,9 @@ msgstr "更新" #: applications/templates/applications/remote_app_detail.html:25 #: applications/templates/applications/remote_app_list.html:57 #: assets/templates/assets/admin_user_detail.html:28 -#: assets/templates/assets/admin_user_list.html:113 +#: assets/templates/assets/admin_user_list.html:115 #: assets/templates/assets/asset_detail.html:31 -#: assets/templates/assets/asset_list.html:191 +#: assets/templates/assets/asset_list.html:197 #: assets/templates/assets/cmd_filter_detail.html:33 #: assets/templates/assets/cmd_filter_list.html:59 #: assets/templates/assets/cmd_filter_rule_list.html:87 @@ -470,7 +469,7 @@ msgstr "更新" #: assets/templates/assets/domain_list.html:55 #: assets/templates/assets/label_list.html:40 #: assets/templates/assets/system_user_detail.html:30 -#: assets/templates/assets/system_user_list.html:119 audits/models.py:34 +#: assets/templates/assets/system_user_list.html:120 audits/models.py:34 #: ops/templates/ops/task_list.html:64 #: perms/templates/perms/asset_permission_detail.html:34 #: perms/templates/perms/asset_permission_list.html:182 @@ -599,17 +598,36 @@ msgstr "更新节点资产硬件信息: {}" msgid "Test if the assets under the node are connectable: {}" msgstr "测试节点下资产是否可连接: {}" -#: assets/forms/asset.py:45 assets/models/asset.py:103 -#: assets/models/user.py:134 assets/templates/assets/asset_detail.html:194 +#: assets/const.py:77 assets/models/utils.py:43 +#: assets/templates/assets/admin_user_list.html:51 +#: assets/templates/assets/system_user_list.html:57 +msgid "Unreachable" +msgstr "不可达" + +#: assets/const.py:78 assets/models/utils.py:44 +#: assets/templates/assets/admin_user_list.html:50 +#: assets/templates/assets/asset_list.html:107 +#: assets/templates/assets/system_user_list.html:56 +#: users/templates/users/user_group_granted_asset.html:47 +msgid "Reachable" +msgstr "可连接" + +#: assets/const.py:79 assets/models/utils.py:45 authentication/utils.py:9 +#: xpack/plugins/license/models.py:78 +msgid "Unknown" +msgstr "未知" + +#: assets/forms/asset.py:45 assets/models/asset.py:101 +#: assets/models/user.py:107 assets/templates/assets/asset_detail.html:194 #: assets/templates/assets/asset_detail.html:202 -#: assets/templates/assets/system_user_asset.html:83 +#: assets/templates/assets/system_user_assets.html:83 #: perms/models/asset_permission.py:38 #: xpack/plugins/change_auth_plan/models.py:72 msgid "Nodes" msgstr "节点" -#: assets/forms/asset.py:48 assets/forms/asset.py:83 assets/models/asset.py:107 -#: assets/models/cluster.py:19 assets/models/user.py:92 +#: assets/forms/asset.py:48 assets/forms/asset.py:83 assets/models/asset.py:105 +#: assets/models/cluster.py:19 assets/models/user.py:65 #: assets/templates/assets/asset_detail.html:80 templates/_nav.html:24 #: xpack/plugins/cloud/models.py:124 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:65 @@ -626,7 +644,7 @@ msgstr "管理用户" msgid "Label" msgstr "标签" -#: assets/forms/asset.py:54 assets/forms/asset.py:89 assets/models/asset.py:102 +#: assets/forms/asset.py:54 assets/forms/asset.py:89 assets/models/asset.py:100 #: assets/models/domain.py:26 assets/models/domain.py:52 #: assets/templates/assets/asset_detail.html:84 #: assets/templates/assets/user_asset_list.html:173 @@ -720,8 +738,8 @@ msgid "Password or private key passphrase" msgstr "密码或密钥密码" #: assets/forms/user.py:26 assets/models/base.py:29 -#: assets/serializers/admin_user.py:21 assets/serializers/asset_user.py:33 -#: assets/serializers/asset_user.py:86 assets/serializers/system_user.py:16 +#: assets/serializers/admin_user.py:19 assets/serializers/asset_user.py:34 +#: assets/serializers/asset_user.py:87 assets/serializers/system_user.py:16 #: assets/templates/assets/_asset_user_auth_update_modal.html:21 #: assets/templates/assets/_asset_user_auth_view_modal.html:27 #: authentication/forms.py:13 @@ -739,8 +757,8 @@ msgstr "密码或密钥密码" msgid "Password" msgstr "密码" -#: assets/forms/user.py:29 assets/serializers/asset_user.py:41 -#: assets/serializers/asset_user.py:94 +#: assets/forms/user.py:29 assets/serializers/asset_user.py:42 +#: assets/serializers/asset_user.py:95 #: assets/templates/assets/_asset_user_auth_update_modal.html:27 #: users/models/user.py:90 msgid "Private key" @@ -759,7 +777,7 @@ msgid "* Automatic login mode must fill in the username." msgstr "自动登录模式,必须填写用户名" #: assets/forms/user.py:151 assets/models/cmd_filter.py:31 -#: assets/models/user.py:142 assets/templates/assets/_system_user.html:66 +#: assets/models/user.py:115 assets/templates/assets/_system_user.html:66 #: assets/templates/assets/system_user_detail.html:165 msgid "Command filter" msgstr "命令过滤器" @@ -786,7 +804,7 @@ msgstr "如果选择手动登录模式,用户名和密码可以不填写" msgid "Use comma split multi command, ex: /bin/whoami,/bin/ifconfig" msgstr "使用逗号分隔多个命令,如: /bin/whoami,/sbin/ifconfig" -#: assets/models/asset.py:73 assets/models/asset.py:98 +#: assets/models/asset.py:71 assets/models/asset.py:96 #: assets/models/domain.py:50 #: assets/templates/assets/domain_gateway_list.html:69 #: assets/templates/assets/user_asset_list.html:168 @@ -794,8 +812,8 @@ msgstr "使用逗号分隔多个命令,如: /bin/whoami,/sbin/ifconfig" msgid "Port" msgstr "端口" -#: assets/models/asset.py:93 assets/models/domain.py:49 -#: assets/serializers/asset_user.py:28 +#: assets/models/asset.py:91 assets/models/domain.py:49 +#: assets/serializers/asset_user.py:29 #: assets/templates/assets/_asset_list_modal.html:46 #: assets/templates/assets/_asset_user_list.html:15 #: assets/templates/assets/asset_detail.html:64 @@ -811,7 +829,7 @@ msgstr "端口" msgid "IP" msgstr "IP" -#: assets/models/asset.py:94 assets/serializers/asset_user.py:27 +#: assets/models/asset.py:92 assets/serializers/asset_user.py:28 #: assets/templates/assets/_asset_list_modal.html:45 #: assets/templates/assets/_asset_user_auth_update_modal.html:9 #: assets/templates/assets/_asset_user_auth_view_modal.html:15 @@ -828,8 +846,8 @@ msgstr "IP" msgid "Hostname" msgstr "主机名" -#: assets/models/asset.py:97 assets/models/asset.py:100 -#: assets/models/domain.py:51 assets/models/user.py:137 +#: assets/models/asset.py:95 assets/models/asset.py:98 +#: assets/models/domain.py:51 assets/models/user.py:110 #: assets/templates/assets/asset_detail.html:72 #: assets/templates/assets/domain_gateway_list.html:70 #: assets/templates/assets/system_user_detail.html:70 @@ -839,115 +857,94 @@ msgstr "主机名" msgid "Protocol" msgstr "协议" -#: assets/models/asset.py:101 assets/templates/assets/asset_detail.html:108 +#: assets/models/asset.py:99 assets/templates/assets/asset_detail.html:108 #: assets/templates/assets/user_asset_list.html:170 msgid "Platform" msgstr "系统平台" -#: assets/models/asset.py:104 assets/models/cmd_filter.py:21 +#: assets/models/asset.py:102 assets/models/cmd_filter.py:21 #: assets/models/domain.py:54 assets/models/label.py:22 #: assets/templates/assets/asset_detail.html:116 #: assets/templates/assets/user_asset_list.html:174 msgid "Is active" msgstr "激活" -#: assets/models/asset.py:110 assets/templates/assets/asset_detail.html:68 +#: assets/models/asset.py:108 assets/templates/assets/asset_detail.html:68 msgid "Public IP" msgstr "公网IP" -#: assets/models/asset.py:111 assets/templates/assets/asset_detail.html:124 +#: assets/models/asset.py:109 assets/templates/assets/asset_detail.html:124 msgid "Asset number" msgstr "资产编号" -#: assets/models/asset.py:114 assets/templates/assets/asset_detail.html:88 +#: assets/models/asset.py:112 assets/templates/assets/asset_detail.html:88 msgid "Vendor" msgstr "制造商" -#: assets/models/asset.py:115 assets/templates/assets/asset_detail.html:92 +#: assets/models/asset.py:113 assets/templates/assets/asset_detail.html:92 msgid "Model" msgstr "型号" -#: assets/models/asset.py:116 assets/templates/assets/asset_detail.html:120 +#: assets/models/asset.py:114 assets/templates/assets/asset_detail.html:120 msgid "Serial number" msgstr "序列号" -#: assets/models/asset.py:118 +#: assets/models/asset.py:116 msgid "CPU model" msgstr "CPU型号" -#: assets/models/asset.py:119 +#: assets/models/asset.py:117 #: xpack/plugins/license/templates/license/license_detail.html:80 msgid "CPU count" msgstr "CPU数量" -#: assets/models/asset.py:120 +#: assets/models/asset.py:118 msgid "CPU cores" msgstr "CPU核数" -#: assets/models/asset.py:121 +#: assets/models/asset.py:119 msgid "CPU vcpus" msgstr "CPU总数" -#: assets/models/asset.py:122 assets/templates/assets/asset_detail.html:100 +#: assets/models/asset.py:120 assets/templates/assets/asset_detail.html:100 msgid "Memory" msgstr "内存" -#: assets/models/asset.py:123 +#: assets/models/asset.py:121 msgid "Disk total" msgstr "硬盘大小" -#: assets/models/asset.py:124 +#: assets/models/asset.py:122 msgid "Disk info" msgstr "硬盘信息" -#: assets/models/asset.py:126 assets/templates/assets/asset_detail.html:112 +#: assets/models/asset.py:124 assets/templates/assets/asset_detail.html:112 #: assets/templates/assets/user_asset_list.html:171 msgid "OS" msgstr "操作系统" -#: assets/models/asset.py:127 +#: assets/models/asset.py:125 msgid "OS version" msgstr "系统版本" -#: assets/models/asset.py:128 +#: assets/models/asset.py:126 msgid "OS arch" msgstr "系统架构" -#: assets/models/asset.py:129 +#: assets/models/asset.py:127 msgid "Hostname raw" msgstr "主机名原始" -#: assets/models/asset.py:131 assets/templates/assets/asset_create.html:46 +#: assets/models/asset.py:129 assets/templates/assets/asset_create.html:46 #: assets/templates/assets/asset_detail.html:231 templates/_nav.html:26 msgid "Labels" msgstr "标签管理" -#: assets/models/asset.py:140 assets/models/base.py:39 -#: assets/serializers/admin_user.py:23 assets/serializers/system_user.py:19 -#: assets/templates/assets/admin_user_list.html:51 -#: assets/templates/assets/system_user_list.html:57 -msgid "Unreachable" -msgstr "不可达" - -#: assets/models/asset.py:141 assets/models/base.py:40 -#: assets/serializers/admin_user.py:25 assets/serializers/system_user.py:27 -#: assets/templates/assets/admin_user_list.html:50 -#: assets/templates/assets/asset_list.html:107 -#: assets/templates/assets/system_user_list.html:56 -#: users/templates/users/user_group_granted_asset.html:47 -msgid "Reachable" -msgstr "可连接" - -#: assets/models/asset.py:142 assets/models/base.py:41 -#: authentication/utils.py:9 xpack/plugins/license/models.py:78 -msgid "Unknown" -msgstr "未知" - -#: assets/models/authbook.py:28 ops/templates/ops/task_detail.html:72 +#: assets/models/authbook.py:25 ops/templates/ops/task_detail.html:72 msgid "Latest version" msgstr "最新版本" -#: assets/models/authbook.py:29 +#: assets/models/authbook.py:26 #: assets/templates/assets/_asset_user_list.html:17 #: ops/templates/ops/adhoc_history.html:58 #: ops/templates/ops/adhoc_history_detail.html:57 @@ -955,7 +952,7 @@ msgstr "最新版本" msgid "Version" msgstr "版本" -#: assets/models/authbook.py:37 +#: assets/models/authbook.py:35 msgid "AuthBook" msgstr "" @@ -969,8 +966,7 @@ msgstr "ssh密钥" msgid "SSH public key" msgstr "ssh公钥" -#: assets/models/base.py:34 assets/serializers/admin_user.py:39 -#: assets/templates/assets/cmd_filter_detail.html:73 +#: assets/models/base.py:34 assets/templates/assets/cmd_filter_detail.html:73 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:109 msgid "Date updated" msgstr "更新日期" @@ -1005,7 +1001,7 @@ msgid "Operator" msgstr "运营商" #: assets/models/cluster.py:36 assets/models/group.py:34 -#: perms/utils/asset_permission.py:63 +#: perms/utils/asset_permission.py:64 msgid "Default" msgstr "默认" @@ -1070,7 +1066,7 @@ msgstr "过滤器" msgid "Type" msgstr "类型" -#: assets/models/cmd_filter.py:51 assets/models/user.py:136 +#: assets/models/cmd_filter.py:51 assets/models/user.py:109 #: assets/templates/assets/cmd_filter_rule_list.html:60 msgid "Priority" msgstr "优先级" @@ -1155,17 +1151,17 @@ msgstr "键" msgid "New node" msgstr "新节点" -#: assets/models/user.py:130 +#: assets/models/user.py:103 msgid "Automatic login" msgstr "自动登录" -#: assets/models/user.py:131 +#: assets/models/user.py:104 msgid "Manually login" msgstr "手动登录" -#: assets/models/user.py:135 +#: assets/models/user.py:108 #: assets/templates/assets/_asset_group_bulk_update_modal.html:11 -#: assets/templates/assets/system_user_asset.html:22 +#: assets/templates/assets/system_user_assets.html:22 #: assets/templates/assets/system_user_detail.html:22 #: assets/views/admin_user.py:30 assets/views/admin_user.py:49 #: assets/views/admin_user.py:66 assets/views/admin_user.py:82 @@ -1186,31 +1182,38 @@ msgstr "手动登录" msgid "Assets" msgstr "资产管理" -#: assets/models/user.py:138 assets/templates/assets/_system_user.html:59 +#: assets/models/user.py:111 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:139 assets/templates/assets/system_user_detail.html:74 +#: assets/models/user.py:112 assets/templates/assets/system_user_detail.html:74 msgid "Sudo" msgstr "Sudo" -#: assets/models/user.py:140 assets/templates/assets/system_user_detail.html:79 +#: assets/models/user.py:113 assets/templates/assets/system_user_detail.html:79 msgid "Shell" msgstr "Shell" -#: assets/models/user.py:141 assets/templates/assets/system_user_detail.html:66 +#: assets/models/user.py:114 assets/templates/assets/system_user_detail.html:66 #: assets/templates/assets/system_user_list.html:54 msgid "Login mode" msgstr "登录模式" -#: assets/models/utils.py:29 +#: assets/models/utils.py:35 #, python-format msgid "%(value)s is not an even number" msgstr "%(value)s is not an even number" -#: assets/serializers/asset.py:46 assets/templates/assets/asset_create.html:24 +#: assets/serializers/admin_user.py:36 assets/serializers/asset.py:47 +#: assets/serializers/asset_user.py:30 assets/serializers/system_user.py:30 +#: assets/templates/assets/_asset_user_list.html:18 +msgid "Connectivity" +msgstr "连接" + +#: assets/serializers/asset.py:45 assets/serializers/asset.py:155 +#: assets/templates/assets/asset_create.html:24 msgid "Protocols" msgstr "协议组" @@ -1218,20 +1221,15 @@ msgstr "协议组" msgid "Hardware info" msgstr "硬件信息" -#: assets/serializers/asset.py:74 assets/serializers/asset_user.py:29 -#: assets/templates/assets/_asset_user_list.html:18 -msgid "Connectivity" -msgstr "连接" - -#: assets/serializers/asset.py:75 orgs/mixins.py:223 +#: assets/serializers/asset.py:74 orgs/mixins.py:220 msgid "Org name" msgstr "组织名称" -#: assets/serializers/asset.py:93 +#: assets/serializers/asset.py:92 msgid "Protocol duplicate: {}" msgstr "协议重复: {}" -#: assets/serializers/asset_user.py:37 assets/serializers/asset_user.py:90 +#: assets/serializers/asset_user.py:38 assets/serializers/asset_user.py:91 #: users/forms.py:248 users/models/user.py:93 #: users/templates/users/first_login.html:42 #: users/templates/users/user_password_update.html:46 @@ -1241,106 +1239,98 @@ msgstr "协议重复: {}" msgid "Public key" msgstr "ssh公钥" -#: assets/serializers/asset_user.py:43 +#: assets/serializers/asset_user.py:44 msgid "Backend" msgstr "后端" -#: assets/serializers/asset_user.py:65 +#: assets/serializers/asset_user.py:66 msgid "private key invalid" msgstr "密钥不合法" -#: assets/serializers/system_user.py:22 -msgid "Unreachable assets" -msgstr "不可达资产" - -#: assets/serializers/system_user.py:25 -msgid "Reachable assets" -msgstr "可连接资产" - -#: assets/serializers/system_user.py:41 +#: assets/serializers/system_user.py:31 msgid "Login mode display" msgstr "登录模式显示" -#: assets/tasks.py:32 +#: assets/tasks.py:33 msgid "Asset has been disabled, skipped: {}" msgstr "资产或许不支持ansible, 跳过: {}" -#: assets/tasks.py:36 +#: assets/tasks.py:37 msgid "Asset may not be support ansible, skipped: {}" msgstr "资产或许不支持ansible, 跳过: {}" -#: assets/tasks.py:49 +#: assets/tasks.py:50 msgid "No assets matched, stop task" msgstr "没有匹配到资产,结束任务" -#: assets/tasks.py:59 +#: assets/tasks.py:60 msgid "No assets matched related system user protocol, stop task" msgstr "没有匹配到与系统用户协议相关的资产,结束任务" -#: assets/tasks.py:85 +#: assets/tasks.py:86 msgid "Get asset info failed: {}" msgstr "获取资产信息失败:{}" -#: assets/tasks.py:135 +#: assets/tasks.py:136 msgid "Update some assets hardware info" msgstr "更新资产硬件信息" -#: assets/tasks.py:152 +#: assets/tasks.py:153 msgid "Update asset hardware info: {}" msgstr "更新资产硬件信息: {}" -#: assets/tasks.py:177 +#: assets/tasks.py:178 msgid "Test assets connectivity" msgstr "测试资产可连接性" -#: assets/tasks.py:229 +#: assets/tasks.py:232 msgid "Test assets connectivity: {}" msgstr "测试资产可连接性: {}" -#: assets/tasks.py:271 +#: assets/tasks.py:274 msgid "Test admin user connectivity period: {}" msgstr "定期测试管理账号可连接性: {}" -#: assets/tasks.py:278 +#: assets/tasks.py:281 msgid "Test admin user connectivity: {}" msgstr "测试管理行号可连接性: {}" -#: assets/tasks.py:348 +#: assets/tasks.py:349 msgid "Test system user connectivity: {}" msgstr "测试系统用户可连接性: {}" -#: assets/tasks.py:355 +#: assets/tasks.py:356 msgid "Test system user connectivity: {} => {}" msgstr "测试系统用户可连接性: {} => {}" -#: assets/tasks.py:368 +#: assets/tasks.py:369 msgid "Test system user connectivity period: {}" msgstr "定期测试系统用户可连接性: {}" -#: assets/tasks.py:469 assets/tasks.py:555 +#: assets/tasks.py:470 assets/tasks.py:556 #: xpack/plugins/change_auth_plan/models.py:522 msgid "The asset {} system platform {} does not support run Ansible tasks" msgstr "资产 {} 系统平台 {} 不支持运行 Ansible 任务" -#: assets/tasks.py:481 +#: assets/tasks.py:482 msgid "" "Push system user task skip, auto push not enable or protocol is not ssh or " "rdp: {}" msgstr "推送系统用户任务跳过,自动推送没有打开,或协议不是ssh或rdp: {}" -#: assets/tasks.py:488 +#: assets/tasks.py:489 msgid "For security, do not push user {}" msgstr "为了安全,禁止推送用户 {}" -#: assets/tasks.py:516 assets/tasks.py:530 +#: assets/tasks.py:517 assets/tasks.py:531 msgid "Push system users to assets: {}" msgstr "推送系统用户到入资产: {}" -#: assets/tasks.py:522 +#: assets/tasks.py:523 msgid "Push system users to asset: {} => {}" msgstr "推送系统用户到入资产: {} => {}" -#: assets/tasks.py:612 +#: assets/tasks.py:602 msgid "Test asset user connectivity: {}" msgstr "测试资产用户可连接性: {}" @@ -1440,21 +1430,26 @@ msgstr "关闭" msgid "Datetime" msgstr "日期" -#: assets/templates/assets/_asset_user_list.html:61 +#: assets/templates/assets/_asset_user_list.html:36 +#: assets/templates/assets/asset_list.html:166 +msgid "Test datetime: " +msgstr "测试日期: " + +#: assets/templates/assets/_asset_user_list.html:68 msgid "View" msgstr "查看" -#: assets/templates/assets/_asset_user_list.html:63 +#: assets/templates/assets/_asset_user_list.html:70 #: assets/templates/assets/admin_user_assets.html:61 #: assets/templates/assets/asset_asset_user_list.html:57 #: assets/templates/assets/asset_detail.html:182 -#: assets/templates/assets/system_user_asset.html:63 +#: assets/templates/assets/system_user_assets.html:63 #: assets/templates/assets/system_user_detail.html:151 msgid "Test" msgstr "测试" -#: assets/templates/assets/_asset_user_list.html:64 -#: assets/templates/assets/system_user_asset.html:72 +#: assets/templates/assets/_asset_user_list.html:71 +#: assets/templates/assets/system_user_assets.html:72 #: assets/templates/assets/system_user_detail.html:142 msgid "Push" msgstr "推送" @@ -1528,7 +1523,7 @@ msgid "Asset list of " msgstr "资产列表" #: assets/templates/assets/admin_user_assets.html:52 -#: assets/templates/assets/system_user_asset.html:54 +#: assets/templates/assets/system_user_assets.html:54 #: assets/templates/assets/system_user_detail.html:116 #: perms/templates/perms/asset_permission_detail.html:114 #: perms/templates/perms/remote_app_permission_detail.html:106 @@ -1554,11 +1549,11 @@ msgstr "选择节点" #: assets/templates/assets/admin_user_detail.html:100 #: assets/templates/assets/asset_detail.html:211 -#: assets/templates/assets/asset_list.html:682 +#: assets/templates/assets/asset_list.html:688 #: assets/templates/assets/cmd_filter_detail.html:106 -#: assets/templates/assets/system_user_asset.html:100 +#: assets/templates/assets/system_user_assets.html:100 #: assets/templates/assets/system_user_detail.html:182 -#: assets/templates/assets/system_user_list.html:170 +#: assets/templates/assets/system_user_list.html:171 #: authentication/templates/authentication/_mfa_confirm_modal.html:20 #: settings/templates/settings/terminal_setting.html:168 #: templates/_modal.html:23 terminal/templates/terminal/session_detail.html:108 @@ -1627,12 +1622,12 @@ msgstr "创建管理用户" msgid "Ratio" msgstr "比例" -#: assets/templates/assets/admin_user_list.html:160 -#: assets/templates/assets/admin_user_list.html:191 -#: assets/templates/assets/asset_list.html:492 -#: assets/templates/assets/asset_list.html:529 -#: assets/templates/assets/system_user_list.html:223 -#: assets/templates/assets/system_user_list.html:254 +#: assets/templates/assets/admin_user_list.html:165 +#: assets/templates/assets/admin_user_list.html:196 +#: assets/templates/assets/asset_list.html:498 +#: assets/templates/assets/asset_list.html:535 +#: assets/templates/assets/system_user_list.html:224 +#: assets/templates/assets/system_user_list.html:255 #: users/templates/users/user_group_list.html:163 #: users/templates/users/user_group_list.html:194 #: users/templates/users/user_list.html:158 @@ -1789,28 +1784,28 @@ msgstr "仅显示当前节点资产" msgid "Displays all child node assets" msgstr "显示所有子节点资产" -#: assets/templates/assets/asset_list.html:229 +#: assets/templates/assets/asset_list.html:235 msgid "Create node failed" msgstr "创建节点失败" -#: assets/templates/assets/asset_list.html:241 +#: assets/templates/assets/asset_list.html:247 msgid "Have child node, cancel" msgstr "存在子节点,不能删除" -#: assets/templates/assets/asset_list.html:243 +#: assets/templates/assets/asset_list.html:249 msgid "Have assets, cancel" msgstr "存在资产,不能删除" -#: assets/templates/assets/asset_list.html:314 +#: assets/templates/assets/asset_list.html:320 msgid "Rename success" msgstr "重命名成功" -#: assets/templates/assets/asset_list.html:315 +#: assets/templates/assets/asset_list.html:321 msgid "Rename failed, do not change the root node name" msgstr "重命名失败,不能更改root节点的名称" -#: assets/templates/assets/asset_list.html:676 -#: assets/templates/assets/system_user_list.html:164 +#: assets/templates/assets/asset_list.html:682 +#: assets/templates/assets/system_user_list.html:165 #: users/templates/users/user_detail.html:382 #: users/templates/users/user_detail.html:408 #: users/templates/users/user_detail.html:476 @@ -1820,12 +1815,12 @@ msgstr "重命名失败,不能更改root节点的名称" msgid "Are you sure?" msgstr "你确认吗?" -#: assets/templates/assets/asset_list.html:677 +#: assets/templates/assets/asset_list.html:683 msgid "This will delete the selected assets !!!" msgstr "删除选择资产" -#: assets/templates/assets/asset_list.html:680 -#: assets/templates/assets/system_user_list.html:168 +#: assets/templates/assets/asset_list.html:686 +#: assets/templates/assets/system_user_list.html:169 #: settings/templates/settings/terminal_setting.html:166 #: users/templates/users/user_detail.html:386 #: users/templates/users/user_detail.html:412 @@ -1838,16 +1833,16 @@ msgstr "删除选择资产" msgid "Cancel" msgstr "取消" -#: assets/templates/assets/asset_list.html:693 +#: assets/templates/assets/asset_list.html:699 msgid "Asset Deleted." msgstr "已被删除" -#: assets/templates/assets/asset_list.html:694 -#: assets/templates/assets/asset_list.html:698 +#: assets/templates/assets/asset_list.html:700 +#: assets/templates/assets/asset_list.html:704 msgid "Asset Delete" msgstr "删除" -#: assets/templates/assets/asset_list.html:697 +#: assets/templates/assets/asset_list.html:703 msgid "Asset Deleting failed." msgstr "删除失败" @@ -1964,21 +1959,21 @@ msgstr "创建网域" msgid "Create label" msgstr "创建标签" -#: assets/templates/assets/system_user_asset.html:31 +#: assets/templates/assets/system_user_assets.html:31 msgid "Assets of " msgstr "资产" -#: assets/templates/assets/system_user_asset.html:60 +#: assets/templates/assets/system_user_assets.html:60 #: assets/templates/assets/system_user_detail.html:148 msgid "Test assets connective" msgstr "测试资产可连接性" -#: assets/templates/assets/system_user_asset.html:69 +#: assets/templates/assets/system_user_assets.html:69 #: assets/templates/assets/system_user_detail.html:139 msgid "Push system user now" msgstr "立刻推送系统" -#: assets/templates/assets/system_user_asset.html:91 +#: assets/templates/assets/system_user_assets.html:91 msgid "Add to node" msgstr "添加到节点" @@ -2027,20 +2022,20 @@ msgstr "" msgid "Create system user" msgstr "创建系统用户" -#: assets/templates/assets/system_user_list.html:165 +#: assets/templates/assets/system_user_list.html:166 msgid "This will delete the selected System Users !!!" msgstr "删除选择系统用户" -#: assets/templates/assets/system_user_list.html:174 +#: assets/templates/assets/system_user_list.html:175 msgid "System Users Deleted." msgstr "已被删除" -#: assets/templates/assets/system_user_list.html:175 -#: assets/templates/assets/system_user_list.html:180 +#: assets/templates/assets/system_user_list.html:176 +#: assets/templates/assets/system_user_list.html:181 msgid "System Users Delete" msgstr "删除系统用户" -#: assets/templates/assets/system_user_list.html:179 +#: assets/templates/assets/system_user_list.html:180 msgid "System Users Deleting failed." msgstr "系统用户删除失败" @@ -2321,8 +2316,8 @@ msgid "Date" msgstr "日期" #: audits/views.py:85 audits/views.py:129 audits/views.py:166 -#: audits/views.py:211 audits/views.py:243 ops/views/command.py:47 -#: templates/_nav.html:87 templates/_nav_audits.html:22 +#: audits/views.py:211 audits/views.py:243 templates/_nav.html:87 +#: templates/_nav_audits.html:22 msgid "Audits" msgstr "日志审计" @@ -2988,7 +2983,7 @@ msgstr "更新任务内容: {}" #: ops/views/adhoc.py:45 ops/views/adhoc.py:71 ops/views/adhoc.py:85 #: ops/views/adhoc.py:99 ops/views/adhoc.py:113 ops/views/adhoc.py:127 -#: ops/views/adhoc.py:141 ops/views/command.py:72 +#: ops/views/adhoc.py:141 ops/views/command.py:47 ops/views/command.py:72 msgid "Ops" msgstr "作业中心" @@ -3008,7 +3003,7 @@ msgstr "命令执行列表" msgid "Command execution" msgstr "命令执行" -#: orgs/mixins.py:85 orgs/mixins.py:222 orgs/models.py:24 +#: orgs/mixins.py:82 orgs/mixins.py:219 orgs/models.py:24 msgid "Organization" msgstr "组织" @@ -5768,7 +5763,7 @@ msgid "Interface settings" msgstr "界面设置" #: xpack/plugins/interface/templates/interface/interface.html:15 -#: xpack/plugins/interface/views.py:24 xpack/plugins/interface/views.py:25 +#: xpack/plugins/interface/views.py:25 msgid "Interface setting" msgstr "界面设置" @@ -5791,6 +5786,12 @@ msgstr "恢复默认成功!" msgid "Restore default failed." msgstr "恢复默认失败!" +#: xpack/plugins/interface/views.py:24 +#, fuzzy +#| msgid "Interval" +msgid "Interface" +msgstr "间隔" + #: xpack/plugins/interface/views.py:51 msgid "It is already in the default setting state!" msgstr "当前已经是初始化状态!" @@ -5894,9 +5895,7 @@ msgstr "无效的许可证" msgid "Admin" msgstr "管理员" -#: xpack/plugins/orgs/meta.py:8 xpack/plugins/orgs/views.py:26 -#: xpack/plugins/orgs/views.py:43 xpack/plugins/orgs/views.py:60 -#: xpack/plugins/orgs/views.py:77 +#: xpack/plugins/orgs/meta.py:8 msgid "Organizations" msgstr "组织管理" @@ -5913,10 +5912,19 @@ msgstr "添加管理员" msgid "Create organization " msgstr "创建组织" +#: xpack/plugins/orgs/views.py:26 +msgid "Org" +msgstr "" + #: xpack/plugins/orgs/views.py:27 msgid "Org list" msgstr "组织列表" +#: xpack/plugins/orgs/views.py:43 xpack/plugins/orgs/views.py:60 +#: xpack/plugins/orgs/views.py:77 +msgid "Orgs" +msgstr "" + #: xpack/plugins/orgs/views.py:44 msgid "Create org" msgstr "创建组织" @@ -5925,8 +5933,8 @@ msgstr "创建组织" msgid "Update org" msgstr "更新组织" -#: xpack/plugins/vault/meta.py:11 xpack/plugins/vault/views.py:22 -#: xpack/plugins/vault/views.py:37 +#: xpack/plugins/vault/meta.py:11 xpack/plugins/vault/views.py:23 +#: xpack/plugins/vault/views.py:38 msgid "Vault" msgstr "密码匣子" @@ -5934,14 +5942,20 @@ msgstr "密码匣子" msgid "Import vault" msgstr "导入密码" -#: xpack/plugins/vault/views.py:23 +#: xpack/plugins/vault/views.py:24 msgid "vault list" msgstr "密码匣子" -#: xpack/plugins/vault/views.py:38 +#: xpack/plugins/vault/views.py:39 msgid "vault create" msgstr "创建" +#~ msgid "Unreachable assets" +#~ msgstr "不可达资产" + +#~ msgid "Reachable assets" +#~ msgstr "可连接资产" + #~ msgid "User does not exist" #~ msgstr "用户不存在"