From 6035d1f130efaa3ba845c6620876c64343bba615 Mon Sep 17 00:00:00 2001 From: chnliyong Date: Sat, 10 Mar 2018 10:46:28 +0800 Subject: [PATCH 1/8] python-gssapi libkrb5-dev for gssapi/gssapi.h --- requirements/deb_requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/deb_requirements.txt b/requirements/deb_requirements.txt index a0ddb7642..f4131a3ea 100644 --- a/requirements/deb_requirements.txt +++ b/requirements/deb_requirements.txt @@ -1 +1 @@ -libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk python-dev openssl libssl-dev libldap2-dev libsasl2-dev sqlite gcc automake +libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk python-dev openssl libssl-dev libldap2-dev libsasl2-dev sqlite gcc automake libkrb5-dev From 4fd83bd5be712dbe4b152137f052d50245062323 Mon Sep 17 00:00:00 2001 From: Nidhoggur1993 Date: Tue, 3 Apr 2018 16:02:51 +0800 Subject: [PATCH 2/8] Update make_migrations.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加自动合并而不是在弹出warning结束 --- utils/make_migrations.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils/make_migrations.sh b/utils/make_migrations.sh index fdf1f6efb..b6068a1ca 100755 --- a/utils/make_migrations.sh +++ b/utils/make_migrations.sh @@ -4,3 +4,5 @@ python3 ../apps/manage.py makemigrations python3 ../apps/manage.py migrate + +python3 ../apps/manage.py makemigrations –merge From a2f23e96819a755d5e2d31a3f43c5299b9681e6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E5=BF=97=E8=89=B3?= Date: Fri, 8 Jun 2018 11:01:07 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E6=96=B0=E5=A2=9ERedis=20DB=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/jumpserver/settings.py | 6 ++++-- config_example.py | 24 +++++++++++++----------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py index 6fd9f0fdd..c8ed1505e 100644 --- a/apps/jumpserver/settings.py +++ b/apps/jumpserver/settings.py @@ -343,10 +343,11 @@ if AUTH_LDAP: AUTHENTICATION_BACKENDS.insert(0, AUTH_LDAP_BACKEND) # Celery using redis as broker -CELERY_BROKER_URL = 'redis://:%(password)s@%(host)s:%(port)s/3' % { +CELERY_BROKER_URL = 'redis://:%(password)s@%(host)s:%(port)s/%(db)s' % { 'password': CONFIG.REDIS_PASSWORD if CONFIG.REDIS_PASSWORD else '', 'host': CONFIG.REDIS_HOST or '127.0.0.1', 'port': CONFIG.REDIS_PORT or 6379, + 'db':CONFIG.REDIS_DB_CELERY_BROKER or 3, } CELERY_TASK_SERIALIZER = 'pickle' CELERY_RESULT_SERIALIZER = 'pickle' @@ -367,10 +368,11 @@ CELERY_WORKER_HIJACK_ROOT_LOGGER = False CACHES = { 'default': { 'BACKEND': 'redis_cache.RedisCache', - 'LOCATION': 'redis://:%(password)s@%(host)s:%(port)s/4' % { + 'LOCATION': 'redis://:%(password)s@%(host)s:%(port)s/%(db)s' % { 'password': CONFIG.REDIS_PASSWORD if CONFIG.REDIS_PASSWORD else '', 'host': CONFIG.REDIS_HOST or '127.0.0.1', 'port': CONFIG.REDIS_PORT or 6379, + 'db':CONFIG.REDIS_DB_CACHE or 4, } } } diff --git a/config_example.py b/config_example.py index 0c8d87094..a96f0d7c9 100644 --- a/config_example.py +++ b/config_example.py @@ -21,10 +21,10 @@ class Config: ALLOWED_HOSTS = ['*'] # Development env open this, when error occur display the full process track, Production disable it - DEBUG = True + DEBUG = os.environ.get("DEBUG") or True # DEBUG, INFO, WARNING, ERROR, CRITICAL can set. See https://docs.djangoproject.com/en/1.10/topics/logging/ - LOG_LEVEL = 'DEBUG' + LOG_LEVEL = os.environ.get("LOG_LEVEL") or 'DEBUG' LOG_DIR = os.path.join(BASE_DIR, 'logs') # Database setting, Support sqlite3, mysql, postgres .... @@ -35,12 +35,12 @@ class Config: DB_NAME = os.path.join(BASE_DIR, 'data', 'db.sqlite3') # MySQL or postgres setting like: - # DB_ENGINE = 'mysql' - # DB_HOST = '127.0.0.1' - # DB_PORT = 3306 - # DB_USER = 'root' - # DB_PASSWORD = '' - # DB_NAME = 'jumpserver' + # DB_ENGINE = os.environ.get("DB_ENGINE") or 'mysql' + # DB_HOST = os.environ.get("DB_HOST") or '127.0.0.1' + # DB_PORT = os.environ.get("DB_PORT") or 3306 + # DB_USER = os.environ.get("DB_USER") or 'jumpserver' + # DB_PASSWORD = os.environ.get("DB_PASSWORD") or 'weakPassword' + # DB_NAME = os.environ.get("DB_NAME") or 'jumpserver' # When Django start it will bind this host and port # ./manage.py runserver 127.0.0.1:8080 @@ -48,9 +48,11 @@ class Config: HTTP_LISTEN_PORT = 8080 # Use Redis as broker for celery and web socket - REDIS_HOST = '127.0.0.1' - REDIS_PORT = 6379 - REDIS_PASSWORD = '' + REDIS_HOST = os.environ.get("REDIS_HOST") or '127.0.0.1' + REDIS_PORT = os.environ.get("REDIS_PORT") or 6379 + REDIS_PASSWORD = os.environ.get("REDIS_PASSWORD") or '' + REDIS_DB_CELERY = os.environ.get('REDIS_DB') or 3 + REDIS_DB_CACHE = os.environ.get('REDIS_DB') or 4 def __init__(self): pass From dd07fa678f05d022da23cc1539cd93f6222effc3 Mon Sep 17 00:00:00 2001 From: BaiJiangJie Date: Mon, 11 Jun 2018 16:27:40 +0800 Subject: [PATCH 4/8] =?UTF-8?q?[Update]=20=E6=B7=BB=E5=8A=A0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E7=B3=BB=E7=BB=9F=E7=94=A8=E6=88=B7=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E7=99=BB=E5=BD=95=E6=A8=A1=E5=BC=8F(=E8=87=AA?= =?UTF-8?q?=E5=8A=A8/=E6=89=8B=E5=8A=A8=E7=99=BB=E5=BD=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/forms/user.py | 21 +- apps/assets/models/base.py | 2 +- apps/assets/models/user.py | 8 + apps/assets/serializers/system_user.py | 7 + .../assets/templates/assets/_system_user.html | 36 ++- .../templates/assets/system_user_detail.html | 4 + .../templates/assets/system_user_list.html | 11 +- .../templates/assets/system_user_update.html | 1 - apps/i18n/zh/LC_MESSAGES/django.mo | Bin 34591 -> 35051 bytes apps/i18n/zh/LC_MESSAGES/django.po | 240 ++++++++++-------- 10 files changed, 208 insertions(+), 122 deletions(-) diff --git a/apps/assets/forms/user.py b/apps/assets/forms/user.py index 2295dc005..0bc4ff094 100644 --- a/apps/assets/forms/user.py +++ b/apps/assets/forms/user.py @@ -109,12 +109,24 @@ class SystemUserForm(PasswordAndKeyAuthForm): if not self.instance and not auto_generate: super().validate_password_key() + def is_valid(self): + validated = super().is_valid() + username = self.cleaned_data.get('username') + login_mode = self.cleaned_data.get('login_mode') + if login_mode == SystemUser.AUTO_LOGIN and not username: + self.add_error( + "username", _('* Automatic login mode,' + ' must fill in the username.') + ) + return False + return validated + class Meta: model = SystemUser fields = [ 'name', 'username', 'protocol', 'auto_generate_key', 'password', 'private_key_file', 'auto_push', 'sudo', - 'comment', 'shell', 'priority', + 'comment', 'shell', 'priority', 'login_mode', ] widgets = { 'name': forms.TextInput(attrs={'placeholder': _('Name')}), @@ -124,5 +136,8 @@ class SystemUserForm(PasswordAndKeyAuthForm): 'name': '* required', 'username': '* required', 'auto_push': _('Auto push system user to asset'), - 'priority': _('High level will be using login asset as default, if user was granted more than 2 system user'), - } \ No newline at end of file + 'priority': _('High level will be using login asset as default, ' + 'if user was granted more than 2 system user'), + 'login_mode': _('If you choose manual login mode, you do not ' + 'need to fill in the username and password.') + } diff --git a/apps/assets/models/base.py b/apps/assets/models/base.py index cb9bb96ae..908e6b647 100644 --- a/apps/assets/models/base.py +++ b/apps/assets/models/base.py @@ -19,7 +19,7 @@ signer = get_signer() class AssetUser(models.Model): id = models.UUIDField(default=uuid.uuid4, primary_key=True) name = models.CharField(max_length=128, unique=True, verbose_name=_('Name')) - username = models.CharField(max_length=32, verbose_name=_('Username'), validators=[alphanumeric]) + username = models.CharField(max_length=32, blank=True, verbose_name=_('Username'), validators=[alphanumeric]) _password = models.CharField(max_length=256, blank=True, null=True, verbose_name=_('Password')) _private_key = models.TextField(max_length=4096, blank=True, null=True, verbose_name=_('SSH private key'), validators=[private_key_validator, ]) _public_key = models.TextField(max_length=4096, blank=True, verbose_name=_('SSH public key')) diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py index bf31b8491..f835e387f 100644 --- a/apps/assets/models/user.py +++ b/apps/assets/models/user.py @@ -100,6 +100,13 @@ class SystemUser(AssetUser): (RDP_PROTOCOL, 'rdp'), ) + AUTO_LOGIN = 'auto' + MANUAL_LOGIN = 'manual' + LOGIN_MODE_CHOICES = ( + (AUTO_LOGIN, _('Automatic login')), + (MANUAL_LOGIN, _('Manually login')) + ) + nodes = models.ManyToManyField('assets.Node', blank=True, verbose_name=_("Nodes")) assets = models.ManyToManyField('assets.Asset', blank=True, verbose_name=_("Assets")) priority = models.IntegerField(default=10, verbose_name=_("Priority")) @@ -107,6 +114,7 @@ class SystemUser(AssetUser): auto_push = models.BooleanField(default=True, verbose_name=_('Auto push')) sudo = models.TextField(default='/bin/whoami', verbose_name=_('Sudo')) shell = models.CharField(max_length=64, default='/bin/bash', verbose_name=_('Shell')) + login_mode = models.CharField(choices=LOGIN_MODE_CHOICES, default=AUTO_LOGIN, max_length=10, verbose_name=_('Login mode')) def __str__(self): return '{0.name}({0.username})'.format(self) diff --git a/apps/assets/serializers/system_user.py b/apps/assets/serializers/system_user.py index 7abd09d29..9caf150b4 100644 --- a/apps/assets/serializers/system_user.py +++ b/apps/assets/serializers/system_user.py @@ -18,6 +18,13 @@ class SystemUserSerializer(serializers.ModelSerializer): model = SystemUser exclude = ('_password', '_private_key', '_public_key') + def get_field_names(self, declared_fields, info): + fields = super(SystemUserSerializer, self).get_field_names(declared_fields, info) + fields.extend([ + 'get_login_mode_display', + ]) + return fields + @staticmethod def get_unreachable_assets(obj): return obj.unreachable_assets diff --git a/apps/assets/templates/assets/_system_user.html b/apps/assets/templates/assets/_system_user.html index 314967d22..cf8539293 100644 --- a/apps/assets/templates/assets/_system_user.html +++ b/apps/assets/templates/assets/_system_user.html @@ -36,12 +36,13 @@ {% endif %}

{% trans 'Basic' %}

{% bootstrap_field form.name layout="horizontal" %} + {% bootstrap_field form.login_mode layout="horizontal" %} {% bootstrap_field form.username layout="horizontal" %} {% bootstrap_field form.priority layout="horizontal" %} {% bootstrap_field form.protocol layout="horizontal" %} +

{% trans 'Auth' %}

{% block auth %} -

{% trans 'Auth' %}

