From e9e601fe453467b34b07e1eb796cdb8ff3950086 Mon Sep 17 00:00:00 2001 From: jym503558564 <503558564@qq.com> Date: Tue, 16 Jul 2019 11:02:05 +0800 Subject: [PATCH 01/12] =?UTF-8?q?[Bugfix]=20=E4=BF=AE=E5=A4=8D=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E8=BF=87=E6=BB=A4=E5=99=A8=E8=AF=A6=E6=83=85=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=B8=8D=E4=BA=86=E7=B3=BB=E7=BB=9F=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/serializers/cmd_filter.py | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/assets/serializers/cmd_filter.py b/apps/assets/serializers/cmd_filter.py index 3f29ca686..da0367c46 100644 --- a/apps/assets/serializers/cmd_filter.py +++ b/apps/assets/serializers/cmd_filter.py @@ -22,7 +22,6 @@ class CommandFilterSerializer(BulkOrgResourceModelSerializer): extra_kwargs = { 'rules': {'read_only': True}, - 'system_users': {'read_only': True} } From 59426d4aa911d994563d8b498f5168709b7c7eda Mon Sep 17 00:00:00 2001 From: jym503558564 <503558564@qq.com> Date: Tue, 16 Jul 2019 12:01:09 +0800 Subject: [PATCH 02/12] =?UTF-8?q?[Bugfix]=20=E4=BF=AE=E5=A4=8D=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E8=AE=B0=E5=BD=95=E9=A1=B5=E9=9D=A2=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E8=BD=AC=E6=8D=A2bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/static/js/jumpserver.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/static/js/jumpserver.js b/apps/static/js/jumpserver.js index c880a5499..ad1ec17f5 100644 --- a/apps/static/js/jumpserver.js +++ b/apps/static/js/jumpserver.js @@ -1110,6 +1110,7 @@ function objectAttrsIsBool(obj, attrs) { } function cleanDate(d) { + if (typeof d === 'number'){return d} for (var i=0; i<2; i++) { if (isNaN(Date.parse(d))) { d = d.split('+')[0].trimRight(); From f19f28cf3eb7590937b8f9f4335b153a0b1dcf16 Mon Sep 17 00:00:00 2001 From: BaiJiangJie Date: Tue, 16 Jul 2019 13:24:16 +0800 Subject: [PATCH 03/12] =?UTF-8?q?[Update]=20=E8=8E=B7=E5=8F=96=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=8E=88=E6=9D=83=E8=B5=84=E4=BA=A7=E6=97=B6=E5=8F=AA?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E8=B5=84=E4=BA=A7=E5=8D=8F=E8=AE=AE=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E7=9A=84=E7=B3=BB=E7=BB=9F=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/perms/api/mixin.py | 2 ++ apps/perms/api/user_permission.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/apps/perms/api/mixin.py b/apps/perms/api/mixin.py index 24bd9abd2..9c726691f 100644 --- a/apps/perms/api/mixin.py +++ b/apps/perms/api/mixin.py @@ -174,6 +174,8 @@ class GrantAssetsMixin(LabelFilterMixin): system_user = system_users_map.get(sid) if not system_user: continue + if not asset.has_protocol(system_user.protocol): + continue system_user.actions = action system_users_granted.append(system_user) asset.system_users_granted = system_users_granted diff --git a/apps/perms/api/user_permission.py b/apps/perms/api/user_permission.py index 0746252cb..13ee07951 100644 --- a/apps/perms/api/user_permission.py +++ b/apps/perms/api/user_permission.py @@ -256,6 +256,8 @@ class UserGrantedNodesWithAssetsApi(UserPermissionCacheMixin, NodesWithUngroupMi system_user = _system_users_map.get(system_user_id) if not system_user: continue + if not asset.has_protocol(system_user.protocol): + continue system_user.actions = action system_user_granted.append(system_user) asset.system_users_granted = system_user_granted From 48cde91dc115e8a8f049aa58d125fbf7203e0498 Mon Sep 17 00:00:00 2001 From: jym503558564 <503558564@qq.com> Date: Tue, 16 Jul 2019 14:33:27 +0800 Subject: [PATCH 04/12] =?UTF-8?q?[Bugfix]=20=E4=BF=AE=E5=A4=8D=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E8=BF=87=E6=BB=A4=E5=99=A8=E5=90=8D=E7=A7=B0=E5=8F=AF?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/models/cmd_filter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/assets/models/cmd_filter.py b/apps/assets/models/cmd_filter.py index 5bd031187..92135894c 100644 --- a/apps/assets/models/cmd_filter.py +++ b/apps/assets/models/cmd_filter.py @@ -17,7 +17,7 @@ __all__ = [ class CommandFilter(OrgModelMixin): id = models.UUIDField(default=uuid.uuid4, primary_key=True) - name = models.CharField(max_length=64, verbose_name=_("Name")) + name = models.CharField(max_length=64, unique=True, verbose_name=_("Name")) is_active = models.BooleanField(default=True, verbose_name=_('Is active')) comment = models.TextField(blank=True, default='', verbose_name=_("Comment")) date_created = models.DateTimeField(auto_now_add=True) From 74aa51578ba676b98e9e09357bcf3596b7ee9f99 Mon Sep 17 00:00:00 2001 From: jym503558564 <503558564@qq.com> Date: Tue, 16 Jul 2019 15:06:25 +0800 Subject: [PATCH 05/12] =?UTF-8?q?[Bugfix]=20=E4=BF=AE=E5=A4=8D=E7=BD=91?= =?UTF-8?q?=E5=9F=9F=E8=AF=A6=E6=83=85=E9=A1=B5=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=97=A0=E6=95=88=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/templates/assets/domain_detail.html | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/assets/templates/assets/domain_detail.html b/apps/assets/templates/assets/domain_detail.html index e60daa334..06fd0d28d 100644 --- a/apps/assets/templates/assets/domain_detail.html +++ b/apps/assets/templates/assets/domain_detail.html @@ -24,7 +24,7 @@ {% trans 'Update' %}
  • - + {% trans 'Delete' %}
  • @@ -127,6 +127,15 @@ $(document).ready(function(){ setTimeout( function () { $data_table.ajax.reload(); }, 3000); -}); +}) +.on('click', '.btn-delete-domain', function () { + var $this = $(this); + var name = "{{ object.name }}"; + var uid = "{{ object.id }}"; + var the_url = '{% url "api-assets:domain-detail" pk=DEFAULT_PK %}'.replace('{{ DEFAULT_PK }}', uid); + var redirect_url = "{% url 'assets:domain-list' %}"; + objectDelete($this, name, the_url, redirect_url); +}) +; {% endblock %} \ No newline at end of file From 3c166abd2dd296f3333a800f655af90731c03bd4 Mon Sep 17 00:00:00 2001 From: jym503558564 <503558564@qq.com> Date: Tue, 16 Jul 2019 15:25:49 +0800 Subject: [PATCH 06/12] =?UTF-8?q?[Bugfix]=20=E4=BF=AE=E5=A4=8D=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E8=BF=87=E6=BB=A4=E5=99=A8=E8=AF=A6=E6=83=85=E9=A1=B5?= =?UTF-8?q?=20=E5=88=A0=E9=99=A4=E5=8A=9F=E8=83=BD=E6=97=A0=E6=95=88?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/templates/assets/cmd_filter_detail.html | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/assets/templates/assets/cmd_filter_detail.html b/apps/assets/templates/assets/cmd_filter_detail.html index b98828f4e..e68cba47c 100644 --- a/apps/assets/templates/assets/cmd_filter_detail.html +++ b/apps/assets/templates/assets/cmd_filter_detail.html @@ -29,7 +29,7 @@ {% trans 'Update' %}
  • - + {% trans 'Delete' %}
  • @@ -164,5 +164,13 @@ $(document).ready(function () { }); updateCMDFilterSystemUsers(system_users) }) +.on('click', '.btn-delete-cmd-filter', function () { + var $this = $(this); + var name = "{{object.name }}"; + var uid = "{{ object.id }}"; + var the_url = '{% url "api-assets:cmd-filter-detail" pk=DEFAULT_PK %}'.replace('{{ DEFAULT_PK }}', uid); + var redirect_url = "{% url 'assets:cmd-filter-list' %}"; + objectDelete($this, name, the_url, redirect_url); +}) {% endblock %} From 018bf809306b4b9333020ad58e04bada5bf07d17 Mon Sep 17 00:00:00 2001 From: BaiJiangJie Date: Tue, 16 Jul 2019 15:38:44 +0800 Subject: [PATCH 07/12] =?UTF-8?q?[Update]=20=E6=B7=BB=E5=8A=A0=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E8=BF=87=E6=BB=A4=E5=99=A8Model=E4=B8=AD=E5=AD=97?= =?UTF-8?q?=E6=AE=B5name=E6=94=B9=E4=B8=BAunique=E7=9A=84=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0036_auto_20190716_1535.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 apps/assets/migrations/0036_auto_20190716_1535.py diff --git a/apps/assets/migrations/0036_auto_20190716_1535.py b/apps/assets/migrations/0036_auto_20190716_1535.py new file mode 100644 index 000000000..317d427f0 --- /dev/null +++ b/apps/assets/migrations/0036_auto_20190716_1535.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.7 on 2019-07-16 07:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('assets', '0035_auto_20190711_2018'), + ] + + operations = [ + migrations.AlterField( + model_name='commandfilter', + name='name', + field=models.CharField(max_length=64, unique=True, verbose_name='Name'), + ), + ] From 1993dba2e0dcdcb9225d6287061eec50f0a9f427 Mon Sep 17 00:00:00 2001 From: jym503558564 <503558564@qq.com> Date: Tue, 16 Jul 2019 15:40:41 +0800 Subject: [PATCH 08/12] =?UTF-8?q?[Bugfix]=20=E4=BF=AE=E5=A4=8D=E8=B5=84?= =?UTF-8?q?=E4=BA=A7=E6=8E=88=E6=9D=83=E8=AF=A6=E6=83=85=E9=A1=B5=20?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=BC=B9=E5=87=BA=E6=A1=86=E7=9A=84=E6=9D=83?= =?UTF-8?q?=E9=99=90=E5=90=8D=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/perms/templates/perms/asset_permission_detail.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/perms/templates/perms/asset_permission_detail.html b/apps/perms/templates/perms/asset_permission_detail.html index beaa5a362..9054d57fd 100644 --- a/apps/perms/templates/perms/asset_permission_detail.html +++ b/apps/perms/templates/perms/asset_permission_detail.html @@ -206,7 +206,7 @@ $(document).ready(function () { }) .on('click', '.btn-delete-perm', function () { var $this = $(this); - var name = "{{ asset_permission.name }}"; + var name = "{{ object.name }}"; var uid = "{{ object.id }}"; var the_url = '{% url "api-perms:asset-permission-detail" pk=DEFAULT_PK %}'.replace('{{ DEFAULT_PK }}', uid); var redirect_url = "{% url 'perms:asset-permission-list' %}"; From 2259bc5ea2c329a782d18666b5b53b7d10e54e3e Mon Sep 17 00:00:00 2001 From: BaiJiangJie Date: Tue, 16 Jul 2019 16:49:43 +0800 Subject: [PATCH 09/12] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/jumpserver/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/jumpserver/const.py b/apps/jumpserver/const.py index c6b7e0e63..72350b1e4 100644 --- a/apps/jumpserver/const.py +++ b/apps/jumpserver/const.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- # -VERSION = '1.5.1' +VERSION = '1.5.2' From 560be610fed051bfb30ee5c3d75d102dc3d0c4a1 Mon Sep 17 00:00:00 2001 From: BaiJiangJie Date: Tue, 16 Jul 2019 17:06:33 +0800 Subject: [PATCH 10/12] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9=E7=BF=BB?= =?UTF-8?q?=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/locale/zh/LC_MESSAGES/django.mo | Bin 77648 -> 77762 bytes apps/locale/zh/LC_MESSAGES/django.po | 57 ++++++++++++--------------- 2 files changed, 26 insertions(+), 31 deletions(-) diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 9dc31d0c8a0ac28755cc69794b4aa36137412452..a19a73d5bcadb5085698c0e77ba5fa2b68289203 100644 GIT binary patch delta 22969 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 H^ydEuIFb%v delta 22873 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

    <+GY%v|@ z6VE2@MB@R9jwtfk$(^EG#^yXFR16=jxbA zTU+{nOgeR~LTr%Z z78hb*9Th2m_-nic^eIk#6Qz;0tLX-%9PtCjyg->`ZA&mYzkho3IB`AY7L6a$`7_FI z#5(HGsk7BDnLS*S|Ia2GjC-#i-@Ry`V13@};@zZALrX0DpLYNMMlph93px#>=&wru zYEX_J&6yZ&JF?COc!@ueYl+!dz!=N-z*(GImUCLs-pkILK<+v9Z{x-$Zc5!ZiWB~% zRHnSL&Y?Jm#ymKe{J(U5i#i^fo2iG<-ig95&E7=R(UkT+uIj~-i_hX75g(>3B0gtr zspz-n{rg|b28f5-DEzwS-JtwJ$ETF;{^9*BMAU70ik-3d+@ft=meqx)$caTIFlUB6>=i;ZtIeKNY=f9*a8)XM&xcYOHqTZ7FPn4#_3HALyXN?tUj3oIDzJI(T z_>KW1Y{faKFSkBfssBQ|{y`y;`Y=}O|2aQytUI*pSU~$q>`dQg`u_h(CCuN%f0K;* zKq9xhd2vTo z9|;}&3hz~?|s$fdNrYh??mT%xq1&uhwI8+%DAC#|Yi_!fbN3ekM8AV4q8|*D^bSdvXu6%E>G}KSfe--5~>IrZw{rkPw zN2m5BHySfz5_aQzo8v9H{nVf6`@hnX<>|DJh9ovfOX67S9m#dDTn2JMR)21uQ*qZWt-1q+hf&ZZK zZ#sXD4=GRW#050=A%6e(fVP<=zM=4sn_f=h&ep${^&LPQWG7X#w(a=B>VN6?kHG{p zSilcykApk$%mm2-;WT1pLacWjKS zoEt(t2l+3kU()Y?qX+^hFRjx@WZ$`rdFsBAbT~$E1amRS2b3SFkHjx2WoheXgUln2PkF(K6)B}@Ye3wH zdPn*cr+iQD6UszNI@<1FCfZL^*O8U-Go>(PvEF|j-*Vy=I(9XOJlZWW<-mXcl-jwO_8HfRL7sl+R=9;F2RPf{|I+lD$;;cQ$+dl>c2 zdjF?TDM~Vo)xWcjXNV8cDZj->Y?8j@-#?m=FGX2GUrzUarGInctO_`8+4-t3C%=aH z!}oH&9W(^KmpI2jW67nZa}M%}u{5QKM&Rg9UB?zXC#eg)?%0OhBWtfqJ-^k%8S^XJ zzsJ{Hl_<OqW&jkAMp#?wv)?7`H9?JJ^xDyF4OpudROXkM>?zb=cK8W5Nk+F-!9aL zlG{LChYt_ae<$@fB9SBP?qTt#x9 zP%>Iu4Lo22G-I%Vlo)cW$bCTnUvWPrm@=0(9ka>n$Zcb&UWm3dy8l7nu4iM(C_~`W)d`} z{KOy+UCMiA29lpf{u`TE>CcHXVd#4~<)0Ier+maY^@%G{($F_QadM20DR{2#<0)eQ z_wQ#aAtX`~#~m4olTgm96GuOXmw~}&kxNQj+;N6nEpkt>0r{zv8P=YkPR*@;nD(#f z7s&!9k^6+=JINnq=v0kH9YZPQ{5AJSb*m?)-$_o+WBrtFMA<`L#}tS68dH*6gOBOI zn0hfgXD9J>>V@zgZV2Qr&RgjCC!KoQKt0#*Y@9q~ef+k8Z4(yFRIo^?B8Ar{Iq)d) K`g|v*H2Xh*==ux* diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 1da5e158c..fe50f06d6 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: 2019-07-15 14:43+0800\n" +"POT-Creation-Date: 2019-07-16 17:04+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: Jumpserver team\n" @@ -555,7 +555,7 @@ msgid "Connect" msgstr "连接" #: applications/views/remote_app.py:31 applications/views/remote_app.py:47 -#: applications/views/remote_app.py:69 applications/views/remote_app.py:87 +#: applications/views/remote_app.py:70 applications/views/remote_app.py:89 #: templates/_nav.html:33 msgid "Applications" msgstr "应用管理" @@ -564,15 +564,15 @@ msgstr "应用管理" msgid "RemoteApp list" msgstr "远程应用列表" -#: applications/views/remote_app.py:70 +#: applications/views/remote_app.py:71 msgid "Update RemoteApp" msgstr "更新远程应用" -#: applications/views/remote_app.py:88 +#: applications/views/remote_app.py:90 msgid "RemoteApp detail" msgstr "远程应用详情" -#: applications/views/remote_app.py:100 +#: applications/views/remote_app.py:102 msgid "My RemoteApp" msgstr "我的远程应用" @@ -695,7 +695,7 @@ msgstr "如果有多个的互相隔离的网络,设置资产属于的网域, msgid "Select assets" msgstr "选择资产" -#: assets/forms/cmd_filter.py:37 assets/serializers/cmd_filter.py:40 +#: assets/forms/cmd_filter.py:38 assets/serializers/cmd_filter.py:43 msgid "Content should not be contain: {}" msgstr "内容不能包含: {}" @@ -1249,86 +1249,86 @@ msgstr "自动登录模式,必须填写用户名" msgid "Password or private key required" msgstr "密码或密钥密码需要一个" -#: assets/tasks.py:33 +#: assets/tasks.py:34 msgid "Asset has been disabled, skipped: {}" msgstr "资产或许不支持ansible, 跳过: {}" -#: assets/tasks.py:37 +#: assets/tasks.py:38 msgid "Asset may not be support ansible, skipped: {}" msgstr "资产或许不支持ansible, 跳过: {}" -#: assets/tasks.py:50 +#: assets/tasks.py:51 msgid "No assets matched, stop task" msgstr "没有匹配到资产,结束任务" -#: assets/tasks.py:60 +#: assets/tasks.py:61 msgid "No assets matched related system user protocol, stop task" msgstr "没有匹配到与系统用户协议相关的资产,结束任务" -#: assets/tasks.py:86 +#: assets/tasks.py:87 msgid "Get asset info failed: {}" msgstr "获取资产信息失败:{}" -#: assets/tasks.py:136 +#: assets/tasks.py:137 msgid "Update some assets hardware info" msgstr "更新资产硬件信息" -#: assets/tasks.py:153 +#: assets/tasks.py:154 msgid "Update asset hardware info: {}" msgstr "更新资产硬件信息: {}" -#: assets/tasks.py:178 +#: assets/tasks.py:179 msgid "Test assets connectivity" msgstr "测试资产可连接性" -#: assets/tasks.py:232 +#: assets/tasks.py:233 msgid "Test assets connectivity: {}" msgstr "测试资产可连接性: {}" -#: assets/tasks.py:274 +#: assets/tasks.py:275 msgid "Test admin user connectivity period: {}" msgstr "定期测试管理账号可连接性: {}" -#: assets/tasks.py:281 +#: assets/tasks.py:282 msgid "Test admin user connectivity: {}" msgstr "测试管理行号可连接性: {}" -#: assets/tasks.py:349 +#: assets/tasks.py:350 msgid "Test system user connectivity: {}" msgstr "测试系统用户可连接性: {}" -#: assets/tasks.py:356 +#: assets/tasks.py:357 msgid "Test system user connectivity: {} => {}" msgstr "测试系统用户可连接性: {} => {}" -#: assets/tasks.py:369 +#: assets/tasks.py:370 msgid "Test system user connectivity period: {}" msgstr "定期测试系统用户可连接性: {}" -#: assets/tasks.py:470 assets/tasks.py:556 +#: assets/tasks.py:471 assets/tasks.py:557 #: xpack/plugins/change_auth_plan/models.py:522 msgid "The asset {} system platform {} does not support run Ansible tasks" msgstr "资产 {} 系统平台 {} 不支持运行 Ansible 任务" -#: assets/tasks.py:482 +#: assets/tasks.py:483 msgid "" "Push system user task skip, auto push not enable or protocol is not ssh or " "rdp: {}" msgstr "推送系统用户任务跳过,自动推送没有打开,或协议不是ssh或rdp: {}" -#: assets/tasks.py:489 +#: assets/tasks.py:490 msgid "For security, do not push user {}" msgstr "为了安全,禁止推送用户 {}" -#: assets/tasks.py:517 assets/tasks.py:531 +#: assets/tasks.py:518 assets/tasks.py:532 msgid "Push system users to assets: {}" msgstr "推送系统用户到入资产: {}" -#: assets/tasks.py:523 +#: assets/tasks.py:524 msgid "Push system users to asset: {} => {}" msgstr "推送系统用户到入资产: {} => {}" -#: assets/tasks.py:603 +#: assets/tasks.py:604 msgid "Test asset user connectivity: {}" msgstr "测试资产用户可连接性: {}" @@ -5307,8 +5307,6 @@ msgstr "密码长度" #: xpack/plugins/change_auth_plan/forms.py:45 #: xpack/plugins/change_auth_plan/models.py:213 -#, fuzzy -#| msgid "For security, do not change {} user's password" msgid "* For security, do not change {} user's password" msgstr "* 为了安全,禁止更改 {} 用户的密码" @@ -5934,9 +5932,6 @@ msgstr "密码匣子" msgid "vault create" msgstr "创建" -#~ msgid "* For security, please do not change root user's password" -#~ msgstr "* 为了安全,请不要更改root用户的密码" - #~ msgid "Interface" #~ msgstr "界面" From d21bb5207b669838dc644f2dd96a1132fc7d7563 Mon Sep 17 00:00:00 2001 From: BaiJiangJie Date: Tue, 16 Jul 2019 17:55:43 +0800 Subject: [PATCH 11/12] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9CommandFilte?= =?UTF-8?q?r=E7=9A=84system=5Fusers=E5=AD=97=E6=AE=B5=E4=B8=BA=E4=B8=8D?= =?UTF-8?q?=E5=BF=85=E5=A1=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/serializers/cmd_filter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/assets/serializers/cmd_filter.py b/apps/assets/serializers/cmd_filter.py index da0367c46..bd925fd9d 100644 --- a/apps/assets/serializers/cmd_filter.py +++ b/apps/assets/serializers/cmd_filter.py @@ -22,6 +22,7 @@ class CommandFilterSerializer(BulkOrgResourceModelSerializer): extra_kwargs = { 'rules': {'read_only': True}, + 'system_users': {'required': False}, } From 3451c2b418db54bd559003808bdaeaa574e12fe9 Mon Sep 17 00:00:00 2001 From: BaiJiangJie <32935519+BaiJiangJie@users.noreply.github.com> Date: Wed, 17 Jul 2019 12:10:14 +0800 Subject: [PATCH 12/12] =?UTF-8?q?[Update]=20=E8=A7=A3=E5=86=B3=E6=8E=88?= =?UTF-8?q?=E6=9D=83=E8=B5=84=E4=BA=A7=E6=98=BE=E7=A4=BA=E7=A6=81=E7=94=A8?= =?UTF-8?q?=E8=B5=84=E4=BA=A7=E7=9A=84=E9=97=AE=E9=A2=98=20(#2975)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Update] 解决授权资产显示禁用资产的问题 * [Bugfix] 解决资产更新页面取消激活失败的问题 * [Bugfix] 解决资产详情页面禁用资产时会清除协议的问题 * [Bugfix] 解决创建/更新管理用户、系统用户提交密钥错误时报错的问题 --- apps/assets/serializers/asset.py | 2 +- apps/assets/serializers/base.py | 2 ++ apps/assets/templates/assets/asset_create.html | 8 ++------ apps/perms/utils/asset_permission.py | 6 +++--- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/apps/assets/serializers/asset.py b/apps/assets/serializers/asset.py index 5fdb3a362..0207f4e7d 100644 --- a/apps/assets/serializers/asset.py +++ b/apps/assets/serializers/asset.py @@ -112,7 +112,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer): protocol = protocols_data[0].split('/') validated_data["protocol"] = protocol[0] validated_data["port"] = int(protocol[1]) - if validated_data: + if protocols_data: validated_data["protocols"] = ' '.join(protocols_data) def create(self, validated_data): diff --git a/apps/assets/serializers/base.py b/apps/assets/serializers/base.py index ca4aa7502..257bb95ab 100644 --- a/apps/assets/serializers/base.py +++ b/apps/assets/serializers/base.py @@ -1,7 +1,9 @@ # -*- coding: utf-8 -*- # +from django.utils.translation import ugettext as _ from rest_framework import serializers + from common.utils import ssh_pubkey_gen, validate_ssh_private_key diff --git a/apps/assets/templates/assets/asset_create.html b/apps/assets/templates/assets/asset_create.html index 1b5636be5..6df7ff862 100644 --- a/apps/assets/templates/assets/asset_create.html +++ b/apps/assets/templates/assets/asset_create.html @@ -216,6 +216,8 @@ $(document).ready(function () { var form = $("form"); var protocols = {}; var data = form.serializeObject(); + objectAttrsIsBool(data, ['is_active']); + objectAttrsIsList(data, ['nodes', 'labels']); $.each(data, function (k, v) { if (k.startsWith("form")){ delete data[k]; @@ -233,12 +235,6 @@ $(document).ready(function () { return v.name + '/' + v.port }); data["protocols"] = protocols; - if (typeof data.labels === "string") { - data["labels"] = [data["labels"]]; - } - if (typeof data["nodes"] == "string") { - data["nodes"] = [data["nodes"]] - } var props = { url: the_url, data: data, diff --git a/apps/perms/utils/asset_permission.py b/apps/perms/utils/asset_permission.py index c437753b6..2c2eaac05 100644 --- a/apps/perms/utils/asset_permission.py +++ b/apps/perms/utils/asset_permission.py @@ -499,7 +499,7 @@ class AssetPermissionUtil(AssetPermissionCacheMixin): if pattern: assets_ids = Asset.objects.filter( nodes__key__regex=pattern - ).values_list("id", flat=True).distinct() + ).valid().values_list("id", flat=True).distinct() else: assets_ids = [] self.tree.add_assets_without_system_users(assets_ids) @@ -523,8 +523,8 @@ class AssetPermissionUtil(AssetPermissionCacheMixin): assets_ids = defaultdict(lambda: defaultdict(int)) for perm in self.permissions: actions = [perm.actions] - _assets_ids = [a.id for a in perm.assets.all()] - system_users_ids = [s.id for s in perm.system_users.all()] + _assets_ids = perm.assets.valid().values_list("id", flat=True) + system_users_ids = perm.system_users.values_list("id", flat=True) iterable = itertools.product(_assets_ids, system_users_ids, actions) for asset_id, sys_id, action in iterable: assets_ids[asset_id][sys_id] |= action