From d9552c00382f79a0b18f6ff08af7884e797695d7 Mon Sep 17 00:00:00 2001 From: ibuler Date: Sun, 25 Apr 2021 18:13:41 +0800 Subject: [PATCH 1/2] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=85=AC?= =?UTF-8?q?=E9=92=A5=E8=AE=BE=E7=BD=AE=EF=BC=8C=E8=AE=A9=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E9=80=89=E6=8B=A9=E6=98=AF=E5=90=A6=E5=BC=80?= =?UTF-8?q?=E5=90=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/jumpserver/conf.py | 1 + apps/jumpserver/settings/custom.py | 1 + apps/users/models/user.py | 11 ++++++++++- apps/users/serializers/profile.py | 4 +++- apps/users/serializers/user.py | 3 ++- 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/apps/jumpserver/conf.py b/apps/jumpserver/conf.py index 179376828..91f3da1cb 100644 --- a/apps/jumpserver/conf.py +++ b/apps/jumpserver/conf.py @@ -222,6 +222,7 @@ class Config(dict): 'TERMINAL_PASSWORD_AUTH': True, 'TERMINAL_PUBLIC_KEY_AUTH': True, + 'TERMINAL_ONLY_SOURCE_LOCAL_CAN_PUBLIC_KEY_AUTH': True, 'TERMINAL_HEARTBEAT_INTERVAL': 20, 'TERMINAL_ASSET_LIST_SORT_BY': 'hostname', 'TERMINAL_ASSET_LIST_PAGE_SIZE': 'auto', diff --git a/apps/jumpserver/settings/custom.py b/apps/jumpserver/settings/custom.py index 936b27582..31b5d52ac 100644 --- a/apps/jumpserver/settings/custom.py +++ b/apps/jumpserver/settings/custom.py @@ -124,3 +124,4 @@ FORGOT_PASSWORD_URL = CONFIG.FORGOT_PASSWORD_URL # 自定义默认组织名 GLOBAL_ORG_DISPLAY_NAME = CONFIG.GLOBAL_ORG_DISPLAY_NAME HEALTH_CHECK_TOKEN = CONFIG.HEALTH_CHECK_TOKEN +TERMINAL_ONLY_SOURCE_LOCAL_CAN_PUBLIC_KEY_AUTH = CONFIG.TERMINAL_ONLY_SOURCE_LOCAL_CAN_PUBLIC_KEY_AUTH diff --git a/apps/users/models/user.py b/apps/users/models/user.py index fab14e252..b10c07223 100644 --- a/apps/users/models/user.py +++ b/apps/users/models/user.py @@ -5,6 +5,7 @@ import uuid import base64 import string import random +import datetime from django.conf import settings from django.contrib.auth.models import AbstractUser @@ -32,6 +33,9 @@ logger = get_logger(__file__) class AuthMixin: + date_password_last_updated: datetime.datetime + is_local: bool + @property def password_raw(self): raise AttributeError('Password raw is not a readable attribute') @@ -63,7 +67,12 @@ class AuthMixin: return self.can_use_ssh_key_login() def can_use_ssh_key_login(self): - return self.is_local and settings.TERMINAL_PUBLIC_KEY_AUTH + if not settings.TERMINAL_PUBLIC_KEY_AUTH: + return False + if self.is_local or settings.TERMINAL_ONLY_SOURCE_LOCAL_CAN_PUBLIC_KEY_AUTH: + return True + else: + return False def is_public_key_valid(self): """ diff --git a/apps/users/serializers/profile.py b/apps/users/serializers/profile.py index 1c5e99873..68e387245 100644 --- a/apps/users/serializers/profile.py +++ b/apps/users/serializers/profile.py @@ -101,7 +101,8 @@ class UserProfileSerializer(UserSerializer): class Meta(UserSerializer.Meta): fields = UserSerializer.Meta.fields + [ - 'public_key_comment', 'public_key_hash_md5', 'admin_or_audit_orgs', 'current_org_roles', + 'public_key_comment', 'public_key_hash_md5', + 'admin_or_audit_orgs', 'current_org_roles', 'guide_url', 'user_all_orgs' ] read_only_fields = [ @@ -164,6 +165,7 @@ class ChangeUserPasswordSerializer(serializers.ModelSerializer): model = User fields = ['password'] + class ResetOTPSerializer(serializers.Serializer): msg = serializers.CharField(read_only=True) diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py index 0d8e784ed..c63c6264d 100644 --- a/apps/users/serializers/user.py +++ b/apps/users/serializers/user.py @@ -34,6 +34,7 @@ class UserSerializer(CommonBulkSerializerMixin, serializers.ModelSerializer): is_expired = serializers.BooleanField(read_only=True, label=_('Is expired')) can_update = serializers.SerializerMethodField(label=_('Can update')) can_delete = serializers.SerializerMethodField(label=_('Can delete')) + can_public_key_auth = serializers.ReadOnlyField(source='can_use_ssh_key_login') org_roles = serializers.ListField( label=_('Organization role name'), allow_null=True, required=False, child=serializers.ChoiceField(choices=ORG_ROLE.choices), default=["User"] @@ -48,7 +49,7 @@ class UserSerializer(CommonBulkSerializerMixin, serializers.ModelSerializer): 'password', 'email', 'public_key', 'wechat', 'phone', 'mfa_level', 'mfa_enabled', 'mfa_level_display', 'mfa_force_enabled', 'role_display', 'org_role_display', 'total_role_display', 'comment', 'source', 'is_valid', 'is_expired', - 'is_active', 'created_by', 'is_first_login', + 'is_active', 'created_by', 'is_first_login', 'can_public_key_auth', 'password_strategy', 'date_password_last_updated', 'date_expired', 'avatar_url', 'source_display', 'date_joined', 'last_login' ] From ab0fda93f61abce65d4ccf351f0d219d08fa4731 Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 26 Apr 2021 10:21:22 +0800 Subject: [PATCH 2/2] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=85=AC?= =?UTF-8?q?=E9=92=A5=E8=AE=BE=E7=BD=AE=EF=BC=8C=E5=B9=B6=E5=88=A0=E6=8E=89?= =?UTF-8?q?=E4=B8=80=E9=83=A8=E5=88=86=E4=B8=8D=E7=94=A8=E7=9A=84=20html?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/jumpserver/conf.py | 1 - apps/jumpserver/settings/custom.py | 1 - apps/locale/zh/LC_MESSAGES/django.mo | Bin 74719 -> 70857 bytes apps/locale/zh/LC_MESSAGES/django.po | 797 +++++++----------- apps/settings/serializers/settings.py | 6 +- apps/users/models/user.py | 10 +- apps/users/templates/users/_user.html | 88 -- .../templates/users/user_bulk_update.html | 70 -- apps/users/templates/users/user_create.html | 100 --- apps/users/templates/users/user_detail.html | 550 ------------ .../templates/users/user_granted_asset.html | 26 - .../users/user_granted_database_app.html | 100 --- .../users/user_granted_remote_app.html | 93 -- .../users/user_group_create_update.html | 69 -- .../templates/users/user_group_detail.html | 168 ---- .../users/user_group_granted_asset.html | 47 -- .../templates/users/user_group_list.html | 112 --- apps/users/templates/users/user_list.html | 280 ------ apps/users/templates/users/user_profile.html | 233 ----- .../templates/users/user_profile_update.html | 84 -- .../templates/users/user_pubkey_update.html | 102 --- .../users/user_remote_app_permission.html | 168 ---- apps/users/templates/users/user_update.html | 117 --- 23 files changed, 308 insertions(+), 2914 deletions(-) delete mode 100644 apps/users/templates/users/_user.html delete mode 100644 apps/users/templates/users/user_bulk_update.html delete mode 100644 apps/users/templates/users/user_create.html delete mode 100644 apps/users/templates/users/user_detail.html delete mode 100644 apps/users/templates/users/user_granted_asset.html delete mode 100644 apps/users/templates/users/user_granted_database_app.html delete mode 100644 apps/users/templates/users/user_granted_remote_app.html delete mode 100644 apps/users/templates/users/user_group_create_update.html delete mode 100644 apps/users/templates/users/user_group_detail.html delete mode 100644 apps/users/templates/users/user_group_granted_asset.html delete mode 100644 apps/users/templates/users/user_group_list.html delete mode 100644 apps/users/templates/users/user_list.html delete mode 100644 apps/users/templates/users/user_profile.html delete mode 100644 apps/users/templates/users/user_profile_update.html delete mode 100644 apps/users/templates/users/user_pubkey_update.html delete mode 100644 apps/users/templates/users/user_remote_app_permission.html delete mode 100644 apps/users/templates/users/user_update.html diff --git a/apps/jumpserver/conf.py b/apps/jumpserver/conf.py index 91f3da1cb..179376828 100644 --- a/apps/jumpserver/conf.py +++ b/apps/jumpserver/conf.py @@ -222,7 +222,6 @@ class Config(dict): 'TERMINAL_PASSWORD_AUTH': True, 'TERMINAL_PUBLIC_KEY_AUTH': True, - 'TERMINAL_ONLY_SOURCE_LOCAL_CAN_PUBLIC_KEY_AUTH': True, 'TERMINAL_HEARTBEAT_INTERVAL': 20, 'TERMINAL_ASSET_LIST_SORT_BY': 'hostname', 'TERMINAL_ASSET_LIST_PAGE_SIZE': 'auto', diff --git a/apps/jumpserver/settings/custom.py b/apps/jumpserver/settings/custom.py index 31b5d52ac..936b27582 100644 --- a/apps/jumpserver/settings/custom.py +++ b/apps/jumpserver/settings/custom.py @@ -124,4 +124,3 @@ FORGOT_PASSWORD_URL = CONFIG.FORGOT_PASSWORD_URL # 自定义默认组织名 GLOBAL_ORG_DISPLAY_NAME = CONFIG.GLOBAL_ORG_DISPLAY_NAME HEALTH_CHECK_TOKEN = CONFIG.HEALTH_CHECK_TOKEN -TERMINAL_ONLY_SOURCE_LOCAL_CAN_PUBLIC_KEY_AUTH = CONFIG.TERMINAL_ONLY_SOURCE_LOCAL_CAN_PUBLIC_KEY_AUTH diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 4e146d83b81d1f910f5ed64ed4565a09bf68c181..78b235d0e6cc1d514a632be08d795827d4c719e6 100644 GIT binary patch delta 21245 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 delta 24831 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 diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 49694c4a0..e24c71c54 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/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: 2021-04-14 17:52+0800\n" +"POT-Creation-Date: 2021-04-26 10:14+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -25,20 +25,11 @@ msgstr "" #: orgs/models.py:23 perms/models/base.py:49 settings/models.py:29 #: terminal/models/storage.py:23 terminal/models/storage.py:90 #: terminal/models/task.py:16 terminal/models/terminal.py:100 -#: users/forms/profile.py:32 users/models/group.py:15 users/models/user.py:530 +#: users/forms/profile.py:32 users/models/group.py:15 users/models/user.py:535 #: users/templates/users/_select_user_modal.html:13 #: users/templates/users/user_asset_permission.html:37 #: users/templates/users/user_asset_permission.html:154 #: users/templates/users/user_database_app_permission.html:36 -#: users/templates/users/user_detail.html:49 -#: users/templates/users/user_granted_database_app.html:34 -#: users/templates/users/user_granted_remote_app.html:34 -#: users/templates/users/user_group_detail.html:50 -#: users/templates/users/user_group_list.html:14 -#: users/templates/users/user_list.html:14 -#: users/templates/users/user_profile.html:51 -#: users/templates/users/user_pubkey_update.html:57 -#: users/templates/users/user_remote_app_permission.html:36 #: xpack/plugins/cloud/models.py:28 msgid "Name" msgstr "名称" @@ -56,8 +47,6 @@ msgstr "优先级可选范围为 1-100 (数值越小越优先)" #: acls/models/base.py:31 authentication/models.py:20 #: authentication/templates/authentication/_access_key_modal.html:32 #: perms/models/base.py:52 users/templates/users/_select_user_modal.html:18 -#: users/templates/users/user_detail.html:132 -#: users/templates/users/user_profile.html:63 msgid "Active" msgstr "激活中" @@ -72,13 +61,7 @@ msgstr "激活中" #: orgs/models.py:26 perms/models/base.py:57 settings/models.py:34 #: terminal/models/storage.py:29 terminal/models/storage.py:96 #: terminal/models/terminal.py:114 tickets/models/ticket.py:73 -#: users/models/group.py:16 users/models/user.py:563 -#: users/templates/users/user_detail.html:115 -#: users/templates/users/user_granted_database_app.html:38 -#: users/templates/users/user_granted_remote_app.html:37 -#: users/templates/users/user_group_detail.html:62 -#: users/templates/users/user_group_list.html:16 -#: users/templates/users/user_profile.html:138 +#: users/models/group.py:16 users/models/user.py:568 #: xpack/plugins/change_auth_plan/models.py:77 xpack/plugins/cloud/models.py:35 #: xpack/plugins/cloud/models.py:98 xpack/plugins/gathered_user/models.py:26 msgid "Comment" @@ -104,9 +87,6 @@ msgstr "登录IP" #: users/templates/users/user_asset_permission.html:44 #: users/templates/users/user_asset_permission.html:79 #: users/templates/users/user_database_app_permission.html:42 -#: users/templates/users/user_group_list.html:17 -#: users/templates/users/user_list.html:20 -#: users/templates/users/user_remote_app_permission.html:42 msgid "Action" msgstr "动作" @@ -118,22 +98,17 @@ msgstr "动作" #: perms/models/base.py:50 templates/index.html:78 #: terminal/backends/command/models.py:18 #: terminal/backends/command/serializers.py:12 terminal/models/session.py:37 -#: tickets/models/comment.py:17 users/models/user.py:159 -#: users/models/user.py:707 users/serializers/group.py:20 +#: tickets/models/comment.py:17 users/models/user.py:164 +#: users/models/user.py:712 users/serializers/group.py:20 #: users/templates/users/user_asset_permission.html:38 #: users/templates/users/user_asset_permission.html:64 #: users/templates/users/user_database_app_permission.html:37 #: users/templates/users/user_database_app_permission.html:58 -#: users/templates/users/user_group_detail.html:73 -#: users/templates/users/user_group_list.html:15 -#: users/templates/users/user_list.html:135 -#: users/templates/users/user_remote_app_permission.html:37 -#: users/templates/users/user_remote_app_permission.html:58 msgid "User" msgstr "用户" #: acls/models/login_asset_acl.py:17 authentication/models.py:72 -#: tickets/const.py:9 users/templates/users/user_detail.html:250 +#: tickets/const.py:9 msgid "Login confirm" msgstr "登录复核" @@ -152,18 +127,16 @@ msgstr "系统用户" #: terminal/backends/command/serializers.py:13 terminal/models/session.py:39 #: users/templates/users/user_asset_permission.html:40 #: users/templates/users/user_asset_permission.html:70 -#: users/templates/users/user_granted_remote_app.html:36 #: xpack/plugins/change_auth_plan/models.py:282 #: xpack/plugins/cloud/models.py:202 msgid "Asset" msgstr "资产" #: acls/models/login_asset_acl.py:32 authentication/models.py:45 -#: users/templates/users/user_detail.html:258 msgid "Reviewers" msgstr "审批人" -#: acls/models/login_asset_acl.py:86 tickets/const.py:12 +#: acls/models/login_asset_acl.py:89 tickets/const.py:12 msgid "Login asset confirm" msgstr "登录资产复核" @@ -205,11 +178,8 @@ msgstr "格式为逗号分隔的字符串, * 表示匹配所有. " #: applications/serializers/attrs/application_type/vmware_client.py:26 #: assets/models/base.py:251 assets/models/gathered_user.py:15 #: audits/models.py:100 authentication/forms.py:15 authentication/forms.py:17 -#: ops/models/adhoc.py:148 users/forms/profile.py:31 users/models/user.py:528 +#: ops/models/adhoc.py:148 users/forms/profile.py:31 users/models/user.py:533 #: users/templates/users/_select_user_modal.html:14 -#: users/templates/users/user_detail.html:53 -#: users/templates/users/user_list.html:15 -#: users/templates/users/user_profile.html:47 #: xpack/plugins/change_auth_plan/models.py:47 #: xpack/plugins/change_auth_plan/models.py:278 #: xpack/plugins/cloud/serializers.py:51 @@ -261,7 +231,6 @@ msgstr "所有复核人都不属于组织 `{}`" #: applications/const.py:9 #: applications/serializers/attrs/application_category/db.py:14 #: applications/serializers/attrs/application_type/mysql_workbench.py:26 -#: users/templates/users/user_granted_database_app.html:37 msgid "Database" msgstr "数据库" @@ -288,7 +257,6 @@ msgstr "类别" #: terminal/models/storage.py:26 terminal/models/storage.py:93 #: tickets/models/ticket.py:38 #: tickets/serializers/ticket/meta/ticket_type/apply_application.py:27 -#: users/templates/users/user_granted_database_app.html:35 msgid "Type" msgstr "类型" @@ -315,9 +283,7 @@ msgid "Cluster" msgstr "集群" #: applications/serializers/attrs/application_category/db.py:11 -#: ops/models/adhoc.py:146 -#: users/templates/users/user_granted_database_app.html:36 -#: xpack/plugins/cloud/serializers.py:49 +#: ops/models/adhoc.py:146 xpack/plugins/cloud/serializers.py:49 msgid "Host" msgstr "主机" @@ -348,14 +314,12 @@ msgstr "目标URL" #: applications/serializers/attrs/application_type/mysql_workbench.py:34 #: applications/serializers/attrs/application_type/vmware_client.py:30 #: assets/models/base.py:252 assets/serializers/asset_user.py:71 -#: audits/signals_handler.py:46 authentication/forms.py:22 +#: audits/signals_handler.py:58 authentication/forms.py:22 #: authentication/templates/authentication/login.html:155 #: settings/serializers/settings.py:93 users/forms/profile.py:21 #: users/templates/users/user_otp_check_password.html:13 #: users/templates/users/user_password_update.html:43 #: users/templates/users/user_password_verify.html:18 -#: users/templates/users/user_profile_update.html:41 -#: users/templates/users/user_pubkey_update.html:41 #: users/templates/users/user_update.html:20 #: xpack/plugins/change_auth_plan/models.py:68 #: xpack/plugins/change_auth_plan/models.py:190 @@ -518,9 +482,8 @@ msgstr "标签管理" #: assets/models/cluster.py:28 assets/models/cmd_filter.py:26 #: assets/models/cmd_filter.py:60 assets/models/group.py:21 #: common/db/models.py:70 common/mixins/models.py:49 orgs/models.py:24 -#: orgs/models.py:422 perms/models/base.py:55 users/models/user.py:571 -#: users/serializers/group.py:35 users/templates/users/user_detail.html:97 -#: xpack/plugins/change_auth_plan/models.py:81 +#: orgs/models.py:422 perms/models/base.py:55 users/models/user.py:576 +#: users/serializers/group.py:35 xpack/plugins/change_auth_plan/models.py:81 #: xpack/plugins/cloud/models.py:104 xpack/plugins/gathered_user/models.py:30 msgid "Created by" msgstr "创建者" @@ -533,7 +496,6 @@ msgstr "创建者" #: assets/models/label.py:25 common/db/models.py:72 common/mixins/models.py:50 #: ops/models/adhoc.py:38 ops/models/command.py:29 orgs/models.py:25 #: orgs/models.py:420 perms/models/base.py:56 users/models/group.py:18 -#: users/templates/users/user_group_detail.html:58 #: xpack/plugins/cloud/models.py:107 msgid "Date created" msgstr "创建日期" @@ -580,8 +542,7 @@ msgstr "带宽" msgid "Contact" msgstr "联系人" -#: assets/models/cluster.py:22 users/models/user.py:549 -#: users/templates/users/user_detail.html:62 +#: assets/models/cluster.py:22 users/models/user.py:554 msgid "Phone" msgstr "手机" @@ -607,7 +568,7 @@ msgid "Default" msgstr "默认" #: assets/models/cluster.py:36 assets/models/label.py:14 -#: users/models/user.py:719 +#: users/models/user.py:724 msgid "System" msgstr "系统" @@ -734,8 +695,7 @@ msgstr "资产" msgid "Users" msgstr "用户管理" -#: assets/models/user.py:121 users/templates/users/user_group_list.html:90 -#: users/templates/users/user_profile.html:124 +#: assets/models/user.py:121 msgid "User groups" msgstr "用户组" @@ -782,8 +742,6 @@ msgstr "用户组" #: users/templates/users/user_asset_permission.html:159 #: users/templates/users/user_database_app_permission.html:40 #: users/templates/users/user_database_app_permission.html:67 -#: users/templates/users/user_remote_app_permission.html:40 -#: users/templates/users/user_remote_app_permission.html:67 msgid "System user" msgstr "系统用户" @@ -847,14 +805,11 @@ msgid "Backend" msgstr "后端" #: assets/serializers/asset_user.py:75 users/forms/profile.py:160 -#: users/models/user.py:560 users/templates/users/user_password_update.html:48 -#: users/templates/users/user_profile.html:69 -#: users/templates/users/user_profile_update.html:46 -#: users/templates/users/user_pubkey_update.html:46 +#: users/models/user.py:565 users/templates/users/user_password_update.html:48 msgid "Public key" msgstr "SSH公钥" -#: assets/serializers/asset_user.py:79 users/models/user.py:557 +#: assets/serializers/asset_user.py:79 users/models/user.py:562 msgid "Private key" msgstr "ssh私钥" @@ -984,25 +939,25 @@ msgid "" "The task of self-checking is already running and cannot be started repeatedly" msgstr "自检程序已经在运行,不能重复启动" -#: assets/tasks/push_system_user.py:192 +#: assets/tasks/push_system_user.py:193 #: assets/tasks/system_user_connectivity.py:89 msgid "System user is dynamic: {}" msgstr "系统用户是动态的: {}" -#: assets/tasks/push_system_user.py:232 +#: assets/tasks/push_system_user.py:233 msgid "Start push system user for platform: [{}]" msgstr "推送系统用户到平台: [{}]" -#: assets/tasks/push_system_user.py:233 +#: assets/tasks/push_system_user.py:234 #: assets/tasks/system_user_connectivity.py:81 msgid "Hosts count: {}" msgstr "主机数量: {}" -#: assets/tasks/push_system_user.py:272 assets/tasks/push_system_user.py:298 +#: assets/tasks/push_system_user.py:273 assets/tasks/push_system_user.py:299 msgid "Push system users to assets: {}" msgstr "推送系统用户到入资产: {}" -#: assets/tasks/push_system_user.py:284 +#: assets/tasks/push_system_user.py:285 msgid "Push system users to asset: {}({}) => {}" msgstr "推送系统用户到入资产: {}({}) => {}" @@ -1042,12 +997,6 @@ msgstr "没有匹配到资产,结束任务" #: authentication/templates/authentication/_access_key_modal.html:65 #: users/templates/users/user_asset_permission.html:128 #: users/templates/users/user_database_app_permission.html:111 -#: users/templates/users/user_detail.html:16 -#: users/templates/users/user_group_detail.html:27 -#: users/templates/users/user_group_list.html:53 -#: users/templates/users/user_list.html:94 -#: users/templates/users/user_list.html:98 -#: users/templates/users/user_remote_app_permission.html:111 msgid "Delete" msgstr "删除" @@ -1089,7 +1038,6 @@ msgid "Filename" msgstr "文件名" #: audits/models.py:42 audits/models.py:96 -#: users/templates/users/user_detail.html:487 msgid "Success" msgstr "成功" @@ -1114,15 +1062,6 @@ msgstr "创建" #: templates/_csv_update_modal.html:6 #: users/templates/users/user_asset_permission.html:127 #: users/templates/users/user_database_app_permission.html:110 -#: users/templates/users/user_detail.html:12 -#: users/templates/users/user_group_detail.html:23 -#: users/templates/users/user_group_list.html:51 -#: users/templates/users/user_list.html:84 -#: users/templates/users/user_list.html:87 -#: users/templates/users/user_profile.html:181 -#: users/templates/users/user_profile.html:191 -#: users/templates/users/user_profile.html:201 -#: users/templates/users/user_remote_app_permission.html:110 msgid "Update" msgstr "更新" @@ -1142,12 +1081,11 @@ msgstr "日期" msgid "Change by" msgstr "修改者" -#: audits/models.py:90 users/templates/users/user_detail.html:84 +#: audits/models.py:90 msgid "Disabled" msgstr "禁用" #: audits/models.py:91 settings/models.py:33 -#: users/templates/users/user_detail.html:82 msgid "Enabled" msgstr "启用" @@ -1180,9 +1118,8 @@ msgstr "用户代理" #: audits/models.py:105 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 #: authentication/templates/authentication/login_otp.html:6 -#: users/forms/profile.py:64 users/models/user.py:552 -#: users/serializers/profile.py:99 users/templates/users/user_detail.html:77 -#: users/templates/users/user_profile.html:87 +#: users/forms/profile.py:64 users/models/user.py:557 +#: users/serializers/profile.py:99 msgid "MFA" msgstr "多因子认证" @@ -1250,11 +1187,11 @@ msgstr "运行用户(显示名称)" msgid "User for display" msgstr "用户(显示名称)" -#: audits/signals_handler.py:45 +#: audits/signals_handler.py:57 msgid "SSH Key" msgstr "SSH 密钥" -#: audits/signals_handler.py:47 +#: audits/signals_handler.py:59 msgid "SSO" msgstr "" @@ -1465,18 +1402,13 @@ msgid "Show" msgstr "显示" #: authentication/templates/authentication/_access_key_modal.html:66 -#: users/models/user.py:445 users/serializers/profile.py:96 -#: users/templates/users/user_profile.html:94 -#: users/templates/users/user_profile.html:163 -#: users/templates/users/user_profile.html:166 +#: users/models/user.py:450 users/serializers/profile.py:96 #: users/templates/users/user_verify_mfa.html:32 msgid "Disable" msgstr "禁用" #: authentication/templates/authentication/_access_key_modal.html:67 -#: users/models/user.py:446 users/serializers/profile.py:97 -#: users/templates/users/user_profile.html:92 -#: users/templates/users/user_profile.html:170 +#: users/models/user.py:451 users/serializers/profile.py:97 msgid "Enable" msgstr "启用" @@ -1508,14 +1440,7 @@ msgid "Need MFA for view auth" msgstr "需要多因子认证来查看账号信息" #: authentication/templates/authentication/_mfa_confirm_modal.html:20 -#: templates/_modal.html:23 users/templates/users/user_detail.html:264 -#: users/templates/users/user_detail.html:417 -#: users/templates/users/user_detail.html:443 -#: users/templates/users/user_detail.html:466 -#: users/templates/users/user_detail.html:511 -#: users/templates/users/user_group_create_update.html:28 -#: users/templates/users/user_list.html:184 -#: users/templates/users/user_password_verify.html:20 +#: templates/_modal.html:23 users/templates/users/user_password_verify.html:20 msgid "Confirm" msgstr "确认" @@ -1826,7 +1751,7 @@ msgstr "再次执行" msgid "Become" msgstr "Become" -#: ops/models/adhoc.py:150 users/templates/users/user_group_detail.html:54 +#: ops/models/adhoc.py:150 msgid "Create by" msgstr "创建者" @@ -1936,11 +1861,8 @@ msgstr "组织审计员" msgid "GLOBAL" msgstr "全局组织" -#: orgs/models.py:419 users/models/user.py:540 +#: orgs/models.py:419 users/models/user.py:545 #: users/templates/users/_select_user_modal.html:15 -#: users/templates/users/user_detail.html:73 -#: users/templates/users/user_list.html:16 -#: users/templates/users/user_profile.html:55 msgid "Role" msgstr "角色" @@ -1952,7 +1874,7 @@ msgstr "管理员正在修改授权,请稍等" msgid "The authorization cannot be revoked for the time being" msgstr "该授权暂时不能撤销" -#: perms/models/application_permission.py:27 users/models/user.py:160 +#: perms/models/application_permission.py:27 users/models/user.py:165 msgid "Application" msgstr "应用程序" @@ -2011,15 +1933,11 @@ msgid "Favorite" msgstr "收藏夹" #: perms/models/base.py:51 templates/_nav.html:21 users/models/group.py:31 -#: users/models/user.py:536 users/templates/users/_select_user_modal.html:16 +#: users/models/user.py:541 users/templates/users/_select_user_modal.html:16 #: users/templates/users/user_asset_permission.html:39 #: users/templates/users/user_asset_permission.html:67 #: users/templates/users/user_database_app_permission.html:38 #: users/templates/users/user_database_app_permission.html:61 -#: users/templates/users/user_detail.html:209 -#: users/templates/users/user_list.html:17 -#: users/templates/users/user_remote_app_permission.html:38 -#: users/templates/users/user_remote_app_permission.html:61 msgid "User group" msgstr "用户组" @@ -2028,8 +1946,7 @@ msgstr "用户组" #: tickets/serializers/ticket/meta/ticket_type/apply_application.py:77 #: tickets/serializers/ticket/meta/ticket_type/apply_asset.py:43 #: tickets/serializers/ticket/meta/ticket_type/apply_asset.py:81 -#: users/models/user.py:568 users/templates/users/user_detail.html:93 -#: users/templates/users/user_profile.html:120 +#: users/models/user.py:573 msgid "Date expired" msgstr "失效日期" @@ -2041,11 +1958,11 @@ msgstr "应用列表中包含与授权类型不同的应用。({})" #: perms/serializers/asset/permission.py:43 #: perms/serializers/asset/permission.py:61 users/serializers/user.py:34 -#: users/serializers/user.py:69 +#: users/serializers/user.py:70 msgid "Is expired" msgstr "是否过期" -#: perms/serializers/asset/permission.py:62 users/serializers/user.py:68 +#: perms/serializers/asset/permission.py:62 users/serializers/user.py:69 msgid "Is valid" msgstr "账户是否有效" @@ -2079,7 +1996,6 @@ msgid "Imported {} users successfully" msgstr "导入 {} 个用户成功" #: settings/models.py:123 users/templates/users/reset_password.html:29 -#: users/templates/users/user_profile.html:20 msgid "Setting" msgstr "设置" @@ -2262,23 +2178,29 @@ msgstr "自动" msgid "Password auth" msgstr "密码认证" -#: settings/serializers/settings.py:124 +#: settings/serializers/settings.py:125 msgid "Public key auth" msgstr "密钥认证" -#: settings/serializers/settings.py:125 +#: settings/serializers/settings.py:126 +msgid "" +"Tips: If use other auth method, like AD/LDAP, you should disable this to " +"avoid being able to log in after deleting" +msgstr "提示:如果你使用其它认证方式,如 AD/LDAP,你应该禁用此项,以避免第三方系统删除后,还可以登录" + +#: settings/serializers/settings.py:129 msgid "List sort by" msgstr "资产列表排序" -#: settings/serializers/settings.py:126 +#: settings/serializers/settings.py:130 msgid "List page size" msgstr "资产列表每页数量" -#: settings/serializers/settings.py:128 +#: settings/serializers/settings.py:132 msgid "Session keep duration" msgstr "会话日志保存时间" -#: settings/serializers/settings.py:129 +#: settings/serializers/settings.py:133 msgid "" "Units: days, Session, record, command will be delete if more than duration, " "only in database" @@ -2286,64 +2208,64 @@ msgstr "" "单位:天。 会话、录像、命令记录超过该时长将会被删除(仅影响数据库存储, oss等不" "受影响)" -#: settings/serializers/settings.py:131 +#: settings/serializers/settings.py:135 msgid "Telnet login regex" msgstr "Telnet 成功正则表达式" -#: settings/serializers/settings.py:136 +#: settings/serializers/settings.py:140 msgid "Global MFA auth" msgstr "全局启用 MFA 认证" -#: settings/serializers/settings.py:137 +#: settings/serializers/settings.py:141 msgid "All user enable MFA" msgstr "强制所有用户启用多因子认证" -#: settings/serializers/settings.py:140 +#: settings/serializers/settings.py:144 msgid "Batch command execution" msgstr "批量命令执行" -#: settings/serializers/settings.py:141 +#: settings/serializers/settings.py:145 msgid "Allow user run batch command or not using ansible" msgstr "是否允许用户使用 ansible 执行批量命令" -#: settings/serializers/settings.py:144 +#: settings/serializers/settings.py:148 msgid "Enable terminal register" msgstr "终端注册" -#: settings/serializers/settings.py:145 +#: settings/serializers/settings.py:149 msgid "" "Allow terminal register, after all terminal setup, you should disable this " "for security" msgstr "是否允许终端注册,当所有终端启动后,为了安全应该关闭" -#: settings/serializers/settings.py:149 +#: settings/serializers/settings.py:153 msgid "Limit the number of login failures" msgstr "限制登录失败次数" -#: settings/serializers/settings.py:153 +#: settings/serializers/settings.py:157 msgid "Block logon interval" msgstr "禁止登录时间间隔" -#: settings/serializers/settings.py:154 +#: settings/serializers/settings.py:158 msgid "" "Tip: (unit/minute) if the user has failed to log in for a limited number of " "times, no login is allowed during this time interval." msgstr "" "提示:(单位:分)当用户登录失败次数达到限制后,那么在此时间间隔内禁止登录" -#: settings/serializers/settings.py:158 +#: settings/serializers/settings.py:162 msgid "Connection max idle time" msgstr "连接最大空闲时间" -#: settings/serializers/settings.py:159 +#: settings/serializers/settings.py:163 msgid "If idle time more than it, disconnect connection Unit: minute" msgstr "提示:如果超过该配置没有操作,连接会被断开 (单位:分)" -#: settings/serializers/settings.py:163 +#: settings/serializers/settings.py:167 msgid "User password expiration" msgstr "用户密码过期时间" -#: settings/serializers/settings.py:164 +#: settings/serializers/settings.py:168 msgid "" "Tip: (unit: day) If the user does not update the password during the time, " "the user password will expire failure;The password expiration reminder mail " @@ -2353,35 +2275,35 @@ msgstr "" "提示:(单位:天)如果用户在此期间没有更新密码,用户密码将过期失效; 密码过期" "提醒邮件将在密码过期前5天内由系统(每天)自动发送给用户" -#: settings/serializers/settings.py:168 +#: settings/serializers/settings.py:172 msgid "Password minimum length" msgstr "密码最小长度" -#: settings/serializers/settings.py:171 +#: settings/serializers/settings.py:175 msgid "Must contain capital" msgstr "必须包含大写字符" -#: settings/serializers/settings.py:173 +#: settings/serializers/settings.py:177 msgid "Must contain lowercase" msgstr "必须包含小写字符" -#: settings/serializers/settings.py:174 +#: settings/serializers/settings.py:178 msgid "Must contain numeric" msgstr "必须包含数字" -#: settings/serializers/settings.py:175 +#: settings/serializers/settings.py:179 msgid "Must contain special" msgstr "必须包含特殊字符" -#: settings/serializers/settings.py:176 +#: settings/serializers/settings.py:180 msgid "Insecure command alert" msgstr "危险命令告警" -#: settings/serializers/settings.py:178 +#: settings/serializers/settings.py:182 msgid "Email recipient" msgstr "邮件收件人" -#: settings/serializers/settings.py:179 +#: settings/serializers/settings.py:183 msgid "Multiple user using , split" msgstr "多个用户,使用 , 分割" @@ -2532,12 +2454,7 @@ msgstr "商业支持" #: templates/_header_bar.html:70 templates/_nav.html:30 #: templates/_nav_user.html:37 users/forms/profile.py:43 -#: users/templates/users/_user.html:44 #: users/templates/users/user_password_update.html:39 -#: users/templates/users/user_profile.html:17 -#: users/templates/users/user_profile_update.html:37 -#: users/templates/users/user_profile_update.html:61 -#: users/templates/users/user_pubkey_update.html:37 msgid "Profile" msgstr "个人信息" @@ -2659,8 +2576,6 @@ msgid "Applications" msgstr "应用管理" #: templates/_nav.html:64 templates/_nav.html:82 templates/_nav_user.html:16 -#: users/templates/users/user_remote_app_permission.html:39 -#: users/templates/users/user_remote_app_permission.html:64 msgid "RemoteApp" msgstr "远程应用" @@ -3028,7 +2943,6 @@ msgid "High" msgstr "较高" #: terminal/const.py:33 users/templates/users/reset_password.html:50 -#: users/templates/users/user_create.html:35 #: users/templates/users/user_password_update.html:104 #: users/templates/users/user_update.html:57 msgid "Normal" @@ -3655,9 +3569,7 @@ msgstr "确认密码" msgid "Password does not match" msgstr "密码不一致" -#: users/forms/profile.py:101 users/models/user.py:532 -#: users/templates/users/user_detail.html:57 -#: users/templates/users/user_profile.html:59 +#: users/forms/profile.py:101 users/models/user.py:537 msgid "Email" msgstr "邮件" @@ -3690,49 +3602,47 @@ msgid "Public key should not be the same as your old one." msgstr "不能和原来的密钥相同" #: users/forms/profile.py:149 users/serializers/profile.py:71 -#: users/serializers/profile.py:144 users/serializers/profile.py:157 +#: users/serializers/profile.py:145 users/serializers/profile.py:158 msgid "Not a valid ssh public key" msgstr "SSH密钥不合法" -#: users/models/user.py:157 +#: users/models/user.py:162 msgid "System administrator" msgstr "系统管理员" -#: users/models/user.py:158 +#: users/models/user.py:163 msgid "System auditor" msgstr "系统审计员" -#: users/models/user.py:447 users/templates/users/user_profile.html:90 +#: users/models/user.py:452 msgid "Force enable" msgstr "强制启用" -#: users/models/user.py:512 +#: users/models/user.py:517 msgid "Local" msgstr "数据库" -#: users/models/user.py:543 +#: users/models/user.py:548 msgid "Avatar" msgstr "头像" -#: users/models/user.py:546 users/templates/users/user_detail.html:68 +#: users/models/user.py:551 msgid "Wechat" msgstr "微信" -#: users/models/user.py:576 users/templates/users/user_detail.html:89 -#: users/templates/users/user_list.html:18 -#: users/templates/users/user_profile.html:102 +#: users/models/user.py:581 msgid "Source" msgstr "用户来源" -#: users/models/user.py:580 +#: users/models/user.py:585 msgid "Date password last updated" msgstr "最后更新密码日期" -#: users/models/user.py:715 +#: users/models/user.py:720 msgid "Administrator" msgstr "管理员" -#: users/models/user.py:718 +#: users/models/user.py:723 msgid "Administrator is the super user of system" msgstr "Administrator是初始的超级管理员" @@ -3740,7 +3650,7 @@ msgstr "Administrator是初始的超级管理员" msgid "The old password is incorrect" msgstr "旧密码错误" -#: users/serializers/profile.py:37 users/serializers/user.py:112 +#: users/serializers/profile.py:37 users/serializers/user.py:113 msgid "Password does not match security rules" msgstr "密码不满足安全规则" @@ -3748,7 +3658,7 @@ msgstr "密码不满足安全规则" msgid "The newly set password is inconsistent" msgstr "两次密码不一致" -#: users/serializers/profile.py:115 users/serializers/user.py:67 +#: users/serializers/profile.py:116 users/serializers/user.py:68 msgid "Is first login" msgstr "首次登录" @@ -3789,35 +3699,35 @@ msgstr "是否可更新" msgid "Can delete" msgstr "是否可删除" -#: users/serializers/user.py:38 users/serializers/user.py:74 +#: users/serializers/user.py:39 users/serializers/user.py:75 msgid "Organization role name" msgstr "组织角色名称" -#: users/serializers/user.py:70 +#: users/serializers/user.py:71 msgid "Avatar url" msgstr "头像路径" -#: users/serializers/user.py:72 +#: users/serializers/user.py:73 msgid "Groups name" msgstr "用户组名" -#: users/serializers/user.py:73 +#: users/serializers/user.py:74 msgid "Source name" msgstr "用户来源名" -#: users/serializers/user.py:75 +#: users/serializers/user.py:76 msgid "Super role name" msgstr "超级角色名称" -#: users/serializers/user.py:76 +#: users/serializers/user.py:77 msgid "Total role name" msgstr "汇总角色名称" -#: users/serializers/user.py:100 +#: users/serializers/user.py:101 msgid "Role limit to {}" msgstr "角色只能为 {}" -#: users/serializers/user.py:197 +#: users/serializers/user.py:198 msgid "name not unique" msgstr "名称重复" @@ -3825,9 +3735,8 @@ msgstr "名称重复" msgid "Security token validation" msgstr "安全令牌验证" -#: users/templates/users/_base_otp.html:14 users/templates/users/_user.html:13 -#: users/templates/users/user_profile_update.html:55 -#: xpack/plugins/cloud/models.py:78 xpack/plugins/cloud/serializers.py:145 +#: users/templates/users/_base_otp.html:14 xpack/plugins/cloud/models.py:78 +#: xpack/plugins/cloud/serializers.py:145 msgid "Account" msgstr "账户" @@ -3847,36 +3756,6 @@ msgstr "选择用户" msgid "Asset num" msgstr "资产数量" -#: users/templates/users/_user.html:21 -msgid "Auth" -msgstr "认证" - -#: users/templates/users/_user.html:27 -msgid "Security and Role" -msgstr "角色安全" - -#: users/templates/users/_user.html:51 -#: users/templates/users/user_bulk_update.html:23 -#: users/templates/users/user_detail.html:168 -#: users/templates/users/user_group_create_update.html:27 -#: users/templates/users/user_password_update.html:74 -#: users/templates/users/user_profile.html:209 -#: users/templates/users/user_profile_update.html:67 -#: users/templates/users/user_pubkey_update.html:74 -#: users/templates/users/user_pubkey_update.html:80 -msgid "Reset" -msgstr "重置" - -#: users/templates/users/_user.html:52 -#: users/templates/users/forgot_password.html:32 -#: users/templates/users/user_bulk_update.html:24 -#: users/templates/users/user_list.html:40 -#: users/templates/users/user_password_update.html:75 -#: users/templates/users/user_profile_update.html:68 -#: users/templates/users/user_pubkey_update.html:81 -msgid "Submit" -msgstr "提交" - #: users/templates/users/_user_detail_nav_header.html:11 msgid "User detail" msgstr "用户详情" @@ -3886,8 +3765,6 @@ msgid "User permissions" msgstr "用户授权" #: users/templates/users/_user_detail_nav_header.html:23 -#: users/templates/users/user_group_detail.html:20 -#: users/templates/users/user_group_granted_asset.html:21 msgid "Asset granted" msgstr "授权的资产" @@ -3932,56 +3809,53 @@ msgstr "获取更多信息" msgid "Input your email, that will send a mail to your" msgstr "输入您的邮箱, 将会发一封重置邮件到您的邮箱中" +#: users/templates/users/forgot_password.html:32 +#: users/templates/users/user_password_update.html:75 +msgid "Submit" +msgstr "提交" + #: users/templates/users/reset_password.html:5 -#: users/templates/users/reset_password.html:6 -#: users/templates/users/user_detail.html:402 users/utils.py:83 +#: users/templates/users/reset_password.html:6 users/utils.py:83 msgid "Reset password" msgstr "重置密码" #: users/templates/users/reset_password.html:23 -#: users/templates/users/user_create.html:13 #: users/templates/users/user_password_update.html:64 #: users/templates/users/user_update.html:13 msgid "Your password must satisfy" msgstr "您的密码必须满足:" #: users/templates/users/reset_password.html:24 -#: users/templates/users/user_create.html:14 #: users/templates/users/user_password_update.html:65 #: users/templates/users/user_update.html:14 msgid "Password strength" msgstr "密码强度:" #: users/templates/users/reset_password.html:48 -#: users/templates/users/user_create.html:33 #: users/templates/users/user_password_update.html:102 #: users/templates/users/user_update.html:55 msgid "Very weak" msgstr "很弱" #: users/templates/users/reset_password.html:49 -#: users/templates/users/user_create.html:34 #: users/templates/users/user_password_update.html:103 #: users/templates/users/user_update.html:56 msgid "Weak" msgstr "弱" #: users/templates/users/reset_password.html:51 -#: users/templates/users/user_create.html:36 #: users/templates/users/user_password_update.html:105 #: users/templates/users/user_update.html:58 msgid "Medium" msgstr "一般" #: users/templates/users/reset_password.html:52 -#: users/templates/users/user_create.html:37 #: users/templates/users/user_password_update.html:106 #: users/templates/users/user_update.html:59 msgid "Strong" msgstr "强" #: users/templates/users/reset_password.html:53 -#: users/templates/users/user_create.html:38 #: users/templates/users/user_password_update.html:107 #: users/templates/users/user_update.html:60 msgid "Very strong" @@ -3990,8 +3864,6 @@ msgstr "很强" #: users/templates/users/user_asset_permission.html:43 #: users/templates/users/user_asset_permission.html:155 #: users/templates/users/user_database_app_permission.html:41 -#: users/templates/users/user_list.html:19 -#: users/templates/users/user_remote_app_permission.html:41 #: xpack/plugins/cloud/models.py:34 msgid "Validity" msgstr "有效" @@ -4008,229 +3880,6 @@ msgstr "包含" msgid "Exclude" msgstr "不包含" -#: users/templates/users/user_bulk_update.html:8 -msgid "Select properties that need to be modified" -msgstr "选择需要修改属性" - -#: users/templates/users/user_bulk_update.html:10 -msgid "Select all" -msgstr "全选" - -#: users/templates/users/user_create.html:4 -#: users/templates/users/user_list.html:7 -msgid "Create user" -msgstr "创建用户" - -#: users/templates/users/user_detail.html:80 -msgid "Force enabled" -msgstr "强制启用" - -#: users/templates/users/user_detail.html:101 -#: users/templates/users/user_profile.html:106 -msgid "Date joined" -msgstr "创建日期" - -#: users/templates/users/user_detail.html:105 -#: users/templates/users/user_profile.html:110 -msgid "Last login" -msgstr "最后登录" - -#: users/templates/users/user_detail.html:110 -#: users/templates/users/user_profile.html:115 -msgid "Last password updated" -msgstr "最后更新密码" - -#: users/templates/users/user_detail.html:126 -#: users/templates/users/user_profile.html:150 -msgid "Quick modify" -msgstr "快速修改" - -#: users/templates/users/user_detail.html:148 -msgid "Force enabled MFA" -msgstr "强制启用多因子认证" - -#: users/templates/users/user_detail.html:165 -msgid "Reset MFA" -msgstr "重置多因子认证" - -#: users/templates/users/user_detail.html:174 -msgid "Send reset password mail" -msgstr "发送重置密码邮件" - -#: users/templates/users/user_detail.html:177 -#: users/templates/users/user_detail.html:187 -msgid "Send" -msgstr "发送" - -#: users/templates/users/user_detail.html:184 -msgid "Send reset ssh key mail" -msgstr "发送重置密钥邮件" - -#: users/templates/users/user_detail.html:193 -#: users/templates/users/user_detail.html:490 -msgid "Unblock user" -msgstr "解除登录限制" - -#: users/templates/users/user_detail.html:196 -msgid "Unblock" -msgstr "解除" - -#: users/templates/users/user_detail.html:217 -msgid "Join user groups" -msgstr "添加到用户组" - -#: users/templates/users/user_detail.html:226 -msgid "Join" -msgstr "加入" - -#: users/templates/users/user_detail.html:356 -#: users/templates/users/user_detail.html:383 -msgid "Update successfully!" -msgstr "更新成功" - -#: users/templates/users/user_detail.html:365 -msgid "Goto profile page enable MFA" -msgstr "请去个人信息页面启用自己的多因子认证" - -#: users/templates/users/user_detail.html:401 -msgid "An e-mail has been sent to the user`s mailbox." -msgstr "已发送邮件到用户邮箱" - -#: users/templates/users/user_detail.html:411 -#: users/templates/users/user_detail.html:437 -#: users/templates/users/user_detail.html:505 -#: users/templates/users/user_list.html:178 -msgid "Are you sure?" -msgstr "你确认吗?" - -#: users/templates/users/user_detail.html:412 -msgid "This will reset the user password and send a reset mail" -msgstr "将失效用户当前密码,并发送重设密码邮件到用户邮箱" - -#: users/templates/users/user_detail.html:415 -#: users/templates/users/user_detail.html:441 -#: users/templates/users/user_detail.html:509 -#: users/templates/users/user_list.html:182 -msgid "Cancel" -msgstr "取消" - -#: users/templates/users/user_detail.html:427 -msgid "" -"The reset-ssh-public-key E-mail has been sent successfully. Please inform " -"the user to update his new ssh public key." -msgstr "重设密钥邮件将会发送到用户邮箱" - -#: users/templates/users/user_detail.html:428 -msgid "Reset SSH public key" -msgstr "重置SSH密钥" - -#: users/templates/users/user_detail.html:438 -msgid "This will reset the user public key and send a reset mail" -msgstr "将会失效用户当前密钥,并发送重置邮件到用户邮箱" - -#: users/templates/users/user_detail.html:456 -msgid "Successfully updated the SSH public key." -msgstr "更新SSH密钥成功" - -#: users/templates/users/user_detail.html:457 -#: users/templates/users/user_detail.html:461 -msgid "User SSH public key update" -msgstr "SSH密钥" - -#: users/templates/users/user_detail.html:506 -msgid "After unlocking the user, the user can log in normally." -msgstr "解除用户登录限制后,此用户即可正常登录" - -#: users/templates/users/user_detail.html:520 -msgid "Reset user MFA success" -msgstr "重置用户多因子认证成功" - -#: users/templates/users/user_granted_remote_app.html:35 -msgid "App type" -msgstr "应用类型" - -#: users/templates/users/user_group_detail.html:17 -#: users/templates/users/user_group_granted_asset.html:18 -msgid "User group detail" -msgstr "用户组详情" - -#: users/templates/users/user_group_detail.html:81 -msgid "Add user" -msgstr "添加用户" - -#: users/templates/users/user_group_detail.html:87 -msgid "Add" -msgstr "添加" - -#: users/templates/users/user_group_list.html:7 -msgid "Create user group" -msgstr "创建用户组" - -#: users/templates/users/user_list.html:30 -msgid "Delete selected" -msgstr "批量删除" - -#: users/templates/users/user_list.html:32 -msgid "Remove selected" -msgstr "批量移除" - -#: users/templates/users/user_list.html:34 -msgid "Update selected" -msgstr "批量更新" - -#: users/templates/users/user_list.html:35 -msgid "Deactive selected" -msgstr "禁用所选" - -#: users/templates/users/user_list.html:36 -msgid "Active selected" -msgstr "激活所选" - -#: users/templates/users/user_list.html:106 -#: users/templates/users/user_list.html:110 -msgid "Remove" -msgstr "移除" - -#: users/templates/users/user_list.html:179 -msgid "This will delete the selected users !!!" -msgstr "删除选中用户 !!!" - -#: users/templates/users/user_list.html:190 -msgid "User Deleting failed." -msgstr "用户删除失败" - -#: users/templates/users/user_list.html:191 -msgid "User Delete" -msgstr "删除" - -#: users/templates/users/user_list.html:213 -msgid "This will remove the selected users !!" -msgstr "移除选中用户 !!!" - -#: users/templates/users/user_list.html:215 -msgid "User Removing failed." -msgstr "用户移除失败" - -#: users/templates/users/user_list.html:216 -msgid "User Remove" -msgstr "移除" - -#: users/templates/users/user_list.html:265 -msgid "Are you sure about removing it?" -msgstr "您确定移除吗?" - -#: users/templates/users/user_list.html:266 -msgid "Remove the success" -msgstr "移除成功" - -#: users/templates/users/user_list.html:271 -msgid "User is expired" -msgstr "用户已失效" - -#: users/templates/users/user_list.html:274 -msgid "User is inactive" -msgstr "用户已禁用" - #: users/templates/users/user_otp_check_password.html:6 #: users/templates/users/user_verify_mfa.html:6 msgid "Authenticate" @@ -4275,57 +3924,15 @@ msgid "" "installed, go to the next step directly)." msgstr "安装完成后点击下一步进入绑定页面(如已安装,直接进入下一步)" +#: users/templates/users/user_password_update.html:74 +msgid "Reset" +msgstr "重置" + #: users/templates/users/user_password_verify.html:8 #: users/templates/users/user_password_verify.html:9 msgid "Verify password" msgstr "校验密码" -#: users/templates/users/user_profile.html:97 -msgid "Administrator Settings force MFA login" -msgstr "管理员设置强制使用多因子认证" - -#: users/templates/users/user_profile.html:156 -msgid "Set MFA" -msgstr "设置多因子认证" - -#: users/templates/users/user_profile.html:178 -msgid "Update MFA" -msgstr "更改多因子认证" - -#: users/templates/users/user_profile.html:188 -msgid "Update password" -msgstr "更改密码" - -#: users/templates/users/user_profile.html:198 -msgid "Update SSH public key" -msgstr "更改SSH密钥" - -#: users/templates/users/user_profile.html:206 -msgid "Reset public key and download" -msgstr "重置并下载SSH密钥" - -#: users/templates/users/user_pubkey_update.html:55 -msgid "Old public key" -msgstr "原来SSH密钥" - -#: users/templates/users/user_pubkey_update.html:63 -msgid "Fingerprint" -msgstr "指纹" - -#: users/templates/users/user_pubkey_update.html:69 -msgid "Update public key" -msgstr "更新密钥" - -#: users/templates/users/user_pubkey_update.html:72 -msgid "Or reset by server" -msgstr "或者重置并下载密钥" - -#: users/templates/users/user_pubkey_update.html:98 -msgid "" -"The new public key has been set successfully, Please download the " -"corresponding private key." -msgstr "新的公钥已设置成功,请下载对应的私钥" - #: users/templates/users/user_update.html:4 msgid "Update user" msgstr "更新用户" @@ -5182,6 +4789,202 @@ msgstr "旗舰版" msgid "Community edition" msgstr "社区版" +#~ msgid "Auth" +#~ msgstr "认证" + +#~ msgid "Security and Role" +#~ msgstr "角色安全" + +#~ msgid "Select properties that need to be modified" +#~ msgstr "选择需要修改属性" + +#~ msgid "Select all" +#~ msgstr "全选" + +#~ msgid "Create user" +#~ msgstr "创建用户" + +#~ msgid "Force enabled" +#~ msgstr "强制启用" + +#~ msgid "Date joined" +#~ msgstr "创建日期" + +#~ msgid "Last login" +#~ msgstr "最后登录" + +#~ msgid "Last password updated" +#~ msgstr "最后更新密码" + +#~ msgid "Quick modify" +#~ msgstr "快速修改" + +#~ msgid "Force enabled MFA" +#~ msgstr "强制启用多因子认证" + +#~ msgid "Reset MFA" +#~ msgstr "重置多因子认证" + +#~ msgid "Send reset password mail" +#~ msgstr "发送重置密码邮件" + +#~ msgid "Send" +#~ msgstr "发送" + +#~ msgid "Send reset ssh key mail" +#~ msgstr "发送重置密钥邮件" + +#~ msgid "Unblock user" +#~ msgstr "解除登录限制" + +#~ msgid "Unblock" +#~ msgstr "解除" + +#~ msgid "Join user groups" +#~ msgstr "添加到用户组" + +#~ msgid "Join" +#~ msgstr "加入" + +#~ msgid "Update successfully!" +#~ msgstr "更新成功" + +#~ msgid "Goto profile page enable MFA" +#~ msgstr "请去个人信息页面启用自己的多因子认证" + +#~ msgid "An e-mail has been sent to the user`s mailbox." +#~ msgstr "已发送邮件到用户邮箱" + +#~ msgid "Are you sure?" +#~ msgstr "你确认吗?" + +#~ msgid "This will reset the user password and send a reset mail" +#~ msgstr "将失效用户当前密码,并发送重设密码邮件到用户邮箱" + +#~ msgid "Cancel" +#~ msgstr "取消" + +#~ msgid "" +#~ "The reset-ssh-public-key E-mail has been sent successfully. Please inform " +#~ "the user to update his new ssh public key." +#~ msgstr "重设密钥邮件将会发送到用户邮箱" + +#~ msgid "Reset SSH public key" +#~ msgstr "重置SSH密钥" + +#~ msgid "This will reset the user public key and send a reset mail" +#~ msgstr "将会失效用户当前密钥,并发送重置邮件到用户邮箱" + +#~ msgid "Successfully updated the SSH public key." +#~ msgstr "更新SSH密钥成功" + +#~ msgid "User SSH public key update" +#~ msgstr "SSH密钥" + +#~ msgid "After unlocking the user, the user can log in normally." +#~ msgstr "解除用户登录限制后,此用户即可正常登录" + +#~ msgid "Reset user MFA success" +#~ msgstr "重置用户多因子认证成功" + +#~ msgid "App type" +#~ msgstr "应用类型" + +#~ msgid "User group detail" +#~ msgstr "用户组详情" + +#~ msgid "Add user" +#~ msgstr "添加用户" + +#~ msgid "Add" +#~ msgstr "添加" + +#~ msgid "Create user group" +#~ msgstr "创建用户组" + +#~ msgid "Delete selected" +#~ msgstr "批量删除" + +#~ msgid "Remove selected" +#~ msgstr "批量移除" + +#~ msgid "Update selected" +#~ msgstr "批量更新" + +#~ msgid "Deactive selected" +#~ msgstr "禁用所选" + +#~ msgid "Active selected" +#~ msgstr "激活所选" + +#~ msgid "Remove" +#~ msgstr "移除" + +#~ msgid "This will delete the selected users !!!" +#~ msgstr "删除选中用户 !!!" + +#~ msgid "User Deleting failed." +#~ msgstr "用户删除失败" + +#~ msgid "User Delete" +#~ msgstr "删除" + +#~ msgid "This will remove the selected users !!" +#~ msgstr "移除选中用户 !!!" + +#~ msgid "User Removing failed." +#~ msgstr "用户移除失败" + +#~ msgid "User Remove" +#~ msgstr "移除" + +#~ msgid "Are you sure about removing it?" +#~ msgstr "您确定移除吗?" + +#~ msgid "Remove the success" +#~ msgstr "移除成功" + +#~ msgid "User is expired" +#~ msgstr "用户已失效" + +#~ msgid "User is inactive" +#~ msgstr "用户已禁用" + +#~ msgid "Administrator Settings force MFA login" +#~ msgstr "管理员设置强制使用多因子认证" + +#~ msgid "Set MFA" +#~ msgstr "设置多因子认证" + +#~ msgid "Update MFA" +#~ msgstr "更改多因子认证" + +#~ msgid "Update password" +#~ msgstr "更改密码" + +#~ msgid "Update SSH public key" +#~ msgstr "更改SSH密钥" + +#~ msgid "Reset public key and download" +#~ msgstr "重置并下载SSH密钥" + +#~ msgid "Old public key" +#~ msgstr "原来SSH密钥" + +#~ msgid "Fingerprint" +#~ msgstr "指纹" + +#~ msgid "Update public key" +#~ msgstr "更新密钥" + +#~ msgid "Or reset by server" +#~ msgstr "或者重置并下载密钥" + +#~ msgid "" +#~ "The new public key has been set successfully, Please download the " +#~ "corresponding private key." +#~ msgstr "新的公钥已设置成功,请下载对应的私钥" + #~ msgid "(Domain name support)" #~ msgstr "(支持域名)" diff --git a/apps/settings/serializers/settings.py b/apps/settings/serializers/settings.py index c6a3c32ac..95757eb8b 100644 --- a/apps/settings/serializers/settings.py +++ b/apps/settings/serializers/settings.py @@ -121,7 +121,11 @@ class TerminalSettingSerializer(serializers.Serializer): ('50', '50'), ) TERMINAL_PASSWORD_AUTH = serializers.BooleanField(required=False, label=_('Password auth')) - TERMINAL_PUBLIC_KEY_AUTH = serializers.BooleanField(required=False, label=_('Public key auth')) + TERMINAL_PUBLIC_KEY_AUTH = serializers.BooleanField( + required=False, label=_('Public key auth'), + help_text=_('Tips: If use other auth method, like AD/LDAP, you should disable this to ' + 'avoid being able to log in after deleting') + ) TERMINAL_ASSET_LIST_SORT_BY = serializers.ChoiceField(SORT_BY_CHOICES, required=False, label=_('List sort by')) TERMINAL_ASSET_LIST_PAGE_SIZE = serializers.ChoiceField(PAGE_SIZE_CHOICES, required=False, label=_('List page size')) TERMINAL_SESSION_KEEP_DURATION = serializers.IntegerField( diff --git a/apps/users/models/user.py b/apps/users/models/user.py index b10c07223..1f8b2418a 100644 --- a/apps/users/models/user.py +++ b/apps/users/models/user.py @@ -66,13 +66,9 @@ class AuthMixin: def can_update_ssh_key(self): return self.can_use_ssh_key_login() - def can_use_ssh_key_login(self): - if not settings.TERMINAL_PUBLIC_KEY_AUTH: - return False - if self.is_local or settings.TERMINAL_ONLY_SOURCE_LOCAL_CAN_PUBLIC_KEY_AUTH: - return True - else: - return False + @staticmethod + def can_use_ssh_key_login(): + return settings.TERMINAL_PUBLIC_KEY_AUTH def is_public_key_valid(self): """ diff --git a/apps/users/templates/users/_user.html b/apps/users/templates/users/_user.html deleted file mode 100644 index dbcf7f804..000000000 --- a/apps/users/templates/users/_user.html +++ /dev/null @@ -1,88 +0,0 @@ -{% extends '_base_create_update.html' %} -{% load i18n %} -{% load static %} -{% load bootstrap3 %} -{% block form %} - {% if form.non_field_errors %} -
- {{ form.non_field_errors }} -
- {% endif %} -
- {% csrf_token %} -

