From 1bc913ab1367d8c08e47d57e99153c121220717c Mon Sep 17 00:00:00 2001 From: xinwen Date: Tue, 21 Jul 2020 12:37:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(perms):=20=E8=B5=84=E4=BA=A7=E6=8E=88?= =?UTF-8?q?=E6=9D=83=E6=B7=BB=E5=8A=A0GUI=E5=A4=8D=E5=88=B6=E7=B2=98?= =?UTF-8?q?=E8=B4=B4=E5=8A=A8=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/locale/zh/LC_MESSAGES/django.mo | Bin 55230 -> 55392 bytes apps/locale/zh/LC_MESSAGES/django.po | 106 ++++++++++-------- .../migrations/0011_auto_20200721_1739.py | 28 +++++ apps/perms/models/asset_permission.py | 20 +++- 4 files changed, 105 insertions(+), 49 deletions(-) create mode 100644 apps/perms/migrations/0011_auto_20200721_1739.py diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 0337649da0092020c18e8181d5235a60bebd6803..8fb1a75b49efdaf650b27b6d6e8ee016aab7d2dd 100644 GIT binary patch delta 16748 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 delta 16617 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 diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index c311e0a7f..b819ee494 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: 2020-07-15 17:13+0800\n" +"POT-Creation-Date: 2020-07-21 16:29+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -46,7 +46,7 @@ msgstr "自定义" msgid "Name" msgstr "名称" -#: applications/models/database_app.py:22 assets/models/cmd_filter.py:51 +#: applications/models/database_app.py:22 assets/models/cmd_filter.py:52 #: terminal/models.py:376 terminal/models.py:413 tickets/models/ticket.py:45 #: users/templates/users/user_granted_database_app.html:35 msgid "Type" @@ -72,7 +72,7 @@ msgstr "数据库" #: applications/models/database_app.py:33 applications/models/remote_app.py:45 #: assets/models/asset.py:150 assets/models/asset.py:226 #: assets/models/base.py:237 assets/models/cluster.py:29 -#: assets/models/cmd_filter.py:23 assets/models/cmd_filter.py:56 +#: assets/models/cmd_filter.py:23 assets/models/cmd_filter.py:57 #: assets/models/domain.py:21 assets/models/domain.py:54 #: assets/models/group.py:23 assets/models/label.py:23 ops/models/adhoc.py:37 #: orgs/models.py:18 perms/models/base.py:56 settings/models.py:32 @@ -104,7 +104,7 @@ msgstr "数据库应用" #: assets/serializers/admin_user.py:32 assets/serializers/asset_user.py:47 #: assets/serializers/asset_user.py:84 assets/serializers/system_user.py:44 #: assets/serializers/system_user.py:176 audits/models.py:38 -#: perms/forms/asset_permission.py:89 perms/models/asset_permission.py:80 +#: perms/forms/asset_permission.py:89 perms/models/asset_permission.py:90 #: templates/index.html:82 terminal/backends/command/models.py:19 #: terminal/backends/command/serializers.py:13 terminal/models.py:187 #: users/templates/users/user_asset_permission.html:40 @@ -130,7 +130,7 @@ msgstr "参数" #: applications/models/remote_app.py:39 assets/models/asset.py:224 #: assets/models/base.py:240 assets/models/cluster.py:28 -#: assets/models/cmd_filter.py:26 assets/models/cmd_filter.py:59 +#: assets/models/cmd_filter.py:26 assets/models/cmd_filter.py:60 #: assets/models/group.py:21 common/mixins/models.py:49 orgs/models.py:16 #: perms/models/base.py:54 users/models/user.py:508 #: users/serializers/group.py:35 users/templates/users/user_detail.html:97 @@ -233,7 +233,7 @@ msgid "Domain" msgstr "网域" #: assets/models/asset.py:195 assets/models/user.py:109 -#: perms/models/asset_permission.py:81 +#: perms/models/asset_permission.py:91 #: xpack/plugins/change_auth_plan/models.py:56 #: xpack/plugins/gathered_user/models.py:24 msgid "Nodes" @@ -247,7 +247,7 @@ msgstr "激活" #: assets/models/asset.py:199 assets/models/cluster.py:19 #: assets/models/user.py:65 templates/_nav.html:44 -#: xpack/plugins/cloud/models.py:133 xpack/plugins/cloud/serializers.py:82 +#: xpack/plugins/cloud/models.py:133 xpack/plugins/cloud/serializers.py:83 msgid "Admin user" msgstr "管理用户" @@ -441,48 +441,48 @@ msgstr "北京电信" msgid "BGP full netcom" msgstr "BGP全网通" -#: assets/models/cmd_filter.py:32 assets/models/user.py:119 +#: assets/models/cmd_filter.py:33 assets/models/user.py:119 msgid "Command filter" msgstr "命令过滤器" -#: assets/models/cmd_filter.py:39 +#: assets/models/cmd_filter.py:40 msgid "Regex" msgstr "正则表达式" -#: assets/models/cmd_filter.py:40 ops/models/command.py:23 +#: assets/models/cmd_filter.py:41 ops/models/command.py:23 #: terminal/backends/command/serializers.py:15 terminal/models.py:196 msgid "Command" msgstr "命令" -#: assets/models/cmd_filter.py:45 +#: assets/models/cmd_filter.py:46 msgid "Deny" msgstr "拒绝" -#: assets/models/cmd_filter.py:46 +#: assets/models/cmd_filter.py:47 msgid "Allow" msgstr "允许" -#: assets/models/cmd_filter.py:50 +#: assets/models/cmd_filter.py:51 msgid "Filter" msgstr "过滤器" -#: assets/models/cmd_filter.py:52 assets/models/user.py:113 +#: assets/models/cmd_filter.py:53 assets/models/user.py:113 msgid "Priority" msgstr "优先级" -#: assets/models/cmd_filter.py:52 +#: assets/models/cmd_filter.py:53 msgid "1-100, the higher will be match first" msgstr "优先级可选范围为1-100,1最低优先级,100最高优先级" -#: assets/models/cmd_filter.py:54 xpack/plugins/license/models.py:29 +#: assets/models/cmd_filter.py:55 xpack/plugins/license/models.py:29 msgid "Content" msgstr "内容" -#: assets/models/cmd_filter.py:54 +#: assets/models/cmd_filter.py:55 msgid "One line one command" msgstr "每行一个命令" -#: assets/models/cmd_filter.py:55 audits/models.py:57 +#: assets/models/cmd_filter.py:56 audits/models.py:57 #: authentication/templates/authentication/_access_key_modal.html:34 #: perms/forms/asset_permission.py:20 #: tickets/serializers/request_asset_perm.py:54 @@ -497,7 +497,7 @@ msgstr "每行一个命令" msgid "Action" msgstr "动作" -#: assets/models/cmd_filter.py:63 +#: assets/models/cmd_filter.py:64 msgid "Command filter rule" msgstr "命令过滤规则" @@ -590,7 +590,7 @@ msgstr "键" #: 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:129 xpack/plugins/cloud/serializers.py:83 +#: xpack/plugins/cloud/models.py:129 xpack/plugins/cloud/serializers.py:84 msgid "Node" msgstr "节点" @@ -643,7 +643,7 @@ msgstr "SFTP根路径" #: assets/models/user.py:195 audits/models.py:39 #: perms/forms/asset_permission.py:95 perms/forms/remote_app_permission.py:49 -#: perms/models/asset_permission.py:82 +#: perms/models/asset_permission.py:92 #: perms/models/database_app_permission.py:22 #: perms/models/remote_app_permission.py:16 templates/_nav.html:45 #: terminal/backends/command/models.py:20 @@ -1000,7 +1000,7 @@ msgstr "Agent" #: authentication/templates/authentication/_mfa_confirm_modal.html:14 #: authentication/templates/authentication/login_otp.html:6 #: users/forms/profile.py:52 users/models/user.py:489 -#: users/serializers/user.py:216 users/templates/users/user_detail.html:77 +#: users/serializers/user.py:220 users/templates/users/user_detail.html:77 #: users/templates/users/user_profile.html:87 msgid "MFA" msgstr "多因子认证" @@ -1224,7 +1224,7 @@ msgid "Show" msgstr "显示" #: authentication/templates/authentication/_access_key_modal.html:66 -#: users/models/user.py:387 users/serializers/user.py:213 +#: users/models/user.py:387 users/serializers/user.py:217 #: users/templates/users/user_profile.html:94 #: users/templates/users/user_profile.html:163 #: users/templates/users/user_profile.html:166 @@ -1233,7 +1233,7 @@ msgid "Disable" msgstr "禁用" #: authentication/templates/authentication/_access_key_modal.html:67 -#: users/models/user.py:388 users/serializers/user.py:214 +#: users/models/user.py:388 users/serializers/user.py:218 #: users/templates/users/user_profile.html:92 #: users/templates/users/user_profile.html:170 msgid "Enable" @@ -1675,31 +1675,43 @@ msgstr "资产和节点至少选一个" msgid "System users" msgstr "系统用户" -#: perms/models/asset_permission.py:31 settings/serializers/settings.py:56 +#: perms/models/asset_permission.py:35 settings/serializers/settings.py:56 msgid "All" msgstr "全部" -#: perms/models/asset_permission.py:32 +#: perms/models/asset_permission.py:36 msgid "Connect" msgstr "连接" -#: perms/models/asset_permission.py:33 +#: perms/models/asset_permission.py:37 msgid "Upload file" msgstr "上传文件" -#: perms/models/asset_permission.py:34 +#: perms/models/asset_permission.py:38 msgid "Download file" msgstr "下载文件" -#: perms/models/asset_permission.py:35 +#: perms/models/asset_permission.py:39 msgid "Upload download" msgstr "上传下载" -#: perms/models/asset_permission.py:83 +#: perms/models/asset_permission.py:40 +msgid "Clipboard copy" +msgstr "剪切板复制" + +#: perms/models/asset_permission.py:41 +msgid "Clipboard paste" +msgstr "剪切板粘贴" + +#: perms/models/asset_permission.py:42 +msgid "Clipboard copy paste" +msgstr "剪切板复制粘贴" + +#: perms/models/asset_permission.py:93 msgid "Actions" msgstr "动作" -#: perms/models/asset_permission.py:87 templates/_nav.html:78 +#: perms/models/asset_permission.py:97 templates/_nav.html:78 #: users/templates/users/_user_detail_nav_header.html:31 msgid "Asset permission" msgstr "资产授权" @@ -2704,8 +2716,8 @@ msgid "Public key should not be the same as your old one." msgstr "不能和原来的密钥相同" #: users/forms/profile.py:137 users/forms/user.py:90 -#: users/serializers/user.py:177 users/serializers/user.py:258 -#: users/serializers/user.py:316 +#: users/serializers/user.py:181 users/serializers/user.py:262 +#: users/serializers/user.py:320 msgid "Not a valid ssh public key" msgstr "SSH密钥不合法" @@ -2795,7 +2807,7 @@ msgstr "最后更新密码日期" msgid "Administrator is the super user of system" msgstr "Administrator是初始的超级管理员" -#: users/serializers/user.py:69 users/serializers/user.py:229 +#: users/serializers/user.py:69 users/serializers/user.py:233 msgid "Is first login" msgstr "首次登录" @@ -2823,19 +2835,19 @@ msgstr "用户来源名" msgid "Role name" msgstr "角色名" -#: users/serializers/user.py:97 +#: users/serializers/user.py:101 msgid "Role limit to {}" msgstr "角色只能为 {}" -#: users/serializers/user.py:109 users/serializers/user.py:282 +#: users/serializers/user.py:113 users/serializers/user.py:286 msgid "Password does not match security rules" msgstr "密码不满足安全规则" -#: users/serializers/user.py:274 +#: users/serializers/user.py:278 msgid "The old password is incorrect" msgstr "旧密码错误" -#: users/serializers/user.py:288 +#: users/serializers/user.py:292 msgid "The newly set password is inconsistent" msgstr "两次密码不一致" @@ -2849,7 +2861,7 @@ 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:119 xpack/plugins/cloud/serializers.py:81 +#: xpack/plugins/cloud/models.py:119 xpack/plugins/cloud/serializers.py:82 msgid "Account" msgstr "账户" @@ -3736,7 +3748,7 @@ msgstr "" msgid "Cloud account" msgstr "云账号" -#: xpack/plugins/cloud/models.py:122 xpack/plugins/cloud/serializers.py:58 +#: xpack/plugins/cloud/models.py:122 xpack/plugins/cloud/serializers.py:59 msgid "Regions" msgstr "地域" @@ -3744,7 +3756,7 @@ msgstr "地域" msgid "Instances" msgstr "实例" -#: xpack/plugins/cloud/models.py:137 xpack/plugins/cloud/serializers.py:85 +#: xpack/plugins/cloud/models.py:137 xpack/plugins/cloud/serializers.py:86 msgid "Always update" msgstr "总是更新" @@ -3860,15 +3872,15 @@ msgstr "拉美-圣地亚哥" msgid "Tencent Cloud" msgstr "腾讯云" -#: xpack/plugins/cloud/serializers.py:56 +#: xpack/plugins/cloud/serializers.py:57 msgid "History count" msgstr "执行次数" -#: xpack/plugins/cloud/serializers.py:57 +#: xpack/plugins/cloud/serializers.py:58 msgid "Instance count" msgstr "实例个数" -#: xpack/plugins/cloud/serializers.py:84 +#: xpack/plugins/cloud/serializers.py:85 #: xpack/plugins/gathered_user/serializers.py:20 msgid "Periodic display" msgstr "定时执行" @@ -3957,6 +3969,12 @@ msgstr "企业版" msgid "Ultimate edition" msgstr "旗舰版" +#~ msgid "GUI copy" +#~ msgstr "GUI 复制" + +#~ msgid "GUI paste" +#~ msgstr "GUI 粘贴" + #~ msgid "Covered always" #~ msgstr "总是被覆盖" diff --git a/apps/perms/migrations/0011_auto_20200721_1739.py b/apps/perms/migrations/0011_auto_20200721_1739.py new file mode 100644 index 000000000..7e6b37188 --- /dev/null +++ b/apps/perms/migrations/0011_auto_20200721_1739.py @@ -0,0 +1,28 @@ +# Generated by Django 2.2.10 on 2020-07-21 09:39 + +from django.db import migrations, models + +from django.db.models import F +from ..models.asset_permission import Action + + +def migrate_asset_permission(apps, schema_editor): + # 已有的资产权限默认拥有剪切板复制粘贴动作 + AssetPermission = apps.get_model('perms', 'AssetPermission') + AssetPermission.objects.all().update(actions=F('actions').bitor(Action.CLIPBOARD_COPY_PASTE)) + + +class Migration(migrations.Migration): + + dependencies = [ + ('perms', '0010_auto_20191218_1705'), + ] + + operations = [ + migrations.AlterField( + model_name='assetpermission', + name='actions', + field=models.IntegerField(choices=[(255, 'All'), (1, 'Connect'), (2, 'Upload file'), (4, 'Download file'), (6, 'Upload download'), (8, 'Clipboard copy'), (16, 'Clipboard paste'), (24, 'Clipboard copy paste')], default=255, verbose_name='Actions'), + ), + migrations.RunPython(migrate_asset_permission) + ] diff --git a/apps/perms/models/asset_permission.py b/apps/perms/models/asset_permission.py index 8552edc74..f2755a568 100644 --- a/apps/perms/models/asset_permission.py +++ b/apps/perms/models/asset_permission.py @@ -21,11 +21,15 @@ logger = logging.getLogger(__name__) class Action: NONE = 0 - CONNECT = 0b00000001 - UPLOAD = 0b00000010 - DOWNLOAD = 0b00000100 + + CONNECT = 0b1 + UPLOAD = 0b1 << 1 + DOWNLOAD = 0b1 << 2 + CLIPBOARD_COPY = 0b1 << 3 + CLIPBOARD_PASTE = 0b1 << 4 + ALL = 0xff UPDOWNLOAD = UPLOAD | DOWNLOAD - ALL = 0b11111111 + CLIPBOARD_COPY_PASTE = CLIPBOARD_COPY | CLIPBOARD_PASTE DB_CHOICES = ( (ALL, _('All')), @@ -33,6 +37,9 @@ class Action: (UPLOAD, _('Upload file')), (DOWNLOAD, _('Download file')), (UPDOWNLOAD, _("Upload download")), + (CLIPBOARD_COPY, _('Clipboard copy')), + (CLIPBOARD_PASTE, _('Clipboard paste')), + (CLIPBOARD_COPY_PASTE, _('Clipboard copy paste')) ) NAME_MAP = { @@ -41,9 +48,12 @@ class Action: UPLOAD: "upload_file", DOWNLOAD: "download_file", UPDOWNLOAD: "updownload", + CLIPBOARD_COPY: 'clipboard_copy', + CLIPBOARD_PASTE: 'clipboard_paste', + CLIPBOARD_COPY_PASTE: 'clipboard_copy_paste' } - NAME_MAP_REVERSE = dict({v: k for k, v in NAME_MAP.items()}) + NAME_MAP_REVERSE = {v: k for k, v in NAME_MAP.items()} CHOICES = [] for i, j in DB_CHOICES: CHOICES.append((NAME_MAP[i], j))