@@ -80,15 +81,22 @@ {% endblock %} {% block custom_foot_js %} {% endblock %} \ No newline at end of file diff --git a/apps/assets/templates/assets/system_user_detail.html b/apps/assets/templates/assets/system_user_detail.html index 9a7bc255a..b68bf2689 100644 --- a/apps/assets/templates/assets/system_user_detail.html +++ b/apps/assets/templates/assets/system_user_detail.html @@ -62,6 +62,10 @@ {% trans 'Username' %}: {{ system_user.username }} + + {% trans 'Login mode' %}: + {{ system_user.get_login_mode_display }} + {% trans 'Protocol' %}: {{ system_user.protocol }} diff --git a/apps/assets/templates/assets/system_user_list.html b/apps/assets/templates/assets/system_user_list.html index 3daa47a81..3fa887df6 100644 --- a/apps/assets/templates/assets/system_user_list.html +++ b/apps/assets/templates/assets/system_user_list.html @@ -26,6 +26,7 @@ {% trans 'Name' %} {% trans 'Username' %} {% trans 'Protocol' %} + {% trans 'Login mode' %} {% trans 'Asset' %} {% trans 'Reachable' %} {% trans 'Unreachable' %} @@ -48,7 +49,7 @@ function initTable() { var detail_btn = '' + cellData + ''; $(td).html(detail_btn.replace('{{ DEFAULT_PK }}', rowData.id)); }}, - {targets: 5, createdCell: function (td, cellData) { + {targets: 6, createdCell: function (td, cellData) { var innerHtml = ""; if (cellData !== 0) { innerHtml = "" + cellData + ""; @@ -57,7 +58,7 @@ function initTable() { } $(td).html('' + innerHtml + ''); }}, - {targets: 6, createdCell: function (td, cellData) { + {targets: 7, createdCell: function (td, cellData) { var innerHtml = ""; if (cellData !== 0) { innerHtml = "" + cellData + ""; @@ -66,7 +67,7 @@ function initTable() { } $(td).html('' + innerHtml + ''); }}, - {targets: 7, createdCell: function (td, cellData, rowData) { + {targets: 8, createdCell: function (td, cellData, rowData) { var val = 0; var innerHtml = ""; var total = rowData.assets_amount; @@ -84,14 +85,14 @@ function initTable() { $(td).html('' + innerHtml + ''); }}, - {targets: 9, createdCell: function (td, cellData, rowData) { + {targets: 10, createdCell: function (td, cellData, rowData) { var update_btn = '{% trans "Update" %}'.replace('{{ DEFAULT_PK }}', cellData); var del_btn = '{% trans "Delete" %}'.replace('{{ DEFAULT_PK }}', cellData); $(td).html(update_btn + del_btn) }}], ajax_url: '{% url "api-assets:system-user-list" %}', columns: [ - {data: "id" }, {data: "name" }, {data: "username" }, {data: "protocol"}, {data: "assets_amount" }, + {data: "id" }, {data: "name" }, {data: "username" }, {data: "protocol"}, {data: "get_login_mode_display"}, {data: "assets_amount" }, {data: "reachable_amount"}, {data: "unreachable_amount"}, {data: "id"}, {data: "comment" }, {data: "id" } ], op_html: $('#actions').html() diff --git a/apps/assets/templates/assets/system_user_update.html b/apps/assets/templates/assets/system_user_update.html index 7e1590db5..977c3ac31 100644 --- a/apps/assets/templates/assets/system_user_update.html +++ b/apps/assets/templates/assets/system_user_update.html @@ -4,7 +4,6 @@ {% load bootstrap3 %} {% block auth %} -

{% trans 'Auth' %}

{% bootstrap_field form.password layout="horizontal" %} {% bootstrap_field form.private_key_file layout="horizontal" %}
diff --git a/apps/i18n/zh/LC_MESSAGES/django.mo b/apps/i18n/zh/LC_MESSAGES/django.mo index 7d2f547cd060a8f9bcb6920ecac28ce737ebe3df..df59e43d67e7b758c445eae254496702a7583bf4 100644 GIT binary patch delta 12416 zcmZwN37k&l`^WJ!t6|1AW9()g>sZFVWh?s@vX-qFW~^hzG7}Se?E4atC9<^`5*pc~ zEG1+sqDWyZAw?*}|MPv$rI-Kf|39za<$Yh*xzByy=RW6oJk@X6EdT3s{JlSi2hMjm zD)>82VVsfMacJIrr|amgN-XX&Ub!}vtN=gs_ZzCIH-!_MB{kmf6glY zsEenNOPz?Sj#CdCVrd-X>UGj-1XDPHTEH31g7>Wc*bJ)XI60|@VE`6J_4i;n*255N zi-oWYhGMGK$D;0O8tS@r80dH%=O7JDcocKt510q9VmAEO45{uoY>pFwT1ZLEj@7Xg zHo`JE0Egi`Y>y!|9H#?zGuNZ)0W}>bi20qDX=sbOqgFf}BX9v~g0&ck+b{@sVHobi z9C#e_;xDM{?^`|KIk#UpYMf})`SPe6tA$<-(3nP6?0_2hRn$%lKyBqnjKl?45Z9p| z*#XRlM^OV`K@EJz&Ob&iJgAntbJJFCL z`L(D=_9^OJ*p3=_7wQom!2I~5oxfw}@0)(L-TtAq*?(OaNkK19G}6Z@jao=A)I|MJ z3mt;$Hx?`6G}Ik#M=f+WY6tdPehhW}Df4G+N`4u&)8)N&+<|MO25yPEpabfTyII~J z^{9rR9?clkOF9R&^&g^dM^NKz$3nOlwIkX8jbjW^uRkGJ~UsOuJ^##@OI`uwk@p%v~%--=NS zID#HLgL+#Zp!yYf-km54wR0s=3#f{kxEX4K4pbnjppeg43<5<*0Rj?G+MgHz`dYgSv-}(K`8CZ#YJ!-yR z8hH8orID+lk)IuMi z#tUrhKH6Mf8Y&dBLJS6yS3$i4HBslAqZZT=b?0%YccU+A!9y)iLoH+i>MMID>XEHN z{T-2k`j{U?jpsc>Ljzt$4R`}JzQ@tsVp9yjepm<-QIB*A zYTU)B8(W3!jMv#jL(lF2>ZQ1aCDFgBd*`K56I4T8*a(BMBWh>5VG#C3y_ADccbtma z`iZEQauG)1W{k#@K6(CkY3SKRHgmT=8Z~eU)D~5;dOcLXhNwGfW%W*|o$HEPNCN7P z2ci}{8Vlkq^v86}f*)fx=65#H&_ugYJ8&3v$LBE%{*IdP9%^f!SUsS*+dmXFaTEq) z2@Jt<=-WBeOWFwaQVv7y%vkj5^EjV|R=N(A??T`b%R?m1`oC1`In$^he9CcZ|Po8#4LqcaYfW4sfSsx1!@89P!q&q zRvduYFa>qqi&bzoYT`4{nyt2PC-6I-9gBU?tnQ^KP2*_Ca#RysamKz zYKhwN1k_e1VknM8ef%a{z7$K7r=$9xz^-`4OT+h!TDdktEucMWg`Ke~4zlwrP@m%s z7>i$H5&R2vXW^~gcO)NbqCyyk#V`~rq8>pV)Q)-ESfev$r_jst!R8xQpMcuxx#qj5 zEq)($1DjA2?nQ0&LDWv2MJ?ba>ZN;t*)c~OU)}2zrlAvMP%Es5T44*fgVP;#XZ=x+ zA_*JgWYo)d81>R#MGfq{XxB%TPPF5p&@_)YhLw^}m2s@pmkT#oF`y^%At9Av>ck z?1j2;7-~z$pze4UYKP{TOED+;hp2v=(Kj(_yptG?=P@_lMh^ydaBsL|2R{FLo6Azr zKn=`xs0-pyUqHjq_mc^WldnbnZa9i57~9ePJ7fh`AU}ZmxZO8Bo!m#%0&7wqg8G@C z-iiI!Gr34XkKj7$nf-yA@geG2e)_We%nqUY{fPQ5KacuKzF_Asqqh1k>Jj?A;y%I< zj3h6N`rfF5y1~|78rtd}sI5xGe5ks%bOGvR`2f{#6KbcvL=AA<@{3rN{0`>9n9lBa zby59aLM^NZ>bilb8~2X3#zfRJn~A!^1*i*_pcb+kbqAYK3p$J%;3w1_T}18NV^sgF zUHDeSe5m?p)Ob@+*Uv*1>~&Vrh@kKTs^fLkOLPyl(ky&W=Enl4JE?*is3H1ZUetu0 zQ3Lm}dMav1y;ueKNO>QQwz6HwO;Mg2lb!xs217S!iIlZFP;E3J+>aXjWl)fb~COvl!Ke7-S_ z{K>2QV;H8r#t&5Lk8lh5o}TWVzY*vD(wT{6sjo9nqrOK1da*mrXcVPU82g)(Pzzaw z+QK!Ke{SwWZT%tCou0J%1WmVP&XRf$334Hl^6HY(2A?tiF#&B^A$7R9D@2ZyotK= z1(vU|^Lwp+%<_vEOus)Yzi)Y9U-x=%C=IPR3X5Vn%Uh#%pet&CG;@qO8Fk$(%il%4 z{VOpL*V_3FsD*xxTKF*xz-!2jd!3tZ!?|zz^>cS56g6=qR>Q)Ux3lw|QCrx{>O-*x zd79-L%q^$|?6Um0dD|2&N(I$TC|?9|`AvwmhOY9ZsyspeaDeu4QuYC#(@D}HGn zLS26nHU3%i7KSmu<3GSXkrT6$7ej4rtXa!!iW;DU*~d(?^D|HjScDoU9kXDD)puC^ z5c(E`UQKkChP-CpGXn;?6XrslFK$*s4N%YW#+J83-&ZkeA$_d=I_mn-<}|A>7|8S2 zK<`=M1Js2dTfP%@;a>9?79u}q{)4(cGSRg#s(*3RIF&4~kLuSNW3Z#;qY~MFofuC+ ze>qG;eF~Of816!yKZN>A=>%$PFIxR3hLQhex!)kSe+X*4oT&aqQT@uH9^rFVf6+@r z6Ld1Wo4rvN3^0eA6U;fNJABXbPf+9RuzZi@N3ksRQ`o*n(kOPOV`0(q>f*Xc&1K80!K zA#6e(HkcO(+oJ~FhFahkmVb+j$iKHdX^7h|6&p|=W%(|1Kjx%<7=0f@U!CWFi-rci zX9f&)2g-%2=d-*7hLe{=-Qn|Q3)BKTqWX6;`!p%Nv<3&334TbjIR1&`U!D%(fFtP!p|3?aXe}7N55I4XZ!G zNa~Tp-TviJU!@AD{Mi159~vI?k}P)2pZwuX_%SU^q6H) z6IVmsSp(E{9Z@fBH`F7GNA*iW%`?)?z0P79y5J+!0H3%goG;BIcK#>SKo>AS-mrQQ zKZSK&7;4~X)OgRMCTwE1N9}A6Ga2*q{yAP6x?mxW$7QGsi@)Jo33a|6YJkRA13TLJ z>8J%PM19=Wq84}xb=@uVp7}3o{J@c@&wp+j8X!sqtc<=d7_)`h(d>a*$N_B@DtpQ9E}ZW6}Rj_k2av zLhD-I33Yw1H`#wR`rC=YsE@^H)UVjLt-cV|?*r7%d~EgIsDTe#o@x1QRKHNhmr-VA z)PftE?YuPfi{v%b%QMMNY&3V7hcE}{Potjw71V<6n~zZg2aRzJH>1s1RR3C**EhYb zY3TFb71d!B>W;>v23&%=gLKqa=T3~qZ!rpQVlfOG>wYRKVtMjDSP18##@m1z=Nr@w zoW;Dnf6fgW%_#(obN}9Ng?ee`q879SwUAY~5I0~RY{6$$_194S2BO}9p%{Q8Fce3j z#+!obHy5>lMLyZKbSrE_-wII!pSAimtN&y5unF$@0%j?*s#)J`jb#|8tK}0=9j*# ze++%U|Ig9T0)E5V_y9F<^-1nP%~9vuo4rt8(~hg`do7nYN5+5Uo)Bg zFGpb`1--TBP;YJM6nCH)vl{B_kSdR5d8LZMp$t!o}pF%^Wdxah|vE>ZbN(PotHHqr_>N5e9AOvf2mD{;Ik5558hJr-9dn3(tbUvJY!x|X z5S6G8B03U$fSgA-j%cS2ntzN>$N2)|tgUCQV*zoIsKN!j?7sg__#&3JiD^0?ac(kE zn`llfqqYLy(MdbP$#W3p2p!vqd&GL(|7R56C0T>RtOKc2$J(!9XW|^SHdZT1`<6O! z1hSayZqte2{5M2l@|MIPtLvLGC;bjuE`sQ{MEhUM234^U@sMah?L4uF_D@88+5@fM zd**Z0pC03>^&|Ps3SW`ylhBG-L&P%qeLFYNu2D>p)GJ%^I$k0!SYHqFW%}Ro8~Hsur(!mJ{;OGG zBW`-;sdYx8xf@~*Fe7#1NeziPZ8^=w-F3_ysi`(ZoL5 zb$l7$7dVQ12X438Q~sr~hjV+;8%N_4J987a5N}e8v6*wz)={2(8eS$6toAAGGsJB2 z!B!)6UL*X;uPfmwOB5pfsFh`$>MC+%=>6M7BP+#1L>Ag(==7}(_8q=L#Hcq%2ih;= zVw{h6P)9>k?F0J54nM{$Mtkkk0v4d}OSp>oNbmp8G`bK^k9jnHc$(llL52JNPV4$c4H@d?HC#6l_|R(+AY zC++rFmUx?ZdQm~@DMT6WY9H!o#reX-hlGv<;xF2(h(KZqQPFpXUDoG+9t9m0%-pmi ziCIK82L6D$hqjI~F3zviuF)=Pxp;w^j%Ij(_>_2_ycFK`o#C%v+HGiu62BAw=vJ~) z3?}|1I#|bV&EodFN@8tl9*n?A#BusxA#}V#tfigH`VS+|O2iWHQ-6Y+t#2}(B(Fd; z(^lrEu#)(aSWR>xzM}s0=s~WdFA+dHJChXgRrq0oXNgY4V4^MOcM+%T8hyXCAhHnG ziJ`=wL{Y{_qrdkTlD`QZeX%O>fOaW5WWz{1*MRm?+Tpm7NTIzGqwIWZ+FNKJ$Bx7- z+C_*0j5B~dmiAUWMFbL6iH3TW`f*|h@$~qH#^a}nnTJ6x(Edq-5Oays#BRb-aQuiX z-KKMc_DG@cK!tC_7dg%^YC)e(DA*CGr=#TMul4el^Ud`BoB&9>EGLv znB2F2l4nqId_t^eQ0lN0PoMsYi5^NR{SrK>!xDxj#SKcRkWs8kT5z!2Ib+UqdqUcJ zdiP6C9+u!46ql45m-xSiNlQ-k#3y@_l2bfM2?_C@l;r<+P)}S^yk~ISuwlcKhsIaP zXw_i5f1uWp@uX3>UzkQsOtTqtH2ErTNaf0&%2jJut&wrI+tR?YS0}H@oVNPPq8*u^ z&%eBSMdr@gw|36R+&%HyiXE9N)@DvxbYgDO_m#0quza#v2Rp#6ond>KASw1#%%A!kKXI@(}=IV!I-H|hvC7tvS^39o%I3&_9 O?Aehr#tdDS=YIeSRQ&V+ delta 11980 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 PjvW!~lig\n" "Language-Team: Jumpserver team\n" @@ -29,10 +29,10 @@ msgstr "" msgid "测试节点下资产是否可连接: {}" msgstr "" -#: assets/forms/asset.py:24 assets/models/asset.py:75 assets/models/user.py:103 +#: assets/forms/asset.py:24 assets/models/asset.py:75 assets/models/user.py:110 #: assets/templates/assets/asset_detail.html:183 #: assets/templates/assets/asset_detail.html:191 -#: assets/templates/assets/system_user_detail.html:175 perms/models.py:33 +#: assets/templates/assets/system_user_detail.html:179 perms/models.py:33 msgid "Nodes" msgstr "节点管理" @@ -103,7 +103,7 @@ msgstr "端口" #: assets/templates/assets/domain_detail.html:60 #: assets/templates/assets/domain_list.html:15 #: assets/templates/assets/label_list.html:16 -#: assets/templates/assets/system_user_list.html:29 audits/models.py:11 +#: assets/templates/assets/system_user_list.html:30 audits/models.py:11 #: audits/templates/audits/ftp_log_list.html:41 #: audits/templates/audits/ftp_log_list.html:72 perms/forms.py:37 #: perms/models.py:32 @@ -118,7 +118,7 @@ msgstr "端口" msgid "Asset" msgstr "资产" -#: assets/forms/domain.py:54 assets/forms/user.py:79 assets/forms/user.py:120 +#: assets/forms/domain.py:54 assets/forms/user.py:79 assets/forms/user.py:131 #: assets/models/base.py:21 assets/models/cluster.py:18 #: assets/models/domain.py:17 assets/models/group.py:20 #: assets/models/label.py:17 assets/templates/assets/admin_user_detail.html:56 @@ -147,15 +147,15 @@ msgstr "资产" msgid "Name" msgstr "名称" -#: assets/forms/domain.py:55 assets/forms/user.py:80 assets/forms/user.py:121 +#: assets/forms/domain.py:55 assets/forms/user.py:80 assets/forms/user.py:132 #: assets/models/base.py:22 assets/templates/assets/admin_user_detail.html:60 #: assets/templates/assets/admin_user_list.html:24 #: assets/templates/assets/domain_gateway_list.html:60 #: assets/templates/assets/system_user_detail.html:62 #: assets/templates/assets/system_user_list.html:27 #: perms/templates/perms/asset_permission_user.html:55 users/forms.py:13 -#: users/forms.py:21 users/forms.py:30 users/models/authentication.py:45 -#: users/models/user.py:47 users/templates/users/_select_user_modal.html:14 +#: users/forms.py:31 users/models/authentication.py:45 users/models/user.py:47 +#: users/templates/users/_select_user_modal.html:14 #: users/templates/users/login.html:56 #: users/templates/users/login_log_list.html:49 #: users/templates/users/user_detail.html:67 @@ -169,7 +169,7 @@ msgid "Password or private key passphrase" msgstr "密码或密钥密码" #: assets/forms/user.py:25 assets/models/base.py:23 common/forms.py:113 -#: users/forms.py:15 users/forms.py:23 users/forms.py:32 users/forms.py:44 +#: users/forms.py:15 users/forms.py:33 users/forms.py:45 #: users/templates/users/login.html:59 #: users/templates/users/reset_password.html:53 #: users/templates/users/user_create.html:10 @@ -192,16 +192,26 @@ msgstr "ssh密钥不合法" msgid "Password and private key file must be input one" msgstr "密码和私钥, 必须输入一个" -#: assets/forms/user.py:126 +#: assets/forms/user.py:118 +msgid "* Automatic login mode, must fill in the username." +msgstr "自动登录模式,必须填写用户名" + +#: assets/forms/user.py:137 msgid "Auto push system user to asset" msgstr "自动推送系统用户到资产" -#: assets/forms/user.py:127 +#: assets/forms/user.py:138 msgid "" "High level will be using login asset as default, if user was granted more " "than 2 system user" msgstr "高优先级的系统用户将会作为默认登录用户" +#: assets/forms/user.py:139 +msgid "" +"If you choose manual login mode, you do not need to fill in the username and " +"password." +msgstr "如果选择手动登录模式,用户名和密码则不需要填写" + #: assets/models/asset.py:63 assets/models/domain.py:43 #: assets/templates/assets/_asset_list_modal.html:46 #: assets/templates/assets/admin_user_assets.html:52 @@ -309,7 +319,7 @@ msgstr "标签管理" #: assets/templates/assets/admin_user_detail.html:68 #: assets/templates/assets/asset_detail.html:117 #: assets/templates/assets/domain_detail.html:72 -#: assets/templates/assets/system_user_detail.html:96 +#: assets/templates/assets/system_user_detail.html:100 #: ops/templates/ops/adhoc_detail.html:86 perms/models.py:38 perms/models.py:81 #: perms/templates/perms/asset_permission_detail.html:98 #: users/models/user.py:90 users/templates/users/user_detail.html:111 @@ -320,7 +330,7 @@ msgstr "创建者" #: assets/models/domain.py:20 assets/models/group.py:22 #: assets/models/label.py:23 assets/templates/assets/admin_user_detail.html:64 #: assets/templates/assets/domain_detail.html:68 -#: assets/templates/assets/system_user_detail.html:92 +#: assets/templates/assets/system_user_detail.html:96 #: ops/templates/ops/adhoc_detail.html:90 ops/templates/ops/task_detail.html:63 #: perms/models.py:39 perms/models.py:82 #: perms/templates/perms/asset_permission_detail.html:94 @@ -338,8 +348,8 @@ msgstr "创建日期" #: assets/templates/assets/domain_detail.html:76 #: assets/templates/assets/domain_gateway_list.html:61 #: assets/templates/assets/domain_list.html:17 -#: assets/templates/assets/system_user_detail.html:100 -#: assets/templates/assets/system_user_list.html:33 common/models.py:30 +#: assets/templates/assets/system_user_detail.html:104 +#: assets/templates/assets/system_user_list.html:34 common/models.py:30 #: ops/models/adhoc.py:42 perms/models.py:40 perms/models.py:83 #: perms/templates/perms/asset_permission_detail.html:102 terminal/models.py:26 #: terminal/templates/terminal/terminal_detail.html:63 users/models/group.py:13 @@ -392,7 +402,7 @@ msgid "Default" msgstr "默认" #: assets/models/cluster.py:36 assets/models/label.py:13 -#: users/models/user.py:343 +#: users/models/user.py:345 msgid "System" msgstr "系统" @@ -404,9 +414,9 @@ msgstr "默认Cluster" msgid "Cluster" msgstr "集群" -#: assets/models/domain.py:45 assets/models/user.py:106 +#: assets/models/domain.py:45 assets/models/user.py:113 #: assets/templates/assets/domain_gateway_list.html:59 -#: assets/templates/assets/system_user_detail.html:66 +#: assets/templates/assets/system_user_detail.html:70 #: assets/templates/assets/system_user_list.html:28 #: terminal/templates/terminal/session_list.html:75 msgid "Protocol" @@ -431,10 +441,10 @@ msgstr "默认资产组" #: terminal/templates/terminal/command_list.html:32 #: terminal/templates/terminal/command_list.html:72 #: terminal/templates/terminal/session_list.html:33 -#: terminal/templates/terminal/session_list.html:71 users/forms.py:281 -#: users/models/user.py:31 users/models/user.py:331 +#: terminal/templates/terminal/session_list.html:71 users/forms.py:282 +#: users/models/user.py:31 users/models/user.py:333 #: users/templates/users/user_group_detail.html:78 -#: users/templates/users/user_group_list.html:13 users/views/user.py:362 +#: users/templates/users/user_group_list.html:13 users/views/user.py:359 msgid "User" msgstr "用户" @@ -451,7 +461,15 @@ msgstr "分类" msgid "Key" msgstr "" -#: assets/models/user.py:104 +#: assets/models/user.py:106 +msgid "Automatic login" +msgstr "自动登录" + +#: assets/models/user.py:107 +msgid "Manually login" +msgstr "手动登录" + +#: assets/models/user.py:111 #: assets/templates/assets/_asset_group_bulk_update_modal.html:11 #: assets/templates/assets/system_user_asset.html:21 #: assets/views/admin_user.py:29 assets/views/admin_user.py:47 @@ -469,25 +487,30 @@ msgstr "" msgid "Assets" msgstr "资产管理" -#: assets/models/user.py:105 +#: assets/models/user.py:112 msgid "Priority" msgstr "优先级" -#: assets/models/user.py:107 assets/templates/assets/_system_user.html:58 -#: assets/templates/assets/system_user_detail.html:118 -#: assets/templates/assets/system_user_update.html:11 +#: assets/models/user.py:114 assets/templates/assets/_system_user.html:59 +#: assets/templates/assets/system_user_detail.html:122 +#: assets/templates/assets/system_user_update.html:10 msgid "Auto push" msgstr "自动推送" -#: assets/models/user.py:108 assets/templates/assets/system_user_detail.html:70 +#: assets/models/user.py:115 assets/templates/assets/system_user_detail.html:74 msgid "Sudo" msgstr "Sudo" -#: assets/models/user.py:109 assets/templates/assets/system_user_detail.html:75 +#: assets/models/user.py:116 assets/templates/assets/system_user_detail.html:79 msgid "Shell" msgstr "Shell" -#: assets/models/user.py:149 audits/models.py:12 +#: assets/models/user.py:117 assets/templates/assets/system_user_detail.html:66 +#: assets/templates/assets/system_user_list.html:29 +msgid "Login mode" +msgstr "登录模式" + +#: assets/models/user.py:157 audits/models.py:12 #: audits/templates/audits/ftp_log_list.html:49 #: audits/templates/audits/ftp_log_list.html:73 perms/forms.py:43 #: perms/models.py:34 perms/models.py:78 @@ -604,16 +627,15 @@ msgstr "基本" #: assets/templates/assets/asset_create.html:25 #: assets/templates/assets/asset_update.html:30 #: assets/templates/assets/gateway_create_update.html:45 -#: assets/templates/assets/system_user_update.html:7 #: users/templates/users/_user.html:21 msgid "Auth" msgstr "认证" -#: assets/templates/assets/_system_user.html:47 +#: assets/templates/assets/_system_user.html:48 msgid "Auto generate key" msgstr "自动生成密钥" -#: assets/templates/assets/_system_user.html:64 +#: assets/templates/assets/_system_user.html:65 #: assets/templates/assets/asset_create.html:59 #: assets/templates/assets/asset_update.html:63 #: assets/templates/assets/gateway_create_update.html:53 @@ -622,7 +644,7 @@ msgstr "自动生成密钥" msgid "Other" msgstr "其它" -#: assets/templates/assets/_system_user.html:70 +#: assets/templates/assets/_system_user.html:71 #: assets/templates/assets/admin_user_create_update.html:45 #: assets/templates/assets/asset_bulk_update.html:23 #: assets/templates/assets/asset_create.html:66 @@ -647,7 +669,7 @@ msgstr "其它" msgid "Reset" msgstr "重置" -#: assets/templates/assets/_system_user.html:71 +#: assets/templates/assets/_system_user.html:72 #: assets/templates/assets/admin_user_create_update.html:46 #: assets/templates/assets/asset_bulk_update.html:24 #: assets/templates/assets/asset_create.html:67 @@ -702,14 +724,14 @@ msgstr "资产列表" #: assets/templates/assets/admin_user_assets.html:54 #: assets/templates/assets/admin_user_list.html:26 #: assets/templates/assets/system_user_asset.html:52 -#: assets/templates/assets/system_user_list.html:30 +#: assets/templates/assets/system_user_list.html:31 #: users/templates/users/user_group_granted_asset.html:47 msgid "Reachable" msgstr "可连接" #: assets/templates/assets/admin_user_assets.html:66 #: assets/templates/assets/system_user_asset.html:64 -#: assets/templates/assets/system_user_detail.html:112 +#: assets/templates/assets/system_user_detail.html:116 #: perms/templates/perms/asset_permission_detail.html:114 msgid "Quick update" msgstr "快速更新" @@ -722,7 +744,7 @@ msgstr "测试可连接性" #: assets/templates/assets/admin_user_assets.html:75 #: assets/templates/assets/asset_detail.html:171 #: assets/templates/assets/system_user_asset.html:81 -#: assets/templates/assets/system_user_detail.html:147 +#: assets/templates/assets/system_user_detail.html:151 msgid "Test" msgstr "测试" @@ -736,7 +758,7 @@ msgstr "测试" #: assets/templates/assets/domain_list.html:42 #: assets/templates/assets/label_list.html:38 #: assets/templates/assets/system_user_detail.html:26 -#: assets/templates/assets/system_user_list.html:88 +#: assets/templates/assets/system_user_list.html:89 #: perms/templates/perms/asset_permission_detail.html:30 #: perms/templates/perms/asset_permission_list.html:191 #: terminal/templates/terminal/terminal_detail.html:16 @@ -760,7 +782,7 @@ msgstr "更新" #: assets/templates/assets/domain_list.html:43 #: assets/templates/assets/label_list.html:39 #: assets/templates/assets/system_user_detail.html:30 -#: assets/templates/assets/system_user_list.html:89 +#: assets/templates/assets/system_user_list.html:90 #: ops/templates/ops/task_list.html:72 #: perms/templates/perms/asset_permission_detail.html:34 #: perms/templates/perms/asset_permission_list.html:192 @@ -785,8 +807,8 @@ msgstr "选择节点" #: assets/templates/assets/admin_user_detail.html:100 #: assets/templates/assets/asset_detail.html:200 #: assets/templates/assets/asset_list.html:638 -#: assets/templates/assets/system_user_detail.html:192 -#: assets/templates/assets/system_user_list.html:138 templates/_modal.html:22 +#: assets/templates/assets/system_user_detail.html:196 +#: assets/templates/assets/system_user_list.html:139 templates/_modal.html:22 #: terminal/templates/terminal/session_detail.html:108 #: users/templates/users/user_detail.html:366 #: users/templates/users/user_detail.html:391 @@ -804,12 +826,12 @@ msgid "Create admin user" msgstr "创建管理用户" #: assets/templates/assets/admin_user_list.html:27 -#: assets/templates/assets/system_user_list.html:31 +#: assets/templates/assets/system_user_list.html:32 msgid "Unreachable" msgstr "不可达" #: assets/templates/assets/admin_user_list.html:28 -#: assets/templates/assets/system_user_list.html:32 +#: assets/templates/assets/system_user_list.html:33 #: ops/templates/ops/adhoc_history.html:54 #: ops/templates/ops/task_history.html:60 msgid "Ratio" @@ -820,7 +842,7 @@ msgstr "比例" #: assets/templates/assets/domain_gateway_list.html:62 #: assets/templates/assets/domain_list.html:18 #: assets/templates/assets/label_list.html:17 -#: assets/templates/assets/system_user_list.html:34 +#: assets/templates/assets/system_user_list.html:35 #: ops/templates/ops/adhoc_history.html:59 ops/templates/ops/task_adhoc.html:64 #: ops/templates/ops/task_history.html:65 ops/templates/ops/task_list.html:42 #: perms/templates/perms/asset_permission_list.html:60 @@ -978,7 +1000,7 @@ msgid "Have assets, cancel" msgstr "存在资产,不能删除" #: assets/templates/assets/asset_list.html:633 -#: assets/templates/assets/system_user_list.html:133 +#: assets/templates/assets/system_user_list.html:134 #: users/templates/users/user_detail.html:361 #: users/templates/users/user_detail.html:386 #: users/templates/users/user_group_list.html:81 @@ -1053,17 +1075,17 @@ msgid "Assets of " msgstr "资产" #: assets/templates/assets/system_user_asset.html:70 -#: assets/templates/assets/system_user_detail.html:135 +#: assets/templates/assets/system_user_detail.html:139 msgid "Push system user now" msgstr "立刻推送系统" #: assets/templates/assets/system_user_asset.html:73 -#: assets/templates/assets/system_user_detail.html:138 +#: assets/templates/assets/system_user_detail.html:142 msgid "Push" msgstr "推送" #: assets/templates/assets/system_user_asset.html:78 -#: assets/templates/assets/system_user_detail.html:144 +#: assets/templates/assets/system_user_detail.html:148 msgid "Test assets connective" msgstr "测试资产可连接性" @@ -1075,28 +1097,28 @@ msgstr "任务已下发,查看ops任务列表" msgid "Task has been send, seen left assets status" msgstr "任务已下发,查看左侧资产状态" -#: assets/templates/assets/system_user_detail.html:81 +#: assets/templates/assets/system_user_detail.html:85 msgid "Home" msgstr "家目录" -#: assets/templates/assets/system_user_detail.html:87 +#: assets/templates/assets/system_user_detail.html:91 msgid "Uid" msgstr "Uid" -#: assets/templates/assets/system_user_detail.html:153 -#: assets/templates/assets/system_user_detail.html:339 +#: assets/templates/assets/system_user_detail.html:157 +#: assets/templates/assets/system_user_detail.html:343 msgid "Clear auth" msgstr "清除认证信息" -#: assets/templates/assets/system_user_detail.html:156 +#: assets/templates/assets/system_user_detail.html:160 msgid "Clear" msgstr "清除" -#: assets/templates/assets/system_user_detail.html:183 +#: assets/templates/assets/system_user_detail.html:187 msgid "Add to node" msgstr "添加到节点" -#: assets/templates/assets/system_user_detail.html:339 +#: assets/templates/assets/system_user_detail.html:343 msgid "success" msgstr "成功" @@ -1105,20 +1127,20 @@ msgstr "成功" msgid "Create system user" msgstr "创建系统用户" -#: assets/templates/assets/system_user_list.html:134 +#: assets/templates/assets/system_user_list.html:135 msgid "This will delete the selected System Users !!!" msgstr "删除选择系统用户" -#: assets/templates/assets/system_user_list.html:142 +#: assets/templates/assets/system_user_list.html:143 msgid "System Users Deleted." msgstr "已被删除" -#: assets/templates/assets/system_user_list.html:143 -#: assets/templates/assets/system_user_list.html:148 +#: assets/templates/assets/system_user_list.html:144 +#: assets/templates/assets/system_user_list.html:149 msgid "System Users Delete" msgstr "删除系统用户" -#: assets/templates/assets/system_user_list.html:147 +#: assets/templates/assets/system_user_list.html:148 msgid "System Users Deleting failed." msgstr "系统用户删除失败" @@ -1805,8 +1827,8 @@ msgstr "任务列表" msgid "Task run history" msgstr "执行历史" -#: perms/forms.py:18 users/forms.py:238 users/forms.py:243 users/forms.py:255 -#: users/forms.py:285 +#: perms/forms.py:18 users/forms.py:239 users/forms.py:244 users/forms.py:256 +#: users/forms.py:286 msgid "Select users" msgstr "选择用户" @@ -1958,14 +1980,14 @@ msgstr "商业支持" msgid "Docs" msgstr "文档" -#: templates/_header_bar.html:37 templates/_nav_user.html:9 users/forms.py:121 +#: templates/_header_bar.html:37 templates/_nav_user.html:9 users/forms.py:122 #: users/templates/users/_user.html:39 #: users/templates/users/first_login.html:39 #: users/templates/users/user_password_update.html:39 #: users/templates/users/user_profile.html:17 #: users/templates/users/user_profile_update.html:37 #: users/templates/users/user_profile_update.html:57 -#: users/templates/users/user_pubkey_update.html:37 users/views/user.py:344 +#: users/templates/users/user_pubkey_update.html:37 users/views/user.py:341 msgid "Profile" msgstr "个人信息" @@ -2022,13 +2044,13 @@ msgstr "关闭" #: templates/_nav.html:10 users/views/group.py:28 users/views/group.py:44 #: users/views/group.py:62 users/views/group.py:79 users/views/group.py:95 -#: users/views/login.py:277 users/views/login.py:335 users/views/user.py:66 -#: users/views/user.py:81 users/views/user.py:103 users/views/user.py:174 -#: users/views/user.py:329 users/views/user.py:381 users/views/user.py:416 +#: users/views/login.py:277 users/views/login.py:335 users/views/user.py:65 +#: users/views/user.py:80 users/views/user.py:102 users/views/user.py:173 +#: users/views/user.py:328 users/views/user.py:378 users/views/user.py:413 msgid "Users" msgstr "用户管理" -#: templates/_nav.html:13 users/views/user.py:67 +#: templates/_nav.html:13 users/views/user.py:66 msgid "User list" msgstr "用户列表" @@ -2334,11 +2356,11 @@ msgstr "" msgid "Invalid token or cache refreshed." msgstr "" -#: users/forms.py:38 +#: users/forms.py:39 msgid "MFA code" msgstr "MFA 验证码" -#: users/forms.py:49 users/models/user.py:59 +#: users/forms.py:50 users/models/user.py:59 #: users/templates/users/_select_user_modal.html:15 #: users/templates/users/user_detail.html:87 #: users/templates/users/user_list.html:25 @@ -2346,31 +2368,31 @@ msgstr "MFA 验证码" msgid "Role" msgstr "角色" -#: users/forms.py:52 users/forms.py:201 +#: users/forms.py:53 users/forms.py:202 msgid "ssh public key" msgstr "ssh公钥" -#: users/forms.py:53 users/forms.py:202 +#: users/forms.py:54 users/forms.py:203 msgid "ssh-rsa AAAA..." msgstr "" -#: users/forms.py:54 +#: users/forms.py:55 msgid "Paste user id_rsa.pub here." msgstr "复制用户公钥到这里" -#: users/forms.py:72 users/templates/users/user_detail.html:200 +#: users/forms.py:73 users/templates/users/user_detail.html:200 msgid "Join user groups" msgstr "添加到用户组" -#: users/forms.py:83 users/forms.py:216 +#: users/forms.py:84 users/forms.py:217 msgid "Public key should not be the same as your old one." msgstr "不能和原来的密钥相同" -#: users/forms.py:87 users/forms.py:220 users/serializers.py:48 +#: users/forms.py:88 users/forms.py:221 users/serializers.py:48 msgid "Not a valid ssh public key" msgstr "ssh密钥不合法" -#: users/forms.py:127 +#: users/forms.py:128 msgid "" "Tip: when enabled, you will enter the MFA binding process the next time you " "log in. you can also directly bind in \"personal information -> quick " @@ -2379,16 +2401,16 @@ msgstr "" "提示:启用之后您将会在下次登录时进入MFA绑定流程;您也可以在(个人信息->快速修" "改->更改MFA设置)中直接绑定!" -#: users/forms.py:137 +#: users/forms.py:138 msgid "* Enable MFA authentication to make the account more secure." msgstr "* 启用MFA认证,使账号更加安全." -#: users/forms.py:142 users/models/user.py:71 +#: users/forms.py:143 users/models/user.py:71 #: users/templates/users/first_login.html:45 msgid "MFA" msgstr "MFA" -#: users/forms.py:147 +#: users/forms.py:148 msgid "" "In order to protect you and your company, please keep your account, password " "and key sensitive information properly. (for example: setting complex " @@ -2397,41 +2419,41 @@ msgstr "" "为了保护您和公司的安全,请妥善保管您的账户、密码和密钥等重要敏感信息;(如:" "设置复杂密码,启用MFA认证)" -#: users/forms.py:154 users/templates/users/first_login.html:48 +#: users/forms.py:155 users/templates/users/first_login.html:48 #: users/templates/users/first_login.html:107 #: users/templates/users/first_login.html:130 msgid "Finish" msgstr "完成" -#: users/forms.py:160 +#: users/forms.py:161 msgid "Old password" msgstr "原来密码" -#: users/forms.py:165 +#: users/forms.py:166 msgid "New password" msgstr "新密码" -#: users/forms.py:170 +#: users/forms.py:171 msgid "Confirm password" msgstr "确认密码" -#: users/forms.py:180 +#: users/forms.py:181 msgid "Old password error" msgstr "原来密码错误" -#: users/forms.py:188 +#: users/forms.py:189 msgid "Password does not match" msgstr "密码不一致" -#: users/forms.py:199 +#: users/forms.py:200 msgid "Automatically configure and download the SSH key" msgstr "自动配置并下载SSH密钥" -#: users/forms.py:203 +#: users/forms.py:204 msgid "Paste your id_rsa.pub here." msgstr "复制你的公钥到这里" -#: users/forms.py:231 users/models/user.py:79 +#: users/forms.py:232 users/models/user.py:79 #: users/templates/users/first_login.html:42 #: users/templates/users/user_password_update.html:45 #: users/templates/users/user_profile.html:68 @@ -2464,7 +2486,7 @@ msgstr "Agent" msgid "Date login" msgstr "登录日期" -#: users/models/user.py:30 users/models/user.py:339 +#: users/models/user.py:30 users/models/user.py:341 msgid "Administrator" msgstr "管理员" @@ -2506,7 +2528,7 @@ msgstr "微信" msgid "Source" msgstr "用户来源" -#: users/models/user.py:342 +#: users/models/user.py:344 msgid "Administrator is the super user of system" msgstr "Administrator是初始的超级管理员" @@ -2649,7 +2671,7 @@ msgid "Setting" msgstr "设置" #: users/templates/users/user_create.html:4 -#: users/templates/users/user_list.html:16 users/views/user.py:81 +#: users/templates/users/user_list.html:16 users/views/user.py:80 msgid "Create user" msgstr "创建用户" @@ -2658,7 +2680,7 @@ msgid "Reset link will be generated and sent to the user. " msgstr "生成重置密码连接,通过邮件发送给用户" #: users/templates/users/user_detail.html:19 -#: users/templates/users/user_granted_asset.html:18 users/views/user.py:175 +#: users/templates/users/user_granted_asset.html:18 users/views/user.py:174 msgid "User detail" msgstr "用户详情" @@ -2793,8 +2815,8 @@ msgstr "用户删除失败" msgid "Administrator Settings force MFA login" msgstr "管理员设置强制使用MFA登录" -#: users/templates/users/user_profile.html:116 users/views/user.py:204 -#: users/views/user.py:258 +#: users/templates/users/user_profile.html:116 users/views/user.py:203 +#: users/views/user.py:257 msgid "User groups" msgstr "用户组" @@ -2840,7 +2862,7 @@ msgid "" "corresponding private key." msgstr "新的公钥已设置成功,请下载对应的私钥" -#: users/templates/users/user_update.html:4 users/views/user.py:104 +#: users/templates/users/user_update.html:4 users/views/user.py:103 msgid "Update user" msgstr "更新用户" @@ -2998,7 +3020,7 @@ msgstr "用户组授权资产" msgid "Please enable cookies and try again." msgstr "设置你的浏览器支持cookie" -#: users/views/login.py:128 users/views/user.py:501 users/views/user.py:526 +#: users/views/login.py:128 users/views/user.py:498 users/views/user.py:523 msgid "MFA code invalid" msgstr "MFA码认证失败" @@ -3039,7 +3061,7 @@ msgstr "Token错误或失效" msgid "Password not same" msgstr "密码不一致" -#: users/views/login.py:239 users/views/user.py:116 users/views/user.py:399 +#: users/views/login.py:239 users/views/user.py:115 users/views/user.py:396 msgid "* Your password does not meet the requirements" msgstr "* 您的密码不符合要求" @@ -3051,46 +3073,46 @@ msgstr "首次登陆" msgid "Login log list" msgstr "登录日志" -#: users/views/user.py:128 +#: users/views/user.py:127 msgid "Bulk update user success" msgstr "批量更新用户成功" -#: users/views/user.py:233 +#: users/views/user.py:232 msgid "Invalid file." msgstr "文件不合法" -#: users/views/user.py:330 +#: users/views/user.py:329 msgid "User granted assets" msgstr "用户授权资产" -#: users/views/user.py:363 +#: users/views/user.py:360 msgid "Profile setting" msgstr "个人信息设置" -#: users/views/user.py:382 +#: users/views/user.py:379 msgid "Password update" msgstr "密码更新" -#: users/views/user.py:417 +#: users/views/user.py:414 msgid "Public key update" msgstr "密钥更新" -#: users/views/user.py:458 +#: users/views/user.py:455 msgid "Password invalid" msgstr "用户名或密码无效" -#: users/views/user.py:552 +#: users/views/user.py:549 msgid "MFA enable success" msgstr "MFA 绑定成功" -#: users/views/user.py:553 +#: users/views/user.py:550 msgid "MFA enable success, return login page" msgstr "MFA 绑定成功,返回到登录页面" -#: users/views/user.py:555 +#: users/views/user.py:552 msgid "MFA disable success" msgstr "MFA 解绑成功" -#: users/views/user.py:556 +#: users/views/user.py:553 msgid "MFA disable success, return login page" msgstr "MFA 解绑成功,返回登录页面" From f5a4370b80050de4e6dc744c26afe6aed5411a4e Mon Sep 17 00:00:00 2001 From: BaiJiangJie Date: Mon, 11 Jun 2018 17:56:20 +0800 Subject: [PATCH 5/8] =?UTF-8?q?[Update]=20=E7=B3=BB=E7=BB=9F=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E9=80=89=E6=8B=A9=E6=89=8B=E5=8A=A8=E7=99=BB=E5=BD=95?= =?UTF-8?q?=EF=BC=8C=E5=8F=96=E6=B6=88=E8=87=AA=E5=8A=A8=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/forms/user.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/assets/forms/user.py b/apps/assets/forms/user.py index 0bc4ff094..c2a1d7b67 100644 --- a/apps/assets/forms/user.py +++ b/apps/assets/forms/user.py @@ -93,14 +93,20 @@ class SystemUserForm(PasswordAndKeyAuthForm): # Because we define custom field, so we need rewrite :method: `save` system_user = super().save() password = self.cleaned_data.get('password', '') or None + login_mode = self.cleaned_data.get('login_mode', '') or None auto_generate_key = self.cleaned_data.get('auto_generate_key', False) private_key, public_key = super().gen_keys() + if login_mode == SystemUser.MANUAL_LOGIN: + system_user.auto_push = 0 + system_user.save() + if auto_generate_key: logger.info('Auto generate key and set system user auth') system_user.auto_gen_auth() else: system_user.set_auth(password=password, private_key=private_key, public_key=public_key) + return system_user def clean(self): From 2e6d238c76110f9d17073febac78d3432a2e52ea Mon Sep 17 00:00:00 2001 From: BaiJiangJie Date: Mon, 11 Jun 2018 19:09:24 +0800 Subject: [PATCH 6/8] =?UTF-8?q?[Bugfix]=20=E4=BF=AE=E5=A4=8D=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E7=94=A8=E6=88=B7=E9=80=89=E6=8B=A9=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E7=99=BB=E5=BD=95=EF=BC=8Cssh=E5=91=BD=E4=BB=A4=E8=A1=8C?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E8=8E=B7=E5=8F=96=E4=B8=8D=E5=88=B0login=5Fm?= =?UTF-8?q?ode=E5=AD=97=E6=AE=B5=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/serializers/system_user.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/assets/serializers/system_user.py b/apps/assets/serializers/system_user.py index 9caf150b4..7a4e3aadc 100644 --- a/apps/assets/serializers/system_user.py +++ b/apps/assets/serializers/system_user.py @@ -63,7 +63,10 @@ class AssetSystemUserSerializer(serializers.ModelSerializer): """ class Meta: model = SystemUser - fields = ('id', 'name', 'username', 'priority', 'protocol', 'comment',) + fields = ( + 'id', 'name', 'username', 'priority', + 'protocol', 'comment', 'login_mode' + ) class SystemUserSimpleSerializer(serializers.ModelSerializer): From eb95a0a9123a968d01874243f03d8d67a9e698f6 Mon Sep 17 00:00:00 2001 From: ibuler Date: Wed, 27 Jun 2018 10:34:16 +0800 Subject: [PATCH 7/8] =?UTF-8?q?[Bugfix]=20=E4=BF=AE=E6=94=B9=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E5=BD=95=E5=83=8F=E6=B2=A1=E6=9C=89=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/terminal/api.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/terminal/api.py b/apps/terminal/api.py index 2fde3fb60..f5c76a73f 100644 --- a/apps/terminal/api.py +++ b/apps/terminal/api.py @@ -317,7 +317,6 @@ class SessionReplayViewSet(viewsets.ViewSet): # 去default storage中查找 for _local_path in (local_path, local_path_v1, session_path): - print("Check {}".format(_local_path)) if default_storage.exists(_local_path): url = default_storage.url(_local_path) return redirect(url) @@ -329,6 +328,9 @@ class SessionReplayViewSet(viewsets.ViewSet): return HttpResponseNotFound() target_path = os.path.join(default_storage.base_location, local_path) # 保存到storage的路径 + target_dir = os.path.dirname(target_path) + if not os.path.isdir(target_dir): + os.makedirs(target_dir, exist_ok=True) storage = jms_storage.get_multi_object_storage(configs) ok, err = storage.download(session_path, target_path) if not ok: From f1f06491d6816576ffe3e2f0c773b423947a208f Mon Sep 17 00:00:00 2001 From: BaiJiangJie Date: Fri, 29 Jun 2018 14:59:43 +0800 Subject: [PATCH 8/8] =?UTF-8?q?[Feature]=20=E6=B7=BB=E5=8A=A0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD,=20=E6=94=AF=E6=8C=81=20telnet=20server.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/forms/asset.py | 4 +- apps/assets/forms/user.py | 3 +- apps/assets/models/asset.py | 14 ++ apps/assets/models/user.py | 2 + apps/assets/serializers/asset.py | 2 +- .../assets/templates/assets/_system_user.html | 11 +- .../assets/templates/assets/asset_create.html | 11 +- .../assets/templates/assets/asset_update.html | 1 + apps/i18n/zh/LC_MESSAGES/django.mo | Bin 35051 -> 35966 bytes apps/i18n/zh/LC_MESSAGES/django.po | 179 +++++++++--------- apps/perms/api.py | 8 +- 11 files changed, 131 insertions(+), 104 deletions(-) diff --git a/apps/assets/forms/asset.py b/apps/assets/forms/asset.py index f8f187b4d..5000c087d 100644 --- a/apps/assets/forms/asset.py +++ b/apps/assets/forms/asset.py @@ -16,7 +16,7 @@ class AssetCreateForm(forms.ModelForm): fields = [ 'hostname', 'ip', 'public_ip', 'port', 'comment', 'nodes', 'is_active', 'admin_user', 'labels', 'platform', - 'domain', + 'domain', 'protocol', ] widgets = { @@ -56,7 +56,7 @@ class AssetUpdateForm(forms.ModelForm): fields = [ 'hostname', 'ip', 'port', 'nodes', 'is_active', 'platform', 'public_ip', 'number', 'comment', 'admin_user', 'labels', - 'domain', + 'domain', 'protocol', ] widgets = { 'nodes': forms.SelectMultiple(attrs={ diff --git a/apps/assets/forms/user.py b/apps/assets/forms/user.py index c2a1d7b67..b25e19d87 100644 --- a/apps/assets/forms/user.py +++ b/apps/assets/forms/user.py @@ -94,10 +94,11 @@ class SystemUserForm(PasswordAndKeyAuthForm): system_user = super().save() password = self.cleaned_data.get('password', '') or None login_mode = self.cleaned_data.get('login_mode', '') or None + protocol = self.cleaned_data.get('protocol') or None auto_generate_key = self.cleaned_data.get('auto_generate_key', False) private_key, public_key = super().gen_keys() - if login_mode == SystemUser.MANUAL_LOGIN: + if login_mode == SystemUser.MANUAL_LOGIN or protocol == SystemUser.TELNET_PROTOCOL: system_user.auto_push = 0 system_user.save() diff --git a/apps/assets/models/asset.py b/apps/assets/models/asset.py index a974d3385..7a2b3fe57 100644 --- a/apps/assets/models/asset.py +++ b/apps/assets/models/asset.py @@ -57,13 +57,27 @@ class Asset(models.Model): ('MacOS', 'MacOS'), ('BSD', 'BSD'), ('Windows', 'Windows'), + ('Windows2016', 'Windows(2016)'), ('Other', 'Other'), ) + + SSH_PROTOCOL = 'ssh' + RDP_PROTOCOL = 'rdp' + TELNET_PROTOCOL = 'telnet' + PROTOCOL_CHOICES = ( + (SSH_PROTOCOL, 'ssh'), + (RDP_PROTOCOL, 'rdp'), + (TELNET_PROTOCOL, 'telnet (beta)'), + ) + id = models.UUIDField(default=uuid.uuid4, primary_key=True) ip = models.GenericIPAddressField(max_length=32, verbose_name=_('IP'), db_index=True) hostname = models.CharField(max_length=128, unique=True, verbose_name=_('Hostname')) + protocol = models.CharField(max_length=128, default=SSH_PROTOCOL, + choices=PROTOCOL_CHOICES, + verbose_name=_('Protocol')) port = models.IntegerField(default=22, verbose_name=_('Port')) platform = models.CharField(max_length=128, choices=PLATFORM_CHOICES, default='Linux', verbose_name=_('Platform')) diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py index f835e387f..5faca5da8 100644 --- a/apps/assets/models/user.py +++ b/apps/assets/models/user.py @@ -95,9 +95,11 @@ class AdminUser(AssetUser): class SystemUser(AssetUser): SSH_PROTOCOL = 'ssh' RDP_PROTOCOL = 'rdp' + TELNET_PROTOCOL = 'telnet' PROTOCOL_CHOICES = ( (SSH_PROTOCOL, 'ssh'), (RDP_PROTOCOL, 'rdp'), + (TELNET_PROTOCOL, 'telnet (beta)'), ) AUTO_LOGIN = 'auto' diff --git a/apps/assets/serializers/asset.py b/apps/assets/serializers/asset.py index a0fdfab73..e63735794 100644 --- a/apps/assets/serializers/asset.py +++ b/apps/assets/serializers/asset.py @@ -43,7 +43,7 @@ class AssetGrantedSerializer(serializers.ModelSerializer): fields = ( "id", "hostname", "ip", "port", "system_users_granted", "is_active", "system_users_join", "os", 'domain', - "platform", "comment" + "platform", "comment", "protocol", ) @staticmethod diff --git a/apps/assets/templates/assets/_system_user.html b/apps/assets/templates/assets/_system_user.html index cf8539293..4e1bc51a8 100644 --- a/apps/assets/templates/assets/_system_user.html +++ b/apps/assets/templates/assets/_system_user.html @@ -104,7 +104,14 @@ function protocolChange() { $.each(need_change_field, function (index, value) { $(value).closest('.form-group').addClass('hidden') }); - } else { + } + else if ($(protocol_id + " option:selected").text() === 'telnet (beta)') { + $('.auth-fields').removeClass('hidden'); + $.each(need_change_field, function (index, value) { + $(value).closest('.form-group').addClass('hidden') + }); + } + else { if($(login_mode_id).val() === 'manual'){ $(sudo_id).closest('.form-group').removeClass('hidden'); $(shell_id).closest('.form-group').removeClass('hidden'); @@ -133,8 +140,8 @@ function loginModeChange(){ } else if($(login_mode_id).val() === 'auto'){ $('#auth_title_id').removeClass('hidden'); - protocolChange(); $(password_id).closest('.form-group').removeClass('hidden') + protocolChange(); } } diff --git a/apps/assets/templates/assets/asset_create.html b/apps/assets/templates/assets/asset_create.html index 99703d2e3..55e233d0d 100644 --- a/apps/assets/templates/assets/asset_create.html +++ b/apps/assets/templates/assets/asset_create.html @@ -17,6 +17,7 @@ {% bootstrap_field form.hostname layout="horizontal" %} {% bootstrap_field form.platform layout="horizontal" %} {% bootstrap_field form.ip layout="horizontal" %} + {% bootstrap_field form.protocol layout="horizontal" %} {% bootstrap_field form.port layout="horizontal" %} {% bootstrap_field form.public_ip layout="horizontal" %} {% bootstrap_field form.domain layout="horizontal" %} @@ -85,14 +86,14 @@ $(document).ready(function () { allowClear: true, templateSelection: format }); - $("#id_platform").change(function (){ - var platform = $("#id_platform option:selected").text(); + $("#id_protocol").change(function (){ + var protocol = $("#id_protocol option:selected").text(); var port = 22; - if(platform === 'Windows'){ + if(protocol === 'rdp'){ port = 3389; } - if(platform === 'Other'){ - port = null; + if(protocol === 'telnet (beta)'){ + port = 23; } $("#id_port").val(port); }); diff --git a/apps/assets/templates/assets/asset_update.html b/apps/assets/templates/assets/asset_update.html index 3d42ca2b5..7ed1da05a 100644 --- a/apps/assets/templates/assets/asset_update.html +++ b/apps/assets/templates/assets/asset_update.html @@ -21,6 +21,7 @@

{% trans 'Basic' %}

{% bootstrap_field form.hostname layout="horizontal" %} {% bootstrap_field form.ip layout="horizontal" %} + {% bootstrap_field form.protocol layout="horizontal" %} {% bootstrap_field form.port layout="horizontal" %} {% bootstrap_field form.platform layout="horizontal" %} {% bootstrap_field form.public_ip layout="horizontal" %} diff --git a/apps/i18n/zh/LC_MESSAGES/django.mo b/apps/i18n/zh/LC_MESSAGES/django.mo index df59e43d67e7b758c445eae254496702a7583bf4..d842930e4e5b0eece76196f4cd257d50a9117912 100644 GIT binary patch delta 12296 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 delta 12043 zcmYk?3w)2||HturC&tERGjo`2j@y{y92!;*bC^)GDW}LG=QAtEZf8=ILpel=PHPDf zDN&(>oQfz?Rw6{iej)y^_xJwn|8PJ4pPtv}b6@v$UH5h0-|xQl``=yWe{rF|`*TF# z%MM3vf5(Zz7fLzK7209wRUf zgYi+UfZZ?zbF4lMbx-q9*R8`q$90^2G&JEM496d^G@i%e_@5cv&~extCla-gYFGjr zVs&hVNjL<@;u7qP!Hpaz3wxOBQT2evjuXWE&SNyRMLkg~ejX!nDQbc|48(01ggY=4 zcVkIBf@Sa*)b#~c4|u@q7l9fl4t2g3>c&#h)d1-Tk$s4I7d}A^yaV-!_F`H5(avAD^980~6R&?r6ZT&hMp4kq6NmJ15>X53i<)RK zYN4Z1{ib0ZoQJx@Pf!cpiQ0iZmLEo4f86{T+mN3_?Q|`-sW)&F)WGdg7i6LCxQFF~ zQIBdg>d{O^y`&3KTmLrtb_6xfCs+Y@p?2g9YQn!!kL)h$#@#Y}NHtMBYJ%FRj%lcm zReRI`Pgp(@HQ{utFF@V#YSaSqPz&6InqW6-hYq5~{SLLjU%cFPF3`|`H&GY*^DUtP zBh6UU1xcud)JIK}j(Q{=P@k5bs7E#mHQqCJeumW-qpn+l8gC6o>hqsRLo3{gz7?Yu za1i71Bh*BC2d8w|ifSOJHj9_d`v zxGPXMwiekL*V#-%&u%a3rMQCC(7%m$=ZUBZ8lWz0g+(wMwKF|12nV8G%HgOx&OvSc zEYwT69Aj|{#^EuaJpUUs^lYNqdRrfd8n`NIi|SfE4b`tD>P|XXy$fpRx}z5I6zYzL zq82;_%i{v{$6PFm?_+W1cQ(_|L_1MCZ~%43XRs*#g_`gtYHROVJ)oV}KLj;#EEd74 z7>qU1w{xhMv=!>59E;kSY3S!2P<8WzP2)B-Y56ZFAi zI0TF1IMjI;>*I^4g@1{f=X=yw@X7YMprCBp|9nm%!yW?iQ4K#=BubJ zeiL;An^6<)LT&Xv)J~m3E#NZhrMrbCuw*A+-F0GU=tL4~g=wf2W_TT(o~Sz;jCvF! zFdgThUcLjUm-akrVCNCJBI4NSuYE@doPI z4}8=+KN9tb#-kSeEb48ZhuVP;Q48IM#qp@sPou{94YjaKn5fVHZ5q16s+rydNvMJ9 zqZXEmdYL++o^?Oe#M7`8&Np92?c7ET$K9x{KZfdm7E|yqtcjI7^ZfM^bfO`zb)vS7&YE8jKDKk3a?>224;CTTrG>wzux8=6f{r^ zGZS?|AJiAnSoHm5!Ybr>sNW5Ta2zIQdw)aTz}n<{Q6IMgGro)Wh%&G-_0g!G`MF)# ze?60Y3VH+=QP1ouZo%8AXZhh{-ZR^e>h~k+yZj95EBUOQKZn}t8>mO<_qg{6gE5Lc z2KBvBA9aHrT^icz-l(k_hS8|Hwsa}#WqAwLZ!>DAzCaCd#PWPhA-|5LF`=tBUNcnx zM^Fpvjk<0q>c-tE)|iEQX7f>ZxD<84O4LH$Mcu&`)PfG62KWheNBO9oyNl{ytQ+5o z7>%k=L5(*Tb^Q`#!LGBGMkIwFP#rI#UZR_*l@{fDvMiQE-AR4aKrPYt@}ef}iW+!; z)pJlg>SB3Zgc@%hYQCKq%>2%GH1u|#Lfzq6)Ik43O<1&tcRm{ROe>=9yeg_+GHSr4 zs87cus7KY+d0{XH$ZD~}Z5rc!x*{FrAMQ!1G zmVajMMs59m)SVu)`dP~_pmy@6<)Qt&e&tX*THW$S{n&pMT3I0rHSv??Ky!qdgPL%% z`5bD2ub8>0g>A>G_!a7V;37VWrTaV1LzrWJ)SvxV;f56&^2%xfIjA3tlTj1Cih9QH zqF%P`sDAs*BjyQI|1;(#^Iz1B78&53FN4afxHPol6g!b-wl^O)`uNC;};C~SZ+mS@`euBa{SYxObMheywlcV~ml9MnRlo6ngq+4-gBo2UhC#A5h`xgT}? zG1T~{%qtkm{Eq(+??f0DBd?6w+GI1;Y=asg%N$@%u=6jV7O)&OPA(S3O;-QZ>if~R zAapg+DH`&EdD9FS>P;AqI$y=Ciy9!!@^s5H(f3u1TF3yaKaIM6iaF2fONa9OHPCBT zcnfvm`<8Dx3+ zs87L448{27 z=qO$w?2HxAkG8xjMv&J;-Qj~~25N!XsQx|7L1vCQ9rX?PBC7wp%JunQZyokx1o<&khx1my zg2Ci>EDsv%O%!3qnaO4e+WgedW%?aGZ;Jgv-$_L1QfqU9izQ?8a*3$1J~% ziR7WJvQ;i!2LH9=sGH*hIb zUKX|TYGxg)rU#GLD{Mu559~&L?(1daFZG}J6(#+x-z6E{HJ zSqs#4*{GMc2kMdaNA(+lnrD)iyUq$4y5Jqu03UcKoG;9ScK#>SKxeTmUb1=+KZSK& zC~Dw1)OZh~CTwkXM(u2Gb0n7K{c~Izx?ma3z}Hb1R+;Eo7j-@jH9$Hx!fZSLJZb^U zP#?EE)B=yAuDfF1H2*`5A2ATyu-L3u|fO!&b;QucGSzSsp&wo3P^I%$P`5_tt_6KbM^DsC<`s3bmvgsHyLv zrY6@EwM*Q{d*=Y0>;tcO}~x|xak z3DOJow#>HrMstU`A4_un1nOb`fm%?3YmK|8frF-cMwoGCGU|d<%bS}WQ6KQ`sPmIi zH!uS=-b&OBO;gr}^2!Rr57J#?mbzMN0Cy}A`r%;siCOk$w!md`{@u+Z{1&5fu9?LaN` zpm_qd;Irlh^D1hA1sK8nPT(wWfN0d0YyxVax)_8_P|vP8@?JWbr~wX}r%?;|6Pw^I z)IuB1_Qq+4I^Wssi~5v|L02c{($Iv77GHpd$$4mC~^ zY9WnK<7C+RZWut`Zw}926Az?N1V^JT9Bbg>4E*J>65dc=%?qun7IEqO$R;a&#(fa<7e|V+Ns1k;(0>H zRU*;X;sjkqO5_vu>CemV`yU1$#zZEz!*$-_(jBr|yd>X>B%s6CB#W!uguTZwwPL^VT zGUOwORlZ^PZ)bMC0ePfN^bqY(+S4!wms_7JxR6Mreu-E?ylm(6pEPe16>W^?Y5V(g z{~ysw#{deG@Fid7I8Ty)N4pU|M({h!sf0S};9w%a20KCR74l|8I_(meuk-56@h;sA^Epw^%bch2H{z^yjz_*t|Nr=t{HC2#u{iApmT$z(_nkXn?ZNc>i*}mj z^RN|>sGRwI$FKaeJcUf6KkdqxL=2<-K5oF)$QPIIxJLV+wX514wIffU{tTgSMID=H zPw|?*|B2F?P8fCl87`dPxkuqLp(B<7TVsR`{66ikb%GKTgNhI1-0oG%}p;IK)4PQ7c2CuhpKz&s~Z-;)va}oBA@oFmN*Yr}&B0 z3i*%5mz>*$eeeT2aT&J~&r(aUnM={uQHy*Yo+F;J+K05=llhvP~$uBD5 zs6kX9{HWDnpoS`PY$7%j#i&&viqf7+pKoof@9=RVfx3OC%+56X$LgBHu zuz`LIS{d{1tCgegBjjs|cZi>fZbad+gvJkr37#i5aLrQUOWH??XNX(AIeGu5_!|7R z!&AgzVm=*;GI<+pOz1dBy)3oDV~;g{qy7ZZh3HMK7BQQ4ke&awB8pL9PyYwC9 z`R6zyiQCxim7ETok0IVBbUa1;LwhX|NUS94_|CAew3iS%YWvxOOOZqo3y9(j{1zSJ zY3oSxaDJtBfp(?EnTe5ZTe7{xhs1+atK$vpxsP@y+9AYW#J@x_YDI|uh%9m)-+DMz z?1@yvCe-3F5@!=f=>G?y<8dO7cDVlL=om{BBa(?XIdKoSSm%*=jJ!6{mMBZUhWLVb zm*_@(MZNIoO|D}g5kR{Hi>TZ=w=| zOyGiFX#bDUF%VOTTePclzBoqNxfZln(T>24#5mg9G1ks^q`j5)5#4__v4Er^QI3Iz zkSEjr7>^TyL<-T87)1S3qVV{J#@)iiEX^2aY5$}#h(*K+VkhA!IDW)6*h0xAl1W5e z+C{kdZ+wF|Oz1euxm`p}&fP#A-+MSSH|?n%8n9_eO52*j_3FjfOKFnQXj6W#9|AT_ I>>rr;f5cTk diff --git a/apps/i18n/zh/LC_MESSAGES/django.po b/apps/i18n/zh/LC_MESSAGES/django.po index b5d9a5c56..c596db6ac 100644 --- a/apps/i18n/zh/LC_MESSAGES/django.po +++ b/apps/i18n/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-06-11 13:36+0800\n" +"POT-Creation-Date: 2018-06-25 12:19+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: Jumpserver team\n" @@ -29,7 +29,7 @@ msgstr "" msgid "测试节点下资产是否可连接: {}" msgstr "" -#: assets/forms/asset.py:24 assets/models/asset.py:75 assets/models/user.py:110 +#: assets/forms/asset.py:24 assets/models/asset.py:89 assets/models/user.py:112 #: assets/templates/assets/asset_detail.html:183 #: assets/templates/assets/asset_detail.html:191 #: assets/templates/assets/system_user_detail.html:179 perms/models.py:33 @@ -37,30 +37,30 @@ msgid "Nodes" msgstr "节点管理" #: assets/forms/asset.py:27 assets/forms/asset.py:66 assets/forms/asset.py:109 -#: assets/forms/asset.py:113 assets/models/asset.py:80 +#: assets/forms/asset.py:113 assets/models/asset.py:94 #: assets/models/cluster.py:19 assets/models/user.py:72 #: assets/templates/assets/asset_detail.html:73 templates/_nav.html:25 msgid "Admin user" msgstr "管理用户" #: assets/forms/asset.py:30 assets/forms/asset.py:69 assets/forms/asset.py:125 -#: assets/templates/assets/asset_create.html:35 -#: assets/templates/assets/asset_create.html:37 +#: assets/templates/assets/asset_create.html:36 +#: assets/templates/assets/asset_create.html:38 #: assets/templates/assets/asset_list.html:75 -#: assets/templates/assets/asset_update.html:40 -#: assets/templates/assets/asset_update.html:42 +#: assets/templates/assets/asset_update.html:41 +#: assets/templates/assets/asset_update.html:43 #: assets/templates/assets/user_asset_list.html:34 msgid "Label" msgstr "标签" -#: assets/forms/asset.py:34 assets/forms/asset.py:73 assets/models/asset.py:71 +#: assets/forms/asset.py:34 assets/forms/asset.py:73 assets/models/asset.py:85 #: assets/models/domain.py:46 msgid "Domain" msgstr "网域" #: assets/forms/asset.py:38 assets/forms/asset.py:63 assets/forms/asset.py:77 -#: assets/forms/asset.py:128 assets/templates/assets/asset_create.html:29 -#: assets/templates/assets/asset_update.html:34 perms/forms.py:40 +#: assets/forms/asset.py:128 assets/templates/assets/asset_create.html:30 +#: assets/templates/assets/asset_update.html:35 perms/forms.py:40 #: perms/forms.py:47 perms/models.py:76 #: perms/templates/perms/asset_permission_list.html:57 #: perms/templates/perms/asset_permission_list.html:142 @@ -90,7 +90,7 @@ msgstr "如果有多个的互相隔离的网络,设置资产属于的网域, msgid "Select assets" msgstr "选择资产" -#: assets/forms/asset.py:105 assets/models/asset.py:67 +#: assets/forms/asset.py:105 assets/models/asset.py:81 #: assets/models/domain.py:44 assets/templates/assets/admin_user_assets.html:53 #: assets/templates/assets/asset_detail.html:69 #: assets/templates/assets/domain_gateway_list.html:58 @@ -99,7 +99,7 @@ msgid "Port" msgstr "端口" #: assets/forms/domain.py:14 assets/forms/label.py:13 -#: assets/models/asset.py:223 assets/templates/assets/admin_user_list.html:25 +#: assets/models/asset.py:237 assets/templates/assets/admin_user_list.html:25 #: assets/templates/assets/domain_detail.html:60 #: assets/templates/assets/domain_list.html:15 #: assets/templates/assets/label_list.html:16 @@ -118,7 +118,7 @@ msgstr "端口" msgid "Asset" msgstr "资产" -#: assets/forms/domain.py:54 assets/forms/user.py:79 assets/forms/user.py:131 +#: assets/forms/domain.py:54 assets/forms/user.py:79 assets/forms/user.py:138 #: assets/models/base.py:21 assets/models/cluster.py:18 #: assets/models/domain.py:17 assets/models/group.py:20 #: assets/models/label.py:17 assets/templates/assets/admin_user_detail.html:56 @@ -147,7 +147,7 @@ msgstr "资产" msgid "Name" msgstr "名称" -#: assets/forms/domain.py:55 assets/forms/user.py:80 assets/forms/user.py:132 +#: assets/forms/domain.py:55 assets/forms/user.py:80 assets/forms/user.py:139 #: assets/models/base.py:22 assets/templates/assets/admin_user_detail.html:60 #: assets/templates/assets/admin_user_list.html:24 #: assets/templates/assets/domain_gateway_list.html:60 @@ -192,27 +192,27 @@ msgstr "ssh密钥不合法" msgid "Password and private key file must be input one" msgstr "密码和私钥, 必须输入一个" -#: assets/forms/user.py:118 +#: assets/forms/user.py:124 msgid "* Automatic login mode, must fill in the username." msgstr "自动登录模式,必须填写用户名" -#: assets/forms/user.py:137 +#: assets/forms/user.py:144 msgid "Auto push system user to asset" msgstr "自动推送系统用户到资产" -#: assets/forms/user.py:138 +#: assets/forms/user.py:145 msgid "" "High level will be using login asset as default, if user was granted more " "than 2 system user" msgstr "高优先级的系统用户将会作为默认登录用户" -#: assets/forms/user.py:139 +#: assets/forms/user.py:147 msgid "" "If you choose manual login mode, you do not need to fill in the username and " "password." msgstr "如果选择手动登录模式,用户名和密码则不需要填写" -#: assets/models/asset.py:63 assets/models/domain.py:43 +#: assets/models/asset.py:74 assets/models/domain.py:43 #: assets/templates/assets/_asset_list_modal.html:46 #: assets/templates/assets/admin_user_assets.html:52 #: assets/templates/assets/asset_detail.html:61 @@ -227,7 +227,7 @@ msgstr "如果选择手动登录模式,用户名和密码则不需要填写" msgid "IP" msgstr "IP" -#: assets/models/asset.py:66 assets/templates/assets/_asset_list_modal.html:45 +#: assets/models/asset.py:77 assets/templates/assets/_asset_list_modal.html:45 #: assets/templates/assets/admin_user_assets.html:51 #: assets/templates/assets/asset_detail.html:57 #: assets/templates/assets/asset_list.html:86 @@ -239,82 +239,91 @@ msgstr "IP" msgid "Hostname" msgstr "主机名" -#: assets/models/asset.py:69 assets/templates/assets/asset_detail.html:97 +#: assets/models/asset.py:80 assets/models/domain.py:45 +#: assets/models/user.py:115 +#: assets/templates/assets/domain_gateway_list.html:59 +#: assets/templates/assets/system_user_detail.html:70 +#: assets/templates/assets/system_user_list.html:28 +#: terminal/templates/terminal/session_list.html:75 +msgid "Protocol" +msgstr "协议" + +#: assets/models/asset.py:83 assets/templates/assets/asset_detail.html:97 msgid "Platform" msgstr "系统平台" -#: assets/models/asset.py:76 assets/models/domain.py:48 +#: assets/models/asset.py:90 assets/models/domain.py:48 #: assets/models/label.py:20 assets/templates/assets/asset_detail.html:105 msgid "Is active" msgstr "激活" -#: assets/models/asset.py:85 assets/templates/assets/asset_detail.html:65 +#: assets/models/asset.py:99 assets/templates/assets/asset_detail.html:65 msgid "Public IP" msgstr "公网IP" -#: assets/models/asset.py:87 assets/templates/assets/asset_detail.html:113 +#: assets/models/asset.py:101 assets/templates/assets/asset_detail.html:113 msgid "Asset number" msgstr "资产编号" -#: assets/models/asset.py:91 assets/templates/assets/asset_detail.html:77 +#: assets/models/asset.py:105 assets/templates/assets/asset_detail.html:77 msgid "Vendor" msgstr "制造商" -#: assets/models/asset.py:93 assets/templates/assets/asset_detail.html:81 +#: assets/models/asset.py:107 assets/templates/assets/asset_detail.html:81 msgid "Model" msgstr "型号" -#: assets/models/asset.py:95 assets/templates/assets/asset_detail.html:109 +#: assets/models/asset.py:109 assets/templates/assets/asset_detail.html:109 msgid "Serial number" msgstr "序列号" -#: assets/models/asset.py:98 +#: assets/models/asset.py:112 msgid "CPU model" msgstr "CPU型号" -#: assets/models/asset.py:99 +#: assets/models/asset.py:113 msgid "CPU count" msgstr "CPU数量" -#: assets/models/asset.py:100 +#: assets/models/asset.py:114 msgid "CPU cores" msgstr "CPU核数" -#: assets/models/asset.py:102 assets/templates/assets/asset_detail.html:89 +#: assets/models/asset.py:116 assets/templates/assets/asset_detail.html:89 msgid "Memory" msgstr "内存" -#: assets/models/asset.py:104 +#: assets/models/asset.py:118 msgid "Disk total" msgstr "硬盘大小" -#: assets/models/asset.py:106 +#: assets/models/asset.py:120 msgid "Disk info" msgstr "硬盘信息" -#: assets/models/asset.py:109 assets/templates/assets/asset_detail.html:101 +#: assets/models/asset.py:123 assets/templates/assets/asset_detail.html:101 msgid "OS" msgstr "操作系统" -#: assets/models/asset.py:111 +#: assets/models/asset.py:125 msgid "OS version" msgstr "系统版本" -#: assets/models/asset.py:113 +#: assets/models/asset.py:127 msgid "OS arch" msgstr "系统架构" -#: assets/models/asset.py:115 +#: assets/models/asset.py:129 msgid "Hostname raw" msgstr "主机名原始" -#: assets/models/asset.py:119 assets/templates/assets/asset_create.html:33 +#: assets/models/asset.py:133 assets/templates/assets/asset_create.html:34 #: assets/templates/assets/asset_detail.html:220 -#: assets/templates/assets/asset_update.html:38 templates/_nav.html:27 +#: assets/templates/assets/asset_update.html:39 templates/_nav.html:27 msgid "Labels" msgstr "标签管理" -#: assets/models/asset.py:121 assets/models/base.py:29 +#: assets/models/asset.py:135 assets/models/base.py:29 #: assets/models/cluster.py:28 assets/models/group.py:21 #: assets/templates/assets/admin_user_detail.html:68 #: assets/templates/assets/asset_detail.html:117 @@ -326,7 +335,7 @@ msgstr "标签管理" msgid "Created by" msgstr "创建者" -#: assets/models/asset.py:124 assets/models/cluster.py:26 +#: assets/models/asset.py:138 assets/models/cluster.py:26 #: assets/models/domain.py:20 assets/models/group.py:22 #: assets/models/label.py:23 assets/templates/assets/admin_user_detail.html:64 #: assets/templates/assets/domain_detail.html:68 @@ -339,7 +348,7 @@ msgstr "创建者" msgid "Date created" msgstr "创建日期" -#: assets/models/asset.py:126 assets/models/base.py:26 +#: assets/models/asset.py:140 assets/models/base.py:26 #: assets/models/cluster.py:29 assets/models/domain.py:18 #: assets/models/domain.py:47 assets/models/group.py:23 #: assets/models/label.py:21 assets/templates/assets/admin_user_detail.html:72 @@ -414,14 +423,6 @@ msgstr "默认Cluster" msgid "Cluster" msgstr "集群" -#: assets/models/domain.py:45 assets/models/user.py:113 -#: assets/templates/assets/domain_gateway_list.html:59 -#: assets/templates/assets/system_user_detail.html:70 -#: assets/templates/assets/system_user_list.html:28 -#: terminal/templates/terminal/session_list.html:75 -msgid "Protocol" -msgstr "协议" - #: assets/models/group.py:30 msgid "Asset group" msgstr "资产组" @@ -444,7 +445,7 @@ msgstr "默认资产组" #: terminal/templates/terminal/session_list.html:71 users/forms.py:282 #: users/models/user.py:31 users/models/user.py:333 #: users/templates/users/user_group_detail.html:78 -#: users/templates/users/user_group_list.html:13 users/views/user.py:359 +#: users/templates/users/user_group_list.html:13 users/views/user.py:361 msgid "User" msgstr "用户" @@ -461,15 +462,15 @@ msgstr "分类" msgid "Key" msgstr "" -#: assets/models/user.py:106 +#: assets/models/user.py:108 msgid "Automatic login" msgstr "自动登录" -#: assets/models/user.py:107 +#: assets/models/user.py:109 msgid "Manually login" msgstr "手动登录" -#: assets/models/user.py:111 +#: assets/models/user.py:113 #: assets/templates/assets/_asset_group_bulk_update_modal.html:11 #: assets/templates/assets/system_user_asset.html:21 #: assets/views/admin_user.py:29 assets/views/admin_user.py:47 @@ -487,30 +488,30 @@ msgstr "手动登录" msgid "Assets" msgstr "资产管理" -#: assets/models/user.py:112 +#: assets/models/user.py:114 msgid "Priority" msgstr "优先级" -#: assets/models/user.py:114 assets/templates/assets/_system_user.html:59 +#: assets/models/user.py:116 assets/templates/assets/_system_user.html:59 #: assets/templates/assets/system_user_detail.html:122 #: assets/templates/assets/system_user_update.html:10 msgid "Auto push" msgstr "自动推送" -#: assets/models/user.py:115 assets/templates/assets/system_user_detail.html:74 +#: assets/models/user.py:117 assets/templates/assets/system_user_detail.html:74 msgid "Sudo" msgstr "Sudo" -#: assets/models/user.py:116 assets/templates/assets/system_user_detail.html:79 +#: assets/models/user.py:118 assets/templates/assets/system_user_detail.html:79 msgid "Shell" msgstr "Shell" -#: assets/models/user.py:117 assets/templates/assets/system_user_detail.html:66 +#: assets/models/user.py:119 assets/templates/assets/system_user_detail.html:66 #: assets/templates/assets/system_user_list.html:29 msgid "Login mode" msgstr "登录模式" -#: assets/models/user.py:157 audits/models.py:12 +#: assets/models/user.py:159 audits/models.py:12 #: audits/templates/audits/ftp_log_list.html:49 #: audits/templates/audits/ftp_log_list.html:73 perms/forms.py:43 #: perms/models.py:34 perms/models.py:78 @@ -624,8 +625,8 @@ msgid "Basic" msgstr "基本" #: assets/templates/assets/_system_user.html:44 -#: assets/templates/assets/asset_create.html:25 -#: assets/templates/assets/asset_update.html:30 +#: assets/templates/assets/asset_create.html:26 +#: assets/templates/assets/asset_update.html:31 #: assets/templates/assets/gateway_create_update.html:45 #: users/templates/users/_user.html:21 msgid "Auth" @@ -636,8 +637,8 @@ msgid "Auto generate key" msgstr "自动生成密钥" #: assets/templates/assets/_system_user.html:65 -#: assets/templates/assets/asset_create.html:59 -#: assets/templates/assets/asset_update.html:63 +#: assets/templates/assets/asset_create.html:60 +#: assets/templates/assets/asset_update.html:64 #: assets/templates/assets/gateway_create_update.html:53 #: perms/templates/perms/asset_permission_create_update.html:45 #: terminal/templates/terminal/terminal_update.html:42 @@ -647,8 +648,8 @@ msgstr "其它" #: assets/templates/assets/_system_user.html:71 #: assets/templates/assets/admin_user_create_update.html:45 #: assets/templates/assets/asset_bulk_update.html:23 -#: assets/templates/assets/asset_create.html:66 -#: assets/templates/assets/asset_update.html:70 +#: assets/templates/assets/asset_create.html:67 +#: assets/templates/assets/asset_update.html:71 #: assets/templates/assets/domain_create_update.html:16 #: assets/templates/assets/gateway_create_update.html:58 #: assets/templates/assets/label_create_update.html:18 @@ -672,9 +673,9 @@ msgstr "重置" #: assets/templates/assets/_system_user.html:72 #: assets/templates/assets/admin_user_create_update.html:46 #: assets/templates/assets/asset_bulk_update.html:24 -#: assets/templates/assets/asset_create.html:67 +#: assets/templates/assets/asset_create.html:68 #: assets/templates/assets/asset_list.html:108 -#: assets/templates/assets/asset_update.html:71 +#: assets/templates/assets/asset_update.html:72 #: assets/templates/assets/domain_create_update.html:17 #: assets/templates/assets/gateway_create_update.html:59 #: assets/templates/assets/label_create_update.html:19 @@ -1025,7 +1026,7 @@ msgstr "删除" msgid "Asset Deleting failed." msgstr "删除失败" -#: assets/templates/assets/asset_update.html:59 +#: assets/templates/assets/asset_update.html:60 msgid "Configuration" msgstr "配置" @@ -1987,7 +1988,7 @@ msgstr "文档" #: users/templates/users/user_profile.html:17 #: users/templates/users/user_profile_update.html:37 #: users/templates/users/user_profile_update.html:57 -#: users/templates/users/user_pubkey_update.html:37 users/views/user.py:341 +#: users/templates/users/user_pubkey_update.html:37 users/views/user.py:343 msgid "Profile" msgstr "个人信息" @@ -2045,8 +2046,8 @@ msgstr "关闭" #: templates/_nav.html:10 users/views/group.py:28 users/views/group.py:44 #: users/views/group.py:62 users/views/group.py:79 users/views/group.py:95 #: users/views/login.py:277 users/views/login.py:335 users/views/user.py:65 -#: users/views/user.py:80 users/views/user.py:102 users/views/user.py:173 -#: users/views/user.py:328 users/views/user.py:378 users/views/user.py:413 +#: users/views/user.py:80 users/views/user.py:102 users/views/user.py:175 +#: users/views/user.py:330 users/views/user.py:380 users/views/user.py:415 msgid "Users" msgstr "用户管理" @@ -2680,7 +2681,7 @@ msgid "Reset link will be generated and sent to the user. " msgstr "生成重置密码连接,通过邮件发送给用户" #: users/templates/users/user_detail.html:19 -#: users/templates/users/user_granted_asset.html:18 users/views/user.py:174 +#: users/templates/users/user_granted_asset.html:18 users/views/user.py:176 msgid "User detail" msgstr "用户详情" @@ -2815,8 +2816,8 @@ msgstr "用户删除失败" msgid "Administrator Settings force MFA login" msgstr "管理员设置强制使用MFA登录" -#: users/templates/users/user_profile.html:116 users/views/user.py:203 -#: users/views/user.py:257 +#: users/templates/users/user_profile.html:116 users/views/user.py:205 +#: users/views/user.py:259 msgid "User groups" msgstr "用户组" @@ -2871,7 +2872,7 @@ msgid "Create account successfully" msgstr "创建账户成功" #: users/utils.py:43 -#, fuzzy, python-format +#, python-format msgid "" "\n" " Hello %(name)s:\n" @@ -3020,7 +3021,7 @@ msgstr "用户组授权资产" msgid "Please enable cookies and try again." msgstr "设置你的浏览器支持cookie" -#: users/views/login.py:128 users/views/user.py:498 users/views/user.py:523 +#: users/views/login.py:128 users/views/user.py:500 users/views/user.py:525 msgid "MFA code invalid" msgstr "MFA码认证失败" @@ -3061,7 +3062,7 @@ msgstr "Token错误或失效" msgid "Password not same" msgstr "密码不一致" -#: users/views/login.py:239 users/views/user.py:115 users/views/user.py:396 +#: users/views/login.py:239 users/views/user.py:118 users/views/user.py:398 msgid "* Your password does not meet the requirements" msgstr "* 您的密码不符合要求" @@ -3073,46 +3074,46 @@ msgstr "首次登陆" msgid "Login log list" msgstr "登录日志" -#: users/views/user.py:127 +#: users/views/user.py:129 msgid "Bulk update user success" msgstr "批量更新用户成功" -#: users/views/user.py:232 +#: users/views/user.py:234 msgid "Invalid file." msgstr "文件不合法" -#: users/views/user.py:329 +#: users/views/user.py:331 msgid "User granted assets" msgstr "用户授权资产" -#: users/views/user.py:360 +#: users/views/user.py:362 msgid "Profile setting" msgstr "个人信息设置" -#: users/views/user.py:379 +#: users/views/user.py:381 msgid "Password update" msgstr "密码更新" -#: users/views/user.py:414 +#: users/views/user.py:416 msgid "Public key update" msgstr "密钥更新" -#: users/views/user.py:455 +#: users/views/user.py:457 msgid "Password invalid" msgstr "用户名或密码无效" -#: users/views/user.py:549 +#: users/views/user.py:551 msgid "MFA enable success" msgstr "MFA 绑定成功" -#: users/views/user.py:550 +#: users/views/user.py:552 msgid "MFA enable success, return login page" msgstr "MFA 绑定成功,返回到登录页面" -#: users/views/user.py:552 +#: users/views/user.py:554 msgid "MFA disable success" msgstr "MFA 解绑成功" -#: users/views/user.py:553 +#: users/views/user.py:555 msgid "MFA disable success, return login page" msgstr "MFA 解绑成功,返回登录页面" diff --git a/apps/perms/api.py b/apps/perms/api.py index 33a027064..40366a19b 100644 --- a/apps/perms/api.py +++ b/apps/perms/api.py @@ -73,9 +73,9 @@ class UserGrantedAssetsApi(ListAPIView): util = AssetPermissionUtil(user) for k, v in util.get_assets().items(): if k.is_unixlike(): - system_users_granted = [s for s in v if s.protocol == 'ssh'] + system_users_granted = [s for s in v if s.protocol in ['ssh', 'telnet']] else: - system_users_granted = [s for s in v if s.protocol == 'rdp'] + system_users_granted = [s for s in v if s.protocol in ['rdp', 'telnet']] k.system_users_granted = system_users_granted queryset.append(k) return queryset @@ -124,9 +124,9 @@ class UserGrantedNodesWithAssetsApi(ListAPIView): assets = _assets.keys() for k, v in _assets.items(): if k.is_unixlike(): - system_users_granted = [s for s in v if s.protocol == 'ssh'] + system_users_granted = [s for s in v if s.protocol in ['ssh', 'telnet']] else: - system_users_granted = [s for s in v if s.protocol == 'rdp'] + system_users_granted = [s for s in v if s.protocol in ['rdp', 'telnet']] k.system_users_granted = system_users_granted node.assets_granted = assets queryset.append(node)