From 9ffae722f3e20f93aa0d67a6e1b7504d8d02248d Mon Sep 17 00:00:00 2001 From: ibuler Date: Wed, 5 Sep 2018 12:26:46 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[Update]=20=E5=8D=87=E7=BA=A7gunicorn?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 81290632a..7bd31d93e 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -31,10 +31,10 @@ ecdsa==0.13 elasticsearch==6.1.1 enum-compat==0.0.2 ephem==3.7.6.0 -eventlet==0.22.1 +eventlet==0.24.1 ForgeryPy==0.1 -greenlet==0.4.12 -gunicorn==19.7.1 +greenlet==0.4.14 +gunicorn==19.9.0 idna==2.6 itsdangerous==0.24 itypes==1.1.0 From 88a29c0a935eb384db425dd2918d5c235c3d19ed Mon Sep 17 00:00:00 2001 From: ibuler Date: Fri, 7 Sep 2018 12:40:26 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[Update]=20=E5=A2=9E=E5=8A=A0=E6=89=8B?= =?UTF-8?q?=E5=8A=A8=E7=BB=93=E6=9D=9F=E9=9D=9E=E6=AD=A3=E5=B8=B8=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E7=9A=84=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/serializers/asset.py | 2 +- apps/assets/urls/api_urls.py | 1 - apps/common/forms.py | 1 - apps/common/mixins.py | 27 +++++----- apps/jumpserver/settings.py | 1 + apps/locale/zh/LC_MESSAGES/django.mo | Bin 50335 -> 50439 bytes apps/locale/zh/LC_MESSAGES/django.po | 38 +++++++++----- apps/static/js/jumpserver.js | 32 ++++++++++-- apps/terminal/api.py | 6 ++- apps/terminal/serializers.py | 4 +- .../templates/terminal/session_list.html | 30 +++++++++++ apps/terminal/urls/api_urls.py | 8 +-- apps/users/api/user.py | 3 +- .../templates/users/user_otp_enable_bind.html | 10 +++- apps/users/utils.py | 2 +- apps/users/views/user.py | 4 +- utils/sync_node.py | 48 ++++++++++++++++++ 17 files changed, 169 insertions(+), 48 deletions(-) create mode 100644 utils/sync_node.py diff --git a/apps/assets/serializers/asset.py b/apps/assets/serializers/asset.py index a3661db5c..dae9ab9af 100644 --- a/apps/assets/serializers/asset.py +++ b/apps/assets/serializers/asset.py @@ -4,7 +4,7 @@ from rest_framework import serializers from rest_framework_bulk.serializers import BulkListSerializer from common.mixins import BulkSerializerMixin -from ..models import Asset, Node +from ..models import Asset from .system_user import AssetSystemUserSerializer __all__ = [ diff --git a/apps/assets/urls/api_urls.py b/apps/assets/urls/api_urls.py index ca23a716c..bdbbe5f1d 100644 --- a/apps/assets/urls/api_urls.py +++ b/apps/assets/urls/api_urls.py @@ -5,7 +5,6 @@ from rest_framework_bulk.routes import BulkRouter app_name = 'assets' - router = BulkRouter() router.register(r'assets', api.AssetViewSet, 'asset') router.register(r'admin-user', api.AdminUserViewSet, 'admin-user') diff --git a/apps/common/forms.py b/apps/common/forms.py index 046c64443..00f6af3d2 100644 --- a/apps/common/forms.py +++ b/apps/common/forms.py @@ -197,7 +197,6 @@ class SecuritySettingForm(BaseForm): ) # upper case SECURITY_PASSWORD_UPPER_CASE = forms.BooleanField( - initial=False, required=False, label=_("Must contain capital letters"), help_text=_( diff --git a/apps/common/mixins.py b/apps/common/mixins.py index bb21fe07e..ceeaed6c1 100644 --- a/apps/common/mixins.py +++ b/apps/common/mixins.py @@ -71,19 +71,20 @@ class BulkSerializerMixin(object): ret = super(BulkSerializerMixin, self).to_internal_value(data) id_attr = getattr(self.Meta, 'update_lookup_field', 'id') - request_method = getattr(getattr(self.context.get('view'), 'request'), 'method', '') - # add update_lookup_field field back to validated data - # since super by default strips out read-only fields - # hence id will no longer be present in validated_data - if all((isinstance(self.root, BulkListSerializer), - id_attr, - request_method in ('PUT', 'PATCH'))): - id_field = self.fields[id_attr] - if data.get("id"): - id_value = id_field.to_internal_value(data.get("id")) - else: - id_value = id_field.to_internal_value(data.get("pk")) - ret[id_attr] = id_value + if self.context.get('view'): + request_method = getattr(getattr(self.context.get('view'), 'request'), 'method', '') + # add update_lookup_field field back to validated data + # since super by default strips out read-only fields + # hence id will no longer be present in validated_data + if all((isinstance(self.root, BulkListSerializer), + id_attr, + request_method in ('PUT', 'PATCH'))): + id_field = self.fields[id_attr] + if data.get("id"): + id_value = id_field.to_internal_value(data.get("id")) + else: + id_value = id_field.to_internal_value(data.get("pk")) + ret[id_attr] = id_value return ret diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py index 0b07bad70..6635b35e6 100644 --- a/apps/jumpserver/settings.py +++ b/apps/jumpserver/settings.py @@ -72,6 +72,7 @@ INSTALLED_APPS = [ 'captcha', 'django_celery_beat', 'django.contrib.auth', + 'django.contrib.admin', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index b6f9a00b43a020d32fae813b898787cdf4e6f65a..5da9e7a3cb0d2e2a193a863b403a1d56747b03b1 100644 GIT binary patch delta 15364 zcmZYG2Xs}{w#M-dNg#ocKsAsD-q`aOU@7sbnQF1VeE;2H+A5!4;^JNkr}JBnIOp%!xNpJ9=*Uz&f6n zpEw=rzS5|THAO9`6{g3In2Gtl{#1f+BBsHq<^s$>yb8l{2X@Efs2$|1>v@H+6h>oP z9E=k&9-m?>>{-wAV(@^Ow!X`EMc*4V?4c5b50J6Fr>G;Z(7-LACu)ZyF(W1*UA(2J zh1|kGe25z77t~4qiD4Mn(EqHxjHq#nqVg3Ra{lUAmxTYBSch2DNer-#qcDVcDysi{ zjKbBZqdbjz6qish-4o1#L5D4uu9H|i0@ zV+c;cJU9>ij|58-A4lE)#PWZj`lo8_P9!~QgIQ4hqRe7GDjKLP>PTv#7SIw?V_Vb$ zyPyW_j#|(F%#IUKC$Jo|;TBZ?)2ROE%rDJr<{i`bm`X4mpQ8p!(ZusAVFYTWO;8Jo zK`r!cRR8{{35KKIl?hl1x1%<26Vu>r)I0GAHO@2hFRZ8UKcJ~Q>PDyu+My=sgSue| z>a!b->2Q|iSD;R8J!;{*%u}fE|7+BV+{d)&HFM*IqQ=jJsr3ElrlOZ83U#zKF%(;& zUYf3`osPnEI0?gW9;)9O)B-<5?f5uq0iU48yJhW9Q40xZ?(*T7M&ExvD%xpr)K1Ey zCajA(%I2tvTBBCp&EkHj0Y{a0RuX@6AW3iC&_{3ux&Uo)xu`T&RT=!bmKG`ife$qy0A3_a$9<{*hs0r_5eSC^V@y!^Q?}2*h2B03rFpS1&sPT5A#y=6m z`KPCHj)YeDAJh(Sqb7J@9iL$s@k`5xw009jp!#P+4H$`g2Mc{?N&TI{GT81=Pii*bMbj zcgG0yjisU+=U^vXh^6oeYQns2-HOYg2Cjzc-w`!ISBv9N6AeNwd=%;tyo>5L6AR&D zOo>OFKJPdc{c(B9yn~I2Q@3+Jtud$ty^Az?d$A#=ZSRh-4Qj$psH2U;LpTD*VyO;% z;~>xZHDLvdtE28~fEqZ) z;#kze`=b^x4D;b6)E`cXm=izf%=u@ha)yLnwwss@pP(iR?&7}N45&v?1+}o|sJC|{ zY9}*L6YWGD^>Ne!E}EB78@q}A6GlDqCtWyy9oe5Ga%1YQZUF_&>X?aqJJb;mKrJKz zbKz3VgGrbdzcznGy(@(F)a}C+djfP%9sf z+SyoCze%VaFTxzS5mVv`)DBOh?*9}u@wcdxyNx~HQ^Fe|8?kp=}<56e$>W3LN?^{KB3}&R;U{;qgM7E>brl8 zx-n08cl5>0nwXV*Yt#u0uy{P`WR_rl{J{JaOA)$7 zg(aYlcou5Mo3I8R!ov6hqcC4jH&H#*PDh~bA8SrVZD=<7zyJ5B=%_cL9>osS4aZUM z#(C6{er4@9uq^RI)K2pDaubz7y{r{63L9fy9D;fT^Uc*5M7$M!nqU_dJ%Yoi&+im! zLDx`6dmFX$XQ+N*z1<_qjCwbsP+v!B)FZ2B`H`qcnSe!b0j9#k$d90RsyFAa4!Qcc zj>RyDxH4*CHBmcignB8vqWUjF{laa);&=%4`QEd9U|)BFIZ;O)g_^i524W=)!0LT@ z{%WX2LPyjPwWGGEXWSjNkP)U2HQ)@3mznD={~-p`e#ktHdZZUn3%`zxvA%~3x%olp}GLA?tTES`btw+xHoMpXZcsEz!H+Q<`Bzm)yl3525_ zwJ#HuI#f!azJg(>&uT7e!cCYO_o8-i)VzS&*)`N7dSLl~Pzwm_?@l5=>i%Ll7|Y>M zOmumlmwABem>c!%3t?I;j)n0})RD!aR@?{E;6%&MG8dXFP!q00EqF5)!2_sg|2=BF zyO>em|3fNzd%c0~CCY+YKzY=oscE)C9c52^hNDnlNB=?YXx~BIHv>a(iMbZlZwrRv zVN8eTF^KuSZ>a?1b@LADXdj_EzD5m@mh;oVxlju!gj!%FjKs#M9S*=~9E$n{T#5R8 zkE6bts~CYX@;Z{TCBgoQ@B zXC8|>fxf7BWFSt$(YPO9qTZq1qufjW=_t-W3yIq#^z2@kK`cLvI0I_HNKA5^=zx4?rVS=uN|si57dJCVP+hGdL*-aRCMHYu3%Q;XQ)S# zc8q%`N}?vJin^~c>Jha^O*9$xXy>BFUt{quEJu72BhmL86+OGmW8K6>Q8!jY?Vu@Y zfDWjg_BZ2EFXK4uk5f?N{DL~MRO8(JX;Ck6R@BZ5q845S8IOPeqmqL}EA&4z)D5GN zKX1ILmVby^(4VLQ0^V^ui9r3})I;6h5z}KY)WSz%Hk^*y*m~4ByD>!H|1m25?-7g9 z@GWY<6yx1QnNe?V6l%u}P>-k;YT><56HP?jw-EI?Z$kaua3|`A?F-Zie1qD+0}R*q z|H3+iOmHttIO?dgpgQJ34O{{>@LQ;7-UzjmcBqB*Kz)7#aW`skJ&IGP{^w9H<0UMK z*U*=bO2|ZxECsvAvcy#)CTro(-eI3 z$ZO^WzsuhRFagh!51PXHpP+JKD!8KsgL7l`3)X{Ii zytvo$-=MyRn`ZD#_tRbubCGXp4w}gkd`@B(3GJxEEH_~+>d4|z`HAK<3?ZIt?aR&g zQ7_pZi!Y$=yMlV@zO(!j)I0FX;t1btH&I?x$Kn=OwYZ_h9Z&=IHV2x+&2gxOC15Dd zHdmldaFclm^;La_>hCK%$NgooDi$Hp4cp;NjK$kn18dK9PBzb&0rT8XaBb8A$75xD z7xUl=)XRGdL-ALO|3Th0pOML1@`g&Gc`#Ovu z-i|)KwI?lc6%{{34IH${9c74_(adcYHp`$EUd7^CSf03vXGg__P~U4s)Iyt>ZBYZqntf0U7-UXDjl0<5^{D&zTK>3s!Dp2#r~&R;{M-y$ z>hck0LDax+q83;eHEOIL zzs7Xr1DCmlM4X`yyw;swA>9CiW)E%YQO?!Y0ODn z&Fp}ch)3XixD$0>BW9B=QTMk;omel6NBG-${s~m{i!}oa<467mz5??ZW+49(_1%Ut ziv}!-nxG1%$6BaI5o7tzsD3>y9%}Jui>F`)egCtm=*BhHuo-pZPV_$#YrkmiSIzIu z`>6hp&A(6^30~>)rOj%n6KG^{NAzh2eJn8u6_3NBn1K2r*>3rRn3MPf>bLzmYT}ou z`%Hvi(1GH)ByJ}C3>r! z0a%hSm01DX6ZgcLc+C78>k`*k!=I!$Wew-Ai64^C3ZJ23Z>@VFwIG3E@^yR-tcF~7G{75v!z!F-9DFykh-fJjta7{unC%mF0gxJ+qeIJ(0>9JFGP*A*5Z9WDuqd$ zM*XBdz_0TUSJUn{m}h~hYF}0+nc>m{fD6j9%J!j)Je{?I1x48R@8*YEPn$T&*%NEio3g(kZBw zFEQ7eTg)WX!j55X{0KGiZSx6g;#U@j?{sl4)cB=P_t!w5ZmdT|#-L6h7B#>a%g@Ge z;uRKeK@G4U)&Cgw#mg4g*yZx=Q5zYG>OT%OPl7pb7w50UDoboJ_nT+TFHr;C#A~Zfz7zWZF zh3XfL5m*|vfZC`DT38%s@kopyKhNBNKN9crSz<+!8(^Dx$UJ9WGQY<#ZhVB{_zJa< z(7n!#sD~lLSfa+fn z(_>f6i$hS~{d{ZRi5l;Ui+$c-R4S2(+V2MJf=h|}V>?WFz)jrIj7PQ4#)??rApd0y zJ7PReNBtDP!fcrBkXv9G)QQ!>EZ7WBgly9K4iLB!c`IZne& z79tG^&4N)cEavR5Wm3OH455q9#~_xp6b<#&f8FFQEpwhwAqS z>ZS5dxi}DYf?=rpGMo7=U&{1Vv`RIz4vyi5#^}SdsDbOAb^|v=4IG07u_G44iTD_| zVM$zh#(jpLqE6(V#hE^G3o7mOdDWP!oA)`A_lEuKbufrTd@Yl$uKU zQx&dQ$^c3i+I2d7ss8IQacc(omS_<5o5)`!y&@^JMXu)*O}d0mo#~LnX6!(H2leIn z?<)iGYwI%r?^^v7oo-q^3w_R0uSc0ky)w?E{RQQU4fcnRXl8LJXi} zbfFhY+dGselt0K#z*Us3)PJRfQEx&2^^~{l9LxKza#%BNlq8PNgkiK|D~*9eKwkv)PZX% zeH&9wYX8GX3?tD0Qt=L6@^|3{v77jV&i}s=w4+T|d-83pO@9FWPMJYl2W&_FOKgaT zP}f~bFWP&N+iPPeA4b`s^Djr~O~Ze1qz&Ah`c=vsl&qGUMqO7^hgY3@0c_1U{r<+}YXg+__ejG&nJ|5lw-7|CC`taH=CmCIB|EZf|>Q{l%^9ua{hl0 zR0mxnDL+t_sf|9mreG{U~cGbIH#~eo(#flnORp zB6;>tXA+$$-&=!nx*{nLDQ}RUM9Iw!UlY%u{tb>H*3|B@rFDf=m-iLd*! z?jH^4+lBn}6wH6X8t&nC8zi~!h2#p3pzN}^GW}Lk??~A}JvW2t>gMo1C2mE&ij8-T zxUuyaVXEtBJ^y#DQ+67%QrEvYw4yAa-knm*+I7Pc>fd1iNr!05P`X)2h^214-px-9Sd_Di9pm`dG?#>Z7nK?Wb`O zypxjE-_!l0HvIIjxGR05Ep9~LZzwH@|4WIc{(t9B{h|_F2h3_N^d@2>20BbW8(y(? zH6J9_6+~G^`Gqo@+!5_n*C~ zm7&bFOn+`FY&YJ(P2>w|KuQ(s(}emj)@M7pU}9Yp@NHa5IZb;T;{4b`-~XR>gZ1^w z5GPUI)16$m9bR2JWTu{A9gEVZn%(;XOHmro-W3PoulNt;DE(L480)C#rC!s<@c;MU ziF6uB(UpLkaXhBRjFum&My?1-OKz@-8LVv-o*~x&cVdL)hnsZu-Y1`Yl_nognM?8g zz(2yR@fCGl<%k#HOyaTBL#f}Pyk-3=U;u4zk}H9OQP(y~Eq{$a70o=@#p))$Bj1>jJPzVEhUliGi4!dKjJ*=vxokViPsWW#rn7rmstgd|7fAtTfzLVTI z+P}b5)-R0w`^3eGw^{%1sHY+~iLzUN|C>U?ha?-~M#^gH-_sa_YbblDry&0Z5impgGqoFG?vz{3#wHw-}SJd)8m^Zd*)0#=iWrnNmGMXObPPc$ed=r$8|i=^P;g> zcF)@y zz!1z@-L*%X1yBn~zzF8|$`RxsQ5(as0|sF)Oo#nYCo=-IvxOLnn=uM^p>}k^^4Bmw z_1mcXLTk8<6+$g20VA;#W@Ub_IzceD!t~hQ?2ehJ55x$Zh#heOY6pK|VGOD1dGVNt zeXtb{z%!VF6<_zfra05QiOQF)#rc;dm`V_g$B{9;GpHjEuk9945w*jHm<8J)UA*3? zh3vsJ_z7y9v#68&0yE+@L?eZ9>r$VOLrP`<8@4nPf?Hf1#0{pb=~*{>T>=;BoaxeV=2^5l2H>?Mm>Uh zm=4=v40c8TBf%2X7ohGxZTa)4{x?u3atF1+`>1};%^+VrH&A-iQRPN0ARa?75w*ZF zr~%8P7E}XsVGGm=^u?Sw7S(?-s{e9xqxq3}(Da=m2&Ll%)Ie7-8Gl8sv|xR=kfNv^ zmqzukj+&r8>RoAp#c={^1G_Oj9zdPINz{hUnHTYOeg3Z!gwc?{ft#Q>YJw`L8)~CI zc8xI{-?n@|)QJs4EqpTSbH50665B8Xo<@yx5jE~r)W&XMls^A=33Q|(4c$U=pMqmDkXxm!ROW}%)9^-{-U zW~_#~&)1CL4T9EK9QU9m{0X(KF`v~V}%LrqZF>LpM+eHFE!%BT~nhw9e^3u9Xh z#Bt^Xnjxf5Fo3H?Cp(SuXR>a}>U(AF3 zTDyhML@jI{YNLxWM4$gp3ABT+%&VxQzlA!whp3&TZQ~}2M7=Z7R*ysNu(ajdppLdP z>Lu%eTW|#S#v*OqIPYVaKL2Y7w6g7}f%l+xcnr0WGngGOTl+oKf}dhG4B+|c-N=FJ z7l(RjE2Dl9X@Gh(eX$UZLd~}ZeVT9+fsSw&Y9~ig`JYice~6m!xz&T)x%LRuz`3m+ zhgx_k)B=(*AJ#_wQ0jqE*c)@<)OMV|UbeL)a^fD;L|DhxivBT{-|2zceNoWDTnZa+mFOV425tl|Sqz*=7 zJB-2Mm=_nB`%x!$1@#WxL@nSB>ZBf9KA?lWQ$7OiI1+UdxllJ2MLmKNsFhbh?W`KA zUv1Qm+hA_&iGer~wZkc>`)8vjUWz)oO{fz)h&ln^IRbUKily-mYJljs+{z207FYuH z43kmql~4oLw0tYngm0kwcSVic7xfa4LT&6l)P`mu8}fMz2z0|T)XLVQKA*c$H{M1a z{UbA^qx&X{LY+WqtJgrC%o~^=dz-T{k@_xF`%To&|3v@K|KPXXTbU2FvPx!k)WYhZ zjyMIi<6c+=$6y>D#e#STHBopcx6_KK`>UCCQ5$NCdMDmO|Ihzk1X|G`)D06*FVPIt zkuJ3MHCT%JPSj3*!Zi34v*JHk5HojnFJ)QOBWP)M!eHwCP~#6l|Ih!i1bX`?qn_<5 z)X{E2?fd}h<-3G>MAuL|xQqI9JV8CO@GdT23DvI-7Qt4S7RO>6oQ!I}*@fq?;30`% z4Cv}s7J}MQCe%w=7}c*0>Km>*7Q->9kMCB?pF^GCkEo-*i<^e+y{%`Xw=R(pzhm( zTIf#9#{AxC0=-1nQ49DR^=v|VIdh?ovM4^n%BV+Hs<%7Z>Ztn~V>*1p?1Jjo7sGHY zhT{y>hL>U}^Lwim;AYg(?m~6^1U0}{sDW>y7IF`@K%HwWWJc|a^u0>rKLi>uysx`4FY4L8h6&gb3*b1^1naRoUO@FL&x2isjc_PFK>c*= z(cj%S1rJc)iu?-UbsNC1`gn2x=l=mgd1{66HYQ@&AouJln4M7X#B?l+yD=H>p`Ll% zV0Qw=QSV3+j>Rgt2aloN`k_PIOFkR3Q{Oa%^VhRGNScTldt!amK>JW9_BrYVzCtbd25RTOp%xxE!i|>+bL;b;i@^WPP&ZUTex7&@ zEWZ;q;9=ANpQ3hh1+!rINOylejHF%+weU)q6C0s6)(thzP}By-W4J#5GYE>3Sc)3( z3~HilsJH$u>V}9>?xb=dEBA__CaQ(HuQlpp+za*g4@P~?=c7(w32NLOs0AHWyFULH z2=uaCMjiEaRL9$>fghs=4jt{Dc_!3OVo(c9Kz;m@a0gySJ&MT;u6JuXYW&5Rh^sIk zUO-=D0N>FBrAP#gbvrJDb*Q&N?Q|__K}S#noktz@C43iuvi2V1+y;hWg8)8)$ZO?& zK_^15&Uila7Et@~C_*vmvIV-rU;XG~YqJWW%gJ z2X)^H)H7ah`8}w2;Dpt$m_PXl)bWuef~L88Bx)hCr~zLwlgtX{Yp8|Q!7yxUc0iqA zFLMm)Q#BXW|1T_vzM$#utF{QXB+&#r;3lks>1R0Wnp4eBFlQo^{#!3;rjfC&vFAqnfc9l)Qu&~N@iV*Am7sJU9CP4wX^Y-pJ6UBH=4Uq z3q0gk3G))AB>D?nB)-&FU*KAN4I( zKaVlY?_DL(fX}QUV2-P2G_#==5^eQ()Wjt$pJY};eUmmseM(xRK0O_+y(?y>J`lCx zN$68zr6qQv2L23nlo!lz&0FSu^C@cKfpcB|beKdv3o2jR@{LfBthMF4TfXmHp1M^3%EzGciKvB^LoKL^S>J4Jc0nz`H^34T&AF%nR$6_7)psGESMOug zgl8>(1vSz4<~_?l!$sr+-go0ILG@d0e(3T(?;wE&JmC`FMeFdb`7=h*{@9FM=)QQ0 z;bQV#Pzw%VHW`YVC;~NZwAG7Qdot>asw&3m=l=+6SYv*Gndq%J*&{fSyBC>tX{tyy^%K59IKMAdLq%}-KEo3fgfaMs7d(8uw zNd1uc8)Wb$&(Un`nVg2(AC#hzGZh5H^@jcVU# z9>HqVPoV|~UFq7hnbD|?6hNIsY1I9%qxv^6+o1AYeFOyvdZRkbK{c#E4X_^h)xg`2 z&9LSwcQT93b*TQ^QTOjPKSAC9CFa6gmjBnxu-cuhFDHQpC~1jusDYYTy*+B6A($Jd zqWZ5x_1j|Z$0F2ES^am^qkWG0VU%`_>mOl8JAGcfCCZr9Q4=;sy_9cb5Y9k-?BKw!Au${MJ2SWVJMaeuRzGT< zHqWCLdda+F{*78t#&ymZ%tk#C^)lBm+ezm423uk#>PR=D7P8yw2T?mcYhJYcb@Nx$ zz)w*3MXq<_(wnnHRAN`R_3; z#%^%q#i16SWcA9Z_IenFDH}L{C3;(jLFPDfrnwZ=ZJfySe5c+ct!%@yW)b1SOfF7p^_=jW~d1E!~b-~7u=v(4or zFhZaI+yq*Af|+DiHfy66mV$Y(HEQA^=6KY^v#q|?>N`*;@d@hwudV&6c?W$u;y(#A zK*kT9mN#;_gkNHb$G>UmJ@bx{j$Y4yIS`$u6Aj^DxgD>2y`W?IJu zsCQxwrosKzei(I9Cs7l8gPP#B)&I46hL2pof@WE~Nx!;QPu%J5ujaF$q1o2#W)8xP z+&B&+a5ieetIUn4g?wlpG|!rsQT=aP{a5n|>U+nRW|!+w81?yo1@-xFf!f(Ha}H{v z&6pYYq57Z0NPLWWF?hH8+!sQ%*FcTe%j&aGzccPf#`AfP2o{jgAJn#l_fZr7Zieo4 z?fI|_`F;3`+HnBp+2_8BXQS@hidx_))QMfe?Dz}TM*T+uHK7is)8~ICfsSYqYKJSa zA8y5knD>DF2`6Tv{<--bs{aG?Uo*qUZoHhRmoqQwWh;dGK8UyWB+RVOe+7aJ*bw#B zx3LbLtlkr~lR@SL)DGvP7O>IsyD=yAlh%F%^%eX8)i3g(Gmn{oK0TYVmS|&kH3ynw zF`j-iP!sI4{FkVO+_3rs^Iz10GaPaoiZTnKPP#ZY#WIIDe+@9z8kU)BQ7hhzYTt(% z@EnHXRn$q{LLKpa^uL5SntJeIcmH^EHtPQ6SRS{b#{K0m=dXdDTZgnqT*vH~jeKFN zS48!zk6Ks@^KI12*cUb6a@0gSP#>>jsQx!C{|9PZ@2Jh=v!F0)f-;x~tDgM+Ol0O@EXb2DL06RGWZT+ zt)@9NrM?Wa;Ut@QI&G!N>8eCro_t{nzq9x+{Yv*H_574^logb@^s7of2XQGM6D-5Q-i}H=-{zJb$ln2y@V^{naYhWAHHHH4E*9mevDPt%HD0&3CzMw3otR(jy z`uCqqWh*xiC9#)SS34VQEAaq}|0K>psY5Am{RqAKlu+soE!UO)!_~m`5xJ|_59?BX zCN4|+4mYMd|8N>w(QpoRHKTDqr7`gl*U_KfO}vCC=B1oow$w|1si5mC+)SB4tndEz z)<2)McgKIo?+IZ3c!KdS4Y+|gHyy4}?o-~Uex5$tD2physE5AP|9f(}$~ydi!#RQW z5bkYFZWA7{wg<$Mi9e!rqqK4R=cgGBvq+3YT@@VOkJy~SYLhQa`GiuATw6*U`FfOl z%2QuW$xZ1?sX}Q;TMDHpWg~sclN*Ge;ZoG)pFf9-y(E%nh_hScVUu6|y+Gm)43vqo zj{0)cb=KkkQ9RXh!Q{r%|1uV|+*;yr;yskrw3R}>(0tx7g3>loPvX?8g5~;Rdy;SC zmy|u$;WF`lN+S2%#AE!(!AaB? zP^uCK+KsW+UWR%);vsm9J|!us*E{42&{hoBTmOl~`RNcv(bxNTlpu=#{O8jtFYy~V zkdD)dAFGk8r44Y1d`61CIwz59MERLAlX9GV6Uv*!Pbo)rBiC<~uPM#Rt){&-KBuH! zRmu5Yqju({t9sG2|4sRrd=^Rp%U2=pOsPiOJRC=UBE|or z;XLx)C}oI40!b%Q=}jf|x@*B~Zr)6J-|Fj#bydR=+@oK`+7geY%%Y4U*VEs_{bLFB zeO9kdtRG$-G4&egk6Bh{GS6OWSV6rA15U*)_!=ek8cQ&TzGtof1hb^|8H~LsD=Cj@ zJB+)z=R-;(%5rj1LimQ*?EpbRvF*ew`?p ziQmEqjYJ zxsP!q^<38X4t+)tZ>M}_eKgiwwNqwNIufQ(-l6DfM!z@Ip88t;S20%`k|SN{|7SOU zC-)oAK5o))Lb^s%rchdtdqVk%qASGV|39L75O*bi!P?ZMANLDY7?*!x`rrHty=^qS zN5e_t_lXA$ME}t{&89Q*x8bKbO+y3DKO?=O06dT9hP`8SppCVB+GG$`l_r6h>XGh)dyoOuZJ-U)Lr| zLx047fKD!qKFzG24_i|1Qwq`cF-Gh2-;~NuIu^%bl-uOmVr_B(h$oZ#f$}!>x|F`;bR|;$Bww8R2dMe|*G3Y%No=x?If#Fxq+VUf zAE10s?h(mslrfaC)PKkR*7r2=P2vd3R?98Mh2)!1s#Ct8J{xD~`+tCSdW%Hrb(r8) zCL4q|DLEOZ~T^s24H}MI|hx+}$B8kD2 zwaSSb6DKoC21)>NS<4@!&sE}nxR|yrmXE_$l%tfHI{!#Y zJeBEm(v^|;T^D+v6MsWVy($wQq7rF+yJJ@B?~sqOewE4fw;P69?kDPt>>f2Wu>Aj? ze_a~Ok-TR&E_kW4QtPRAwwp#!zhtr60%(h*UI}+$P5hR8YaE6HDPK~yQ;ykv$1z#Y z{~eu79we3%!Y!yNfR;u?0Z>KiGu zsK*9&a{ndcJQ9T7E$dX#Zr)2y*CesIdpk_RrQ|3Br1uK)l5 diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 7895d020e..938b305e7 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: 2018-09-04 16:00+0800\n" +"POT-Creation-Date: 2018-09-07 12:00+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: Jumpserver team\n" @@ -759,7 +759,7 @@ msgstr "重置" #: common/templates/common/terminal_setting.html:108 #: perms/templates/perms/asset_permission_create_update.html:70 #: terminal/templates/terminal/command_list.html:103 -#: terminal/templates/terminal/session_list.html:126 +#: terminal/templates/terminal/session_list.html:127 #: terminal/templates/terminal/terminal_update.html:48 #: users/templates/users/_user.html:47 #: users/templates/users/forgot_password.html:45 @@ -1759,7 +1759,7 @@ 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 "" -"提示:(单位 / 分钟)当用户登录失败次数达到限制后,那么在此时间间隔内禁止登录." +"提示: (单位: 分钟) 当用户登录失败次数达到限制后,那么在此时间间隔内禁止登录." #: common/forms.py:187 msgid "Connection max idle time" @@ -1768,47 +1768,47 @@ msgstr "SSH最大空闲时间" #: common/forms.py:189 msgid "" "If idle time more than it, disconnect connection(only ssh now) Unit: minute" -msgstr "如果超过该配置没有操作,连接会被断开" +msgstr "提示: (单位: 分钟) 如果超过该配置没有操作,连接会被断开(仅ssh) " #: common/forms.py:195 msgid "Password minimum length" msgstr "密码最小长度 " -#: common/forms.py:202 +#: common/forms.py:201 msgid "Must contain capital letters" msgstr "必须包含大写字母" -#: common/forms.py:204 +#: common/forms.py:203 msgid "" "After opening, the user password changes and resets must contain uppercase " "letters" msgstr "开启后,用户密码修改、重置必须包含大写字母" -#: common/forms.py:210 +#: common/forms.py:209 msgid "Must contain lowercase letters" msgstr "必须包含小写字母" -#: common/forms.py:211 +#: common/forms.py:210 msgid "" "After opening, the user password changes and resets must contain lowercase " "letters" msgstr "开启后,用户密码修改、重置必须包含小写字母" -#: common/forms.py:217 +#: common/forms.py:216 msgid "Must contain numeric characters" msgstr "必须包含数字字符" -#: common/forms.py:218 +#: common/forms.py:217 msgid "" "After opening, the user password changes and resets must contain numeric " "characters" msgstr "开启后,用户密码修改、重置必须包含数字字符" -#: common/forms.py:224 +#: common/forms.py:223 msgid "Must contain special characters" msgstr "必须包含特殊字符" -#: common/forms.py:225 +#: common/forms.py:224 msgid "" "After opening, the user password changes and resets must contain special " "characters" @@ -2717,10 +2717,20 @@ msgstr "终断" msgid "Terminate selected" msgstr "终断所选" -#: terminal/templates/terminal/session_list.html:142 +#: terminal/templates/terminal/session_list.html:123 +msgid "Confirm finished" +msgstr "确认已完成" + +#: terminal/templates/terminal/session_list.html:143 msgid "Terminate task send, waiting ..." msgstr "终断任务已发送,请等待" +#: terminal/templates/terminal/session_list.html:156 +#, fuzzy +#| msgid "MFA enable success" +msgid "Finish session success" +msgstr "MFA 绑定成功" + #: terminal/templates/terminal/terminal_detail.html:13 #: terminal/views/terminal.py:59 msgid "Terminal detail" @@ -2805,7 +2815,7 @@ msgstr "MFA认证失败" #: users/api/user.py:134 msgid "Could not reset self otp, use profile reset instead" -msgstr "" +msgstr "不能再该页面重置MFA, 请去个人信息页面重置" #: users/authentication.py:56 msgid "Invalid signature header. No credentials provided." diff --git a/apps/static/js/jumpserver.js b/apps/static/js/jumpserver.js index 10e3d5589..bfd94efd4 100644 --- a/apps/static/js/jumpserver.js +++ b/apps/static/js/jumpserver.js @@ -154,8 +154,10 @@ function activeNav() { function APIUpdateAttr(props) { // props = {url: .., body: , success: , error: , method: ,} props = props || {}; - var success_message = props.success_message || gettext('Update is successful!'); - var fail_message = props.fail_message || gettext('An unknown error occurred while updating..'); + var user_success_message = props.success_message; + var default_success_message = gettext('Update is successful!'); + var user_fail_message = props.fail_message; + var default_failed_message = gettext('An unknown error occurred while updating..'); var flash_message = props.flash_message || true; if (props.flash_message === false){ flash_message = false; @@ -169,14 +171,36 @@ function APIUpdateAttr(props) { dataType: props.data_type || "json" }).done(function(data, textStatue, jqXHR) { if (flash_message) { - toastr.success(success_message); + var msg = ""; + if (user_fail_message) { + msg = user_success_message; + } else { + msg = default_success_message; + } + toastr.success(msg); } if (typeof props.success === 'function') { return props.success(data); } }).fail(function(jqXHR, textStatus, errorThrown) { if (flash_message) { - toastr.error(fail_message); + var msg = ""; + console.log(jqXHR); + console.log(textStatus); + console.log(errorThrown); + if (user_fail_message) { + msg = user_fail_message; + } else if (jqXHR.responseJSON) { + if (jqXHR.responseJSON.error) { + msg = jqXHR.responseJSON.error + } else if (jqXHR.responseJSON.msg) { + msg = jqXHR.responseJSON.msg + } + } + if (msg === "") { + msg = default_failed_message; + } + toastr.error(msg); } if (typeof props.error === 'function') { return props.error(jqXHR.responseText, jqXHR.status); diff --git a/apps/terminal/api.py b/apps/terminal/api.py index 0b908d837..1a2a35184 100644 --- a/apps/terminal/api.py +++ b/apps/terminal/api.py @@ -15,6 +15,7 @@ from django.conf import settings import jms_storage +from rest_framework.pagination import LimitOffsetPagination from rest_framework import viewsets from rest_framework.views import APIView, Response from rest_framework.permissions import AllowAny @@ -173,9 +174,10 @@ class StatusViewSet(viewsets.ModelViewSet): return super().get_permissions() -class SessionViewSet(viewsets.ModelViewSet): +class SessionViewSet(BulkModelViewSet): queryset = Session.objects.all() serializer_class = SessionSerializer + pagination_class = LimitOffsetPagination permission_classes = (IsOrgAdminOrAppUser,) def get_queryset(self): @@ -183,7 +185,7 @@ class SessionViewSet(viewsets.ModelViewSet): if terminal_id: terminal = get_object_or_404(Terminal, id=terminal_id) self.queryset = terminal.session_set.all() - return self.queryset + return self.queryset.all() def perform_create(self, serializer): if hasattr(self.request.user, 'terminal'): diff --git a/apps/terminal/serializers.py b/apps/terminal/serializers.py index c18c5023d..425eae8b1 100644 --- a/apps/terminal/serializers.py +++ b/apps/terminal/serializers.py @@ -5,9 +5,7 @@ from django.utils import timezone from rest_framework import serializers from rest_framework_bulk.serializers import BulkListSerializer - from common.mixins import BulkSerializerMixin -from common.utils import get_object_or_none from .models import Terminal, Status, Session, Task from .backends import get_multi_command_storage @@ -45,7 +43,7 @@ class TerminalSerializer(serializers.ModelSerializer): return False -class SessionSerializer(serializers.ModelSerializer): +class SessionSerializer(BulkSerializerMixin, serializers.ModelSerializer): command_amount = serializers.SerializerMethodField() command_store = get_multi_command_storage() diff --git a/apps/terminal/templates/terminal/session_list.html b/apps/terminal/templates/terminal/session_list.html index c27b2f8a7..534dc4cd6 100644 --- a/apps/terminal/templates/terminal/session_list.html +++ b/apps/terminal/templates/terminal/session_list.html @@ -120,6 +120,7 @@