Merge pull request #8250 from jumpserver/dev

v2.22.0-rc2
pull/8289/head
Jiangjie.Bai 2022-05-17 15:10:59 +08:00 committed by GitHub
commit 514fa9cf0a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 238 additions and 178 deletions

1
.gitattributes vendored
View File

@ -1,2 +1,3 @@
*.mmdb filter=lfs diff=lfs merge=lfs -text *.mmdb filter=lfs diff=lfs merge=lfs -text
*.mo filter=lfs diff=lfs merge=lfs -text *.mo filter=lfs diff=lfs merge=lfs -text
*.ipdb filter=lfs diff=lfs merge=lfs -text

View File

@ -11,8 +11,8 @@ from assets.models import Type
class AuthSerializer(serializers.ModelSerializer): class AuthSerializer(serializers.ModelSerializer):
password = EncryptedField(required=False, allow_blank=True, allow_null=True, max_length=1024) password = EncryptedField(required=False, allow_blank=True, allow_null=True, max_length=1024, label=_('Password'))
private_key = EncryptedField(required=False, allow_blank=True, allow_null=True, max_length=4096) private_key = EncryptedField(required=False, allow_blank=True, allow_null=True, max_length=4096, label=_('Private key'))
def gen_keys(self, private_key=None, password=None): def gen_keys(self, private_key=None, password=None):
if private_key is None: if private_key is None:
@ -32,8 +32,12 @@ class AuthSerializer(serializers.ModelSerializer):
class AuthSerializerMixin(serializers.ModelSerializer): class AuthSerializerMixin(serializers.ModelSerializer):
password = EncryptedField(required=False, allow_blank=True, allow_null=True, max_length=1024) password = EncryptedField(
private_key = EncryptedField(required=False, allow_blank=True, allow_null=True, max_length=4096) label=_('Password'), required=False, allow_blank=True, allow_null=True, max_length=1024
)
private_key = EncryptedField(
label=_('SSH private key'), required=False, allow_blank=True, allow_null=True, max_length=4096
)
passphrase = serializers.CharField( passphrase = serializers.CharField(
allow_blank=True, allow_null=True, required=False, max_length=512, allow_blank=True, allow_null=True, required=False, max_length=512,
write_only=True, label=_('Key password') write_only=True, label=_('Key password')

View File

@ -27,6 +27,10 @@ class ReadableHiddenField(serializers.HiddenField):
class EncryptedField(serializers.CharField): class EncryptedField(serializers.CharField):
def __init__(self, **kwargs):
kwargs['write_only'] = True
super().__init__(**kwargs)
def to_internal_value(self, value): def to_internal_value(self, value):
value = super().to_internal_value(value) value = super().to_internal_value(value)
return decrypt_password(value) return decrypt_password(value)

View File

@ -9,4 +9,3 @@ from .crypto import *
from .random import * from .random import *
from .jumpserver import * from .jumpserver import *
from .ip import * from .ip import *
from .geoip import *

View File

@ -19,7 +19,7 @@ def get_redis_client(db=0):
'password': CONFIG.REDIS_PASSWORD, 'password': CONFIG.REDIS_PASSWORD,
'db': db, 'db': db,
"ssl": is_true(CONFIG.REDIS_USE_SSL), "ssl": is_true(CONFIG.REDIS_USE_SSL),
'ssl_cert_reqs': CONFIG.REDIS_SSL_REQUIRED, 'ssl_cert_reqs': getattr(settings, 'REDIS_SSL_REQUIRED'),
'ssl_keyfile': getattr(settings, 'REDIS_SSL_KEYFILE'), 'ssl_keyfile': getattr(settings, 'REDIS_SSL_KEYFILE'),
'ssl_certfile': getattr(settings, 'REDIS_SSL_CERTFILE'), 'ssl_certfile': getattr(settings, 'REDIS_SSL_CERTFILE'),
'ssl_ca_certs': getattr(settings, 'REDIS_SSL_CA_CERTS'), 'ssl_ca_certs': getattr(settings, 'REDIS_SSL_CA_CERTS'),

View File

@ -0,0 +1 @@
from .utils import *

View File

@ -8,11 +8,11 @@ from geoip2.errors import GeoIP2Error
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.conf import settings from django.conf import settings
__all__ = ['get_ip_city'] __all__ = ['get_ip_city_by_geoip']
reader = None reader = None
def get_ip_city(ip): def get_ip_city_by_geoip(ip):
if not ip or '.' not in ip or not isinstance(ip, str): if not ip or '.' not in ip or not isinstance(ip, str):
return _("Invalid ip") return _("Invalid ip")
if ':' in ip: if ':' in ip:
@ -32,15 +32,13 @@ def get_ip_city(ip):
try: try:
response = reader.city(ip) response = reader.city(ip)
except GeoIP2Error: except GeoIP2Error:
return _("Unknown ip") return {}
names = response.city.names city_names = response.city.names or {}
if not names: lang = settings.LANGUAGE_CODE[:2]
names = response.country.names if lang == 'zh':
lang = 'zh-CN'
city = city_names.get(lang, _("Unknown"))
return city
if 'en' in settings.LANGUAGE_CODE and 'en' in names:
return names['en']
elif 'zh-CN' in names:
return names['zh-CN']
return _("Unknown ip")

View File

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
#
from .utils import *

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b82b874152c798dda407ffe7544e1f5ec67efa1f5c334efc0d3893b8053b4be1
size 3649897

View File

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
#
import os
from django.utils.translation import ugettext as _
import ipdb
__all__ = ['get_ip_city_by_ipip']
ipip_db = None
def get_ip_city_by_ipip(ip):
global ipip_db
if not ip or not isinstance(ip, str):
return _("Invalid ip")
if ':' in ip:
return 'IPv6'
if ipip_db is None:
ipip_db_path = os.path.join(os.path.dirname(__file__), 'ipipfree.ipdb')
ipip_db = ipdb.City(ipip_db_path)
info = ipip_db.find_info(ip, 'CN')
return {'city': info.city_name, 'country': info.country_name}

View File

@ -1,4 +1,9 @@
from ipaddress import ip_network, ip_address from ipaddress import ip_network, ip_address
from django.conf import settings
from django.utils.translation import gettext_lazy as _
from .ipip import get_ip_city_by_ipip
from .geoip import get_ip_city_by_geoip
def is_ip_address(address): def is_ip_address(address):
@ -66,3 +71,16 @@ def contains_ip(ip, ip_group):
return True return True
return False return False
def get_ip_city(ip):
info = get_ip_city_by_ipip(ip)
city = info.get('city', _("Unknown"))
country = info.get('country')
# 国内城市 并且 语言是中文就使用国内
is_zh = settings.LANGUAGE_CODE.startswith('zh')
if country == '中国' and is_zh:
return city
else:
return get_ip_city_by_geoip(ip)

View File

@ -18,7 +18,7 @@ class RedisServer(_RedisServer):
ssl_params = {} ssl_params = {}
if CONFIG.REDIS_USE_SSL: if CONFIG.REDIS_USE_SSL:
ssl_params = { ssl_params = {
'ssl_cert_reqs': CONFIG.REDIS_SSL_REQUIRED, 'ssl_cert_reqs': getattr(settings, 'REDIS_SSL_REQUIRED'),
'ssl_keyfile': getattr(settings, 'REDIS_SSL_KEYFILE'), 'ssl_keyfile': getattr(settings, 'REDIS_SSL_KEYFILE'),
'ssl_certfile': getattr(settings, 'REDIS_SSL_CERTFILE'), 'ssl_certfile': getattr(settings, 'REDIS_SSL_CERTFILE'),
'ssl_ca_certs': getattr(settings, 'REDIS_SSL_CA_CERTS'), 'ssl_ca_certs': getattr(settings, 'REDIS_SSL_CA_CERTS'),

View File

@ -277,6 +277,11 @@ REDIS_SSL_CA_CERTS = os.path.join(PROJECT_DIR, 'data', 'certs', 'redis_ca.crt')
if not os.path.exists(REDIS_SSL_CA_CERTS): if not os.path.exists(REDIS_SSL_CA_CERTS):
REDIS_SSL_CA_CERTS = os.path.join(PROJECT_DIR, 'data', 'certs', 'redis_ca.pem') REDIS_SSL_CA_CERTS = os.path.join(PROJECT_DIR, 'data', 'certs', 'redis_ca.pem')
if not os.path.exists(REDIS_SSL_CA_CERTS):
REDIS_SSL_CA_CERTS = None
REDIS_SSL_REQUIRED = CONFIG.REDIS_SSL_REQUIRED or 'none'
CACHES = { CACHES = {
'default': { 'default': {
# 'BACKEND': 'redis_cache.RedisCache', # 'BACKEND': 'redis_cache.RedisCache',
@ -291,7 +296,7 @@ CACHES = {
'OPTIONS': { 'OPTIONS': {
"REDIS_CLIENT_KWARGS": {"health_check_interval": 30}, "REDIS_CLIENT_KWARGS": {"health_check_interval": 30},
"CONNECTION_POOL_KWARGS": { "CONNECTION_POOL_KWARGS": {
'ssl_cert_reqs': CONFIG.REDIS_SSL_REQUIRED, 'ssl_cert_reqs': REDIS_SSL_REQUIRED,
"ssl_keyfile": REDIS_SSL_KEYFILE, "ssl_keyfile": REDIS_SSL_KEYFILE,
"ssl_certfile": REDIS_SSL_CERTFILE, "ssl_certfile": REDIS_SSL_CERTFILE,
"ssl_ca_certs": REDIS_SSL_CA_CERTS "ssl_ca_certs": REDIS_SSL_CA_CERTS

View File

@ -3,7 +3,7 @@
import os import os
import ssl import ssl
from .base import REDIS_SSL_CA_CERTS, REDIS_SSL_CERTFILE, REDIS_SSL_KEYFILE from .base import REDIS_SSL_CA_CERTS, REDIS_SSL_CERTFILE, REDIS_SSL_KEYFILE, REDIS_SSL_REQUIRED
from ..const import CONFIG, PROJECT_DIR from ..const import CONFIG, PROJECT_DIR
REST_FRAMEWORK = { REST_FRAMEWORK = {
@ -90,6 +90,7 @@ if not CONFIG.REDIS_USE_SSL:
else: else:
context = ssl.SSLContext() context = ssl.SSLContext()
context.check_hostname = bool(CONFIG.REDIS_SSL_REQUIRED) context.check_hostname = bool(CONFIG.REDIS_SSL_REQUIRED)
if REDIS_SSL_CA_CERTS:
context.load_verify_locations(REDIS_SSL_CA_CERTS) context.load_verify_locations(REDIS_SSL_CA_CERTS)
if REDIS_SSL_CERTFILE and REDIS_SSL_KEYFILE: if REDIS_SSL_CERTFILE and REDIS_SSL_KEYFILE:
context.load_cert_chain(REDIS_SSL_CERTFILE, REDIS_SSL_KEYFILE) context.load_cert_chain(REDIS_SSL_CERTFILE, REDIS_SSL_KEYFILE)
@ -140,7 +141,7 @@ CELERY_WORKER_REDIRECT_STDOUTS_LEVEL = "INFO"
CELERY_TASK_SOFT_TIME_LIMIT = 3600 CELERY_TASK_SOFT_TIME_LIMIT = 3600
if CONFIG.REDIS_USE_SSL: if CONFIG.REDIS_USE_SSL:
CELERY_BROKER_USE_SSL = CELERY_REDIS_BACKEND_USE_SSL = { CELERY_BROKER_USE_SSL = CELERY_REDIS_BACKEND_USE_SSL = {
'ssl_cert_reqs': CONFIG.REDIS_SSL_REQUIRED, 'ssl_cert_reqs': REDIS_SSL_REQUIRED,
'ssl_ca_certs': REDIS_SSL_CA_CERTS, 'ssl_ca_certs': REDIS_SSL_CA_CERTS,
'ssl_certfile': REDIS_SSL_CERTFILE, 'ssl_certfile': REDIS_SSL_CERTFILE,
'ssl_keyfile': REDIS_SSL_KEYFILE 'ssl_keyfile': REDIS_SSL_KEYFILE

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:90a70c14fd3b546cb1ef6a96da4cd7a2acde947128bbb773527ed1845510511c oid sha256:01a52223f421d736b00a600f623d28ac4a43e97a30f5e9cbebc3e6d18ed4527e
size 127420 size 127324

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-12 14:39+0800\n" "POT-Creation-Date: 2022-05-16 17:43+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -33,7 +33,7 @@ msgstr "Acls"
#: terminal/models/storage.py:25 terminal/models/task.py:16 #: terminal/models/storage.py:25 terminal/models/task.py:16
#: terminal/models/terminal.py:100 users/forms/profile.py:33 #: terminal/models/terminal.py:100 users/forms/profile.py:33
#: users/models/group.py:15 users/models/user.py:661 #: users/models/group.py:15 users/models/user.py:661
#: xpack/plugins/cloud/models.py:27 #: xpack/plugins/cloud/models.py:28
msgid "Name" msgid "Name"
msgstr "名前" msgstr "名前"
@ -66,12 +66,13 @@ msgstr "アクティブ"
#: tickets/models/comment.py:24 tickets/models/ticket.py:154 #: tickets/models/comment.py:24 tickets/models/ticket.py:154
#: users/models/group.py:16 users/models/user.py:698 #: users/models/group.py:16 users/models/user.py:698
#: xpack/plugins/change_auth_plan/models/base.py:44 #: xpack/plugins/change_auth_plan/models/base.py:44
#: xpack/plugins/cloud/models.py:34 xpack/plugins/cloud/models.py:115 #: xpack/plugins/cloud/models.py:35 xpack/plugins/cloud/models.py:116
#: xpack/plugins/gathered_user/models.py:26 #: xpack/plugins/gathered_user/models.py:26
msgid "Comment" msgid "Comment"
msgstr "コメント" msgstr "コメント"
#: acls/models/login_acl.py:18 tickets/const.py:38 #: acls/models/login_acl.py:18 tickets/const.py:38
#: tickets/templates/tickets/approve_check_password.html:39
msgid "Reject" msgid "Reject"
msgstr "拒否" msgstr "拒否"
@ -134,7 +135,7 @@ msgstr "システムユーザー"
#: terminal/notifications.py:90 #: terminal/notifications.py:90
#: xpack/plugins/change_auth_plan/models/asset.py:199 #: xpack/plugins/change_auth_plan/models/asset.py:199
#: xpack/plugins/change_auth_plan/serializers/asset.py:180 #: xpack/plugins/change_auth_plan/serializers/asset.py:180
#: xpack/plugins/cloud/models.py:222 #: xpack/plugins/cloud/models.py:223
msgid "Asset" msgid "Asset"
msgstr "資産" msgstr "資産"
@ -318,7 +319,7 @@ msgstr "タイプ"
msgid "Domain" msgid "Domain"
msgstr "ドメイン" msgstr "ドメイン"
#: applications/models/application.py:228 xpack/plugins/cloud/models.py:32 #: applications/models/application.py:228 xpack/plugins/cloud/models.py:33
#: xpack/plugins/cloud/serializers/account.py:59 #: xpack/plugins/cloud/serializers/account.py:59
msgid "Attrs" msgid "Attrs"
msgstr "ツールバーの" msgstr "ツールバーの"
@ -357,7 +358,7 @@ msgstr "タイプ表示"
#: common/mixins/models.py:50 ops/models/adhoc.py:39 ops/models/command.py:30 #: common/mixins/models.py:50 ops/models/adhoc.py:39 ops/models/command.py:30
#: orgs/models.py:67 orgs/models.py:217 perms/models/base.py:92 #: orgs/models.py:67 orgs/models.py:217 perms/models/base.py:92
#: users/models/group.py:18 users/models/user.py:915 #: users/models/group.py:18 users/models/user.py:915
#: xpack/plugins/cloud/models.py:124 #: xpack/plugins/cloud/models.py:125
msgid "Date created" msgid "Date created"
msgstr "作成された日付" msgstr "作成された日付"
@ -572,7 +573,7 @@ msgstr "ホスト名生"
#: assets/models/asset.py:215 assets/serializers/account.py:16 #: assets/models/asset.py:215 assets/serializers/account.py:16
#: assets/serializers/asset.py:65 perms/serializers/asset/user_permission.py:41 #: assets/serializers/asset.py:65 perms/serializers/asset/user_permission.py:41
#: xpack/plugins/cloud/models.py:106 xpack/plugins/cloud/serializers/task.py:42 #: xpack/plugins/cloud/models.py:107 xpack/plugins/cloud/serializers/task.py:42
msgid "Protocols" msgid "Protocols"
msgstr "プロトコル" msgstr "プロトコル"
@ -612,7 +613,7 @@ msgstr "ラベル"
#: orgs/models.py:219 perms/models/base.py:91 users/models/user.py:706 #: orgs/models.py:219 perms/models/base.py:91 users/models/user.py:706
#: users/serializers/group.py:33 #: users/serializers/group.py:33
#: xpack/plugins/change_auth_plan/models/base.py:48 #: xpack/plugins/change_auth_plan/models/base.py:48
#: xpack/plugins/cloud/models.py:121 xpack/plugins/gathered_user/models.py:30 #: xpack/plugins/cloud/models.py:122 xpack/plugins/gathered_user/models.py:30
msgid "Created by" msgid "Created by"
msgstr "によって作成された" msgstr "によって作成された"
@ -716,7 +717,7 @@ msgstr "トリガーモード"
#: xpack/plugins/change_auth_plan/models/base.py:201 #: xpack/plugins/change_auth_plan/models/base.py:201
#: xpack/plugins/change_auth_plan/serializers/app.py:66 #: xpack/plugins/change_auth_plan/serializers/app.py:66
#: xpack/plugins/change_auth_plan/serializers/asset.py:179 #: xpack/plugins/change_auth_plan/serializers/asset.py:179
#: xpack/plugins/cloud/models.py:178 #: xpack/plugins/cloud/models.py:179
msgid "Reason" msgid "Reason"
msgstr "理由" msgstr "理由"
@ -734,6 +735,7 @@ msgid "Account backup execution"
msgstr "アカウントバックアップの実行" msgstr "アカウントバックアップの実行"
#: assets/models/base.py:30 assets/tasks/const.py:51 audits/const.py:5 #: assets/models/base.py:30 assets/tasks/const.py:51 audits/const.py:5
#: common/utils/ip/geoip/utils.py:41 common/utils/ip/utils.py:78
msgid "Unknown" msgid "Unknown"
msgstr "不明" msgstr "不明"
@ -954,7 +956,7 @@ msgid "Parent key"
msgstr "親キー" msgstr "親キー"
#: assets/models/node.py:559 assets/serializers/system_user.py:263 #: assets/models/node.py:559 assets/serializers/system_user.py:263
#: xpack/plugins/cloud/models.py:95 xpack/plugins/cloud/serializers/task.py:69 #: xpack/plugins/cloud/models.py:96 xpack/plugins/cloud/serializers/task.py:69
msgid "Node" msgid "Node"
msgstr "ノード" msgstr "ノード"
@ -1491,8 +1493,8 @@ msgid "MFA"
msgstr "MFA" msgstr "MFA"
#: audits/models.py:128 terminal/models/status.py:33 #: audits/models.py:128 terminal/models/status.py:33
#: tickets/models/ticket.py:140 xpack/plugins/cloud/models.py:174 #: tickets/models/ticket.py:140 xpack/plugins/cloud/models.py:175
#: xpack/plugins/cloud/models.py:226 #: xpack/plugins/cloud/models.py:227
msgid "Status" msgid "Status"
msgstr "ステータス" msgstr "ステータス"
@ -1529,7 +1531,7 @@ msgid "Hosts display"
msgstr "ホスト表示" msgstr "ホスト表示"
#: audits/serializers.py:96 ops/models/command.py:27 #: audits/serializers.py:96 ops/models/command.py:27
#: xpack/plugins/cloud/models.py:172 #: xpack/plugins/cloud/models.py:173
msgid "Result" msgid "Result"
msgstr "結果" msgstr "結果"
@ -2100,7 +2102,7 @@ msgstr "バインディングリマインダー"
#: perms/serializers/application/permission.py:20 #: perms/serializers/application/permission.py:20
#: perms/serializers/application/permission.py:41 #: perms/serializers/application/permission.py:41
#: perms/serializers/asset/permission.py:19 #: perms/serializers/asset/permission.py:19
#: perms/serializers/asset/permission.py:45 users/serializers/user.py:141 #: perms/serializers/asset/permission.py:45 users/serializers/user.py:143
msgid "Is valid" msgid "Is valid"
msgstr "有効です" msgstr "有効です"
@ -2637,18 +2639,15 @@ msgstr "確認コードが正しくありません"
msgid "Please wait {} seconds before sending" msgid "Please wait {} seconds before sending"
msgstr "{} 秒待ってから送信してください" msgstr "{} 秒待ってから送信してください"
#: common/utils/geoip/utils.py:17 common/utils/geoip/utils.py:30 #: common/utils/ip/geoip/utils.py:17 common/utils/ip/geoip/utils.py:30
#: common/utils/ip/ipip/utils.py:15
msgid "Invalid ip" msgid "Invalid ip"
msgstr "無効なIP" msgstr "無効なIP"
#: common/utils/geoip/utils.py:28 #: common/utils/ip/geoip/utils.py:28
msgid "LAN" msgid "LAN"
msgstr "LAN" msgstr "LAN"
#: common/utils/geoip/utils.py:35 common/utils/geoip/utils.py:45
msgid "Unknown ip"
msgstr "不明なip"
#: common/validators.py:32 #: common/validators.py:32
msgid "This field must be unique." msgid "This field must be unique."
msgstr "このフィールドは一意である必要があります。" msgstr "このフィールドは一意である必要があります。"
@ -3063,8 +3062,8 @@ msgstr "Organization {} のアプリケーション権限"
#: perms/serializers/application/permission.py:21 #: perms/serializers/application/permission.py:21
#: perms/serializers/application/permission.py:40 #: perms/serializers/application/permission.py:40
#: perms/serializers/asset/permission.py:20 #: perms/serializers/asset/permission.py:20
#: perms/serializers/asset/permission.py:44 users/serializers/user.py:86 #: perms/serializers/asset/permission.py:44 users/serializers/user.py:87
#: users/serializers/user.py:143 #: users/serializers/user.py:145
msgid "Is expired" msgid "Is expired"
msgstr "期限切れです" msgstr "期限切れです"
@ -4977,7 +4976,7 @@ msgstr "バケット"
msgid "Secret key" msgid "Secret key"
msgstr "秘密キー" msgstr "秘密キー"
#: terminal/serializers/storage.py:64 xpack/plugins/cloud/models.py:219 #: terminal/serializers/storage.py:64 xpack/plugins/cloud/models.py:220
msgid "Region" msgid "Region"
msgstr "リージョン" msgstr "リージョン"
@ -5492,12 +5491,8 @@ msgid "Ticket approval"
msgstr "作業指示の承認" msgstr "作業指示の承認"
#: tickets/templates/tickets/approve_check_password.html:35 #: tickets/templates/tickets/approve_check_password.html:35
msgid "Ticket direct approval" msgid "Approval"
msgstr "作業指示の直接承認" msgstr "承認"
#: tickets/templates/tickets/approve_check_password.html:39
msgid "Ticket direct reject"
msgstr "作業指示の直接却下"
#: tickets/templates/tickets/approve_check_password.html:44 #: tickets/templates/tickets/approve_check_password.html:44
msgid "Go Login" msgid "Go Login"
@ -5645,7 +5640,7 @@ msgstr "強制有効"
msgid "Local" msgid "Local"
msgstr "ローカル" msgstr "ローカル"
#: users/models/user.py:673 users/serializers/user.py:142 #: users/models/user.py:673 users/serializers/user.py:144
msgid "Is service account" msgid "Is service account"
msgstr "サービスアカウントです" msgstr "サービスアカウントです"
@ -5744,101 +5739,101 @@ msgstr "新しいパスワードを最後の {} 個のパスワードにする
msgid "The newly set password is inconsistent" msgid "The newly set password is inconsistent"
msgstr "新しく設定されたパスワードが一致しない" msgstr "新しく設定されたパスワードが一致しない"
#: users/serializers/profile.py:147 users/serializers/user.py:140 #: users/serializers/profile.py:147 users/serializers/user.py:142
msgid "Is first login" msgid "Is first login"
msgstr "最初のログインです" msgstr "最初のログインです"
#: users/serializers/user.py:25 users/serializers/user.py:32 #: users/serializers/user.py:26 users/serializers/user.py:33
msgid "System roles" msgid "System roles"
msgstr "システムの役割" msgstr "システムの役割"
#: users/serializers/user.py:30 users/serializers/user.py:33 #: users/serializers/user.py:31 users/serializers/user.py:34
msgid "Org roles" msgid "Org roles"
msgstr "組織ロール" msgstr "組織ロール"
#: users/serializers/user.py:78 #: users/serializers/user.py:79
#: xpack/plugins/change_auth_plan/models/base.py:35 #: xpack/plugins/change_auth_plan/models/base.py:35
#: xpack/plugins/change_auth_plan/serializers/base.py:22 #: xpack/plugins/change_auth_plan/serializers/base.py:22
msgid "Password strategy" msgid "Password strategy"
msgstr "パスワード戦略" msgstr "パスワード戦略"
#: users/serializers/user.py:80 #: users/serializers/user.py:81
msgid "MFA enabled" msgid "MFA enabled"
msgstr "MFA有効化" msgstr "MFA有効化"
#: users/serializers/user.py:81 #: users/serializers/user.py:82
msgid "MFA force enabled" msgid "MFA force enabled"
msgstr "MFAフォース有効化" msgstr "MFAフォース有効化"
#: users/serializers/user.py:83 #: users/serializers/user.py:84
msgid "MFA level display" msgid "MFA level display"
msgstr "MFAレベル表示" msgstr "MFAレベル表示"
#: users/serializers/user.py:85 #: users/serializers/user.py:86
msgid "Login blocked" msgid "Login blocked"
msgstr "ログインブロック" msgstr "ログインブロック"
#: users/serializers/user.py:88 #: users/serializers/user.py:89
msgid "Can public key authentication" msgid "Can public key authentication"
msgstr "公開鍵認証が可能" msgstr "公開鍵認証が可能"
#: users/serializers/user.py:144 #: users/serializers/user.py:146
msgid "Avatar url" msgid "Avatar url"
msgstr "アバターURL" msgstr "アバターURL"
#: users/serializers/user.py:146 #: users/serializers/user.py:148
msgid "Groups name" msgid "Groups name"
msgstr "グループ名" msgstr "グループ名"
#: users/serializers/user.py:147 #: users/serializers/user.py:149
msgid "Source name" msgid "Source name"
msgstr "ソース名" msgstr "ソース名"
#: users/serializers/user.py:148 #: users/serializers/user.py:150
msgid "Organization role name" msgid "Organization role name"
msgstr "組織の役割名" msgstr "組織の役割名"
#: users/serializers/user.py:149 #: users/serializers/user.py:151
msgid "Super role name" msgid "Super role name"
msgstr "スーパーロール名" msgstr "スーパーロール名"
#: users/serializers/user.py:150 #: users/serializers/user.py:152
msgid "Total role name" msgid "Total role name"
msgstr "合計ロール名" msgstr "合計ロール名"
#: users/serializers/user.py:152 #: users/serializers/user.py:154
msgid "Is wecom bound" msgid "Is wecom bound"
msgstr "企業の微信をバインドしているかどうか" msgstr "企業の微信をバインドしているかどうか"
#: users/serializers/user.py:153 #: users/serializers/user.py:155
msgid "Is dingtalk bound" msgid "Is dingtalk bound"
msgstr "ピンをバインドしているかどうか" msgstr "ピンをバインドしているかどうか"
#: users/serializers/user.py:154 #: users/serializers/user.py:156
msgid "Is feishu bound" msgid "Is feishu bound"
msgstr "飛本を縛ったかどうか" msgstr "飛本を縛ったかどうか"
#: users/serializers/user.py:155 #: users/serializers/user.py:157
msgid "Is OTP bound" msgid "Is OTP bound"
msgstr "仮想MFAがバインドされているか" msgstr "仮想MFAがバインドされているか"
#: users/serializers/user.py:157 #: users/serializers/user.py:159
msgid "System role name" msgid "System role name"
msgstr "システムロール名" msgstr "システムロール名"
#: users/serializers/user.py:197 #: users/serializers/user.py:199
msgid "User cannot self-update fields: {}" msgid "User cannot self-update fields: {}"
msgstr "ユーザーは自分のフィールドを更新できません: {}" msgstr "ユーザーは自分のフィールドを更新できません: {}"
#: users/serializers/user.py:254 #: users/serializers/user.py:256
msgid "Select users" msgid "Select users"
msgstr "ユーザーの選択" msgstr "ユーザーの選択"
#: users/serializers/user.py:255 #: users/serializers/user.py:257
msgid "For security, only list several users" msgid "For security, only list several users"
msgstr "セキュリティのために、複数のユーザーのみをリストします" msgstr "セキュリティのために、複数のユーザーのみをリストします"
#: users/serializers/user.py:290 #: users/serializers/user.py:292
msgid "name not unique" msgid "name not unique"
msgstr "名前が一意ではない" msgstr "名前が一意ではない"
@ -6371,79 +6366,79 @@ msgstr "リリース済み"
msgid "Cloud center" msgid "Cloud center"
msgstr "クラウドセンター" msgstr "クラウドセンター"
#: xpack/plugins/cloud/models.py:29 #: xpack/plugins/cloud/models.py:30
msgid "Provider" msgid "Provider"
msgstr "プロバイダー" msgstr "プロバイダー"
#: xpack/plugins/cloud/models.py:33 #: xpack/plugins/cloud/models.py:34
msgid "Validity" msgid "Validity"
msgstr "有効性" msgstr "有効性"
#: xpack/plugins/cloud/models.py:38 #: xpack/plugins/cloud/models.py:39
msgid "Cloud account" msgid "Cloud account"
msgstr "クラウドアカウント" msgstr "クラウドアカウント"
#: xpack/plugins/cloud/models.py:40 #: xpack/plugins/cloud/models.py:41
msgid "Test cloud account" msgid "Test cloud account"
msgstr "クラウドアカウントのテスト" msgstr "クラウドアカウントのテスト"
#: xpack/plugins/cloud/models.py:84 xpack/plugins/cloud/serializers/task.py:66 #: xpack/plugins/cloud/models.py:85 xpack/plugins/cloud/serializers/task.py:66
msgid "Account" msgid "Account"
msgstr "アカウント" msgstr "アカウント"
#: xpack/plugins/cloud/models.py:87 xpack/plugins/cloud/serializers/task.py:37 #: xpack/plugins/cloud/models.py:88 xpack/plugins/cloud/serializers/task.py:37
msgid "Regions" msgid "Regions"
msgstr "リージョン" msgstr "リージョン"
#: xpack/plugins/cloud/models.py:90 #: xpack/plugins/cloud/models.py:91
msgid "Hostname strategy" msgid "Hostname strategy"
msgstr "ホスト名戦略" msgstr "ホスト名戦略"
#: xpack/plugins/cloud/models.py:99 xpack/plugins/cloud/serializers/task.py:67 #: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/serializers/task.py:67
msgid "Unix admin user" msgid "Unix admin user"
msgstr "Unix adminユーザー" msgstr "Unix adminユーザー"
#: xpack/plugins/cloud/models.py:103 xpack/plugins/cloud/serializers/task.py:68 #: xpack/plugins/cloud/models.py:104 xpack/plugins/cloud/serializers/task.py:68
msgid "Windows admin user" msgid "Windows admin user"
msgstr "Windows管理者" msgstr "Windows管理者"
#: xpack/plugins/cloud/models.py:109 xpack/plugins/cloud/serializers/task.py:45 #: xpack/plugins/cloud/models.py:110 xpack/plugins/cloud/serializers/task.py:45
msgid "IP network segment group" msgid "IP network segment group"
msgstr "IPネットワークセグメントグループ" msgstr "IPネットワークセグメントグループ"
#: xpack/plugins/cloud/models.py:112 xpack/plugins/cloud/serializers/task.py:71 #: xpack/plugins/cloud/models.py:113 xpack/plugins/cloud/serializers/task.py:71
msgid "Always update" msgid "Always update"
msgstr "常に更新" msgstr "常に更新"
#: xpack/plugins/cloud/models.py:118 #: xpack/plugins/cloud/models.py:119
msgid "Date last sync" msgid "Date last sync"
msgstr "最終同期日" msgstr "最終同期日"
#: xpack/plugins/cloud/models.py:129 xpack/plugins/cloud/models.py:170 #: xpack/plugins/cloud/models.py:130 xpack/plugins/cloud/models.py:171
msgid "Sync instance task" msgid "Sync instance task"
msgstr "インスタンスの同期タスク" msgstr "インスタンスの同期タスク"
#: xpack/plugins/cloud/models.py:181 xpack/plugins/cloud/models.py:229 #: xpack/plugins/cloud/models.py:182 xpack/plugins/cloud/models.py:230
msgid "Date sync" msgid "Date sync"
msgstr "日付の同期" msgstr "日付の同期"
#: xpack/plugins/cloud/models.py:185 #: xpack/plugins/cloud/models.py:186
msgid "Sync instance task execution" msgid "Sync instance task execution"
msgstr "インスタンスタスクの同期実行" msgstr "インスタンスタスクの同期実行"
#: xpack/plugins/cloud/models.py:209 #: xpack/plugins/cloud/models.py:210
msgid "Sync task" msgid "Sync task"
msgstr "同期タスク" msgstr "同期タスク"
#: xpack/plugins/cloud/models.py:213 #: xpack/plugins/cloud/models.py:214
msgid "Sync instance task history" msgid "Sync instance task history"
msgstr "インスタンスタスク履歴の同期" msgstr "インスタンスタスク履歴の同期"
#: xpack/plugins/cloud/models.py:216 #: xpack/plugins/cloud/models.py:217
msgid "Instance" msgid "Instance"
msgstr "インスタンス" msgstr "インスタンス"
#: xpack/plugins/cloud/models.py:233 #: xpack/plugins/cloud/models.py:234
msgid "Sync instance detail" msgid "Sync instance detail"
msgstr "同期インスタンスの詳細" msgstr "同期インスタンスの詳細"
@ -6805,6 +6800,9 @@ msgstr "究極のエディション"
msgid "Community edition" msgid "Community edition"
msgstr "コミュニティ版" msgstr "コミュニティ版"
#~ msgid "Unknown ip"
#~ msgstr "不明なip"
#~ msgid "" #~ msgid ""
#~ "Windows needs to download the client to connect SSH assets, and the MacOS " #~ "Windows needs to download the client to connect SSH assets, and the MacOS "
#~ "system uses its own terminal" #~ "system uses its own terminal"

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f181a41eb4dd8a30a576f7903e5c9f519da2042e5e095ac27146d7b4002ba3df oid sha256:e4a00b4e1a3bc944c968987fd3c65798fb39fa552e91457693ec8fcb597820f0
size 105303 size 105225

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n" "Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-12 14:39+0800\n" "POT-Creation-Date: 2022-05-16 17:43+0800\n"
"PO-Revision-Date: 2021-05-20 10:54+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n"
"Last-Translator: ibuler <ibuler@qq.com>\n" "Last-Translator: ibuler <ibuler@qq.com>\n"
"Language-Team: JumpServer team<ibuler@qq.com>\n" "Language-Team: JumpServer team<ibuler@qq.com>\n"
@ -32,7 +32,7 @@ msgstr "访问控制"
#: terminal/models/storage.py:25 terminal/models/task.py:16 #: terminal/models/storage.py:25 terminal/models/task.py:16
#: terminal/models/terminal.py:100 users/forms/profile.py:33 #: terminal/models/terminal.py:100 users/forms/profile.py:33
#: users/models/group.py:15 users/models/user.py:661 #: users/models/group.py:15 users/models/user.py:661
#: xpack/plugins/cloud/models.py:27 #: xpack/plugins/cloud/models.py:28
msgid "Name" msgid "Name"
msgstr "名称" msgstr "名称"
@ -65,12 +65,13 @@ msgstr "激活中"
#: tickets/models/comment.py:24 tickets/models/ticket.py:154 #: tickets/models/comment.py:24 tickets/models/ticket.py:154
#: users/models/group.py:16 users/models/user.py:698 #: users/models/group.py:16 users/models/user.py:698
#: xpack/plugins/change_auth_plan/models/base.py:44 #: xpack/plugins/change_auth_plan/models/base.py:44
#: xpack/plugins/cloud/models.py:34 xpack/plugins/cloud/models.py:115 #: xpack/plugins/cloud/models.py:35 xpack/plugins/cloud/models.py:116
#: xpack/plugins/gathered_user/models.py:26 #: xpack/plugins/gathered_user/models.py:26
msgid "Comment" msgid "Comment"
msgstr "备注" msgstr "备注"
#: acls/models/login_acl.py:18 tickets/const.py:38 #: acls/models/login_acl.py:18 tickets/const.py:38
#: tickets/templates/tickets/approve_check_password.html:39
msgid "Reject" msgid "Reject"
msgstr "拒绝" msgstr "拒绝"
@ -133,7 +134,7 @@ msgstr "系统用户"
#: terminal/notifications.py:90 #: terminal/notifications.py:90
#: xpack/plugins/change_auth_plan/models/asset.py:199 #: xpack/plugins/change_auth_plan/models/asset.py:199
#: xpack/plugins/change_auth_plan/serializers/asset.py:180 #: xpack/plugins/change_auth_plan/serializers/asset.py:180
#: xpack/plugins/cloud/models.py:222 #: xpack/plugins/cloud/models.py:223
msgid "Asset" msgid "Asset"
msgstr "资产" msgstr "资产"
@ -313,7 +314,7 @@ msgstr "类型"
msgid "Domain" msgid "Domain"
msgstr "网域" msgstr "网域"
#: applications/models/application.py:228 xpack/plugins/cloud/models.py:32 #: applications/models/application.py:228 xpack/plugins/cloud/models.py:33
#: xpack/plugins/cloud/serializers/account.py:59 #: xpack/plugins/cloud/serializers/account.py:59
msgid "Attrs" msgid "Attrs"
msgstr "属性" msgstr "属性"
@ -352,7 +353,7 @@ msgstr "类型名称"
#: common/mixins/models.py:50 ops/models/adhoc.py:39 ops/models/command.py:30 #: common/mixins/models.py:50 ops/models/adhoc.py:39 ops/models/command.py:30
#: orgs/models.py:67 orgs/models.py:217 perms/models/base.py:92 #: orgs/models.py:67 orgs/models.py:217 perms/models/base.py:92
#: users/models/group.py:18 users/models/user.py:915 #: users/models/group.py:18 users/models/user.py:915
#: xpack/plugins/cloud/models.py:124 #: xpack/plugins/cloud/models.py:125
msgid "Date created" msgid "Date created"
msgstr "创建日期" msgstr "创建日期"
@ -567,7 +568,7 @@ msgstr "主机名原始"
#: assets/models/asset.py:215 assets/serializers/account.py:16 #: assets/models/asset.py:215 assets/serializers/account.py:16
#: assets/serializers/asset.py:65 perms/serializers/asset/user_permission.py:41 #: assets/serializers/asset.py:65 perms/serializers/asset/user_permission.py:41
#: xpack/plugins/cloud/models.py:106 xpack/plugins/cloud/serializers/task.py:42 #: xpack/plugins/cloud/models.py:107 xpack/plugins/cloud/serializers/task.py:42
msgid "Protocols" msgid "Protocols"
msgstr "协议组" msgstr "协议组"
@ -607,7 +608,7 @@ msgstr "标签管理"
#: orgs/models.py:219 perms/models/base.py:91 users/models/user.py:706 #: orgs/models.py:219 perms/models/base.py:91 users/models/user.py:706
#: users/serializers/group.py:33 #: users/serializers/group.py:33
#: xpack/plugins/change_auth_plan/models/base.py:48 #: xpack/plugins/change_auth_plan/models/base.py:48
#: xpack/plugins/cloud/models.py:121 xpack/plugins/gathered_user/models.py:30 #: xpack/plugins/cloud/models.py:122 xpack/plugins/gathered_user/models.py:30
msgid "Created by" msgid "Created by"
msgstr "创建者" msgstr "创建者"
@ -711,7 +712,7 @@ msgstr "触发模式"
#: xpack/plugins/change_auth_plan/models/base.py:201 #: xpack/plugins/change_auth_plan/models/base.py:201
#: xpack/plugins/change_auth_plan/serializers/app.py:66 #: xpack/plugins/change_auth_plan/serializers/app.py:66
#: xpack/plugins/change_auth_plan/serializers/asset.py:179 #: xpack/plugins/change_auth_plan/serializers/asset.py:179
#: xpack/plugins/cloud/models.py:178 #: xpack/plugins/cloud/models.py:179
msgid "Reason" msgid "Reason"
msgstr "原因" msgstr "原因"
@ -729,6 +730,7 @@ msgid "Account backup execution"
msgstr "账号备份执行" msgstr "账号备份执行"
#: assets/models/base.py:30 assets/tasks/const.py:51 audits/const.py:5 #: assets/models/base.py:30 assets/tasks/const.py:51 audits/const.py:5
#: common/utils/ip/geoip/utils.py:41 common/utils/ip/utils.py:78
msgid "Unknown" msgid "Unknown"
msgstr "未知" msgstr "未知"
@ -949,7 +951,7 @@ msgid "Parent key"
msgstr "ssh私钥" msgstr "ssh私钥"
#: assets/models/node.py:559 assets/serializers/system_user.py:263 #: assets/models/node.py:559 assets/serializers/system_user.py:263
#: xpack/plugins/cloud/models.py:95 xpack/plugins/cloud/serializers/task.py:69 #: xpack/plugins/cloud/models.py:96 xpack/plugins/cloud/serializers/task.py:69
msgid "Node" msgid "Node"
msgstr "节点" msgstr "节点"
@ -1479,8 +1481,8 @@ msgid "MFA"
msgstr "MFA" msgstr "MFA"
#: audits/models.py:128 terminal/models/status.py:33 #: audits/models.py:128 terminal/models/status.py:33
#: tickets/models/ticket.py:140 xpack/plugins/cloud/models.py:174 #: tickets/models/ticket.py:140 xpack/plugins/cloud/models.py:175
#: xpack/plugins/cloud/models.py:226 #: xpack/plugins/cloud/models.py:227
msgid "Status" msgid "Status"
msgstr "状态" msgstr "状态"
@ -1517,7 +1519,7 @@ msgid "Hosts display"
msgstr "主机名称" msgstr "主机名称"
#: audits/serializers.py:96 ops/models/command.py:27 #: audits/serializers.py:96 ops/models/command.py:27
#: xpack/plugins/cloud/models.py:172 #: xpack/plugins/cloud/models.py:173
msgid "Result" msgid "Result"
msgstr "结果" msgstr "结果"
@ -2079,7 +2081,7 @@ msgstr "绑定提醒"
#: perms/serializers/application/permission.py:20 #: perms/serializers/application/permission.py:20
#: perms/serializers/application/permission.py:41 #: perms/serializers/application/permission.py:41
#: perms/serializers/asset/permission.py:19 #: perms/serializers/asset/permission.py:19
#: perms/serializers/asset/permission.py:45 users/serializers/user.py:141 #: perms/serializers/asset/permission.py:45 users/serializers/user.py:143
msgid "Is valid" msgid "Is valid"
msgstr "账号是否有效" msgstr "账号是否有效"
@ -2607,18 +2609,15 @@ msgstr "验证码错误"
msgid "Please wait {} seconds before sending" msgid "Please wait {} seconds before sending"
msgstr "请在 {} 秒后发送" msgstr "请在 {} 秒后发送"
#: common/utils/geoip/utils.py:17 common/utils/geoip/utils.py:30 #: common/utils/ip/geoip/utils.py:17 common/utils/ip/geoip/utils.py:30
#: common/utils/ip/ipip/utils.py:15
msgid "Invalid ip" msgid "Invalid ip"
msgstr "无效IP" msgstr "无效IP"
#: common/utils/geoip/utils.py:28 #: common/utils/ip/geoip/utils.py:28
msgid "LAN" msgid "LAN"
msgstr "LAN" msgstr "LAN"
#: common/utils/geoip/utils.py:35 common/utils/geoip/utils.py:45
msgid "Unknown ip"
msgstr "未知ip"
#: common/validators.py:32 #: common/validators.py:32
msgid "This field must be unique." msgid "This field must be unique."
msgstr "字段必须唯一" msgstr "字段必须唯一"
@ -3027,8 +3026,8 @@ msgstr "组织 ({}) 的应用授权"
#: perms/serializers/application/permission.py:21 #: perms/serializers/application/permission.py:21
#: perms/serializers/application/permission.py:40 #: perms/serializers/application/permission.py:40
#: perms/serializers/asset/permission.py:20 #: perms/serializers/asset/permission.py:20
#: perms/serializers/asset/permission.py:44 users/serializers/user.py:86 #: perms/serializers/asset/permission.py:44 users/serializers/user.py:87
#: users/serializers/user.py:143 #: users/serializers/user.py:145
msgid "Is expired" msgid "Is expired"
msgstr "已过期" msgstr "已过期"
@ -4905,7 +4904,7 @@ msgstr "桶名称"
msgid "Secret key" msgid "Secret key"
msgstr "密钥" msgstr "密钥"
#: terminal/serializers/storage.py:64 xpack/plugins/cloud/models.py:219 #: terminal/serializers/storage.py:64 xpack/plugins/cloud/models.py:220
msgid "Region" msgid "Region"
msgstr "地域" msgstr "地域"
@ -5416,12 +5415,8 @@ msgid "Ticket approval"
msgstr "工单审批" msgstr "工单审批"
#: tickets/templates/tickets/approve_check_password.html:35 #: tickets/templates/tickets/approve_check_password.html:35
msgid "Ticket direct approval" msgid "Approval"
msgstr "工单直接审批" msgstr "同意"
#: tickets/templates/tickets/approve_check_password.html:39
msgid "Ticket direct reject"
msgstr "工单直接拒绝"
#: tickets/templates/tickets/approve_check_password.html:44 #: tickets/templates/tickets/approve_check_password.html:44
msgid "Go Login" msgid "Go Login"
@ -5567,7 +5562,7 @@ msgstr "强制启用"
msgid "Local" msgid "Local"
msgstr "数据库" msgstr "数据库"
#: users/models/user.py:673 users/serializers/user.py:142 #: users/models/user.py:673 users/serializers/user.py:144
msgid "Is service account" msgid "Is service account"
msgstr "服务账号" msgstr "服务账号"
@ -5666,101 +5661,101 @@ msgstr "新密码不能是最近 {} 次的密码"
msgid "The newly set password is inconsistent" msgid "The newly set password is inconsistent"
msgstr "两次密码不一致" msgstr "两次密码不一致"
#: users/serializers/profile.py:147 users/serializers/user.py:140 #: users/serializers/profile.py:147 users/serializers/user.py:142
msgid "Is first login" msgid "Is first login"
msgstr "首次登录" msgstr "首次登录"
#: users/serializers/user.py:25 users/serializers/user.py:32 #: users/serializers/user.py:26 users/serializers/user.py:33
msgid "System roles" msgid "System roles"
msgstr "系统角色" msgstr "系统角色"
#: users/serializers/user.py:30 users/serializers/user.py:33 #: users/serializers/user.py:31 users/serializers/user.py:34
msgid "Org roles" msgid "Org roles"
msgstr "组织角色" msgstr "组织角色"
#: users/serializers/user.py:78 #: users/serializers/user.py:79
#: xpack/plugins/change_auth_plan/models/base.py:35 #: xpack/plugins/change_auth_plan/models/base.py:35
#: xpack/plugins/change_auth_plan/serializers/base.py:22 #: xpack/plugins/change_auth_plan/serializers/base.py:22
msgid "Password strategy" msgid "Password strategy"
msgstr "密码策略" msgstr "密码策略"
#: users/serializers/user.py:80 #: users/serializers/user.py:81
msgid "MFA enabled" msgid "MFA enabled"
msgstr "MFA" msgstr "MFA"
#: users/serializers/user.py:81 #: users/serializers/user.py:82
msgid "MFA force enabled" msgid "MFA force enabled"
msgstr "强制 MFA" msgstr "强制 MFA"
#: users/serializers/user.py:83 #: users/serializers/user.py:84
msgid "MFA level display" msgid "MFA level display"
msgstr "MFA 等级名称" msgstr "MFA 等级名称"
#: users/serializers/user.py:85 #: users/serializers/user.py:86
msgid "Login blocked" msgid "Login blocked"
msgstr "登录被阻塞" msgstr "登录被阻塞"
#: users/serializers/user.py:88 #: users/serializers/user.py:89
msgid "Can public key authentication" msgid "Can public key authentication"
msgstr "能否公钥认证" msgstr "能否公钥认证"
#: users/serializers/user.py:144 #: users/serializers/user.py:146
msgid "Avatar url" msgid "Avatar url"
msgstr "头像路径" msgstr "头像路径"
#: users/serializers/user.py:146 #: users/serializers/user.py:148
msgid "Groups name" msgid "Groups name"
msgstr "用户组名" msgstr "用户组名"
#: users/serializers/user.py:147 #: users/serializers/user.py:149
msgid "Source name" msgid "Source name"
msgstr "用户来源名" msgstr "用户来源名"
#: users/serializers/user.py:148 #: users/serializers/user.py:150
msgid "Organization role name" msgid "Organization role name"
msgstr "组织角色名称" msgstr "组织角色名称"
#: users/serializers/user.py:149 #: users/serializers/user.py:151
msgid "Super role name" msgid "Super role name"
msgstr "超级角色名称" msgstr "超级角色名称"
#: users/serializers/user.py:150 #: users/serializers/user.py:152
msgid "Total role name" msgid "Total role name"
msgstr "汇总角色名称" msgstr "汇总角色名称"
#: users/serializers/user.py:152 #: users/serializers/user.py:154
msgid "Is wecom bound" msgid "Is wecom bound"
msgstr "是否绑定了企业微信" msgstr "是否绑定了企业微信"
#: users/serializers/user.py:153 #: users/serializers/user.py:155
msgid "Is dingtalk bound" msgid "Is dingtalk bound"
msgstr "是否绑定了钉钉" msgstr "是否绑定了钉钉"
#: users/serializers/user.py:154 #: users/serializers/user.py:156
msgid "Is feishu bound" msgid "Is feishu bound"
msgstr "是否绑定了飞书" msgstr "是否绑定了飞书"
#: users/serializers/user.py:155 #: users/serializers/user.py:157
msgid "Is OTP bound" msgid "Is OTP bound"
msgstr "是否绑定了虚拟 MFA" msgstr "是否绑定了虚拟 MFA"
#: users/serializers/user.py:157 #: users/serializers/user.py:159
msgid "System role name" msgid "System role name"
msgstr "系统角色名称" msgstr "系统角色名称"
#: users/serializers/user.py:197 #: users/serializers/user.py:199
msgid "User cannot self-update fields: {}" msgid "User cannot self-update fields: {}"
msgstr "用户不能更新自己的字段: {}" msgstr "用户不能更新自己的字段: {}"
#: users/serializers/user.py:254 #: users/serializers/user.py:256
msgid "Select users" msgid "Select users"
msgstr "选择用户" msgstr "选择用户"
#: users/serializers/user.py:255 #: users/serializers/user.py:257
msgid "For security, only list several users" msgid "For security, only list several users"
msgstr "为了安全,仅列出几个用户" msgstr "为了安全,仅列出几个用户"
#: users/serializers/user.py:290 #: users/serializers/user.py:292
msgid "name not unique" msgid "name not unique"
msgstr "名称重复" msgstr "名称重复"
@ -6280,79 +6275,79 @@ msgstr "已释放"
msgid "Cloud center" msgid "Cloud center"
msgstr "云管中心" msgstr "云管中心"
#: xpack/plugins/cloud/models.py:29 #: xpack/plugins/cloud/models.py:30
msgid "Provider" msgid "Provider"
msgstr "云服务商" msgstr "云服务商"
#: xpack/plugins/cloud/models.py:33 #: xpack/plugins/cloud/models.py:34
msgid "Validity" msgid "Validity"
msgstr "有效" msgstr "有效"
#: xpack/plugins/cloud/models.py:38 #: xpack/plugins/cloud/models.py:39
msgid "Cloud account" msgid "Cloud account"
msgstr "云账号" msgstr "云账号"
#: xpack/plugins/cloud/models.py:40 #: xpack/plugins/cloud/models.py:41
msgid "Test cloud account" msgid "Test cloud account"
msgstr "测试云账号" msgstr "测试云账号"
#: xpack/plugins/cloud/models.py:84 xpack/plugins/cloud/serializers/task.py:66 #: xpack/plugins/cloud/models.py:85 xpack/plugins/cloud/serializers/task.py:66
msgid "Account" msgid "Account"
msgstr "账号" msgstr "账号"
#: xpack/plugins/cloud/models.py:87 xpack/plugins/cloud/serializers/task.py:37 #: xpack/plugins/cloud/models.py:88 xpack/plugins/cloud/serializers/task.py:37
msgid "Regions" msgid "Regions"
msgstr "地域" msgstr "地域"
#: xpack/plugins/cloud/models.py:90 #: xpack/plugins/cloud/models.py:91
msgid "Hostname strategy" msgid "Hostname strategy"
msgstr "主机名策略" msgstr "主机名策略"
#: xpack/plugins/cloud/models.py:99 xpack/plugins/cloud/serializers/task.py:67 #: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/serializers/task.py:67
msgid "Unix admin user" msgid "Unix admin user"
msgstr "Unix 管理员" msgstr "Unix 管理员"
#: xpack/plugins/cloud/models.py:103 xpack/plugins/cloud/serializers/task.py:68 #: xpack/plugins/cloud/models.py:104 xpack/plugins/cloud/serializers/task.py:68
msgid "Windows admin user" msgid "Windows admin user"
msgstr "Windows 管理员" msgstr "Windows 管理员"
#: xpack/plugins/cloud/models.py:109 xpack/plugins/cloud/serializers/task.py:45 #: xpack/plugins/cloud/models.py:110 xpack/plugins/cloud/serializers/task.py:45
msgid "IP network segment group" msgid "IP network segment group"
msgstr "IP网段组" msgstr "IP网段组"
#: xpack/plugins/cloud/models.py:112 xpack/plugins/cloud/serializers/task.py:71 #: xpack/plugins/cloud/models.py:113 xpack/plugins/cloud/serializers/task.py:71
msgid "Always update" msgid "Always update"
msgstr "总是更新" msgstr "总是更新"
#: xpack/plugins/cloud/models.py:118 #: xpack/plugins/cloud/models.py:119
msgid "Date last sync" msgid "Date last sync"
msgstr "最后同步日期" msgstr "最后同步日期"
#: xpack/plugins/cloud/models.py:129 xpack/plugins/cloud/models.py:170 #: xpack/plugins/cloud/models.py:130 xpack/plugins/cloud/models.py:171
msgid "Sync instance task" msgid "Sync instance task"
msgstr "同步实例任务" msgstr "同步实例任务"
#: xpack/plugins/cloud/models.py:181 xpack/plugins/cloud/models.py:229 #: xpack/plugins/cloud/models.py:182 xpack/plugins/cloud/models.py:230
msgid "Date sync" msgid "Date sync"
msgstr "同步日期" msgstr "同步日期"
#: xpack/plugins/cloud/models.py:185 #: xpack/plugins/cloud/models.py:186
msgid "Sync instance task execution" msgid "Sync instance task execution"
msgstr "同步实例任务执行" msgstr "同步实例任务执行"
#: xpack/plugins/cloud/models.py:209 #: xpack/plugins/cloud/models.py:210
msgid "Sync task" msgid "Sync task"
msgstr "同步任务" msgstr "同步任务"
#: xpack/plugins/cloud/models.py:213 #: xpack/plugins/cloud/models.py:214
msgid "Sync instance task history" msgid "Sync instance task history"
msgstr "同步实例任务历史" msgstr "同步实例任务历史"
#: xpack/plugins/cloud/models.py:216 #: xpack/plugins/cloud/models.py:217
msgid "Instance" msgid "Instance"
msgstr "实例" msgstr "实例"
#: xpack/plugins/cloud/models.py:233 #: xpack/plugins/cloud/models.py:234
msgid "Sync instance detail" msgid "Sync instance detail"
msgstr "同步实例详情" msgstr "同步实例详情"
@ -6713,6 +6708,9 @@ msgstr "旗舰版"
msgid "Community edition" msgid "Community edition"
msgstr "社区版" msgstr "社区版"
#~ msgid "Unknown ip"
#~ msgstr "未知ip"
#~ msgid "" #~ msgid ""
#~ "Windows needs to download the client to connect SSH assets, and the MacOS " #~ "Windows needs to download the client to connect SSH assets, and the MacOS "
#~ "system uses its own terminal" #~ "system uses its own terminal"

View File

@ -9,7 +9,7 @@ from users.models import UserGroup, User
from users.signals import pre_user_leave_org from users.signals import pre_user_leave_org
from applications.models import Application from applications.models import Application
from terminal.models import Session from terminal.models import Session
from rbac.models import OrgRoleBinding, SystemRoleBinding from rbac.models import OrgRoleBinding, SystemRoleBinding, RoleBinding
from assets.models import Asset, SystemUser, Domain, Gateway from assets.models import Asset, SystemUser, Domain, Gateway
from orgs.caches import OrgResourceStatisticsCache from orgs.caches import OrgResourceStatisticsCache
from orgs.utils import current_org from orgs.utils import current_org
@ -85,6 +85,7 @@ class OrgResourceStatisticsRefreshUtil:
Node: ['nodes_amount'], Node: ['nodes_amount'],
Asset: ['assets_amount'], Asset: ['assets_amount'],
UserGroup: ['groups_amount'], UserGroup: ['groups_amount'],
RoleBinding: ['users_amount']
} }
@classmethod @classmethod

View File

@ -22,7 +22,7 @@ class LDAPTestConfigSerializer(serializers.Serializer):
class LDAPTestLoginSerializer(serializers.Serializer): class LDAPTestLoginSerializer(serializers.Serializer):
username = serializers.CharField(max_length=1024, required=True) username = serializers.CharField(max_length=1024, required=True)
password = EncryptedField(max_length=2014, required=True) password = EncryptedField(max_length=2014, required=True, label=_("Password"))
class LDAPUserSerializer(serializers.Serializer): class LDAPUserSerializer(serializers.Serializer):

View File

@ -40,4 +40,4 @@ class PrivateSettingSerializer(PublicSettingSerializer):
TERMINAL_KOKO_SSH_ENABLED = serializers.BooleanField() TERMINAL_KOKO_SSH_ENABLED = serializers.BooleanField()
ANNOUNCEMENT_ENABLED = serializers.BooleanField() ANNOUNCEMENT_ENABLED = serializers.BooleanField()
ANNOUNCEMENT = serializers.CharField() ANNOUNCEMENT = serializers.DictField()

View File

@ -32,11 +32,11 @@
{% if user.is_authenticated %} {% if user.is_authenticated %}
<button class="btn btn-primary block full-width m-b" name="action" value="approve" <button class="btn btn-primary block full-width m-b" name="action" value="approve"
type="submit"> type="submit">
{% trans 'Ticket direct approval' %} {% trans 'Approval' %}
</button> </button>
<button class="btn btn-primary block full-width m-b" name="action" value="reject" <button class="btn btn-primary block full-width m-b" name="action" value="reject"
type="submit"> type="submit">
{% trans 'Ticket direct reject' %} {% trans 'Reject' %}
</button> </button>
{% else %} {% else %}
<a id='login_button' class="btn btn-primary block full-width m-b" <a id='login_button' class="btn btn-primary block full-width m-b"

View File

@ -88,7 +88,9 @@ class UserSerializer(RolesSerializerMixin, CommonBulkSerializerMixin, serializer
can_public_key_auth = serializers.ReadOnlyField( can_public_key_auth = serializers.ReadOnlyField(
source='can_use_ssh_key_login', label=_('Can public key authentication') source='can_use_ssh_key_login', label=_('Can public key authentication')
) )
password = EncryptedField(required=False, allow_blank=True, allow_null=True, max_length=1024) password = EncryptedField(
label=_('Password'), required=False, allow_blank=True, allow_null=True, max_length=1024
)
# Todo: 这里看看该怎么搞 # Todo: 这里看看该怎么搞
# can_update = serializers.SerializerMethodField(label=_('Can update')) # can_update = serializers.SerializerMethodField(label=_('Can update'))
# can_delete = serializers.SerializerMethodField(label=_('Can delete')) # can_delete = serializers.SerializerMethodField(label=_('Can delete'))

View File

@ -131,3 +131,4 @@ pandas==1.3.5
pyjwkest==1.4.2 pyjwkest==1.4.2
jsonfield2==4.0.0.post0 jsonfield2==4.0.0.post0
bce-python-sdk==0.8.64 bce-python-sdk==0.8.64
ipip-ipdb==1.6.1