{% trans 'Account' %}

- {% bootstrap_field form.name layout="horizontal" %} - {% bootstrap_field form.username layout="horizontal" %} - {% bootstrap_field form.email layout="horizontal" %} - {% bootstrap_field form.groups layout="horizontal" %} - -
- -

{% trans 'Auth' %}

- {% block password %}{% endblock %} - {% bootstrap_field form.mfa_level layout="horizontal" %} - {% bootstrap_field form.source layout="horizontal" %} - -
-

{% trans 'Security and Role' %}

- {% bootstrap_field form.role layout="horizontal" %} -
- -
-
- - {% if form.errors %} - - {% else %} - - {% endif %} -
- {{ form.date_expired.errors }} -
-
-
-

{% trans 'Profile' %}

- {% bootstrap_field form.phone layout="horizontal" %} - {% bootstrap_field form.wechat layout="horizontal" %} - {% bootstrap_field form.comment layout="horizontal" %} -
-
-
- - -
-
-
- -{% endblock %} -{% block custom_foot_js %} - - - - - - - -{% endblock %} diff --git a/apps/users/templates/users/user_bulk_update.html b/apps/users/templates/users/user_bulk_update.html deleted file mode 100644 index 28b0e8cb7..000000000 --- a/apps/users/templates/users/user_bulk_update.html +++ /dev/null @@ -1,70 +0,0 @@ -{% extends '_base_create_update.html' %} -{% load static %} -{% load bootstrap3 %} -{% load i18n %} - -{% block form %} -
-

