From 49a35985a141e5e330ba1fc9d3dcbadf37afae3b Mon Sep 17 00:00:00 2001 From: xinwen Date: Thu, 22 Jul 2021 19:53:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A4=9A=E5=AF=B9=E5=A4=9A=E5=85=B3?= =?UTF-8?q?=E7=B3=BB=E6=B7=BB=E5=8A=A0=E5=AE=A1=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/audits/signals_handler.py | 120 +++++++++++++++- apps/locale/zh/LC_MESSAGES/django.mo | Bin 76678 -> 79608 bytes apps/locale/zh/LC_MESSAGES/django.po | 207 +++++++++++++++++++++++---- 3 files changed, 298 insertions(+), 29 deletions(-) diff --git a/apps/audits/signals_handler.py b/apps/audits/signals_handler.py index 5f94fb42a..05de237d3 100644 --- a/apps/audits/signals_handler.py +++ b/apps/audits/signals_handler.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -from django.db.models.signals import post_save, post_delete +from django.db.models.signals import post_save, post_delete, m2m_changed from django.dispatch import receiver from django.conf import settings from django.db import transaction @@ -11,6 +11,8 @@ from django.utils.translation import ugettext_lazy as _ from rest_framework.renderers import JSONRenderer from rest_framework.request import Request +from assets.models import Asset +from common.const.signals import POST_ADD, POST_REMOVE, POST_CLEAR from jumpserver.utils import current_request from common.utils import get_request_ip, get_logger, get_syslogger from users.models import User @@ -20,6 +22,9 @@ from terminal.models import Session, Command from common.utils.encode import model_to_json from .utils import write_login_log from . import models +from .models import OperateLog +from orgs.utils import current_org +from perms.models import AssetPermission, ApplicationPermission logger = get_logger(__name__) sys_logger = get_syslogger(__name__) @@ -90,6 +95,119 @@ def create_operate_log(action, sender, resource): logger.error("Create operate log error: {}".format(e)) +M2M_NEED_RECORD = { + 'OrganizationMember': ( + _('User and Organization'), + _('{User} *JOINED* {Organization}'), + _('{User} *LEFT* {Organization}') + ), + User.groups.through._meta.object_name: ( + _('User and Group'), + _('{User} *JOINED* {UserGroup}'), + _('{User} *LEFT* {UserGroup}') + ), + Asset.nodes.through._meta.object_name: ( + _('Node and Asset'), + _('{Node} *ADD* {Asset}'), + _('{Node} *REMOVE* {Asset}') + ), + AssetPermission.users.through._meta.object_name: ( + _('User asset permissions'), + _('{AssetPermission} *ADD* {User}'), + _('{AssetPermission} *REMOVE* {User}'), + ), + AssetPermission.user_groups.through._meta.object_name: ( + _('User group asset permissions'), + _('{AssetPermission} *ADD* {UserGroup}'), + _('{AssetPermission} *REMOVE* {UserGroup}'), + ), + AssetPermission.assets.through._meta.object_name: ( + _('Asset permission'), + _('{AssetPermission} *ADD* {Asset}'), + _('{AssetPermission} *REMOVE* {Asset}'), + ), + AssetPermission.nodes.through._meta.object_name: ( + _('Node permission'), + _('{AssetPermission} *ADD* {Node}'), + _('{AssetPermission} *REMOVE* {Node}'), + ), + AssetPermission.system_users.through._meta.object_name: ( + _('Asset permission and SystemUser'), + _('{AssetPermission} *ADD* {SystemUser}'), + _('{AssetPermission} *REMOVE* {SystemUser}'), + ), + ApplicationPermission.users.through._meta.object_name: ( + _('User application permissions'), + _('{ApplicationPermission} *ADD* {User}'), + _('{ApplicationPermission} *REMOVE* {User}'), + ), + ApplicationPermission.user_groups.through._meta.object_name: ( + _('User group application permissions'), + _('{ApplicationPermission} *ADD* {UserGroup}'), + _('{ApplicationPermission} *REMOVE* {UserGroup}'), + ), + ApplicationPermission.applications.through._meta.object_name: ( + _('Application permission'), + _('{ApplicationPermission} *ADD* {Application}'), + _('{ApplicationPermission} *REMOVE* {Application}'), + ), + ApplicationPermission.system_users.through._meta.object_name: ( + _('Application permission and SystemUser'), + _('{ApplicationPermission} *ADD* {SystemUser}'), + _('{ApplicationPermission} *REMOVE* {SystemUser}'), + ), +} + + +M2M_ACTION = { + POST_ADD: 'add', + POST_REMOVE: 'remove', + POST_CLEAR: 'remove', +} + + +@receiver(m2m_changed) +def on_m2m_changed(sender, action, instance, reverse, model, pk_set, **kwargs): + if action not in M2M_ACTION: + return + + user = current_request.user if current_request else None + if not user or not user.is_authenticated: + return + + sender_name = sender._meta.object_name + if sender_name in M2M_NEED_RECORD: + action = M2M_ACTION[action] + org_id = current_org.id + remote_addr = get_request_ip(current_request) + user = str(user) + resource_type, resource_tmpl_add, resource_tmpl_remove = M2M_NEED_RECORD[sender_name] + if action == 'add': + resource_tmpl = resource_tmpl_add + elif action == 'remove': + resource_tmpl = resource_tmpl_remove + + to_create = [] + objs = model.objects.filter(pk__in=pk_set) + + instance_name = instance._meta.object_name + instance_value = str(instance) + + model_name = model._meta.object_name + + for obj in objs: + resource = resource_tmpl.format(**{ + instance_name: instance_value, + model_name: str(obj) + }) + + to_create.append(OperateLog( + user=user, action=action, resource_type=resource_type, + resource=resource, remote_addr=remote_addr, org_id=org_id + )) + OperateLog.objects.bulk_create(to_create) + + @receiver(post_save) def on_object_created_or_update(sender, instance=None, created=False, update_fields=None, **kwargs): # last_login 改变是最后登录日期, 每次登录都会改变 diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 07fed0963279780d2bdf3efdfbe3c7433a76d56d..3239dd59c23ec0477519d0fa76e66ebc2bacc8a5 100644 GIT binary patch delta 25274 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 diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 013697fec..c1b36c65f 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: 2021-07-26 15:48+0800\n" +"POT-Creation-Date: 2021-07-26 17:56+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -140,7 +140,7 @@ msgstr "审批人" msgid "Login asset confirm" msgstr "登录资产复核" -#: acls/serializers/login_acl.py:18 xpack/plugins/cloud/serializers.py:164 +#: acls/serializers/login_acl.py:18 xpack/plugins/cloud/serializers.py:165 msgid "IP address invalid: `{}`" msgstr "IP 地址无效: `{}`" @@ -330,7 +330,7 @@ msgstr "目标URL" #: applications/serializers/attrs/application_type/custom.py:25 #: applications/serializers/attrs/application_type/mysql_workbench.py:34 #: applications/serializers/attrs/application_type/vmware_client.py:30 -#: assets/models/base.py:177 audits/signals_handler.py:58 +#: assets/models/base.py:177 audits/signals_handler.py:63 #: authentication/forms.py:22 #: authentication/templates/authentication/login.html:164 #: settings/serializers/settings.py:94 users/forms/profile.py:21 @@ -392,7 +392,7 @@ msgstr "系统平台" #: assets/models/asset.py:186 assets/serializers/asset.py:65 #: perms/serializers/asset/user_permission.py:41 -#: xpack/plugins/cloud/models.py:99 xpack/plugins/cloud/serializers.py:182 +#: xpack/plugins/cloud/models.py:99 xpack/plugins/cloud/serializers.py:183 msgid "Protocols" msgstr "协议组" @@ -411,7 +411,7 @@ msgstr "激活" #: assets/models/asset.py:193 assets/models/cluster.py:19 #: assets/models/user.py:191 assets/models/user.py:326 templates/_nav.html:44 -#: xpack/plugins/cloud/models.py:96 xpack/plugins/cloud/serializers.py:204 +#: xpack/plugins/cloud/models.py:96 xpack/plugins/cloud/serializers.py:205 msgid "Admin user" msgstr "特权用户" @@ -713,7 +713,7 @@ msgstr "ssh私钥" #: users/templates/users/user_asset_permission.html:41 #: users/templates/users/user_asset_permission.html:73 #: users/templates/users/user_asset_permission.html:158 -#: xpack/plugins/cloud/models.py:93 xpack/plugins/cloud/serializers.py:205 +#: xpack/plugins/cloud/models.py:93 xpack/plugins/cloud/serializers.py:206 msgid "Node" msgstr "节点" @@ -1198,30 +1198,190 @@ msgstr "运行用户" msgid "User display" msgstr "用户" -#: audits/signals_handler.py:57 +#: audits/signals_handler.py:62 msgid "SSH Key" msgstr "SSH 密钥" -#: audits/signals_handler.py:59 +#: audits/signals_handler.py:64 msgid "SSO" msgstr "" -#: audits/signals_handler.py:60 +#: audits/signals_handler.py:65 msgid "Auth Token" msgstr "认证令牌" -#: audits/signals_handler.py:61 +#: audits/signals_handler.py:66 #: authentication/templates/authentication/login.html:210 #: notifications/backends/__init__.py:12 msgid "WeCom" msgstr "企业微信" -#: audits/signals_handler.py:62 +#: audits/signals_handler.py:67 #: authentication/templates/authentication/login.html:215 #: notifications/backends/__init__.py:13 msgid "DingTalk" msgstr "钉钉" +#: audits/signals_handler.py:100 +msgid "User and Organization" +msgstr "用户与组织" + +#: audits/signals_handler.py:101 +#, python-brace-format +msgid "{User} *JOINED* {Organization}" +msgstr "{User} *加入了* {Organization}" + +#: audits/signals_handler.py:102 +msgid "{User} *LEFT* {Organization}" +msgstr "{User} *离开了* {Organization}" + +#: audits/signals_handler.py:105 +msgid "User and Group" +msgstr "用户与用户组" + +#: audits/signals_handler.py:106 +#, python-brace-format +msgid "{User} *JOINED* {UserGroup}" +msgstr "{User} *加入了* {UserGroup}" + +#: audits/signals_handler.py:107 +#, python-brace-format +msgid "{User} *LEFT* {UserGroup}" +msgstr "{User} *离开了* {UserGroup}" + +#: audits/signals_handler.py:110 +msgid "Node and Asset" +msgstr "节点与资产" + +#: audits/signals_handler.py:111 +#, python-brace-format +msgid "{Node} *ADD* {Asset}" +msgstr "{Node} *添加了* {Asset}" + +#: audits/signals_handler.py:112 +#, python-brace-format +msgid "{Node} *REMOVE* {Asset}" +msgstr "{Node} *移除了* {Asset}" + +#: audits/signals_handler.py:115 +msgid "User asset permissions" +msgstr "用户资产授权" + +#: audits/signals_handler.py:116 +msgid "{AssetPermission} *ADD* {User}" +msgstr "{AssetPermission} *添加了* {User}" + +#: audits/signals_handler.py:117 +#, python-brace-format +msgid "{AssetPermission} *REMOVE* {User}" +msgstr "{AssetPermission} *移除了* {User}" + +#: audits/signals_handler.py:120 +msgid "User group asset permissions" +msgstr "用户组资产授权" + +#: audits/signals_handler.py:121 +#, python-brace-format +msgid "{AssetPermission} *ADD* {UserGroup}" +msgstr "{AssetPermission} *添加了* {UserGroup}" + +#: audits/signals_handler.py:122 +#, python-brace-format +msgid "{AssetPermission} *REMOVE* {UserGroup}" +msgstr "{AssetPermission} *移除了* {UserGroup}" + +#: audits/signals_handler.py:125 perms/models/asset_permission.py:106 +#: templates/_nav.html:78 users/templates/users/_user_detail_nav_header.html:31 +msgid "Asset permission" +msgstr "资产授权" + +#: audits/signals_handler.py:126 +#, python-brace-format +msgid "{AssetPermission} *ADD* {Asset}" +msgstr "{AssetPermission} *添加了* {Asset}" + +#: audits/signals_handler.py:127 +#, python-brace-format +msgid "{AssetPermission} *REMOVE* {Asset}" +msgstr "{AssetPermission} *移除了* {Asset}" + +#: audits/signals_handler.py:130 +msgid "Node permission" +msgstr "节点授权" + +#: audits/signals_handler.py:131 +msgid "{AssetPermission} *ADD* {Node}" +msgstr "{AssetPermission} *添加了* {Node}" + +#: audits/signals_handler.py:132 +#, python-brace-format +msgid "{AssetPermission} *REMOVE* {Node}" +msgstr "{AssetPermission} *移除了* {Node}" + +#: audits/signals_handler.py:135 +msgid "Asset permission and SystemUser" +msgstr "资产授权与系统用户" + +#: audits/signals_handler.py:136 +#, python-brace-format +msgid "{AssetPermission} *ADD* {SystemUser}" +msgstr "{AssetPermission} *添加了* {SystemUser}" + +#: audits/signals_handler.py:137 +#, python-brace-format +msgid "{AssetPermission} *REMOVE* {SystemUser}" +msgstr "{AssetPermission} *移除了* {SystemUser}" + +#: audits/signals_handler.py:140 +msgid "User application permissions" +msgstr "用户应用授权" + +#: audits/signals_handler.py:141 +msgid "{ApplicationPermission} *ADD* {User}" +msgstr "{ApplicationPermission} *添加了* {User}" + +#: audits/signals_handler.py:142 +msgid "{ApplicationPermission} *REMOVE* {User}" +msgstr "{ApplicationPermission} *移除了* {User}" + +#: audits/signals_handler.py:145 +msgid "User group application permissions" +msgstr "用户组应用授权" + +#: audits/signals_handler.py:146 +msgid "{ApplicationPermission} *ADD* {UserGroup}" +msgstr "{ApplicationPermission} *添加了* {UserGroup}" + +#: audits/signals_handler.py:147 +msgid "{ApplicationPermission} *REMOVE* {UserGroup}" +msgstr "{ApplicationPermission} *移除了* {UserGroup}" + +#: audits/signals_handler.py:150 perms/models/application_permission.py:36 +msgid "Application permission" +msgstr "应用管理" + +#: audits/signals_handler.py:151 +msgid "{ApplicationPermission} *ADD* {Application}" +msgstr "{ApplicationPermission} *添加了* {Application}" + +#: audits/signals_handler.py:152 +#, python-brace-format +msgid "{ApplicationPermission} *REMOVE* {Application}" +msgstr "{ApplicationPermission} *移除了* {Application}" + +#: audits/signals_handler.py:155 +msgid "Application permission and SystemUser" +msgstr "应用授权与系统用户" + +#: audits/signals_handler.py:156 +msgid "{ApplicationPermission} *ADD* {SystemUser}" +msgstr "{ApplicationPermission} *添加了* {SystemUser}" + +#: audits/signals_handler.py:157 +#, python-brace-format +msgid "{ApplicationPermission} *REMOVE* {SystemUser}" +msgstr "{ApplicationPermission} *移除了* {SystemUser}" + #: authentication/api/connection_token.py:258 msgid "Invalid token" msgstr "无效的令牌" @@ -2043,10 +2203,6 @@ msgstr "该授权暂时不能撤销" msgid "Application" msgstr "应用程序" -#: perms/models/application_permission.py:36 -msgid "Application permission" -msgstr "应用管理" - #: perms/models/asset_permission.py:37 settings/serializers/settings.py:117 msgid "All" msgstr "全部" @@ -2084,11 +2240,6 @@ msgstr "剪贴板复制粘贴" msgid "Actions" msgstr "动作" -#: perms/models/asset_permission.py:106 templates/_nav.html:78 -#: users/templates/users/_user_detail_nav_header.html:31 -msgid "Asset permission" -msgstr "资产授权" - #: perms/models/asset_permission.py:209 msgid "Ungrouped" msgstr "未分组" @@ -4794,11 +4945,11 @@ msgstr "云服务商" msgid "Cloud account" msgstr "云账号" -#: xpack/plugins/cloud/models.py:82 xpack/plugins/cloud/serializers.py:203 +#: xpack/plugins/cloud/models.py:82 xpack/plugins/cloud/serializers.py:204 msgid "Account" msgstr "账户" -#: xpack/plugins/cloud/models.py:85 xpack/plugins/cloud/serializers.py:178 +#: xpack/plugins/cloud/models.py:85 xpack/plugins/cloud/serializers.py:179 msgid "Regions" msgstr "地域" @@ -4806,11 +4957,11 @@ msgstr "地域" msgid "Hostname strategy" msgstr "主机名策略" -#: xpack/plugins/cloud/models.py:102 xpack/plugins/cloud/serializers.py:185 +#: xpack/plugins/cloud/models.py:102 xpack/plugins/cloud/serializers.py:186 msgid "IP network segment group" msgstr "IP网段组" -#: xpack/plugins/cloud/models.py:105 xpack/plugins/cloud/serializers.py:207 +#: xpack/plugins/cloud/models.py:105 xpack/plugins/cloud/serializers.py:208 msgid "Always update" msgstr "总是更新" @@ -5010,7 +5161,7 @@ msgstr "这个字段是必填项" msgid "API Endpoint" msgstr "API 端点" -#: xpack/plugins/cloud/serializers.py:170 +#: xpack/plugins/cloud/serializers.py:171 msgid "" "The IP address that is first matched to will be used as the IP of the " "created asset.
The default * indicates a random match.
Format for " @@ -5019,15 +5170,15 @@ msgstr "" "第一个匹配到的 IP 地址将被用作创建的资产的 IP。
默认值 * 表示随机匹配。" "
格式为以逗号分隔的字符串,例如:192.168.1.0/24,10.1.1.1-10.1.1.20" -#: xpack/plugins/cloud/serializers.py:176 +#: xpack/plugins/cloud/serializers.py:177 msgid "History count" msgstr "执行次数" -#: xpack/plugins/cloud/serializers.py:177 +#: xpack/plugins/cloud/serializers.py:178 msgid "Instance count" msgstr "实例个数" -#: xpack/plugins/cloud/serializers.py:206 +#: xpack/plugins/cloud/serializers.py:207 #: xpack/plugins/gathered_user/serializers.py:20 msgid "Periodic display" msgstr "定时执行"