diff --git a/apps/applications/migrations/0016_auto_20220118_1455.py b/apps/applications/migrations/0016_auto_20220118_1455.py new file mode 100644 index 000000000..edb97bade --- /dev/null +++ b/apps/applications/migrations/0016_auto_20220118_1455.py @@ -0,0 +1,24 @@ +# Generated by Django 3.1.13 on 2022-01-18 06:55 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('applications', '0015_auto_20220112_2035'), + ] + + operations = [ + migrations.AlterField( + model_name='account', + name='app', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='applications.application', verbose_name='Application'), + ), + migrations.AlterField( + model_name='historicalaccount', + name='app', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='applications.application', verbose_name='Application'), + ), + ] diff --git a/apps/applications/models/account.py b/apps/applications/models/account.py index f95b0d0f5..1b0da7979 100644 --- a/apps/applications/models/account.py +++ b/apps/applications/models/account.py @@ -9,7 +9,7 @@ from assets.models.base import BaseUser class Account(BaseUser): app = models.ForeignKey( - 'applications.Application', on_delete=models.CASCADE, null=True, verbose_name=_('Database') + 'applications.Application', on_delete=models.CASCADE, null=True, verbose_name=_('Application') ) systemuser = models.ForeignKey( 'assets.SystemUser', on_delete=models.CASCADE, null=True, verbose_name=_("System user") diff --git a/apps/assets/serializers/system_user.py b/apps/assets/serializers/system_user.py index 4c01d46bb..850870762 100644 --- a/apps/assets/serializers/system_user.py +++ b/apps/assets/serializers/system_user.py @@ -51,7 +51,7 @@ class SystemUserSerializer(AuthSerializerMixin, BulkOrgResourceModelSerializer): 'trim_whitespace': False, "validators": [validate_password_contains_left_double_curly_bracket] }, - 'cmd_filters': {"required": False}, + 'cmd_filters': {"required": False, 'label': _('Command filter')}, 'public_key': {"write_only": True}, 'private_key': {"write_only": True}, 'token': {"write_only": True}, diff --git a/apps/audits/models.py b/apps/audits/models.py index bd7988dbe..f40dce16c 100644 --- a/apps/audits/models.py +++ b/apps/audits/models.py @@ -2,8 +2,9 @@ import uuid from django.db import models from django.db.models import Q -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext, ugettext_lazy as _ from django.utils import timezone +from common.utils import lazyproperty from orgs.mixins.models import OrgModelMixin, Organization from orgs.utils import current_org @@ -63,6 +64,10 @@ class OperateLog(OrgModelMixin): def __str__(self): return "<{}> {} <{}>".format(self.user, self.action, self.resource) + @lazyproperty + def resource_type_display(self): + return gettext(self.resource_type) + def save(self, *args, **kwargs): if current_org.is_root() and not self.org_id: self.org_id = Organization.ROOT_ID @@ -113,6 +118,10 @@ class UserLoginLog(models.Model): datetime = models.DateTimeField(default=timezone.now, verbose_name=_('Date login')) backend = models.CharField(max_length=32, default='', verbose_name=_('Authentication backend')) + @property + def backend_display(self): + return gettext(self.backend) + @classmethod def get_login_logs(cls, date_from=None, date_to=None, user=None, keyword=None): login_logs = cls.objects.all() diff --git a/apps/audits/serializers.py b/apps/audits/serializers.py index 2c7911f14..bc78ef238 100644 --- a/apps/audits/serializers.py +++ b/apps/audits/serializers.py @@ -35,27 +35,33 @@ class UserLoginLogSerializer(serializers.ModelSerializer): fields_mini = ['id'] fields_small = fields_mini + [ 'username', 'type', 'type_display', 'ip', 'city', 'user_agent', - 'mfa', 'mfa_display', 'reason', 'reason_display', 'backend', + 'mfa', 'mfa_display', 'reason', 'reason_display', 'backend', 'backend_display', 'status', 'status_display', 'datetime', ] fields = fields_small extra_kwargs = { "user_agent": {'label': _('User agent')}, - "reason_display": {'label': _('Reason display')} + "reason_display": {'label': _('Reason display')}, + 'backend_display': {'label': _('Authentication backend')} } class OperateLogSerializer(serializers.ModelSerializer): + action_display = serializers.CharField(source='get_action_display', label=_('Action')) + class Meta: model = models.OperateLog fields_mini = ['id'] fields_small = fields_mini + [ - 'user', 'action', 'resource_type', 'resource', 'remote_addr', - 'datetime', - 'org_id' + 'user', 'action', 'action_display', + 'resource_type', 'resource_type_display', 'resource', + 'remote_addr', 'datetime', 'org_id' ] fields = fields_small + extra_kwargs = { + 'resource_type_display': {'label': _('Resource Type')} + } class PasswordChangeLogSerializer(serializers.ModelSerializer): diff --git a/apps/audits/signals_handler.py b/apps/audits/signals_handler.py index 362bd4c11..0193e830b 100644 --- a/apps/audits/signals_handler.py +++ b/apps/audits/signals_handler.py @@ -10,6 +10,7 @@ from django.utils import timezone from django.utils.functional import LazyObject from django.contrib.auth import BACKEND_SESSION_KEY from django.utils.translation import ugettext_lazy as _ +from django.utils import translation from rest_framework.renderers import JSONRenderer from rest_framework.request import Request @@ -83,7 +84,8 @@ def create_operate_log(action, sender, resource): model_name = sender._meta.object_name if model_name not in MODELS_NEED_RECORD: return - resource_type = sender._meta.verbose_name + with translation.override('en'): + resource_type = sender._meta.verbose_name remote_addr = get_request_ip(current_request) data = { @@ -290,13 +292,16 @@ def generate_data(username, request, login_type=None): if login_type is None: login_type = 'W' + with translation.override('en'): + backend = str(get_login_backend(request)) + data = { 'username': username, 'ip': login_ip, 'type': login_type, 'user_agent': user_agent[0:254], 'datetime': timezone.now(), - 'backend': get_login_backend(request) + 'backend': backend, } return data diff --git a/apps/common/utils/translate.py b/apps/common/utils/translate.py new file mode 100644 index 000000000..dc1f5c90b --- /dev/null +++ b/apps/common/utils/translate.py @@ -0,0 +1,14 @@ +from django.utils.translation import gettext + + +def translate_value(value): + if not value: + return value + sps = ['. ', ': '] + spb = {str(sp in value): sp for sp in sps} + sp = spb.get('True') + if not sp: + return value + + tpl, data = value.split(sp, 1) + return gettext(tpl + sp) + data diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index a97530a02..c22f63f2d 100644 --- a/apps/locale/zh/LC_MESSAGES/django.mo +++ b/apps/locale/zh/LC_MESSAGES/django.mo @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a08014e3eed6152aaff1e42758f20666f0e90e1ed4264a9d7cd44e34191d607e -size 96692 +oid sha256:bc12c498651ddc7b1750389f65c4fe6d48d9dbe0fad3f63b7066cb82ef7e223a +size 97032 diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index a8ab01dba..44c3f384c 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-17 19:06+0800\n" +"POT-Creation-Date: 2022-01-18 18:31+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -57,11 +57,11 @@ msgstr "激活中" #: assets/models/cluster.py:29 assets/models/cmd_filter.py:44 #: assets/models/cmd_filter.py:87 assets/models/domain.py:25 #: assets/models/domain.py:65 assets/models/group.py:23 -#: assets/models/label.py:23 ops/models/adhoc.py:37 orgs/models.py:27 +#: assets/models/label.py:23 ops/models/adhoc.py:38 orgs/models.py:27 #: perms/models/base.py:93 settings/models.py:34 terminal/models/storage.py:26 #: terminal/models/terminal.py:114 tickets/models/ticket.py:75 #: users/models/group.py:16 users/models/user.py:585 -#: xpack/plugins/change_auth_plan/models/base.py:41 +#: xpack/plugins/change_auth_plan/models/base.py:44 #: xpack/plugins/cloud/models.py:35 xpack/plugins/cloud/models.py:113 #: xpack/plugins/gathered_user/models.py:26 msgid "Comment" @@ -81,8 +81,8 @@ msgid "Login confirm" msgstr "登录复核" #: acls/models/login_acl.py:24 acls/models/login_asset_acl.py:20 -#: assets/models/cmd_filter.py:26 assets/models/label.py:15 audits/models.py:36 -#: audits/models.py:56 audits/models.py:74 audits/serializers.py:94 +#: assets/models/cmd_filter.py:26 assets/models/label.py:15 audits/models.py:37 +#: audits/models.py:57 audits/models.py:79 audits/serializers.py:97 #: authentication/models.py:47 orgs/models.py:19 orgs/models.py:433 #: perms/models/base.py:84 templates/index.html:78 #: terminal/backends/command/models.py:19 @@ -104,7 +104,7 @@ msgstr "规则" #: acls/models/login_acl.py:31 acls/models/login_asset_acl.py:26 #: acls/serializers/login_acl.py:17 acls/serializers/login_asset_acl.py:75 -#: assets/models/cmd_filter.py:80 audits/models.py:57 +#: assets/models/cmd_filter.py:80 audits/models.py:58 #: authentication/templates/authentication/_access_key_modal.html:34 #: users/templates/users/_granted_assets.html:29 #: users/templates/users/user_asset_permission.html:44 @@ -133,7 +133,7 @@ msgstr "系统用户" #: assets/models/asset.py:356 assets/models/authbook.py:19 #: assets/models/backup.py:31 assets/models/cmd_filter.py:34 #: assets/models/gathered_user.py:14 assets/serializers/system_user.py:264 -#: audits/models.py:38 perms/models/asset_permission.py:24 +#: audits/models.py:39 perms/models/asset_permission.py:24 #: templates/index.html:82 terminal/backends/command/models.py:20 #: terminal/backends/command/serializers.py:13 terminal/models/session.py:42 #: terminal/notifications.py:89 @@ -158,11 +158,11 @@ msgstr "格式为逗号分隔的字符串, * 表示匹配所有. " #: acls/serializers/login_acl.py:15 acls/serializers/login_asset_acl.py:17 #: acls/serializers/login_asset_acl.py:51 assets/models/base.py:176 -#: assets/models/gathered_user.py:15 audits/models.py:105 +#: assets/models/gathered_user.py:15 audits/models.py:110 #: authentication/forms.py:15 authentication/forms.py:17 #: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9 -#: ops/models/adhoc.py:159 users/forms/profile.py:31 users/models/user.py:547 +#: ops/models/adhoc.py:154 users/forms/profile.py:31 users/models/user.py:547 #: users/templates/users/_msg_user_created.html:12 #: users/templates/users/_select_user_modal.html:14 #: xpack/plugins/change_auth_plan/models/asset.py:34 @@ -264,7 +264,7 @@ msgid "Custom" msgstr "自定义" #: applications/models/account.py:15 assets/models/authbook.py:20 -#: assets/models/cmd_filter.py:38 assets/models/user.py:302 audits/models.py:39 +#: assets/models/cmd_filter.py:38 assets/models/user.py:302 audits/models.py:40 #: perms/models/application_permission.py:32 #: perms/models/asset_permission.py:26 templates/_nav.html:45 #: terminal/backends/command/models.py:21 @@ -353,7 +353,7 @@ msgstr "类型名称" #: assets/models/domain.py:27 assets/models/gathered_user.py:19 #: assets/models/group.py:22 assets/models/label.py:25 #: assets/serializers/account.py:17 common/db/models.py:113 -#: common/mixins/models.py:50 ops/models/adhoc.py:38 ops/models/command.py:29 +#: common/mixins/models.py:50 ops/models/adhoc.py:39 ops/models/command.py:29 #: orgs/models.py:26 orgs/models.py:435 perms/models/base.py:92 #: users/models/group.py:18 users/models/user.py:783 #: xpack/plugins/cloud/models.py:122 @@ -362,7 +362,7 @@ msgstr "创建日期" #: applications/serializers/application.py:104 assets/models/base.py:182 #: assets/models/gathered_user.py:20 assets/serializers/account.py:20 -#: common/db/models.py:114 common/mixins/models.py:51 ops/models/adhoc.py:39 +#: common/db/models.py:114 common/mixins/models.py:51 ops/models/adhoc.py:40 #: orgs/models.py:436 msgid "Date updated" msgstr "更新日期" @@ -378,7 +378,7 @@ msgid "Cluster" msgstr "集群" #: applications/serializers/attrs/application_category/db.py:11 -#: ops/models/adhoc.py:157 settings/serializers/auth/radius.py:14 +#: ops/models/adhoc.py:152 settings/serializers/auth/radius.py:14 #: xpack/plugins/cloud/serializers/account_attrs.py:68 msgid "Host" msgstr "主机" @@ -441,7 +441,7 @@ msgstr "自定义用户名" #: applications/serializers/attrs/application_type/custom.py:23 #: applications/serializers/attrs/application_type/custom.py:30 -#: xpack/plugins/change_auth_plan/models/base.py:24 +#: xpack/plugins/change_auth_plan/models/base.py:27 msgid "Custom password" msgstr "自定义密码" @@ -599,7 +599,7 @@ msgstr "标签管理" #: common/db/models.py:111 common/mixins/models.py:49 orgs/models.py:25 #: orgs/models.py:437 perms/models/base.py:91 users/models/user.py:593 #: users/serializers/group.py:33 -#: xpack/plugins/change_auth_plan/models/base.py:45 +#: xpack/plugins/change_auth_plan/models/base.py:48 #: xpack/plugins/cloud/models.py:119 xpack/plugins/gathered_user/models.py:30 msgid "Created by" msgstr "创建者" @@ -625,30 +625,30 @@ msgid "Account backup plan" msgstr "账户备份计划" #: assets/models/backup.py:100 -#: xpack/plugins/change_auth_plan/models/base.py:104 +#: xpack/plugins/change_auth_plan/models/base.py:107 msgid "Manual trigger" msgstr "手动触发" #: assets/models/backup.py:101 -#: xpack/plugins/change_auth_plan/models/base.py:105 +#: xpack/plugins/change_auth_plan/models/base.py:108 msgid "Timing trigger" msgstr "定时触发" -#: assets/models/backup.py:105 audits/models.py:43 ops/models/command.py:30 +#: assets/models/backup.py:105 audits/models.py:44 ops/models/command.py:30 #: perms/models/base.py:89 terminal/models/session.py:54 #: tickets/serializers/ticket/meta/ticket_type/apply_application.py:55 #: tickets/serializers/ticket/meta/ticket_type/apply_asset.py:57 -#: xpack/plugins/change_auth_plan/models/base.py:109 -#: xpack/plugins/change_auth_plan/models/base.py:200 +#: xpack/plugins/change_auth_plan/models/base.py:112 +#: xpack/plugins/change_auth_plan/models/base.py:203 #: xpack/plugins/gathered_user/models.py:76 msgid "Date start" msgstr "开始日期" #: assets/models/backup.py:108 #: authentication/templates/authentication/_msg_oauth_bind.html:11 -#: notifications/notifications.py:187 ops/models/adhoc.py:257 -#: xpack/plugins/change_auth_plan/models/base.py:112 -#: xpack/plugins/change_auth_plan/models/base.py:201 +#: notifications/notifications.py:187 ops/models/adhoc.py:252 +#: xpack/plugins/change_auth_plan/models/base.py:115 +#: xpack/plugins/change_auth_plan/models/base.py:204 #: xpack/plugins/gathered_user/models.py:79 msgid "Time" msgstr "时间" @@ -658,22 +658,22 @@ msgid "Account backup snapshot" msgstr "账号备份快照" #: assets/models/backup.py:116 assets/serializers/backup.py:40 -#: xpack/plugins/change_auth_plan/models/base.py:122 +#: xpack/plugins/change_auth_plan/models/base.py:125 #: xpack/plugins/change_auth_plan/serializers/base.py:73 msgid "Trigger mode" msgstr "触发模式" -#: assets/models/backup.py:119 audits/models.py:111 +#: assets/models/backup.py:119 audits/models.py:116 #: terminal/models/sharing.py:88 -#: xpack/plugins/change_auth_plan/models/base.py:198 +#: xpack/plugins/change_auth_plan/models/base.py:201 #: xpack/plugins/cloud/models.py:176 msgid "Reason" msgstr "原因" #: assets/models/backup.py:121 audits/serializers.py:76 -#: audits/serializers.py:91 ops/models/adhoc.py:259 +#: audits/serializers.py:91 ops/models/adhoc.py:254 #: terminal/serializers/session.py:35 -#: xpack/plugins/change_auth_plan/models/base.py:199 +#: xpack/plugins/change_auth_plan/models/base.py:202 msgid "Is success" msgstr "是否成功" @@ -689,7 +689,7 @@ msgstr "未知" msgid "Ok" msgstr "成功" -#: assets/models/base.py:32 audits/models.py:102 +#: assets/models/base.py:32 audits/models.py:107 #: xpack/plugins/change_auth_plan/task_handlers/base/manager.py:121 #: xpack/plugins/cloud/const.py:29 msgid "Failed" @@ -703,16 +703,16 @@ msgstr "可连接性" msgid "Date verified" msgstr "校验日期" -#: assets/models/base.py:177 audits/signals_handler.py:65 +#: assets/models/base.py:177 audits/signals_handler.py:66 #: authentication/forms.py:22 #: authentication/templates/authentication/login.html:151 #: settings/serializers/auth/ldap.py:44 users/forms/profile.py:21 #: users/templates/users/_msg_user_created.html:13 #: users/templates/users/user_password_update.html:43 #: users/templates/users/user_password_verify.html:18 -#: xpack/plugins/change_auth_plan/models/base.py:39 -#: xpack/plugins/change_auth_plan/models/base.py:118 -#: xpack/plugins/change_auth_plan/models/base.py:193 +#: xpack/plugins/change_auth_plan/models/base.py:42 +#: xpack/plugins/change_auth_plan/models/base.py:121 +#: xpack/plugins/change_auth_plan/models/base.py:196 #: xpack/plugins/cloud/serializers/account_attrs.py:24 msgid "Password" msgstr "密码" @@ -781,7 +781,7 @@ msgstr "默认Cluster" msgid "User group" msgstr "用户组" -#: assets/models/cmd_filter.py:56 +#: assets/models/cmd_filter.py:56 assets/serializers/system_user.py:54 msgid "Command filter" msgstr "命令过滤器" @@ -1275,131 +1275,131 @@ msgstr "为了安全,禁止推送用户 {}" msgid "No assets matched, stop task" msgstr "没有匹配到资产,结束任务" -#: audits/models.py:26 audits/models.py:53 +#: audits/models.py:27 audits/models.py:54 #: 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 msgid "Delete" msgstr "删除" -#: audits/models.py:27 +#: audits/models.py:28 msgid "Upload" msgstr "上传文件" -#: audits/models.py:28 +#: audits/models.py:29 msgid "Download" msgstr "下载文件" -#: audits/models.py:29 +#: audits/models.py:30 msgid "Rmdir" msgstr "删除目录" -#: audits/models.py:30 +#: audits/models.py:31 msgid "Rename" msgstr "重命名" -#: audits/models.py:31 +#: audits/models.py:32 msgid "Mkdir" msgstr "创建目录" -#: audits/models.py:32 +#: audits/models.py:33 msgid "Symlink" msgstr "建立软链接" -#: audits/models.py:37 audits/models.py:60 audits/models.py:76 +#: audits/models.py:38 audits/models.py:61 audits/models.py:81 #: terminal/models/session.py:47 terminal/models/sharing.py:76 msgid "Remote addr" msgstr "远端地址" -#: audits/models.py:40 +#: audits/models.py:41 msgid "Operate" msgstr "操作" -#: audits/models.py:41 +#: audits/models.py:42 msgid "Filename" msgstr "文件名" -#: audits/models.py:42 audits/models.py:101 terminal/models/sharing.py:84 +#: audits/models.py:43 audits/models.py:106 terminal/models/sharing.py:84 #: xpack/plugins/change_auth_plan/task_handlers/base/manager.py:119 msgid "Success" msgstr "成功" -#: audits/models.py:51 +#: audits/models.py:52 #: authentication/templates/authentication/_access_key_modal.html:22 msgid "Create" msgstr "创建" -#: audits/models.py:52 templates/_csv_import_export.html:18 +#: audits/models.py:53 templates/_csv_import_export.html:18 #: templates/_csv_update_modal.html:6 #: users/templates/users/user_asset_permission.html:127 #: users/templates/users/user_database_app_permission.html:110 msgid "Update" msgstr "更新" -#: audits/models.py:58 +#: audits/models.py:59 audits/serializers.py:60 msgid "Resource Type" msgstr "资源类型" -#: audits/models.py:59 +#: audits/models.py:60 msgid "Resource" msgstr "资源" -#: audits/models.py:61 audits/models.py:77 +#: audits/models.py:62 audits/models.py:82 msgid "Datetime" msgstr "日期" -#: audits/models.py:75 +#: audits/models.py:80 msgid "Change by" msgstr "修改者" -#: audits/models.py:95 +#: audits/models.py:100 msgid "Disabled" msgstr "禁用" -#: audits/models.py:96 settings/models.py:33 +#: audits/models.py:101 settings/models.py:33 msgid "Enabled" msgstr "启用" -#: audits/models.py:97 +#: audits/models.py:102 msgid "-" msgstr "" -#: audits/models.py:106 +#: audits/models.py:111 msgid "Login type" msgstr "登录方式" -#: audits/models.py:107 +#: audits/models.py:112 #: tickets/serializers/ticket/meta/ticket_type/login_confirm.py:14 msgid "Login ip" msgstr "登录IP" -#: audits/models.py:108 +#: audits/models.py:113 #: authentication/templates/authentication/_msg_different_city.html:11 #: tickets/serializers/ticket/meta/ticket_type/login_confirm.py:17 msgid "Login city" msgstr "登录城市" -#: audits/models.py:109 audits/serializers.py:44 +#: audits/models.py:114 audits/serializers.py:44 msgid "User agent" msgstr "用户代理" -#: audits/models.py:110 +#: audits/models.py:115 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 #: users/forms/profile.py:64 users/models/user.py:571 #: users/serializers/profile.py:123 msgid "MFA" msgstr "MFA" -#: audits/models.py:112 tickets/models/ticket.py:61 +#: audits/models.py:117 tickets/models/ticket.py:61 #: xpack/plugins/cloud/models.py:172 xpack/plugins/cloud/models.py:221 msgid "Status" msgstr "状态" -#: audits/models.py:113 +#: audits/models.py:118 msgid "Date login" msgstr "登录日期" -#: audits/models.py:114 +#: audits/models.py:119 audits/serializers.py:46 msgid "Authentication backend" msgstr "认证方式" @@ -1419,234 +1419,234 @@ msgstr "MFA名称" msgid "Reason display" msgstr "原因描述" -#: audits/serializers.py:78 +#: audits/serializers.py:81 msgid "Hosts display" msgstr "主机名称" -#: audits/serializers.py:90 ops/models/command.py:26 +#: audits/serializers.py:93 ops/models/command.py:26 #: xpack/plugins/cloud/models.py:170 msgid "Result" msgstr "结果" -#: audits/serializers.py:92 terminal/serializers/storage.py:151 +#: audits/serializers.py:95 terminal/serializers/storage.py:151 msgid "Hosts" msgstr "主机" -#: audits/serializers.py:93 +#: audits/serializers.py:96 msgid "Run as" msgstr "运行用户" -#: audits/serializers.py:95 +#: audits/serializers.py:98 msgid "Run as display" msgstr "运行用户名称" -#: audits/serializers.py:96 +#: audits/serializers.py:99 msgid "User display" msgstr "用户名称" -#: audits/signals_handler.py:64 +#: audits/signals_handler.py:65 msgid "SSH Key" msgstr "SSH 密钥" -#: audits/signals_handler.py:66 +#: audits/signals_handler.py:67 msgid "SSO" msgstr "" -#: audits/signals_handler.py:67 +#: audits/signals_handler.py:68 msgid "Auth Token" msgstr "认证令牌" -#: audits/signals_handler.py:68 authentication/notifications.py:73 +#: audits/signals_handler.py:69 authentication/notifications.py:73 #: authentication/views/login.py:164 authentication/views/wecom.py:158 #: notifications/backends/__init__.py:11 users/models/user.py:607 msgid "WeCom" msgstr "企业微信" -#: audits/signals_handler.py:69 authentication/views/dingtalk.py:160 +#: audits/signals_handler.py:70 authentication/views/dingtalk.py:160 #: authentication/views/login.py:170 notifications/backends/__init__.py:12 #: users/models/user.py:608 msgid "DingTalk" msgstr "钉钉" -#: audits/signals_handler.py:102 +#: audits/signals_handler.py:104 msgid "User and Organization" msgstr "用户与组织" -#: audits/signals_handler.py:103 +#: audits/signals_handler.py:105 #, python-brace-format msgid "{User} JOINED {Organization}" msgstr "{User} 加入 {Organization}" -#: audits/signals_handler.py:104 +#: audits/signals_handler.py:106 #, python-brace-format msgid "{User} LEFT {Organization}" msgstr "{User} 离开 {Organization}" -#: audits/signals_handler.py:107 +#: audits/signals_handler.py:109 msgid "User and Group" msgstr "用户与用户组" -#: audits/signals_handler.py:108 +#: audits/signals_handler.py:110 #, python-brace-format msgid "{User} JOINED {UserGroup}" msgstr "{User} 加入 {UserGroup}" -#: audits/signals_handler.py:109 +#: audits/signals_handler.py:111 #, python-brace-format msgid "{User} LEFT {UserGroup}" msgstr "{User} 离开 {UserGroup}" -#: audits/signals_handler.py:112 +#: audits/signals_handler.py:114 msgid "Asset and SystemUser" msgstr "资产与系统用户" -#: audits/signals_handler.py:113 +#: audits/signals_handler.py:115 #, python-brace-format msgid "{Asset} ADD {SystemUser}" msgstr "{Asset} 添加 {SystemUser}" -#: audits/signals_handler.py:114 +#: audits/signals_handler.py:116 #, python-brace-format msgid "{Asset} REMOVE {SystemUser}" msgstr "{Asset} 移除 {SystemUser}" -#: audits/signals_handler.py:117 +#: audits/signals_handler.py:119 msgid "Node and Asset" msgstr "节点与资产" -#: audits/signals_handler.py:118 +#: audits/signals_handler.py:120 #, python-brace-format msgid "{Node} ADD {Asset}" msgstr "{Node} 添加 {Asset}" -#: audits/signals_handler.py:119 +#: audits/signals_handler.py:121 #, python-brace-format msgid "{Node} REMOVE {Asset}" msgstr "{Node} 移除 {Asset}" -#: audits/signals_handler.py:122 +#: audits/signals_handler.py:124 msgid "User asset permissions" msgstr "用户资产授权" -#: audits/signals_handler.py:123 +#: audits/signals_handler.py:125 #, python-brace-format msgid "{AssetPermission} ADD {User}" msgstr "{AssetPermission} 添加 {User}" -#: audits/signals_handler.py:124 +#: audits/signals_handler.py:126 #, python-brace-format msgid "{AssetPermission} REMOVE {User}" msgstr "{AssetPermission} 移除 {User}" -#: audits/signals_handler.py:127 +#: audits/signals_handler.py:129 msgid "User group asset permissions" msgstr "用户组资产授权" -#: audits/signals_handler.py:128 +#: audits/signals_handler.py:130 #, python-brace-format msgid "{AssetPermission} ADD {UserGroup}" msgstr "{AssetPermission} 添加 {UserGroup}" -#: audits/signals_handler.py:129 +#: audits/signals_handler.py:131 #, python-brace-format msgid "{AssetPermission} REMOVE {UserGroup}" msgstr "{AssetPermission} 移除 {UserGroup}" -#: audits/signals_handler.py:132 perms/models/asset_permission.py:30 +#: audits/signals_handler.py:134 perms/models/asset_permission.py:30 #: templates/_nav.html:78 users/templates/users/_user_detail_nav_header.html:31 msgid "Asset permission" msgstr "资产授权" -#: audits/signals_handler.py:133 +#: audits/signals_handler.py:135 #, python-brace-format msgid "{AssetPermission} ADD {Asset}" msgstr "{AssetPermission} 添加 {Asset}" -#: audits/signals_handler.py:134 +#: audits/signals_handler.py:136 #, python-brace-format msgid "{AssetPermission} REMOVE {Asset}" msgstr "{AssetPermission} 移除 {Asset}" -#: audits/signals_handler.py:137 +#: audits/signals_handler.py:139 msgid "Node permission" msgstr "节点授权" -#: audits/signals_handler.py:138 +#: audits/signals_handler.py:140 #, python-brace-format msgid "{AssetPermission} ADD {Node}" msgstr "{AssetPermission} 添加 {Node}" -#: audits/signals_handler.py:139 +#: audits/signals_handler.py:141 #, python-brace-format msgid "{AssetPermission} REMOVE {Node}" msgstr "{AssetPermission} 移除 {Node}" -#: audits/signals_handler.py:142 +#: audits/signals_handler.py:144 msgid "Asset permission and SystemUser" msgstr "资产授权与系统用户" -#: audits/signals_handler.py:143 +#: audits/signals_handler.py:145 #, python-brace-format msgid "{AssetPermission} ADD {SystemUser}" msgstr "{AssetPermission} 添加 {SystemUser}" -#: audits/signals_handler.py:144 +#: audits/signals_handler.py:146 #, python-brace-format msgid "{AssetPermission} REMOVE {SystemUser}" msgstr "{AssetPermission} 移除 {SystemUser}" -#: audits/signals_handler.py:147 +#: audits/signals_handler.py:149 msgid "User application permissions" msgstr "用户应用授权" -#: audits/signals_handler.py:148 +#: audits/signals_handler.py:150 #, python-brace-format msgid "{ApplicationPermission} ADD {User}" msgstr "{ApplicationPermission} 添加 {User}" -#: audits/signals_handler.py:149 +#: audits/signals_handler.py:151 #, python-brace-format msgid "{ApplicationPermission} REMOVE {User}" msgstr "{ApplicationPermission} 移除 {User}" -#: audits/signals_handler.py:152 +#: audits/signals_handler.py:154 msgid "User group application permissions" msgstr "用户组应用授权" -#: audits/signals_handler.py:153 +#: audits/signals_handler.py:155 #, python-brace-format msgid "{ApplicationPermission} ADD {UserGroup}" msgstr "{ApplicationPermission} 添加 {UserGroup}" -#: audits/signals_handler.py:154 +#: audits/signals_handler.py:156 #, python-brace-format msgid "{ApplicationPermission} REMOVE {UserGroup}" msgstr "{ApplicationPermission} 移除 {UserGroup}" -#: audits/signals_handler.py:157 perms/models/application_permission.py:37 +#: audits/signals_handler.py:159 perms/models/application_permission.py:37 msgid "Application permission" msgstr "应用授权" -#: audits/signals_handler.py:158 +#: audits/signals_handler.py:160 #, python-brace-format msgid "{ApplicationPermission} ADD {Application}" msgstr "{ApplicationPermission} 添加 {Application}" -#: audits/signals_handler.py:159 +#: audits/signals_handler.py:161 #, python-brace-format msgid "{ApplicationPermission} REMOVE {Application}" msgstr "{ApplicationPermission} 移除 {Application}" -#: audits/signals_handler.py:162 +#: audits/signals_handler.py:164 msgid "Application permission and SystemUser" msgstr "应用授权与系统用户" -#: audits/signals_handler.py:163 +#: audits/signals_handler.py:165 #, python-brace-format msgid "{ApplicationPermission} ADD {SystemUser}" msgstr "{ApplicationPermission} 添加 {SystemUser}" -#: audits/signals_handler.py:164 +#: audits/signals_handler.py:166 #, python-brace-format msgid "{ApplicationPermission} REMOVE {SystemUser}" msgstr "{ApplicationPermission} 移除 {SystemUser}" @@ -2070,7 +2070,7 @@ msgstr "您的帐户刚刚绑定到" #: authentication/templates/authentication/_msg_oauth_bind.html:17 msgid "If the operation is not your own, unbind and change the password." -msgstr "" +msgstr "如果操作不是您本人,请解绑并且修改密码" #: authentication/templates/authentication/_msg_reset_password.html:6 msgid "" @@ -2592,60 +2592,60 @@ msgstr "" msgid "Unit: hour" msgstr "单位: 时" -#: ops/models/adhoc.py:35 +#: ops/models/adhoc.py:36 msgid "Callback" msgstr "回调" -#: ops/models/adhoc.py:154 +#: ops/models/adhoc.py:149 msgid "Tasks" msgstr "任务" -#: ops/models/adhoc.py:155 +#: ops/models/adhoc.py:150 msgid "Pattern" msgstr "模式" -#: ops/models/adhoc.py:156 +#: ops/models/adhoc.py:151 msgid "Options" msgstr "选项" -#: ops/models/adhoc.py:158 +#: ops/models/adhoc.py:153 msgid "Run as admin" msgstr "再次执行" -#: ops/models/adhoc.py:161 +#: ops/models/adhoc.py:156 msgid "Become" msgstr "Become" -#: ops/models/adhoc.py:162 +#: ops/models/adhoc.py:157 msgid "Create by" msgstr "创建者" -#: ops/models/adhoc.py:251 +#: ops/models/adhoc.py:246 msgid "Task display" msgstr "任务名称" -#: ops/models/adhoc.py:253 +#: ops/models/adhoc.py:248 msgid "Host amount" msgstr "主机数量" -#: ops/models/adhoc.py:255 +#: ops/models/adhoc.py:250 msgid "Start time" msgstr "开始时间" -#: ops/models/adhoc.py:256 +#: ops/models/adhoc.py:251 msgid "End time" msgstr "完成时间" -#: ops/models/adhoc.py:258 ops/models/command.py:28 +#: ops/models/adhoc.py:253 ops/models/command.py:28 #: terminal/serializers/session.py:39 msgid "Is finished" msgstr "是否完成" -#: ops/models/adhoc.py:260 +#: ops/models/adhoc.py:255 msgid "Adhoc raw result" msgstr "结果" -#: ops/models/adhoc.py:261 +#: ops/models/adhoc.py:256 msgid "Adhoc result summary" msgstr "汇总" @@ -4528,7 +4528,7 @@ msgid "Date left" msgstr "结束日期" #: terminal/models/sharing.py:91 -#: xpack/plugins/change_auth_plan/models/base.py:189 +#: xpack/plugins/change_auth_plan/models/base.py:192 msgid "Finished" msgstr "结束" @@ -5323,7 +5323,7 @@ msgid "Is first login" msgstr "首次登录" #: users/serializers/user.py:22 -#: xpack/plugins/change_auth_plan/models/base.py:32 +#: xpack/plugins/change_auth_plan/models/base.py:35 #: xpack/plugins/change_auth_plan/serializers/base.py:22 msgid "Password strategy" msgstr "密码策略" @@ -5762,6 +5762,11 @@ msgstr "应用" msgid "Application change auth plan task" msgstr "用用改密计划任务" +#: xpack/plugins/change_auth_plan/models/app.py:180 +#: xpack/plugins/change_auth_plan/models/asset.py:263 +msgid "Password cannot be set to blank, exit. " +msgstr "密码不能设置为空, 退出. " + #: xpack/plugins/change_auth_plan/models/asset.py:29 msgid "Append SSH KEY" msgstr "追加" @@ -5788,43 +5793,56 @@ msgstr "改密计划执行" msgid "Change auth plan task" msgstr "改密计划任务" -#: xpack/plugins/change_auth_plan/models/base.py:25 +#: xpack/plugins/change_auth_plan/models/asset.py:252 +msgid "This asset does not have a privileged user set: " +msgstr "该资产没有设置特权用户: " + +#: xpack/plugins/change_auth_plan/models/asset.py:258 +msgid "" +"The password and key of the current asset privileged user cannot be changed: " +msgstr "不能更改当前资产特权用户的密码及密钥: " + +#: xpack/plugins/change_auth_plan/models/asset.py:269 +msgid "Public key cannot be set to null, exit. " +msgstr "公钥不能设置为空, 退出. " + +#: xpack/plugins/change_auth_plan/models/base.py:28 msgid "All assets use the same random password" msgstr "使用相同的随机密码" -#: xpack/plugins/change_auth_plan/models/base.py:26 +#: xpack/plugins/change_auth_plan/models/base.py:29 msgid "All assets use different random password" msgstr "使用不同的随机密码" -#: xpack/plugins/change_auth_plan/models/base.py:36 +#: xpack/plugins/change_auth_plan/models/base.py:39 msgid "Password rules" msgstr "密码规则" -#: xpack/plugins/change_auth_plan/models/base.py:115 +#: xpack/plugins/change_auth_plan/models/base.py:118 msgid "Change auth plan snapshot" msgstr "改密计划快照" -#: xpack/plugins/change_auth_plan/models/base.py:184 +#: xpack/plugins/change_auth_plan/models/base.py:187 msgid "Ready" msgstr "准备" -#: xpack/plugins/change_auth_plan/models/base.py:185 +#: xpack/plugins/change_auth_plan/models/base.py:188 msgid "Preflight check" msgstr "改密前的校验" -#: xpack/plugins/change_auth_plan/models/base.py:186 +#: xpack/plugins/change_auth_plan/models/base.py:189 msgid "Change auth" msgstr "执行改密" -#: xpack/plugins/change_auth_plan/models/base.py:187 +#: xpack/plugins/change_auth_plan/models/base.py:190 msgid "Verify auth" msgstr "验证密码/密钥" -#: xpack/plugins/change_auth_plan/models/base.py:188 +#: xpack/plugins/change_auth_plan/models/base.py:191 msgid "Keep auth" msgstr "保存密码/密钥" -#: xpack/plugins/change_auth_plan/models/base.py:196 +#: xpack/plugins/change_auth_plan/models/base.py:199 msgid "Step" msgstr "步骤" @@ -6344,27 +6362,3 @@ msgstr "旗舰版" #: xpack/plugins/license/models.py:77 msgid "Community edition" msgstr "社区版" - -#~ msgid "MFA type not support: {}" -#~ msgstr "MFA 类型不支持:{}" - -#~ msgid "Push system users to asset: {}({}) => {}" -#~ msgstr "推送系统用户到入资产: {}({}) => {}" - -#~ msgid "Test system user connectivity: {} => {}" -#~ msgstr "测试系统用户可连接性: {} => {}" - -#~ msgid "Account backup plan execution" -#~ msgstr "改密计划执行" - -#~ msgid "Account backup plan task" -#~ msgstr "改密计划任务" - -#~ msgid "Escape route plan" -#~ msgstr "改密计划" - -#~ msgid "Escape route execution" -#~ msgstr "改密计划执行" - -#~ msgid "Escape route plan task" -#~ msgstr "改密计划任务" diff --git a/apps/ops/models/adhoc.py b/apps/ops/models/adhoc.py index 3e95799b5..d1bb8c7f9 100644 --- a/apps/ops/models/adhoc.py +++ b/apps/ops/models/adhoc.py @@ -12,6 +12,7 @@ from django.utils import timezone from django.utils.translation import ugettext_lazy as _, gettext from common.utils import get_logger, lazyproperty +from common.utils.translate import translate_value from common.fields.model import ( JsonListTextField, JsonDictCharField, EncryptJsonDictCharField, JsonDictTextField, @@ -60,14 +61,8 @@ class Task(PeriodTaskModelMixin, OrgModelMixin): @lazyproperty def display_name(self): - sps = ['. ', ': '] - spb = {str(sp in self.name): sp for sp in sps} - sp = spb.get('True') - if not sp: - return self.name - - tpl, data = self.name.split(sp, 1) - return gettext(tpl + sp) + data + value = translate_value(self.name) + return value @property def timedelta(self): diff --git a/apps/orgs/mixins/models.py b/apps/orgs/mixins/models.py index 8176cb439..d3dc4529d 100644 --- a/apps/orgs/mixins/models.py +++ b/apps/orgs/mixins/models.py @@ -14,7 +14,7 @@ from ..models import Organization logger = get_logger(__file__) __all__ = [ - 'OrgManager', 'OrgModelMixin', + 'OrgManager', 'OrgModelMixin', 'Organization' ] diff --git a/apps/terminal/backends/command/es.py b/apps/terminal/backends/command/es.py index 7863dbbfb..d74ad3fa8 100644 --- a/apps/terminal/backends/command/es.py +++ b/apps/terminal/backends/command/es.py @@ -84,6 +84,12 @@ class CommandStore(): }, "org_id": { "type": "keyword" + }, + "@timestamp": { + "type": "date" + }, + "timestamp": { + "type": "long" } } } diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 8f9eb3f42..480e19dac 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -62,7 +62,7 @@ pytz==2018.3 PyYAML==6.0 redis==3.5.3 requests==2.25.1 -jms-storage==0.0.40 +jms-storage==0.0.41 s3transfer==0.5.0 simplejson==3.13.2 six==1.11.0