{% trans 'Select properties that need to be modified' %}

-
- {% trans 'Select all' %} - {% for field in form %} - {% if field.name != 'users' %} - {{ field.label }} - {% endif %} - {% endfor %} -
-
-
- {% csrf_token %} - {% bootstrap_form form layout="horizontal" %} -
-
- - -
-
-
-{% endblock %} - -{% block custom_foot_js %} - -{% endblock %} diff --git a/apps/users/templates/users/user_create.html b/apps/users/templates/users/user_create.html deleted file mode 100644 index 5e15b5469..000000000 --- a/apps/users/templates/users/user_create.html +++ /dev/null @@ -1,100 +0,0 @@ -{% extends 'users/_user.html' %} -{% load i18n %} -{% load bootstrap3 %} -{% block user_template_title %}{% trans "Create user" %}{% endblock %} -{% block password %} - {% bootstrap_field form.password_strategy layout="horizontal" %} - {% bootstrap_field form.password layout="horizontal" %} - {# 密码popover #} -
- -
- -{% endblock %} - diff --git a/apps/users/templates/users/user_detail.html b/apps/users/templates/users/user_detail.html deleted file mode 100644 index 0b624b78a..000000000 --- a/apps/users/templates/users/user_detail.html +++ /dev/null @@ -1,550 +0,0 @@ -{% extends 'users/_base_user_detail.html' %} -{% load static %} -{% load i18n %} - -{% block custom_head_css_js %} - - -{% endblock %} - -{% block content_nav_delete_update %} -
  • - {% trans 'Update' %} -
  • -
  • - - {% trans 'Delete' %} - -
  • -{% endblock %} - -{% block content_table %} -
    -
    -
    - {{ object.name }} -
    - - - - - - - - - - -
    -
    -
    - - - - - - - - - - - - - - - - - - {% if user.phone %} - - - - - {% endif %} - {% if object.wechat %} - - - - - {% endif %} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {% if object.can_update_password %} - - - - - {% endif %} - - - - - -
    - -
    {% trans 'Name' %}:{{ object.name }}
    {% trans 'Username' %}:{{ object.username }}
    {% trans 'Email' %}:{{ object.email }}
    {% trans 'Phone' %}:{{ object.phone }}
    {% trans 'Wechat' %}:{{ object.wechat }}
    {% trans 'Role' %}:{{ object.org_role_display }}
    {% trans 'MFA' %}: - {% if object.mfa_force_enabled %} - {% trans 'Force enabled' %} - {% elif object.mfa_enabled%} - {% trans 'Enabled' %} - {% else %} - {% trans 'Disabled' %} - {% endif %} -
    {% trans 'Source' %}:{{ object.get_source_display }}
    {% trans 'Date expired' %}:{{ object.date_expired|date:"Y-m-j H:i:s" }}
    {% trans 'Created by' %}:{{ object.created_by }}
    {% trans 'Date joined' %}:{{ object.date_joined|date:"Y-m-j H:i:s" }}
    {% trans 'Last login' %}:{{ object.last_login|date:"Y-m-j H:i:s" }}
    {% trans 'Last password updated' %}:{{ object.date_password_last_updated|date:"Y-m-j H:i:s" }}
    {% trans 'Comment' %}:{{ object.comment }}
    -
    -
    -
    -
    -
    -
    - {% trans 'Quick modify' %} -
    -
    - - - - - - - - - - - - - - - {% if object.can_update_password %} - - - - - {% endif %} - {% if object.can_update_ssh_key %} - - - - - {% endif %} - - - - - -
    {% trans 'Active' %}: - -
    -
    - - -
    -
    -
    -
    {% trans 'Force enabled MFA' %}: - -
    -
    - - -
    -
    -
    -
    {% trans 'Reset MFA' %}: - - - -
    {% trans 'Send reset password mail' %}: - - - -
    {% trans 'Send reset ssh key mail' %}: - - - -
    {% trans 'Unblock user' %} - - - -
    -
    -
    - {% if request.user.can_admin_current_org %} - - {% if object.can_user_current_org or object.can_admin_current_org %} -
    -
    - {% trans 'User group' %} -
    -
    - - - - - - - - - - - - {% for group in object.groups.all %} - - - - - {% endfor %} - -
    - -
    - -
    - {{ group.name }} - - -
    -
    -
    - {% endif %} - - {% if LICENSE_VALID and LOGIN_CONFIRM_ENABLE %} -
    -
    - {% trans 'Login confirm' %} -
    -
    - - - - - - - - - - - {% if object.get_login_confirm_setting %} - {% for u in object.login_confirm_setting.reviewers.all %} - - - - - {% endfor %} - {% endif %} - -
    - -
    - -
    - {{ u }} - - -
    -
    -
    - {% endif %} - - {% endif %} -
    - -{% include 'users/_user_update_pk_modal.html' %} - -{% endblock %} - -{% block custom_foot_js %} - -{% endblock %} diff --git a/apps/users/templates/users/user_granted_asset.html b/apps/users/templates/users/user_granted_asset.html deleted file mode 100644 index 523697153..000000000 --- a/apps/users/templates/users/user_granted_asset.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends 'users/_base_user_detail.html' %} -{% load bootstrap3 %} -{% load static %} -{% load i18n %} - -{% block custom_head_css_js %} - - -{% endblock %} - -{% block content_table %} -{% include 'users/_granted_assets.html' %} -{% endblock %} - -{% block custom_foot_js %} - -{% endblock %} diff --git a/apps/users/templates/users/user_granted_database_app.html b/apps/users/templates/users/user_granted_database_app.html deleted file mode 100644 index 7133a9217..000000000 --- a/apps/users/templates/users/user_granted_database_app.html +++ /dev/null @@ -1,100 +0,0 @@ -{% extends 'users/_base_user_detail.html' %} -{% load i18n static %} - -{% block custom_head_css_js %} - -{% endblock %} - -{% block content_table %} -
    -
    -
    - {{ object.name }} -
    - - - - - - - - - - -
    -
    -
    - - - - - - - - - - - - - -
    - - {% trans 'Name' %}{% trans 'Type' %}{% trans 'Host' %}{% trans 'Database' %}{% trans 'Comment' %}
    -
    -
    -
    -{% endblock %} - -{% block custom_foot_js %} - -{% endblock %} diff --git a/apps/users/templates/users/user_granted_remote_app.html b/apps/users/templates/users/user_granted_remote_app.html deleted file mode 100644 index 19b8ab22c..000000000 --- a/apps/users/templates/users/user_granted_remote_app.html +++ /dev/null @@ -1,93 +0,0 @@ -{% extends 'users/_base_user_detail.html' %} -{% load i18n static %} - -{% block custom_head_css_js %} - -{% endblock %} - -{% block content_table %} -
    -
    -
    - {{ object.name }} -
    - - - - - - - - - - -
    -
    -
    - - - - - - - - - - - - -
    - - {% trans 'Name' %}{% trans 'App type' %}{% trans 'Asset' %}{% trans 'Comment' %}
    -
    -
    -
    -{% endblock %} - -{% block custom_foot_js %} - -{% endblock %} diff --git a/apps/users/templates/users/user_group_create_update.html b/apps/users/templates/users/user_group_create_update.html deleted file mode 100644 index 09030eca8..000000000 --- a/apps/users/templates/users/user_group_create_update.html +++ /dev/null @@ -1,69 +0,0 @@ -{% extends 'base.html' %} -{% load static %} -{% load i18n %} -{% load bootstrap3 %} - -{% block content %} -
    -
    -
    -
    -
    -
    {{ action }}
    -
    -
    - {% if form.non_field_errors %} -
    - {{ form.non_field_errors }} -
    - {% endif %} -
    - {% csrf_token %} - {% bootstrap_field form.name layout="horizontal" %} - {% bootstrap_field form.users layout="horizontal" %} - {% bootstrap_field form.comment layout="horizontal" %} -
    -
    - - -
    -
    -
    -
    -
    -
    -
    -
    - {% include "users/_select_user_modal.html" %} -{% endblock %} -{% block custom_foot_js %} - -{% endblock %} diff --git a/apps/users/templates/users/user_group_detail.html b/apps/users/templates/users/user_group_detail.html deleted file mode 100644 index cd65bb746..000000000 --- a/apps/users/templates/users/user_group_detail.html +++ /dev/null @@ -1,168 +0,0 @@ -{% extends 'base.html' %} -{% load static %} -{% load i18n %} - -{% block custom_head_css_js %} - - -{% endblock %} -{% block content %} -
    -
    -
    -
    - -
    -
    -
    -
    - {{ user_group.name }} - -
    -
    - - - - - - - - - - - - - - - - - - - -
    {% trans 'Name' %}:{{ user_group.name }}
    {% trans 'Create by' %}:{{ user_group.created_by }}
    {% trans 'Date created' %}:{{ user_group.date_created }}
    {% trans 'Comment' %}:{{ user_group.comment }}
    -
    -
    -
    -
    -
    -
    - {% trans 'User' %} -
    -
    - - - - - - - - - - - - {% for user in user_group.users.all %} - - - - - {% endfor %} - -
    - -
    - -
    {{ user.name }} - -
    -
    -
    -
    -
    -
    -
    -
    -
    -{% endblock %} -{% block custom_foot_js %} - -{% endblock %} diff --git a/apps/users/templates/users/user_group_granted_asset.html b/apps/users/templates/users/user_group_granted_asset.html deleted file mode 100644 index 2180e6313..000000000 --- a/apps/users/templates/users/user_group_granted_asset.html +++ /dev/null @@ -1,47 +0,0 @@ -{% extends 'base.html' %} -{% load bootstrap3 %} -{% load static %} -{% load i18n %} - -{% block custom_head_css_js %} - - -{% endblock %} -{% block content %} -
    -
    -
    -
    - -
    - {% include 'users/_granted_assets.html' %} -
    -
    -
    -
    -
    -{% endblock %} - -{% block custom_foot_js %} - -{% endblock %} diff --git a/apps/users/templates/users/user_group_list.html b/apps/users/templates/users/user_group_list.html deleted file mode 100644 index 5e354d3db..000000000 --- a/apps/users/templates/users/user_group_list.html +++ /dev/null @@ -1,112 +0,0 @@ -{% extends '_base_list.html' %} -{% load i18n static %} -{% block table_search %} - {% include '_csv_import_export.html' %} -{% endblock %} -{% block table_container %} - - - - - - - - - - - -
    - - {% trans 'Name' %}{% trans 'User' %}{% trans 'Comment' %}{% trans 'Action' %}
    -{% endblock %} - -{% block content_bottom_left %}{% endblock %} -{% block custom_foot_js %} - -{% endblock %} diff --git a/apps/users/templates/users/user_list.html b/apps/users/templates/users/user_list.html deleted file mode 100644 index 28b30f73d..000000000 --- a/apps/users/templates/users/user_list.html +++ /dev/null @@ -1,280 +0,0 @@ -{% extends '_base_list.html' %} -{% load i18n static %} -{% block table_search %} - {% include '_csv_import_export.html' %} -{% endblock %} -{% block table_container %} - - - - - - - - - - - - - - - - -
    - - {% trans 'Name' %}{% trans 'Username' %}{% trans 'Role' %}{% trans 'User group' %}{% trans 'Source' %}{% trans 'Validity' %}{% trans 'Action' %}
    -
    -
    - -
    - -
    -
    -
    -{% endblock %} -{% block content_bottom_left %}{% endblock %} -{% block custom_foot_js %} - - -{% endblock %} - diff --git a/apps/users/templates/users/user_profile.html b/apps/users/templates/users/user_profile.html deleted file mode 100644 index d1f77c7d0..000000000 --- a/apps/users/templates/users/user_profile.html +++ /dev/null @@ -1,233 +0,0 @@ -{% extends 'base.html' %} -{% load static %} -{% load i18n %} - -{% block custom_head_css_js %} - - -{% endblock %} -{% block content %} -
    -
    -
    -
    - -
    -
    -
    -
    - {{ user.name }} - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - {% if user.can_update_ssh_key %} - - - - - {% endif %} - - - - - - - - - - - - - - - - - {% if user.can_update_password %} - - - - - {% endif %} - - - - - - - - - - - - -
    - -
    {% trans 'Username' %}{{ user.username }}
    {% trans 'Name' %}{{ user.name }}
    {% trans 'Role' %}{{ user.get_role_display }}
    {% trans 'Email' %}{{ user.email }}
    {% trans 'Active' %}{{ user.is_active|yesno:"Yes,No,Unkown" }}
    {% trans 'Public key' %} - - - - - - - -
    - {{ user.public_key_obj.comment }} -
    - {{ user.public_key_obj.hash_md5 }} -
    -
    {% trans 'MFA' %} - {% if user.mfa_force_enabled %} - {% trans 'Force enable' %} - {% elif user.mfa_enabled%} - {% trans 'Enable' %} - {% else %} - {% trans 'Disable' %} - {% endif %} - {% if mfa_setting %} - ( {% trans 'Administrator Settings force MFA login' %} ) - {% endif %} -
    {% trans 'Source' %}{{ user.get_source_display }}
    {% trans 'Date joined' %}{{ user.date_joined|date:"Y-m-d H:i:s" }}
    {% trans 'Last login' %}{{ user.last_login|date:"Y-m-d H:i:s" }}
    {% trans 'Last password updated' %}{{ user.date_password_last_updated|date:"Y-m-d H:i:s" }}
    {% trans 'Date expired' %}{{ user.date_expired|date:"Y-m-d H:i:s" }}
    {% trans 'User groups' %} - - {% for group in user.groups.all %} - - - - {% endfor %} -
    - {{ group.name }} -
    -
    {% trans 'Comment' %}:{{ user.comment }}
    -
    -
    -
    -
    -
    -
    -
    -
    - {% trans 'Quick modify' %} -
    -
    - - - - - - - {% if request.user.mfa_enabled %} - - - - - {% endif %} - {% if request.user.can_update_password %} - - - - - {% endif %} - {% if request.user.can_update_ssh_key %} - - - - - - - - - {% endif %} - -
    {% trans 'Set MFA' %}: - - {% trans 'Disable' %} - {% else %} - {% url 'authentication:user-otp-disable-authentication' %} - ">{% trans 'Disable' %} - {% endif %} - {% else %} - {% url 'authentication:user-otp-enable-start' %} - ">{% trans 'Enable' %} - {% endif %} - - -
    {% trans 'Update MFA' %}: - - {% trans 'Update' %} - -
    {% trans 'Update password' %}: - - {% trans 'Update' %} - -
    {% trans 'Update SSH public key' %}: - - {% trans 'Update' %} - -
    {% trans 'Reset public key and download' %}: - - {% trans 'Reset' %} - -
    -
    -
    -
    -
    -
    -
    -
    -{% endblock %} -{% block custom_foot_js %} - -{% endblock %} diff --git a/apps/users/templates/users/user_profile_update.html b/apps/users/templates/users/user_profile_update.html deleted file mode 100644 index e59edeccc..000000000 --- a/apps/users/templates/users/user_profile_update.html +++ /dev/null @@ -1,84 +0,0 @@ -{% extends 'base.html' %} -{% load static %} -{% load i18n %} -{% load bootstrap3 %} - -{% block custom_head_css_js %} - - - - - -{% endblock %} -{% block content %} -
    -
    -
    -
    -
    - -
    -
    -
    -
    - {% csrf_token %} -

    {% trans 'Account' %}

    - {% bootstrap_field form.username layout="horizontal" %} - {% bootstrap_field form.name layout="horizontal" %} - {% bootstrap_field form.email layout="horizontal" %} - -
    -

    {% trans 'Profile' %}

    - {% bootstrap_field form.phone layout="horizontal" %} - {% bootstrap_field form.wechat layout="horizontal" %} -
    -
    -
    - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -{% endblock %} - -{% block custom_foot_js %} - - -{% endblock %} diff --git a/apps/users/templates/users/user_pubkey_update.html b/apps/users/templates/users/user_pubkey_update.html deleted file mode 100644 index 4ab03f01c..000000000 --- a/apps/users/templates/users/user_pubkey_update.html +++ /dev/null @@ -1,102 +0,0 @@ -{% extends 'base.html' %} -{% load static %} -{% load i18n %} -{% load bootstrap3 %} - -{% block custom_head_css_js %} - - - - - -{% endblock %} -{% block content %} -
    -
    -
    -
    -
    - -
    -
    -
    -
    - {% csrf_token %} -

    {% trans 'Old public key' %}

    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    -

    {% trans 'Update public key' %}

    - {% bootstrap_field form.public_key layout="horizontal" %} -
    - - -
    -
    -
    -
    - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -{% endblock %} - -{% block custom_foot_js %} - - -{% endblock %} diff --git a/apps/users/templates/users/user_remote_app_permission.html b/apps/users/templates/users/user_remote_app_permission.html deleted file mode 100644 index d1f6aabb7..000000000 --- a/apps/users/templates/users/user_remote_app_permission.html +++ /dev/null @@ -1,168 +0,0 @@ -{% extends 'users/_base_user_detail.html' %} -{% load static %} -{% load i18n %} - -{% block custom_head_css_js %} - - -{% endblock %} - -{% block content_table %} -
    -
    -
    - {{ object.name }} -
    - - - - - - - - - - -
    -
    -
    - - - - - - - - - - - - - - - -
    {% trans 'Name' %}{% trans 'User' %}{% trans 'User group' %}{% trans 'RemoteApp' %}{% trans 'System user' %}{% trans 'Validity' %}{% trans 'Action' %}
    -
    -
    -
    -{% endblock %} - -{% block custom_foot_js %} - -{% endblock %} diff --git a/apps/users/templates/users/user_update.html b/apps/users/templates/users/user_update.html deleted file mode 100644 index 182ec88aa..000000000 --- a/apps/users/templates/users/user_update.html +++ /dev/null @@ -1,117 +0,0 @@ -{% extends 'users/_user.html' %} -{% load i18n %} -{% load bootstrap3 %} -{% block user_template_title %}{% trans "Update user" %}{% endblock %} -{% block password %} - {% if object.can_update_password %} - {% bootstrap_field form.password layout="horizontal" %} - {# 密码popover #} -
    - -
    - {% else %} -
    - -
    - {% trans 'User auth from {}, go there change password' %} -
    -
    - {% endif %} - {% if object.can_update_ssh_key %} - {% bootstrap_field form.public_key layout="horizontal" %} - {% else %} -
    - -
    - {% trans 'User auth from {}, ssh key login is not supported' %} -
    -
    - {% endif %} -{% endblock %} - -{% block custom_foot_js %} - {{ block.super }} - -{% endblock %}