Merge branch 'dev' of github.com:jumpserver/jumpserver into dev

pull/3344/head
ibuler 2019-10-14 11:37:31 +08:00
commit 52d0961519
15 changed files with 205 additions and 131 deletions

View File

@ -13,7 +13,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from rest_framework import generics from rest_framework import generics, status
from rest_framework.serializers import ValidationError from rest_framework.serializers import ValidationError
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.response import Response from rest_framework.response import Response
@ -59,6 +59,13 @@ class NodeViewSet(OrgModelViewSet):
raise ValidationError({"error": msg}) raise ValidationError({"error": msg})
return super().perform_update(serializer) return super().perform_update(serializer)
def destroy(self, request, *args, **kwargs):
node = self.get_object()
if node.has_children_or_contains_assets():
msg = _("Deletion failed and the node contains children or assets")
return Response(data={'msg': msg}, status=status.HTTP_403_FORBIDDEN)
return super().destroy(request, *args, **kwargs)
class NodeListAsTreeApi(generics.ListAPIView): class NodeListAsTreeApi(generics.ListAPIView):
""" """

14
apps/assets/const.py Normal file
View File

@ -0,0 +1,14 @@
# -*- coding: utf-8 -*-
#
from django.utils.translation import ugettext_lazy as _
GENERAL_LIMIT_SPECIAL_CHARACTERS_HELP_TEXT = _(
'Only Numbers、letters、 chinese and characters ( {} ) are allowed'
).format(" ".join(['.', '_', '@', '-']))
GENERAL_LIMIT_SPECIAL_CHARACTERS_PATTERN = r"^[\._@\w-]+$"
GENERAL_LIMIT_SPECIAL_CHARACTERS_ERROR_MSG = \
_("* The contains characters that are not allowed")

View File

