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
*.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):
password = EncryptedField(required=False, allow_blank=True, allow_null=True, max_length=1024)
private_key = EncryptedField(required=False, allow_blank=True, allow_null=True, max_length=4096)
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, label=_('Private key'))
def gen_keys(self, private_key=None, password=None):
if private_key is None:
@ -32,8 +32,12 @@ class AuthSerializer(serializers.ModelSerializer):
class AuthSerializerMixin(serializers.ModelSerializer):
password = EncryptedField(required=False, allow_blank=True, allow_null=True, max_length=1024)
private_key = EncryptedField(required=False, allow_blank=True, allow_null=True, max_length=4096)
password = EncryptedField(
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(
allow_blank=True, allow_null=True, required=False, max_length=512,
write_only=True, label=_('Key password')

View File

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

View File

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

View File

@ -19,7 +19,7 @@ def get_redis_client(db=0):
'password': CONFIG.REDIS_PASSWORD,
'db': db,
"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_certfile': getattr(settings, 'REDIS_SSL_CERTFILE'),
'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.conf import settings
__all__ = ['get_ip_city']
__all__ = ['get_ip_city_by_geoip']
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):
return _("Invalid ip")
if ':' in ip:
@ -32,15 +32,13 @@ def get_ip_city(ip):
try:
response = reader.city(ip)
except GeoIP2Error:
return _("Unknown ip")
return {}
names = response.city.names
if not names:
names = response.country.names
city_names = response.city.names or {}
lang = settings.LANGUAGE_CODE[:2]
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 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):
@ -66,3 +71,16 @@ def contains_ip(ip, ip_group):
return True
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 = {}
if CONFIG.REDIS_USE_SSL:
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_certfile': getattr(settings, 'REDIS_SSL_CERTFILE'),
'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):
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 = {
'default': {
# 'BACKEND': 'redis_cache.RedisCache',
@ -291,7 +296,7 @@ CACHES = {
'OPTIONS': {
"REDIS_CLIENT_KWARGS": {"health_check_interval": 30},
"CONNECTION_POOL_KWARGS": {
'ssl_cert_reqs': CONFIG.REDIS_SSL_REQUIRED,
'ssl_cert_reqs': REDIS_SSL_REQUIRED,
"ssl_keyfile": REDIS_SSL_KEYFILE,
"ssl_certfile": REDIS_SSL_CERTFILE,
"ssl_ca_certs": REDIS_SSL_CA_CERTS

View File

@ -3,7 +3,7 @@
import os
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
REST_FRAMEWORK = {
@ -90,6 +90,7 @@ if not CONFIG.REDIS_USE_SSL:
else:
context = ssl.SSLContext()
context.check_hostname = bool(CONFIG.REDIS_SSL_REQUIRED)
if REDIS_SSL_CA_CERTS:
context.load_verify_locations(REDIS_SSL_CA_CERTS)
if REDIS_SSL_CERTFILE and 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
if CONFIG.REDIS_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_certfile': REDIS_SSL_CERTFILE,
'ssl_keyfile': REDIS_SSL_KEYFILE

View File

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

View File

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

View File

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

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: JumpServer 0.3.3\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"
"Last-Translator: ibuler <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/terminal.py:100 users/forms/profile.py:33
#: users/models/group.py:15 users/models/user.py:661
#: xpack/plugins/cloud/models.py:27
#: xpack/plugins/cloud/models.py:28
msgid "Name"
msgstr "名称"
@ -65,12 +65,13 @@ msgstr "激活中"
#: tickets/models/comment.py:24 tickets/models/ticket.py:154
#: users/models/group.py:16 users/models/user.py:698
#: 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
msgid "Comment"
msgstr "备注"
#: acls/models/login_acl.py:18 tickets/const.py:38
#: tickets/templates/tickets/approve_check_password.html:39
msgid "Reject"
msgstr "拒绝"
@ -133,7 +134,7 @@ msgstr "系统用户"
#: terminal/notifications.py:90
#: xpack/plugins/change_auth_plan/models/asset.py:199
#: xpack/plugins/change_auth_plan/serializers/asset.py:180
#: xpack/plugins/cloud/models.py:222
#: xpack/plugins/cloud/models.py:223
msgid "Asset"
msgstr "资产"
@ -313,7 +314,7 @@ msgstr "类型"
msgid "Domain"
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
msgid "Attrs"
msgstr "属性"
@ -352,7 +353,7 @@ msgstr "类型名称"
#: 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
#: 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"
msgstr "创建日期"
@ -567,7 +568,7 @@ msgstr "主机名原始"
#: assets/models/asset.py:215 assets/serializers/account.py:16
#: 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"
msgstr "协议组"
@ -607,7 +608,7 @@ msgstr "标签管理"
#: orgs/models.py:219 perms/models/base.py:91 users/models/user.py:706
#: users/serializers/group.py:33
#: 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"
msgstr "创建者"
@ -711,7 +712,7 @@ msgstr "触发模式"
#: xpack/plugins/change_auth_plan/models/base.py:201
#: xpack/plugins/change_auth_plan/serializers/app.py:66
#: xpack/plugins/change_auth_plan/serializers/asset.py:179
#: xpack/plugins/cloud/models.py:178
#: xpack/plugins/cloud/models.py:179
msgid "Reason"
msgstr "原因"
@ -729,6 +730,7 @@ msgid "Account backup execution"
msgstr "账号备份执行"
#: 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"
msgstr "未知"
@ -949,7 +951,7 @@ msgid "Parent key"
msgstr "ssh私钥"
#: 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"
msgstr "节点"
@ -1479,8 +1481,8 @@ msgid "MFA"
msgstr "MFA"
#: audits/models.py:128 terminal/models/status.py:33
#: tickets/models/ticket.py:140 xpack/plugins/cloud/models.py:174
#: xpack/plugins/cloud/models.py:226
#: tickets/models/ticket.py:140 xpack/plugins/cloud/models.py:175
#: xpack/plugins/cloud/models.py:227
msgid "Status"
msgstr "状态"
@ -1517,7 +1519,7 @@ msgid "Hosts display"
msgstr "主机名称"
#: audits/serializers.py:96 ops/models/command.py:27
#: xpack/plugins/cloud/models.py:172
#: xpack/plugins/cloud/models.py:173
msgid "Result"
msgstr "结果"
@ -2079,7 +2081,7 @@ msgstr "绑定提醒"
#: perms/serializers/application/permission.py:20
#: perms/serializers/application/permission.py:41
#: 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"
msgstr "账号是否有效"
@ -2607,18 +2609,15 @@ msgstr "验证码错误"
msgid "Please wait {} seconds before sending"
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"
msgstr "无效IP"
#: common/utils/geoip/utils.py:28
#: common/utils/ip/geoip/utils.py:28
msgid "LAN"
msgstr "LAN"
#: common/utils/geoip/utils.py:35 common/utils/geoip/utils.py:45
msgid "Unknown ip"
msgstr "未知ip"
#: common/validators.py:32
msgid "This field must be unique."
msgstr "字段必须唯一"
@ -3027,8 +3026,8 @@ msgstr "组织 ({}) 的应用授权"
#: perms/serializers/application/permission.py:21
#: perms/serializers/application/permission.py:40
#: perms/serializers/asset/permission.py:20
#: perms/serializers/asset/permission.py:44 users/serializers/user.py:86
#: users/serializers/user.py:143
#: perms/serializers/asset/permission.py:44 users/serializers/user.py:87
#: users/serializers/user.py:145
msgid "Is expired"
msgstr "已过期"
@ -4905,7 +4904,7 @@ msgstr "桶名称"
msgid "Secret key"
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"
msgstr "地域"
@ -5416,12 +5415,8 @@ msgid "Ticket approval"
msgstr "工单审批"
#: tickets/templates/tickets/approve_check_password.html:35
msgid "Ticket direct approval"
msgstr "工单直接审批"
#: tickets/templates/tickets/approve_check_password.html:39
msgid "Ticket direct reject"
msgstr "工单直接拒绝"
msgid "Approval"
msgstr "同意"
#: tickets/templates/tickets/approve_check_password.html:44
msgid "Go Login"
@ -5567,7 +5562,7 @@ msgstr "强制启用"
msgid "Local"
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"
msgstr "服务账号"
@ -5666,101 +5661,101 @@ msgstr "新密码不能是最近 {} 次的密码"
msgid "The newly set password is inconsistent"
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"
msgstr "首次登录"
#: users/serializers/user.py:25 users/serializers/user.py:32
#: users/serializers/user.py:26 users/serializers/user.py:33
msgid "System roles"
msgstr "系统角色"
#: users/serializers/user.py:30 users/serializers/user.py:33
#: users/serializers/user.py:31 users/serializers/user.py:34
msgid "Org roles"
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/serializers/base.py:22
msgid "Password strategy"
msgstr "密码策略"
#: users/serializers/user.py:80
#: users/serializers/user.py:81
msgid "MFA enabled"
msgstr "MFA"
#: users/serializers/user.py:81
#: users/serializers/user.py:82
msgid "MFA force enabled"
msgstr "强制 MFA"
#: users/serializers/user.py:83
#: users/serializers/user.py:84
msgid "MFA level display"
msgstr "MFA 等级名称"
#: users/serializers/user.py:85
#: users/serializers/user.py:86
msgid "Login blocked"
msgstr "登录被阻塞"
#: users/serializers/user.py:88
#: users/serializers/user.py:89
msgid "Can public key authentication"
msgstr "能否公钥认证"
#: users/serializers/user.py:144
#: users/serializers/user.py:146
msgid "Avatar url"
msgstr "头像路径"
#: users/serializers/user.py:146
#: users/serializers/user.py:148
msgid "Groups name"
msgstr "用户组名"
#: users/serializers/user.py:147
#: users/serializers/user.py:149
msgid "Source name"
msgstr "用户来源名"
#: users/serializers/user.py:148
#: users/serializers/user.py:150
msgid "Organization role name"
msgstr "组织角色名称"
#: users/serializers/user.py:149
#: users/serializers/user.py:151
msgid "Super role name"
msgstr "超级角色名称"
#: users/serializers/user.py:150
#: users/serializers/user.py:152
msgid "Total role name"
msgstr "汇总角色名称"
#: users/serializers/user.py:152
#: users/serializers/user.py:154
msgid "Is wecom bound"
msgstr "是否绑定了企业微信"
#: users/serializers/user.py:153
#: users/serializers/user.py:155
msgid "Is dingtalk bound"
msgstr "是否绑定了钉钉"
#: users/serializers/user.py:154
#: users/serializers/user.py:156
msgid "Is feishu bound"
msgstr "是否绑定了飞书"
#: users/serializers/user.py:155
#: users/serializers/user.py:157
msgid "Is OTP bound"
msgstr "是否绑定了虚拟 MFA"
#: users/serializers/user.py:157
#: users/serializers/user.py:159
msgid "System role name"
msgstr "系统角色名称"
#: users/serializers/user.py:197
#: users/serializers/user.py:199
msgid "User cannot self-update fields: {}"
msgstr "用户不能更新自己的字段: {}"
#: users/serializers/user.py:254
#: users/serializers/user.py:256
msgid "Select users"
msgstr "选择用户"
#: users/serializers/user.py:255
#: users/serializers/user.py:257
msgid "For security, only list several users"
msgstr "为了安全,仅列出几个用户"
#: users/serializers/user.py:290
#: users/serializers/user.py:292
msgid "name not unique"
msgstr "名称重复"
@ -6280,79 +6275,79 @@ msgstr "已释放"
msgid "Cloud center"
msgstr "云管中心"
#: xpack/plugins/cloud/models.py:29
#: xpack/plugins/cloud/models.py:30
msgid "Provider"
msgstr "云服务商"
#: xpack/plugins/cloud/models.py:33
#: xpack/plugins/cloud/models.py:34
msgid "Validity"
msgstr "有效"
#: xpack/plugins/cloud/models.py:38
#: xpack/plugins/cloud/models.py:39
msgid "Cloud account"
msgstr "云账号"
#: xpack/plugins/cloud/models.py:40
#: xpack/plugins/cloud/models.py:41
msgid "Test cloud account"
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"
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"
msgstr "地域"
#: xpack/plugins/cloud/models.py:90
#: xpack/plugins/cloud/models.py:91
msgid "Hostname strategy"
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"
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"
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"
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"
msgstr "总是更新"
#: xpack/plugins/cloud/models.py:118
#: xpack/plugins/cloud/models.py:119
msgid "Date last sync"
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"
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"
msgstr "同步日期"
#: xpack/plugins/cloud/models.py:185
#: xpack/plugins/cloud/models.py:186
msgid "Sync instance task execution"
msgstr "同步实例任务执行"
#: xpack/plugins/cloud/models.py:209
#: xpack/plugins/cloud/models.py:210
msgid "Sync task"
msgstr "同步任务"
#: xpack/plugins/cloud/models.py:213
#: xpack/plugins/cloud/models.py:214
msgid "Sync instance task history"
msgstr "同步实例任务历史"
#: xpack/plugins/cloud/models.py:216
#: xpack/plugins/cloud/models.py:217
msgid "Instance"
msgstr "实例"
#: xpack/plugins/cloud/models.py:233
#: xpack/plugins/cloud/models.py:234
msgid "Sync instance detail"
msgstr "同步实例详情"
@ -6713,6 +6708,9 @@ msgstr "旗舰版"
msgid "Community edition"
msgstr "社区版"
#~ msgid "Unknown ip"
#~ msgstr "未知ip"
#~ msgid ""
#~ "Windows needs to download the client to connect SSH assets, and the MacOS "
#~ "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 applications.models import Application
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 orgs.caches import OrgResourceStatisticsCache
from orgs.utils import current_org
@ -85,6 +85,7 @@ class OrgResourceStatisticsRefreshUtil:
Node: ['nodes_amount'],
Asset: ['assets_amount'],
UserGroup: ['groups_amount'],
RoleBinding: ['users_amount']
}
@classmethod

View File

@ -22,7 +22,7 @@ class LDAPTestConfigSerializer(serializers.Serializer):
class LDAPTestLoginSerializer(serializers.Serializer):
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):

View File

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

View File

@ -32,11 +32,11 @@
{% if user.is_authenticated %}
<button class="btn btn-primary block full-width m-b" name="action" value="approve"
type="submit">
{% trans 'Ticket direct approval' %}
{% trans 'Approval' %}
</button>
<button class="btn btn-primary block full-width m-b" name="action" value="reject"
type="submit">
{% trans 'Ticket direct reject' %}
{% trans 'Reject' %}
</button>
{% else %}
<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(
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: 这里看看该怎么搞
# can_update = serializers.SerializerMethodField(label=_('Can update'))
# can_delete = serializers.SerializerMethodField(label=_('Can delete'))

View File

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