@ -7,6 +7,7 @@ from common.utils import get_logger
from orgs.mixins.forms import OrgModelForm from orgs.mixins.forms import OrgModelForm
from ..models import Asset, Node from ..models import Asset, Node
from ..const import GENERAL_LIMIT_SPECIAL_CHARACTERS_HELP_TEXT
logger = get_logger(__file__) logger = get_logger(__file__)
@ -14,10 +15,6 @@ __all__ = [
'AssetCreateForm', 'AssetUpdateForm', 'AssetBulkUpdateForm', 'ProtocolForm', 'AssetCreateForm', 'AssetUpdateForm', 'AssetBulkUpdateForm', 'ProtocolForm',
] ]
HELP_TEXTS_ASSET_HOSTNAME = _(
'Only Numbers、letters、 chinese and characters ( {} ) are allowed'
).format(" ".join(['.', '_', '@']))
class ProtocolForm(forms.Form): class ProtocolForm(forms.Form):
name = forms.ChoiceField( name = forms.ChoiceField(
@ -72,7 +69,7 @@ class AssetCreateForm(OrgModelForm):
'nodes': _("Node"), 'nodes': _("Node"),
} }
help_texts = { help_texts = {
'hostname': HELP_TEXTS_ASSET_HOSTNAME, 'hostname': GENERAL_LIMIT_SPECIAL_CHARACTERS_HELP_TEXT,
'admin_user': _( 'admin_user': _(
'root or other NOPASSWD sudo privilege user existed in asset,' 'root or other NOPASSWD sudo privilege user existed in asset,'
'If asset is windows or other set any one, more see admin user left menu' 'If asset is windows or other set any one, more see admin user left menu'
@ -119,7 +116,7 @@ class AssetUpdateForm(OrgModelForm):
'nodes': _("Node"), 'nodes': _("Node"),
} }
help_texts = { help_texts = {
'hostname': HELP_TEXTS_ASSET_HOSTNAME, 'hostname': GENERAL_LIMIT_SPECIAL_CHARACTERS_HELP_TEXT,
'admin_user': _( 'admin_user': _(
'root or other NOPASSWD sudo privilege user existed in asset,' 'root or other NOPASSWD sudo privilege user existed in asset,'
'If asset is windows or other set any one, more see admin user left menu' 'If asset is windows or other set any one, more see admin user left menu'

View File

@ -6,6 +6,7 @@ from django.utils.translation import gettext_lazy as _
from common.utils import validate_ssh_private_key, ssh_pubkey_gen, get_logger from common.utils import validate_ssh_private_key, ssh_pubkey_gen, get_logger
from orgs.mixins.forms import OrgModelForm from orgs.mixins.forms import OrgModelForm
from ..models import AdminUser, SystemUser from ..models import AdminUser, SystemUser
from ..const import GENERAL_LIMIT_SPECIAL_CHARACTERS_HELP_TEXT
logger = get_logger(__file__) logger = get_logger(__file__)
__all__ = [ __all__ = [
@ -98,6 +99,7 @@ class SystemUserForm(OrgModelForm, PasswordAndKeyAuthForm):
}), }),
} }
help_texts = { help_texts = {
'name': GENERAL_LIMIT_SPECIAL_CHARACTERS_HELP_TEXT,
'auto_push': _('Auto push system user to asset'), 'auto_push': _('Auto push system user to asset'),
'priority': _('1-100, High level will be using login asset as default, ' 'priority': _('1-100, High level will be using login asset as default, '
'if user was granted more than 2 system user'), 'if user was granted more than 2 system user'),

View File

@ -470,8 +470,13 @@ class Node(OrgModelMixin, SomeNodesMixin, TreeMixin, FamilyMixin, FullValueMixin
tree_node = TreeNode(**data) tree_node = TreeNode(**data)
return tree_node return tree_node
def delete(self, using=None, keep_parents=False): def has_children_or_contains_assets(self):
if self.children or self.get_assets(): if self.children or self.get_assets():
return True
return False
def delete(self, using=None, keep_parents=False):
if self.has_children_or_contains_assets():
return return
return super().delete(using=using, keep_parents=keep_parents) return super().delete(using=using, keep_parents=keep_parents)

View File

@ -8,6 +8,10 @@ from django.utils.translation import ugettext_lazy as _
from orgs.mixins.serializers import BulkOrgResourceModelSerializer from orgs.mixins.serializers import BulkOrgResourceModelSerializer
from common.serializers import AdaptedBulkListSerializer from common.serializers import AdaptedBulkListSerializer
from ..models import Asset, Node, Label from ..models import Asset, Node, Label
from ..const import (
GENERAL_LIMIT_SPECIAL_CHARACTERS_PATTERN,
GENERAL_LIMIT_SPECIAL_CHARACTERS_ERROR_MSG
)
from .base import ConnectivitySerializer from .base import ConnectivitySerializer
__all__ = [ __all__ = [
@ -94,10 +98,10 @@ class AssetSerializer(BulkOrgResourceModelSerializer):
@staticmethod @staticmethod
def validate_hostname(hostname): def validate_hostname(hostname):
pattern = r"^[\._@\w-]+$" pattern = GENERAL_LIMIT_SPECIAL_CHARACTERS_PATTERN
res = re.match(pattern, hostname) res = re.match(pattern, hostname)
if res is None: if res is None:
msg = _("* The hostname contains characters that are not allowed") msg = GENERAL_LIMIT_SPECIAL_CHARACTERS_ERROR_MSG
raise serializers.ValidationError(msg) raise serializers.ValidationError(msg)
return hostname return hostname
@ -136,6 +140,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer):
class AssetSimpleSerializer(serializers.ModelSerializer): class AssetSimpleSerializer(serializers.ModelSerializer):
connectivity = ConnectivitySerializer(read_only=True, label=_("Connectivity"))
class Meta: class Meta:
model = Asset model = Asset

View File

@ -1,3 +1,4 @@
import re
from rest_framework import serializers from rest_framework import serializers
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -6,6 +7,10 @@ from common.serializers import AdaptedBulkListSerializer
from common.utils import ssh_pubkey_gen from common.utils import ssh_pubkey_gen
from orgs.mixins.serializers import BulkOrgResourceModelSerializer from orgs.mixins.serializers import BulkOrgResourceModelSerializer
from ..models import SystemUser from ..models import SystemUser
from ..const import (
GENERAL_LIMIT_SPECIAL_CHARACTERS_PATTERN,
GENERAL_LIMIT_SPECIAL_CHARACTERS_ERROR_MSG
)
from .base import AuthSerializer, AuthSerializerMixin from .base import AuthSerializer, AuthSerializerMixin
@ -33,6 +38,15 @@ class SystemUserSerializer(AuthSerializerMixin, BulkOrgResourceModelSerializer):
'created_by': {'read_only': True}, 'created_by': {'read_only': True},
} }
@staticmethod
def validate_name(name):
pattern = GENERAL_LIMIT_SPECIAL_CHARACTERS_PATTERN
res = re.match(pattern, name)
if res is None:
msg = GENERAL_LIMIT_SPECIAL_CHARACTERS_ERROR_MSG
raise serializers.ValidationError(msg)
return name
def validate_auto_push(self, value): def validate_auto_push(self, value):
login_mode = self.initial_data.get("login_mode") login_mode = self.initial_data.get("login_mode")
protocol = self.initial_data.get("protocol") protocol = self.initial_data.get("protocol")

View File

@ -22,7 +22,6 @@
<li> <li>
<a href="{% url 'assets:asset-user-list' pk=asset.id %}" class="text-center"><i class="fa fa-bar-chart-o"></i> {% trans 'Asset user list' %} </a> <a href="{% url 'assets:asset-user-list' pk=asset.id %}" class="text-center"><i class="fa fa-bar-chart-o"></i> {% trans 'Asset user list' %} </a>
</li> </li>
{% if user.is_superuser %}
<li class="pull-right"> <li class="pull-right">
<a class="btn btn-outline btn-default" href="{% url 'assets:asset-update' pk=asset.id %}"><i class="fa fa-edit"></i>{% trans 'Update' %}</a> <a class="btn btn-outline btn-default" href="{% url 'assets:asset-update' pk=asset.id %}"><i class="fa fa-edit"></i>{% trans 'Update' %}</a>
</li> </li>
@ -31,7 +30,6 @@
<i class="fa fa-trash-o"></i>{% trans 'Delete' %} <i class="fa fa-trash-o"></i>{% trans 'Delete' %}
</a> </a>
</li> </li>
{% endif %}
</ul> </ul>
</div> </div>
<div class="tab-content"> <div class="tab-content">

View File

@ -32,6 +32,13 @@ class LDAPAuthorizationBackend(LDAPBackend):
if not username: if not username:
logger.info('Authenticate failed: username is None') logger.info('Authenticate failed: username is None')
return None return None
if settings.AUTH_LDAP_USER_LOGIN_ONLY_IN_USERS:
user_model = self.get_user_model()
exist = user_model.objects.filter(username=username).exists()
if not exist:
msg = 'Authentication failed: user ({}) is not in the user list'
logger.info(msg.format(username))
return None
ldap_user = LDAPUser(self, username=username.strip(), request=request) ldap_user = LDAPUser(self, username=username.strip(), request=request)
user = self.authenticate_ldap_user(ldap_user, password) user = self.authenticate_ldap_user(ldap_user, password)
logger.info('Authenticate user: {}'.format(user)) logger.info('Authenticate user: {}'.format(user))

View File

@ -378,6 +378,7 @@ defaults = {
'AUTH_LDAP_SYNC_IS_PERIODIC': False, 'AUTH_LDAP_SYNC_IS_PERIODIC': False,
'AUTH_LDAP_SYNC_INTERVAL': None, 'AUTH_LDAP_SYNC_INTERVAL': None,
'AUTH_LDAP_SYNC_CRONTAB': None, 'AUTH_LDAP_SYNC_CRONTAB': None,
'AUTH_LDAP_USER_LOGIN_ONLY_IN_USERS': False,
'HTTP_BIND_HOST': '0.0.0.0', 'HTTP_BIND_HOST': '0.0.0.0',
'HTTP_LISTEN_PORT': 8080, 'HTTP_LISTEN_PORT': 8080,
'WS_LISTEN_PORT': 8070, 'WS_LISTEN_PORT': 8070,

View File

@ -429,6 +429,7 @@ AUTH_LDAP_SEARCH_PAGED_SIZE = CONFIG.AUTH_LDAP_SEARCH_PAGED_SIZE
AUTH_LDAP_SYNC_IS_PERIODIC = CONFIG.AUTH_LDAP_SYNC_IS_PERIODIC AUTH_LDAP_SYNC_IS_PERIODIC = CONFIG.AUTH_LDAP_SYNC_IS_PERIODIC
AUTH_LDAP_SYNC_INTERVAL = CONFIG.AUTH_LDAP_SYNC_INTERVAL AUTH_LDAP_SYNC_INTERVAL = CONFIG.AUTH_LDAP_SYNC_INTERVAL
AUTH_LDAP_SYNC_CRONTAB = CONFIG.AUTH_LDAP_SYNC_CRONTAB AUTH_LDAP_SYNC_CRONTAB = CONFIG.AUTH_LDAP_SYNC_CRONTAB
AUTH_LDAP_USER_LOGIN_ONLY_IN_USERS = CONFIG.AUTH_LDAP_USER_LOGIN_ONLY_IN_USERS
AUTH_LDAP_SERVER_URI = 'ldap://localhost:389' AUTH_LDAP_SERVER_URI = 'ldap://localhost:389'
AUTH_LDAP_BIND_DN = 'cn=admin,dc=jumpserver,dc=org' AUTH_LDAP_BIND_DN = 'cn=admin,dc=jumpserver,dc=org'

Binary file not shown.

View File

@ -8,7 +8,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: 2019-10-08 17:09+0800\n" "POT-Creation-Date: 2019-10-12 17:06+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\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"
@ -78,7 +78,7 @@ msgstr "运行参数"
#: assets/forms/domain.py:15 assets/forms/label.py:13 #: assets/forms/domain.py:15 assets/forms/label.py:13
#: assets/models/asset.py:295 assets/models/authbook.py:24 #: assets/models/asset.py:295 assets/models/authbook.py:24
#: assets/models/gathered_user.py:14 assets/serializers/admin_user.py:32 #: assets/models/gathered_user.py:14 assets/serializers/admin_user.py:32
#: assets/serializers/asset_user.py:82 assets/serializers/system_user.py:31 #: assets/serializers/asset_user.py:82 assets/serializers/system_user.py:36
#: assets/templates/assets/admin_user_list.html:46 #: assets/templates/assets/admin_user_list.html:46
#: assets/templates/assets/domain_detail.html:60 #: assets/templates/assets/domain_detail.html:60
#: assets/templates/assets/domain_list.html:26 #: assets/templates/assets/domain_list.html:26
@ -112,9 +112,9 @@ msgstr "资产"
#: applications/templates/applications/remote_app_detail.html:53 #: applications/templates/applications/remote_app_detail.html:53
#: applications/templates/applications/remote_app_list.html:20 #: applications/templates/applications/remote_app_list.html:20
#: applications/templates/applications/user_remote_app_list.html:16 #: applications/templates/applications/user_remote_app_list.html:16
#: assets/forms/asset.py:24 assets/forms/domain.py:73 assets/forms/user.py:74 #: assets/forms/asset.py:21 assets/forms/domain.py:73 assets/forms/user.py:75
#: assets/forms/user.py:94 assets/models/base.py:28 assets/models/cluster.py:18 #: assets/forms/user.py:95 assets/models/base.py:28 assets/models/cluster.py:18
#: assets/models/cmd_filter.py:20 assets/models/domain.py:20 #: assets/models/cmd_filter.py:21 assets/models/domain.py:20
#: assets/models/group.py:20 assets/models/label.py:18 #: assets/models/group.py:20 assets/models/label.py:18
#: assets/templates/assets/admin_user_detail.html:56 #: assets/templates/assets/admin_user_detail.html:56
#: assets/templates/assets/admin_user_list.html:44 #: assets/templates/assets/admin_user_list.html:44
@ -186,10 +186,10 @@ msgstr "参数"
#: applications/models/remote_app.py:39 #: applications/models/remote_app.py:39
#: applications/templates/applications/remote_app_detail.html:73 #: applications/templates/applications/remote_app_detail.html:73
#: assets/models/asset.py:174 assets/models/base.py:36 #: assets/models/asset.py:174 assets/models/base.py:36
#: assets/models/cluster.py:28 assets/models/cmd_filter.py:25 #: assets/models/cluster.py:28 assets/models/cmd_filter.py:26
#: assets/models/cmd_filter.py:58 assets/models/group.py:21 #: assets/models/cmd_filter.py:59 assets/models/group.py:21
#: assets/templates/assets/admin_user_detail.html:68 #: assets/templates/assets/admin_user_detail.html:68
#: assets/templates/assets/asset_detail.html:124 #: assets/templates/assets/asset_detail.html:122
#: assets/templates/assets/cmd_filter_detail.html:77 #: assets/templates/assets/cmd_filter_detail.html:77
#: assets/templates/assets/domain_detail.html:72 #: assets/templates/assets/domain_detail.html:72
#: assets/templates/assets/system_user_detail.html:100 #: assets/templates/assets/system_user_detail.html:100
@ -238,12 +238,12 @@ msgstr "创建日期"
#: applications/templates/applications/remote_app_list.html:23 #: applications/templates/applications/remote_app_list.html:23
#: applications/templates/applications/user_remote_app_list.html:19 #: applications/templates/applications/user_remote_app_list.html:19
#: assets/models/asset.py:176 assets/models/base.py:33 #: assets/models/asset.py:176 assets/models/base.py:33
#: assets/models/cluster.py:29 assets/models/cmd_filter.py:22 #: assets/models/cluster.py:29 assets/models/cmd_filter.py:23
#: assets/models/cmd_filter.py:55 assets/models/domain.py:21 #: assets/models/cmd_filter.py:56 assets/models/domain.py:21
#: assets/models/domain.py:53 assets/models/group.py:23 #: assets/models/domain.py:53 assets/models/group.py:23
#: assets/models/label.py:23 assets/templates/assets/admin_user_detail.html:72 #: assets/models/label.py:23 assets/templates/assets/admin_user_detail.html:72
#: assets/templates/assets/admin_user_list.html:50 #: assets/templates/assets/admin_user_list.html:50
#: assets/templates/assets/asset_detail.html:132 #: assets/templates/assets/asset_detail.html:130
#: assets/templates/assets/cmd_filter_detail.html:65 #: assets/templates/assets/cmd_filter_detail.html:65
#: assets/templates/assets/cmd_filter_list.html:27 #: assets/templates/assets/cmd_filter_list.html:27
#: assets/templates/assets/cmd_filter_rule_list.html:62 #: assets/templates/assets/cmd_filter_rule_list.html:62
@ -394,7 +394,7 @@ msgstr "详情"
#: assets/templates/assets/admin_user_detail.html:24 #: assets/templates/assets/admin_user_detail.html:24
#: assets/templates/assets/admin_user_list.html:26 #: assets/templates/assets/admin_user_list.html:26
#: assets/templates/assets/admin_user_list.html:111 #: assets/templates/assets/admin_user_list.html:111
#: assets/templates/assets/asset_detail.html:27 #: assets/templates/assets/asset_detail.html:26
#: assets/templates/assets/asset_list.html:78 #: assets/templates/assets/asset_list.html:78
#: assets/templates/assets/asset_list.html:167 #: assets/templates/assets/asset_list.html:167
#: assets/templates/assets/cmd_filter_detail.html:29 #: assets/templates/assets/cmd_filter_detail.html:29
@ -440,7 +440,7 @@ msgstr "更新"
#: applications/templates/applications/remote_app_list.html:55 #: applications/templates/applications/remote_app_list.html:55
#: assets/templates/assets/admin_user_detail.html:28 #: assets/templates/assets/admin_user_detail.html:28
#: assets/templates/assets/admin_user_list.html:112 #: assets/templates/assets/admin_user_list.html:112
#: assets/templates/assets/asset_detail.html:31 #: assets/templates/assets/asset_detail.html:30
#: assets/templates/assets/asset_list.html:168 #: assets/templates/assets/asset_list.html:168
#: assets/templates/assets/cmd_filter_detail.html:33 #: assets/templates/assets/cmd_filter_detail.html:33
#: assets/templates/assets/cmd_filter_list.html:59 #: assets/templates/assets/cmd_filter_list.html:59
@ -498,7 +498,7 @@ msgstr "创建远程应用"
#: applications/templates/applications/remote_app_list.html:24 #: applications/templates/applications/remote_app_list.html:24
#: applications/templates/applications/user_remote_app_list.html:20 #: applications/templates/applications/user_remote_app_list.html:20
#: assets/models/cmd_filter.py:54 #: assets/models/cmd_filter.py:55
#: assets/templates/assets/_asset_user_list.html:25 #: assets/templates/assets/_asset_user_list.html:25
#: assets/templates/assets/admin_user_list.html:51 #: assets/templates/assets/admin_user_list.html:51
#: assets/templates/assets/asset_list.html:100 #: assets/templates/assets/asset_list.html:100
@ -568,28 +568,36 @@ msgstr "我的远程应用"
msgid "You can't update the root node name" msgid "You can't update the root node name"
msgstr "不能修改根节点名称" msgstr "不能修改根节点名称"
#: assets/api/node.py:266 #: assets/api/node.py:65
msgid "Deletion failed and the node contains children or assets"
msgstr "删除失败,节点包含子节点或资产"
#: assets/api/node.py:273
msgid "Update node asset hardware information: {}" msgid "Update node asset hardware information: {}"
msgstr "更新节点资产硬件信息: {}" msgstr "更新节点资产硬件信息: {}"
#: assets/api/node.py:280 #: assets/api/node.py:287
msgid "Test if the assets under the node are connectable: {}" msgid "Test if the assets under the node are connectable: {}"
msgstr "测试节点下资产是否可连接: {}" msgstr "测试节点下资产是否可连接: {}"
#: assets/forms/asset.py:18 #: assets/const.py:8
msgid "Only Numbers、letters、 chinese and characters ( {} ) are allowed" msgid "Only Numbers、letters、 chinese and characters ( {} ) are allowed"
msgstr "只允许包含数字、字母、中文和特殊字符( {} " msgstr "只允许包含数字、字母、中文和特殊字符( {} "
#: assets/forms/asset.py:28 assets/models/asset.py:140 #: assets/const.py:14
msgid "* The contains characters that are not allowed"
msgstr "* 包含不被允许的字符"
#: assets/forms/asset.py:25 assets/models/asset.py:140
#: assets/models/domain.py:50 #: assets/models/domain.py:50
#: assets/templates/assets/domain_gateway_list.html:69 #: assets/templates/assets/domain_gateway_list.html:69
#: settings/templates/settings/replay_storage_create.html:59 #: settings/templates/settings/replay_storage_create.html:59
msgid "Port" msgid "Port"
msgstr "端口" msgstr "端口"
#: assets/forms/asset.py:59 assets/models/asset.py:145 #: assets/forms/asset.py:56 assets/models/asset.py:145
#: assets/models/user.py:110 assets/templates/assets/asset_detail.html:190 #: assets/models/user.py:110 assets/templates/assets/asset_detail.html:188
#: assets/templates/assets/asset_detail.html:198 #: assets/templates/assets/asset_detail.html:196
#: assets/templates/assets/system_user_assets.html:83 #: assets/templates/assets/system_user_assets.html:83
#: perms/models/asset_permission.py:81 #: perms/models/asset_permission.py:81
#: xpack/plugins/change_auth_plan/models.py:74 #: xpack/plugins/change_auth_plan/models.py:74
@ -598,16 +606,16 @@ msgstr "端口"
msgid "Nodes" msgid "Nodes"
msgstr "节点" msgstr "节点"
#: assets/forms/asset.py:62 assets/forms/asset.py:109 #: assets/forms/asset.py:59 assets/forms/asset.py:106
#: assets/models/asset.py:149 assets/models/cluster.py:19 #: assets/models/asset.py:149 assets/models/cluster.py:19
#: assets/models/user.py:68 assets/templates/assets/asset_detail.html:76 #: assets/models/user.py:68 assets/templates/assets/asset_detail.html:74
#: templates/_nav.html:44 xpack/plugins/cloud/models.py:161 #: templates/_nav.html:44 xpack/plugins/cloud/models.py:161
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:68 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:68
#: xpack/plugins/orgs/templates/orgs/org_list.html:19 #: xpack/plugins/orgs/templates/orgs/org_list.html:19
msgid "Admin user" msgid "Admin user"
msgstr "管理用户" msgstr "管理用户"
#: assets/forms/asset.py:65 assets/forms/asset.py:112 assets/forms/asset.py:152 #: assets/forms/asset.py:62 assets/forms/asset.py:109 assets/forms/asset.py:149
#: assets/templates/assets/asset_create.html:48 #: assets/templates/assets/asset_create.html:48
#: assets/templates/assets/asset_create.html:50 #: assets/templates/assets/asset_create.html:50
#: assets/templates/assets/asset_list.html:85 #: assets/templates/assets/asset_list.html:85
@ -615,16 +623,16 @@ msgstr "管理用户"
msgid "Label" msgid "Label"
msgstr "标签" msgstr "标签"
#: assets/forms/asset.py:68 assets/forms/asset.py:115 #: assets/forms/asset.py:65 assets/forms/asset.py:112
#: assets/models/asset.py:144 assets/models/domain.py:26 #: assets/models/asset.py:144 assets/models/domain.py:26
#: assets/models/domain.py:52 assets/templates/assets/asset_detail.html:80 #: assets/models/domain.py:52 assets/templates/assets/asset_detail.html:78
#: assets/templates/assets/user_asset_list.html:53 #: assets/templates/assets/user_asset_list.html:53
#: xpack/plugins/orgs/templates/orgs/org_list.html:18 #: xpack/plugins/orgs/templates/orgs/org_list.html:18
msgid "Domain" msgid "Domain"
msgstr "网域" msgstr "网域"
#: assets/forms/asset.py:72 assets/forms/asset.py:106 assets/forms/asset.py:119 #: assets/forms/asset.py:69 assets/forms/asset.py:103 assets/forms/asset.py:116
#: assets/forms/asset.py:155 assets/models/node.py:409 #: assets/forms/asset.py:152 assets/models/node.py:409
#: assets/templates/assets/asset_create.html:42 #: assets/templates/assets/asset_create.html:42
#: perms/forms/asset_permission.py:83 perms/forms/asset_permission.py:90 #: perms/forms/asset_permission.py:83 perms/forms/asset_permission.py:90
#: perms/templates/perms/asset_permission_list.html:53 #: perms/templates/perms/asset_permission_list.html:53
@ -639,7 +647,7 @@ msgstr "网域"
msgid "Node" msgid "Node"
msgstr "节点" msgstr "节点"
#: assets/forms/asset.py:77 assets/forms/asset.py:124 #: assets/forms/asset.py:74 assets/forms/asset.py:121
msgid "" msgid ""
"root or other NOPASSWD sudo privilege user existed in asset,If asset is " "root or other NOPASSWD sudo privilege user existed in asset,If asset is "
"windows or other set any one, more see admin user left menu" "windows or other set any one, more see admin user left menu"
@ -647,16 +655,16 @@ msgstr ""
"root或其他拥有NOPASSWD: ALL权限的用户, 如果是windows或其它硬件可以随意设置一" "root或其他拥有NOPASSWD: ALL权限的用户, 如果是windows或其它硬件可以随意设置一"
"个, 更多信息查看左侧 `管理用户` 菜单" "个, 更多信息查看左侧 `管理用户` 菜单"
#: assets/forms/asset.py:80 assets/forms/asset.py:127 #: assets/forms/asset.py:77 assets/forms/asset.py:124
msgid "Windows 2016 RDP protocol is different, If is window 2016, set it" msgid "Windows 2016 RDP protocol is different, If is window 2016, set it"
msgstr "Windows 2016的RDP协议与之前不同如果是请设置" msgstr "Windows 2016的RDP协议与之前不同如果是请设置"
#: assets/forms/asset.py:81 assets/forms/asset.py:128 #: assets/forms/asset.py:78 assets/forms/asset.py:125
msgid "" msgid ""
"If your have some network not connect with each other, you can set domain" "If your have some network not connect with each other, you can set domain"
msgstr "如果有多个的互相隔离的网络,设置资产属于的网域,使用网域网关跳转登录" msgstr "如果有多个的互相隔离的网络,设置资产属于的网域,使用网域网关跳转登录"
#: assets/forms/asset.py:135 assets/forms/asset.py:139 #: assets/forms/asset.py:132 assets/forms/asset.py:136
#: assets/forms/domain.py:17 assets/forms/label.py:15 #: assets/forms/domain.py:17 assets/forms/label.py:15
#: perms/templates/perms/asset_permission_asset.html:78 #: perms/templates/perms/asset_permission_asset.html:78
#: xpack/plugins/change_auth_plan/forms.py:55 #: xpack/plugins/change_auth_plan/forms.py:55
@ -676,7 +684,7 @@ msgstr "不能包含特殊字符"
msgid "SSH gateway support proxy SSH,RDP,VNC" msgid "SSH gateway support proxy SSH,RDP,VNC"
msgstr "SSH网关支持代理SSH,RDP和VNC" msgstr "SSH网关支持代理SSH,RDP和VNC"
#: assets/forms/domain.py:74 assets/forms/user.py:75 assets/forms/user.py:95 #: assets/forms/domain.py:74 assets/forms/user.py:76 assets/forms/user.py:96
#: assets/models/base.py:29 assets/models/gathered_user.py:16 #: assets/models/base.py:29 assets/models/gathered_user.py:16
#: assets/templates/assets/_asset_user_auth_update_modal.html:15 #: assets/templates/assets/_asset_user_auth_update_modal.html:15
#: assets/templates/assets/_asset_user_auth_view_modal.html:21 #: assets/templates/assets/_asset_user_auth_view_modal.html:21
@ -708,11 +716,11 @@ msgstr "SSH网关支持代理SSH,RDP和VNC"
msgid "Username" msgid "Username"
msgstr "用户名" msgstr "用户名"
#: assets/forms/user.py:25 #: assets/forms/user.py:26
msgid "Password or private key passphrase" msgid "Password or private key passphrase"
msgstr "密码或密钥密码" msgstr "密码或密钥密码"
#: assets/forms/user.py:26 assets/models/base.py:30 #: assets/forms/user.py:27 assets/models/base.py:30
#: assets/serializers/asset_user.py:63 #: assets/serializers/asset_user.py:63
#: assets/templates/assets/_asset_user_auth_update_modal.html:21 #: assets/templates/assets/_asset_user_auth_update_modal.html:21
#: assets/templates/assets/_asset_user_auth_view_modal.html:27 #: assets/templates/assets/_asset_user_auth_view_modal.html:27
@ -731,31 +739,31 @@ msgstr "密码或密钥密码"
msgid "Password" msgid "Password"
msgstr "密码" msgstr "密码"
#: assets/forms/user.py:29 assets/serializers/asset_user.py:71 #: assets/forms/user.py:30 assets/serializers/asset_user.py:71
#: assets/templates/assets/_asset_user_auth_update_modal.html:27 #: assets/templates/assets/_asset_user_auth_update_modal.html:27
#: users/models/user.py:400 #: users/models/user.py:400
msgid "Private key" msgid "Private key"
msgstr "ssh私钥" msgstr "ssh私钥"
#: assets/forms/user.py:41 #: assets/forms/user.py:42
msgid "Invalid private key, Only support RSA/DSA format key" msgid "Invalid private key, Only support RSA/DSA format key"
msgstr "不合法的密钥仅支持RSA/DSA格式的密钥" msgstr "不合法的密钥仅支持RSA/DSA格式的密钥"
#: assets/forms/user.py:52 #: assets/forms/user.py:53
msgid "Password and private key file must be input one" msgid "Password and private key file must be input one"
msgstr "密码和私钥, 必须输入一个" msgstr "密码和私钥, 必须输入一个"
#: assets/forms/user.py:97 assets/models/cmd_filter.py:31 #: assets/forms/user.py:98 assets/models/cmd_filter.py:32
#: assets/models/user.py:118 assets/templates/assets/_system_user.html:66 #: assets/models/user.py:118 assets/templates/assets/_system_user.html:66
#: assets/templates/assets/system_user_detail.html:165 #: assets/templates/assets/system_user_detail.html:165
msgid "Command filter" msgid "Command filter"
msgstr "命令过滤器" msgstr "命令过滤器"
#: assets/forms/user.py:101 #: assets/forms/user.py:103
msgid "Auto push system user to asset" msgid "Auto push system user to asset"
msgstr "自动推送系统用户到资产" msgstr "自动推送系统用户到资产"
#: assets/forms/user.py:102 #: assets/forms/user.py:104
msgid "" msgid ""
"1-100, High level will be using login asset as default, if user was granted " "1-100, High level will be using login asset as default, if user was granted "
"more than 2 system user" "more than 2 system user"
@ -763,13 +771,13 @@ msgstr ""
"1-100, 1最低优先级100最高优先级。授权多个用户时高优先级的系统用户将会作为" "1-100, 1最低优先级100最高优先级。授权多个用户时高优先级的系统用户将会作为"
"默认登录用户" "默认登录用户"
#: assets/forms/user.py:104 #: assets/forms/user.py:106
msgid "" msgid ""
"If you choose manual login mode, you do not need to fill in the username and " "If you choose manual login mode, you do not need to fill in the username and "
"password." "password."
msgstr "如果选择手动登录模式,用户名和密码可以不填写" msgstr "如果选择手动登录模式,用户名和密码可以不填写"
#: assets/forms/user.py:106 #: assets/forms/user.py:108
msgid "Use comma split multi command, ex: /bin/whoami,/bin/ifconfig" msgid "Use comma split multi command, ex: /bin/whoami,/bin/ifconfig"
msgstr "使用逗号分隔多个命令,如: /bin/whoami,/sbin/ifconfig" msgstr "使用逗号分隔多个命令,如: /bin/whoami,/sbin/ifconfig"
@ -777,7 +785,7 @@ msgstr "使用逗号分隔多个命令,如: /bin/whoami,/sbin/ifconfig"
#: assets/serializers/asset_user.py:28 #: assets/serializers/asset_user.py:28
#: assets/templates/assets/_asset_list_modal.html:47 #: assets/templates/assets/_asset_list_modal.html:47
#: assets/templates/assets/_asset_user_list.html:20 #: assets/templates/assets/_asset_user_list.html:20
#: assets/templates/assets/asset_detail.html:64 #: assets/templates/assets/asset_detail.html:62
#: assets/templates/assets/asset_list.html:97 #: assets/templates/assets/asset_list.html:97
#: assets/templates/assets/domain_gateway_list.html:68 #: assets/templates/assets/domain_gateway_list.html:68
#: assets/templates/assets/user_asset_list.html:49 #: assets/templates/assets/user_asset_list.html:49
@ -795,7 +803,7 @@ msgstr "IP"
#: assets/templates/assets/_asset_user_auth_update_modal.html:9 #: assets/templates/assets/_asset_user_auth_update_modal.html:9
#: assets/templates/assets/_asset_user_auth_view_modal.html:15 #: assets/templates/assets/_asset_user_auth_view_modal.html:15
#: assets/templates/assets/_asset_user_list.html:19 #: assets/templates/assets/_asset_user_list.html:19
#: assets/templates/assets/asset_detail.html:60 #: assets/templates/assets/asset_detail.html:58
#: assets/templates/assets/asset_list.html:96 #: assets/templates/assets/asset_list.html:96
#: assets/templates/assets/user_asset_list.html:48 #: assets/templates/assets/user_asset_list.html:48
#: perms/templates/perms/asset_permission_asset.html:57 #: perms/templates/perms/asset_permission_asset.html:57
@ -807,7 +815,7 @@ msgid "Hostname"
msgstr "主机名" msgstr "主机名"
#: assets/models/asset.py:139 assets/models/domain.py:51 #: assets/models/asset.py:139 assets/models/domain.py:51
#: assets/models/user.py:113 assets/templates/assets/asset_detail.html:72 #: assets/models/user.py:113 assets/templates/assets/asset_detail.html:70
#: assets/templates/assets/domain_gateway_list.html:70 #: assets/templates/assets/domain_gateway_list.html:70
#: assets/templates/assets/system_user_detail.html:70 #: assets/templates/assets/system_user_detail.html:70
#: assets/templates/assets/system_user_list.html:53 #: assets/templates/assets/system_user_list.html:53
@ -815,41 +823,41 @@ msgstr "主机名"
msgid "Protocol" msgid "Protocol"
msgstr "协议" msgstr "协议"
#: assets/models/asset.py:142 assets/serializers/asset.py:64 #: assets/models/asset.py:142 assets/serializers/asset.py:68
#: assets/templates/assets/asset_create.html:24 #: assets/templates/assets/asset_create.html:24
#: assets/templates/assets/user_asset_list.html:50 #: assets/templates/assets/user_asset_list.html:50
#: perms/serializers/user_permission.py:48 #: perms/serializers/user_permission.py:48
msgid "Protocols" msgid "Protocols"
msgstr "协议组" msgstr "协议组"
#: assets/models/asset.py:143 assets/templates/assets/asset_detail.html:104 #: assets/models/asset.py:143 assets/templates/assets/asset_detail.html:102
#: assets/templates/assets/user_asset_list.html:51 #: assets/templates/assets/user_asset_list.html:51
msgid "Platform" msgid "Platform"
msgstr "系统平台" msgstr "系统平台"
#: assets/models/asset.py:146 assets/models/authbook.py:27 #: assets/models/asset.py:146 assets/models/authbook.py:27
#: assets/models/cmd_filter.py:21 assets/models/domain.py:54 #: assets/models/cmd_filter.py:22 assets/models/domain.py:54
#: assets/models/label.py:22 assets/templates/assets/asset_detail.html:112 #: assets/models/label.py:22 assets/templates/assets/asset_detail.html:110
msgid "Is active" msgid "Is active"
msgstr "激活" msgstr "激活"
#: assets/models/asset.py:152 assets/templates/assets/asset_detail.html:68 #: assets/models/asset.py:152 assets/templates/assets/asset_detail.html:66
msgid "Public IP" msgid "Public IP"
msgstr "公网IP" msgstr "公网IP"
#: assets/models/asset.py:153 assets/templates/assets/asset_detail.html:120 #: assets/models/asset.py:153 assets/templates/assets/asset_detail.html:118
msgid "Asset number" msgid "Asset number"
msgstr "资产编号" msgstr "资产编号"
#: assets/models/asset.py:156 assets/templates/assets/asset_detail.html:84 #: assets/models/asset.py:156 assets/templates/assets/asset_detail.html:82
msgid "Vendor" msgid "Vendor"
msgstr "制造商" msgstr "制造商"
#: assets/models/asset.py:157 assets/templates/assets/asset_detail.html:88 #: assets/models/asset.py:157 assets/templates/assets/asset_detail.html:86
msgid "Model" msgid "Model"
msgstr "型号" msgstr "型号"
#: assets/models/asset.py:158 assets/templates/assets/asset_detail.html:116 #: assets/models/asset.py:158 assets/templates/assets/asset_detail.html:114
msgid "Serial number" msgid "Serial number"
msgstr "序列号" msgstr "序列号"
@ -870,7 +878,7 @@ msgstr "CPU核数"
msgid "CPU vcpus" msgid "CPU vcpus"
msgstr "CPU总数" msgstr "CPU总数"
#: assets/models/asset.py:164 assets/templates/assets/asset_detail.html:96 #: assets/models/asset.py:164 assets/templates/assets/asset_detail.html:94
msgid "Memory" msgid "Memory"
msgstr "内存" msgstr "内存"
@ -882,7 +890,7 @@ msgstr "硬盘大小"
msgid "Disk info" msgid "Disk info"
msgstr "硬盘信息" msgstr "硬盘信息"
#: assets/models/asset.py:168 assets/templates/assets/asset_detail.html:108 #: assets/models/asset.py:168 assets/templates/assets/asset_detail.html:106
msgid "OS" msgid "OS"
msgstr "操作系统" msgstr "操作系统"
@ -899,7 +907,7 @@ msgid "Hostname raw"
msgstr "主机名原始" msgstr "主机名原始"
#: assets/models/asset.py:173 assets/templates/assets/asset_create.html:46 #: assets/models/asset.py:173 assets/templates/assets/asset_create.html:46
#: assets/templates/assets/asset_detail.html:224 templates/_nav.html:46 #: assets/templates/assets/asset_detail.html:222 templates/_nav.html:46
msgid "Labels" msgid "Labels"
msgstr "标签管理" msgstr "标签管理"
@ -994,11 +1002,11 @@ msgstr "北京电信"
msgid "BGP full netcom" msgid "BGP full netcom"
msgstr "BGP全网通" msgstr "BGP全网通"
#: assets/models/cmd_filter.py:38 #: assets/models/cmd_filter.py:39
msgid "Regex" msgid "Regex"
msgstr "正则表达式" msgstr "正则表达式"
#: assets/models/cmd_filter.py:39 ops/models/command.py:21 #: assets/models/cmd_filter.py:40 ops/models/command.py:21
#: ops/templates/ops/command_execution_list.html:64 terminal/models.py:163 #: ops/templates/ops/command_execution_list.html:64 terminal/models.py:163
#: terminal/templates/terminal/command_list.html:28 #: terminal/templates/terminal/command_list.html:28
#: terminal/templates/terminal/command_list.html:68 #: terminal/templates/terminal/command_list.html:68
@ -1007,19 +1015,19 @@ msgstr "正则表达式"
msgid "Command" msgid "Command"
msgstr "命令" msgstr "命令"
#: assets/models/cmd_filter.py:44 #: assets/models/cmd_filter.py:45
msgid "Deny" msgid "Deny"
msgstr "拒绝" msgstr "拒绝"
#: assets/models/cmd_filter.py:45 #: assets/models/cmd_filter.py:46
msgid "Allow" msgid "Allow"
msgstr "允许" msgstr "允许"
#: assets/models/cmd_filter.py:49 #: assets/models/cmd_filter.py:50
msgid "Filter" msgid "Filter"
msgstr "过滤器" msgstr "过滤器"
#: assets/models/cmd_filter.py:50 #: assets/models/cmd_filter.py:51
#: assets/templates/assets/cmd_filter_rule_list.html:58 #: assets/templates/assets/cmd_filter_rule_list.html:58
#: audits/templates/audits/login_log_list.html:58 #: audits/templates/audits/login_log_list.html:58
#: perms/templates/perms/remote_app_permission_remote_app.html:54 #: perms/templates/perms/remote_app_permission_remote_app.html:54
@ -1030,26 +1038,26 @@ msgstr "过滤器"
msgid "Type" msgid "Type"
msgstr "类型" msgstr "类型"
#: assets/models/cmd_filter.py:51 assets/models/user.py:112 #: assets/models/cmd_filter.py:52 assets/models/user.py:112
#: assets/templates/assets/cmd_filter_rule_list.html:60 #: assets/templates/assets/cmd_filter_rule_list.html:60
msgid "Priority" msgid "Priority"
msgstr "优先级" msgstr "优先级"
#: assets/models/cmd_filter.py:51 #: assets/models/cmd_filter.py:52
msgid "1-100, the higher will be match first" msgid "1-100, the higher will be match first"
msgstr "优先级可选范围为1-1001最低优先级100最高优先级" msgstr "优先级可选范围为1-1001最低优先级100最高优先级"
#: assets/models/cmd_filter.py:53 #: assets/models/cmd_filter.py:54
#: assets/templates/assets/cmd_filter_rule_list.html:59 #: assets/templates/assets/cmd_filter_rule_list.html:59
#: xpack/plugins/license/models.py:29 #: xpack/plugins/license/models.py:29
msgid "Content" msgid "Content"
msgstr "内容" msgstr "内容"
#: assets/models/cmd_filter.py:53 #: assets/models/cmd_filter.py:54
msgid "One line one command" msgid "One line one command"
msgstr "每行一个命令" msgstr "每行一个命令"
#: assets/models/cmd_filter.py:64 #: assets/models/cmd_filter.py:63
msgid "Command filter rule" msgid "Command filter rule"
msgstr "命令过滤规则" msgstr "命令过滤规则"
@ -1208,45 +1216,41 @@ msgstr "系统用户"
msgid "%(value)s is not an even number" msgid "%(value)s is not an even number"
msgstr "%(value)s is not an even number" msgstr "%(value)s is not an even number"
#: assets/models/utils.py:43 assets/tasks/const.py:81 #: assets/models/utils.py:43 assets/tasks/const.py:84
msgid "Unreachable" msgid "Unreachable"
msgstr "不可达" msgstr "不可达"
#: assets/models/utils.py:44 assets/tasks/const.py:82 #: assets/models/utils.py:44 assets/tasks/const.py:85
#: assets/templates/assets/asset_list.html:99 #: assets/templates/assets/asset_list.html:99
msgid "Reachable" msgid "Reachable"
msgstr "可连接" msgstr "可连接"
#: assets/models/utils.py:45 assets/tasks/const.py:83 #: assets/models/utils.py:45 assets/tasks/const.py:86
#: authentication/utils.py:13 xpack/plugins/license/models.py:78 #: authentication/utils.py:13 xpack/plugins/license/models.py:78
msgid "Unknown" msgid "Unknown"
msgstr "未知" msgstr "未知"
#: assets/serializers/asset.py:22 #: assets/serializers/asset.py:26
msgid "Protocol format should {}/{}" msgid "Protocol format should {}/{}"
msgstr "协议格式 {}/{}" msgstr "协议格式 {}/{}"
#: assets/serializers/asset.py:39 #: assets/serializers/asset.py:43
msgid "Protocol duplicate: {}" msgid "Protocol duplicate: {}"
msgstr "协议重复: {}" msgstr "协议重复: {}"
#: assets/serializers/asset.py:65 assets/serializers/asset_user.py:29 #: assets/serializers/asset.py:69 assets/serializers/asset_user.py:29
#: assets/templates/assets/_asset_user_list.html:23 #: assets/templates/assets/_asset_user_list.html:23
msgid "Connectivity" msgid "Connectivity"
msgstr "连接" msgstr "连接"
#: assets/serializers/asset.py:91 #: assets/serializers/asset.py:95
msgid "Hardware info" msgid "Hardware info"
msgstr "硬件信息" msgstr "硬件信息"
#: assets/serializers/asset.py:92 orgs/mixins/serializers.py:27 #: assets/serializers/asset.py:96 orgs/mixins/serializers.py:27
msgid "Org name" msgid "Org name"
msgstr "组织名称" msgstr "组织名称"
#: assets/serializers/asset.py:100
msgid "* The hostname contains characters that are not allowed"
msgstr "* 主机名包含不被允许的字符"
#: assets/serializers/asset_user.py:31 #: assets/serializers/asset_user.py:31
msgid "Backend" msgid "Backend"
msgstr "后端" msgstr "后端"
@ -1277,15 +1281,15 @@ msgstr "值"
msgid "The same level node name cannot be the same" msgid "The same level node name cannot be the same"
msgstr "同级别节点名字不能重复" msgstr "同级别节点名字不能重复"
#: assets/serializers/system_user.py:32 #: assets/serializers/system_user.py:37
msgid "Login mode display" msgid "Login mode display"
msgstr "登录模式显示" msgstr "登录模式显示"
#: assets/serializers/system_user.py:67 #: assets/serializers/system_user.py:81
msgid "* Automatic login mode must fill in the username." msgid "* Automatic login mode must fill in the username."
msgstr "自动登录模式,必须填写用户名" msgstr "自动登录模式,必须填写用户名"
#: assets/serializers/system_user.py:78 #: assets/serializers/system_user.py:92
msgid "Password or private key required" msgid "Password or private key required"
msgstr "密码或密钥密码需要一个" msgstr "密码或密钥密码需要一个"
@ -1424,6 +1428,7 @@ msgstr "资产列表"
#: assets/templates/assets/_asset_list_modal.html:33 #: assets/templates/assets/_asset_list_modal.html:33
#: assets/templates/assets/_node_tree.html:40 #: assets/templates/assets/_node_tree.html:40
#: ops/templates/ops/command_execution_create.html:49 #: ops/templates/ops/command_execution_create.html:49
#: ops/templates/ops/command_execution_create.html:143
#: users/templates/users/_granted_assets.html:7 #: users/templates/users/_granted_assets.html:7
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_create_update.html:66 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_create_update.html:66
msgid "Loading" msgid "Loading"
@ -1443,7 +1448,7 @@ msgid "Please input password"
msgstr "请输入密码" msgstr "请输入密码"
#: assets/templates/assets/_asset_user_auth_update_modal.html:68 #: assets/templates/assets/_asset_user_auth_update_modal.html:68
#: assets/templates/assets/asset_detail.html:304 #: assets/templates/assets/asset_detail.html:302
#: users/templates/users/user_detail.html:313 #: users/templates/users/user_detail.html:313
#: users/templates/users/user_detail.html:340 #: users/templates/users/user_detail.html:340
#: xpack/plugins/interface/views.py:35 #: xpack/plugins/interface/views.py:35
@ -1492,7 +1497,7 @@ msgstr "查看"
#: assets/templates/assets/_asset_user_list.html:75 #: assets/templates/assets/_asset_user_list.html:75
#: assets/templates/assets/admin_user_assets.html:61 #: assets/templates/assets/admin_user_assets.html:61
#: assets/templates/assets/asset_asset_user_list.html:57 #: assets/templates/assets/asset_asset_user_list.html:57
#: assets/templates/assets/asset_detail.html:178 #: assets/templates/assets/asset_detail.html:176
#: assets/templates/assets/system_user_assets.html:63 #: assets/templates/assets/system_user_assets.html:63
#: assets/templates/assets/system_user_detail.html:151 #: assets/templates/assets/system_user_detail.html:151
msgid "Test" msgid "Test"
@ -1614,7 +1619,7 @@ msgstr "快速更新"
#: assets/templates/assets/admin_user_assets.html:58 #: assets/templates/assets/admin_user_assets.html:58
#: assets/templates/assets/asset_asset_user_list.html:54 #: assets/templates/assets/asset_asset_user_list.html:54
#: assets/templates/assets/asset_detail.html:175 #: assets/templates/assets/asset_detail.html:173
msgid "Test connective" msgid "Test connective"
msgstr "测试可连接性" msgstr "测试可连接性"
@ -1631,7 +1636,7 @@ msgid "Select nodes"
msgstr "选择节点" msgstr "选择节点"
#: assets/templates/assets/admin_user_detail.html:100 #: assets/templates/assets/admin_user_detail.html:100
#: assets/templates/assets/asset_detail.html:204 #: assets/templates/assets/asset_detail.html:202
#: assets/templates/assets/asset_list.html:422 #: assets/templates/assets/asset_list.html:422
#: assets/templates/assets/cmd_filter_detail.html:106 #: assets/templates/assets/cmd_filter_detail.html:106
#: assets/templates/assets/system_user_assets.html:97 #: assets/templates/assets/system_user_assets.html:97
@ -1639,7 +1644,7 @@ msgstr "选择节点"
#: assets/templates/assets/system_user_list.html:139 #: assets/templates/assets/system_user_list.html:139
#: authentication/templates/authentication/_mfa_confirm_modal.html:20 #: authentication/templates/authentication/_mfa_confirm_modal.html:20
#: settings/templates/settings/terminal_setting.html:168 #: settings/templates/settings/terminal_setting.html:168
#: templates/_modal.html:23 terminal/templates/terminal/session_detail.html:108 #: templates/_modal.html:23 terminal/templates/terminal/session_detail.html:112
#: users/templates/users/user_detail.html:394 #: users/templates/users/user_detail.html:394
#: users/templates/users/user_detail.html:420 #: users/templates/users/user_detail.html:420
#: users/templates/users/user_detail.html:443 #: users/templates/users/user_detail.html:443
@ -1719,8 +1724,8 @@ msgid "Asset users of"
msgstr "资产用户" msgstr "资产用户"
#: assets/templates/assets/asset_asset_user_list.html:47 #: assets/templates/assets/asset_asset_user_list.html:47
#: assets/templates/assets/asset_detail.html:144 #: assets/templates/assets/asset_detail.html:142
#: terminal/templates/terminal/session_detail.html:81 #: terminal/templates/terminal/session_detail.html:85
#: users/templates/users/user_detail.html:140 #: users/templates/users/user_detail.html:140
#: users/templates/users/user_profile.html:150 #: users/templates/users/user_profile.html:150
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:128 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:128
@ -1739,21 +1744,21 @@ msgstr "选择需要修改属性"
msgid "Select all" msgid "Select all"
msgstr "全选" msgstr "全选"
#: assets/templates/assets/asset_detail.html:92 #: assets/templates/assets/asset_detail.html:90
msgid "CPU" msgid "CPU"
msgstr "CPU" msgstr "CPU"
#: assets/templates/assets/asset_detail.html:100 #: assets/templates/assets/asset_detail.html:98
msgid "Disk" msgid "Disk"
msgstr "硬盘" msgstr "硬盘"
#: assets/templates/assets/asset_detail.html:128 #: assets/templates/assets/asset_detail.html:126
#: users/templates/users/user_detail.html:115 #: users/templates/users/user_detail.html:115
#: users/templates/users/user_profile.html:106 #: users/templates/users/user_profile.html:106
msgid "Date joined" msgid "Date joined"
msgstr "创建日期" msgstr "创建日期"
#: assets/templates/assets/asset_detail.html:150 authentication/models.py:15 #: assets/templates/assets/asset_detail.html:148 authentication/models.py:15
#: authentication/templates/authentication/_access_key_modal.html:32 #: authentication/templates/authentication/_access_key_modal.html:32
#: perms/models/base.py:51 #: perms/models/base.py:51
#: perms/templates/perms/asset_permission_create_update.html:55 #: perms/templates/perms/asset_permission_create_update.html:55
@ -1767,11 +1772,11 @@ msgstr "创建日期"
msgid "Active" msgid "Active"
msgstr "激活中" msgstr "激活中"
#: assets/templates/assets/asset_detail.html:167 #: assets/templates/assets/asset_detail.html:165
msgid "Refresh hardware" msgid "Refresh hardware"
msgstr "更新硬件信息" msgstr "更新硬件信息"
#: assets/templates/assets/asset_detail.html:170 #: assets/templates/assets/asset_detail.html:168
msgid "Refresh" msgid "Refresh"
msgstr "刷新" msgstr "刷新"
@ -2984,38 +2989,38 @@ msgid "Task log"
msgstr "任务列表" msgstr "任务列表"
#: ops/templates/ops/command_execution_create.html:90 #: ops/templates/ops/command_execution_create.html:90
#: terminal/templates/terminal/session_detail.html:91 #: terminal/templates/terminal/session_detail.html:95
#: terminal/templates/terminal/session_detail.html:100 #: terminal/templates/terminal/session_detail.html:104
msgid "Go" msgid "Go"
msgstr "" msgstr ""
#: ops/templates/ops/command_execution_create.html:215 #: ops/templates/ops/command_execution_create.html:216
msgid "Selected assets" msgid "Selected assets"
msgstr "已选择资产" msgstr "已选择资产"
#: ops/templates/ops/command_execution_create.html:218 #: ops/templates/ops/command_execution_create.html:219
msgid "In total" msgid "In total"
msgstr "总共" msgstr "总共"
#: ops/templates/ops/command_execution_create.html:254 #: ops/templates/ops/command_execution_create.html:256
msgid "" msgid ""
"Select the left asset, select the running system user, execute command in " "Select the left asset, select the running system user, execute command in "
"batch" "batch"
msgstr "选择左侧资产, 选择运行的系统用户,批量执行命令" msgstr "选择左侧资产, 选择运行的系统用户,批量执行命令"
#: ops/templates/ops/command_execution_create.html:275 #: ops/templates/ops/command_execution_create.html:299
msgid "Unselected assets" msgid "Unselected assets"
msgstr "没有选中资产" msgstr "没有选中资产"
#: ops/templates/ops/command_execution_create.html:279 #: ops/templates/ops/command_execution_create.html:303
msgid "No input command" msgid "No input command"
msgstr "没有输入命令" msgstr "没有输入命令"
#: ops/templates/ops/command_execution_create.html:283 #: ops/templates/ops/command_execution_create.html:307
msgid "No system user was selected" msgid "No system user was selected"
msgstr "没有选择系统用户" msgstr "没有选择系统用户"
#: ops/templates/ops/command_execution_create.html:328 #: ops/templates/ops/command_execution_create.html:317
msgid "Pending" msgid "Pending"
msgstr "等待" msgstr "等待"
@ -3394,21 +3399,21 @@ msgstr "连接LDAP成功"
msgid "Match {} s users" msgid "Match {} s users"
msgstr "匹配 {} 个用户" msgstr "匹配 {} 个用户"
#: settings/api.py:163 #: settings/api.py:151
msgid "succeed: {} failed: {} total: {}" msgid "succeed: {} failed: {} total: {}"
msgstr "成功:{} 失败:{} 总数:{}" msgstr "成功:{} 失败:{} 总数:{}"
#: settings/api.py:185 settings/api.py:221 #: settings/api.py:173 settings/api.py:209
msgid "" msgid ""
"Error: Account invalid (Please make sure the information such as Access key " "Error: Account invalid (Please make sure the information such as Access key "
"or Secret key is correct)" "or Secret key is correct)"
msgstr "错误:账户无效 (请确保 Access key 或 Secret key 等信息正确)" msgstr "错误:账户无效 (请确保 Access key 或 Secret key 等信息正确)"
#: settings/api.py:191 settings/api.py:227 #: settings/api.py:179 settings/api.py:215
msgid "Create succeed" msgid "Create succeed"
msgstr "创建成功" msgstr "创建成功"
#: settings/api.py:209 settings/api.py:247 #: settings/api.py:197 settings/api.py:235
#: settings/templates/settings/terminal_setting.html:154 #: settings/templates/settings/terminal_setting.html:154
msgid "Delete succeed" msgid "Delete succeed"
msgstr "删除成功" msgstr "删除成功"
@ -3923,11 +3928,11 @@ msgstr "删除失败"
msgid "Are you sure about deleting it?" msgid "Are you sure about deleting it?"
msgstr "您确定删除吗?" msgstr "您确定删除吗?"
#: settings/utils.py:91 #: settings/utils.py:98
msgid "Search no entry matched in ou {}" msgid "Search no entry matched in ou {}"
msgstr "在ou:{}中没有匹配条目" msgstr "在ou:{}中没有匹配条目"
#: settings/utils.py:146 #: settings/utils.py:172
msgid "The user source is not LDAP" msgid "The user source is not LDAP"
msgstr "用户来源不是LDAP" msgstr "用户来源不是LDAP"
@ -4404,7 +4409,7 @@ msgstr "参数"
msgid "Export command" msgid "Export command"
msgstr "导出命令" msgstr "导出命令"
#: terminal/templates/terminal/command_list.html:191 #: terminal/templates/terminal/command_list.html:205
msgid "Goto" msgid "Goto"
msgstr "转到" msgstr "转到"
@ -4418,19 +4423,19 @@ msgstr "会话详情"
msgid "Command list" msgid "Command list"
msgstr "命令记录列表" msgstr "命令记录列表"
#: terminal/templates/terminal/session_detail.html:63 #: terminal/templates/terminal/session_detail.html:67
msgid "There is no command about this session" msgid "There is no command about this session"
msgstr "该会话没有命令记录" msgstr "该会话没有命令记录"
#: terminal/templates/terminal/session_detail.html:88 #: terminal/templates/terminal/session_detail.html:92
msgid "Replay session" msgid "Replay session"
msgstr "回放会话" msgstr "回放会话"
#: terminal/templates/terminal/session_detail.html:97 #: terminal/templates/terminal/session_detail.html:101
msgid "Monitor session" msgid "Monitor session"
msgstr "监控" msgstr "监控"
#: terminal/templates/terminal/session_detail.html:105 #: terminal/templates/terminal/session_detail.html:109
msgid "Terminate session" msgid "Terminate session"
msgstr "终止会话" msgstr "终止会话"

View File

@ -1,9 +1,13 @@
import re
from rest_framework.serializers import ModelSerializer from rest_framework.serializers import ModelSerializer
from rest_framework import serializers from rest_framework import serializers
from users.models import User, UserGroup from users.models import User, UserGroup
from assets.models import Asset, Domain, AdminUser, SystemUser, Label from assets.models import Asset, Domain, AdminUser, SystemUser, Label
from assets.const import (
GENERAL_LIMIT_SPECIAL_CHARACTERS_PATTERN,
GENERAL_LIMIT_SPECIAL_CHARACTERS_ERROR_MSG
)
from perms.models import AssetPermission from perms.models import AssetPermission
from common.serializers import AdaptedBulkListSerializer from common.serializers import AdaptedBulkListSerializer
from .utils import set_current_org, get_current_org from .utils import set_current_org, get_current_org
@ -18,6 +22,15 @@ class OrgSerializer(ModelSerializer):
fields = '__all__' fields = '__all__'
read_only_fields = ['created_by', 'date_created'] read_only_fields = ['created_by', 'date_created']
@staticmethod
def validate_name(name):
pattern = GENERAL_LIMIT_SPECIAL_CHARACTERS_PATTERN
res = re.match(pattern, name)
if res is None:
msg = GENERAL_LIMIT_SPECIAL_CHARACTERS_ERROR_MSG
raise serializers.ValidationError(msg)
return name
class OrgReadSerializer(ModelSerializer): class OrgReadSerializer(ModelSerializer):
admins = serializers.SlugRelatedField(slug_field='name', many=True, read_only=True) admins = serializers.SlugRelatedField(slug_field='name', many=True, read_only=True)

View File

@ -72,13 +72,18 @@ REDIS_PORT: 6379
# RADIUS_PORT: 1812 # RADIUS_PORT: 1812
# RADIUS_SECRET: # RADIUS_SECRET:
# LDAP/AD 设置定时同步参数 # LDAP/AD settings
# 定时同步用户
# 启用/禁用 # 启用/禁用
# AUTH_LDAP_SYNC_IS_PERIODIC: True # AUTH_LDAP_SYNC_IS_PERIODIC: True
# 单位: 时 # 单位: 时
# AUTH_LDAP_SYNC_INTERVAL: 12 # AUTH_LDAP_SYNC_INTERVAL: 12
# Crontab 表达式 # Crontab 表达式
# AUTH_LDAP_SYNC_CRONTAB: * 6 * * * # AUTH_LDAP_SYNC_CRONTAB: * 6 * * *
#
# LDAP 用户登录时仅允许在用户列表中的用户执行 LDAP Server 认证
# AUTH_LDAP_USER_LOGIN_ONLY_IN_USERS: False
# OTP settings # OTP settings
# OTP/MFA 配置 # OTP/MFA 配置