Compare commits

..

2 Commits

Author SHA1 Message Date
Bai
6e7c11d6c0 perf: update release to latest 2024-07-11 15:56:55 +08:00
fit2bot
d9cd820b04 feat: Update v4.0.0 2024-07-03 19:21:23 +08:00
50 changed files with 395 additions and 505 deletions

1
.gitignore vendored
View File

@@ -45,3 +45,4 @@ test.py
.history/
.test/
*.mo

View File

@@ -1,4 +1,4 @@
FROM debian:bullseye-slim AS stage-1
FROM debian:bullseye-slim as stage-1
ARG TARGETARCH
ARG DEPENDENCIES=" \
@@ -27,6 +27,14 @@ RUN set -ex \
&& chmod 755 /usr/local/bin/check \
&& rm -f check-${CHECK_VERSION}-linux-${TARGETARCH}.tar.gz
ARG RECEPTOR_VERSION=v1.4.5
RUN set -ex \
&& wget -O /opt/receptor.tar.gz https://github.com/ansible/receptor/releases/download/${RECEPTOR_VERSION}/receptor_${RECEPTOR_VERSION/v/}_linux_${TARGETARCH}.tar.gz \
&& tar -xf /opt/receptor.tar.gz -C /usr/local/bin/ \
&& chown root:root /usr/local/bin/receptor \
&& chmod 755 /usr/local/bin/receptor \
&& rm -f /opt/receptor.tar.gz
ARG VERSION
WORKDIR /opt/jumpserver
@@ -37,7 +45,7 @@ RUN echo > /opt/jumpserver/config.yml \
sed -i "s@VERSION = .*@VERSION = '${VERSION}'@g" apps/jumpserver/const.py; \
fi
FROM python:3.11-slim-bullseye AS stage-2
FROM python:3.11-slim-bullseye as stage-2
ARG TARGETARCH
ARG BUILD_DEPENDENCIES=" \

View File

@@ -1,7 +1,7 @@
ARG VERSION
FROM registry.fit2cloud.com/jumpserver/xpack:${VERSION} AS build-xpack
FROM python:3.11-slim-bullseye AS build-core
FROM registry.fit2cloud.com/jumpserver/xpack:${VERSION} as build-xpack
FROM python:3.11-slim-bullseye as build-core
ARG BUILD_DEPENDENCIES=" \
g++"

1
GITSHA Normal file
View File

@@ -0,0 +1 @@
02fc045370b39a2d14561ea978d465e162a53119

View File

@@ -8,7 +8,7 @@ from django.utils.translation import gettext_lazy as _
from xlsxwriter import Workbook
from accounts.const import AutomationTypes, SecretType, SSHKeyStrategy, SecretStrategy, ChangeSecretRecordStatusChoice
from accounts.models import ChangeSecretRecord, BaseAccountQuerySet
from accounts.models import ChangeSecretRecord
from accounts.notifications import ChangeSecretExecutionTaskMsg, ChangeSecretFailedMsg
from accounts.serializers import ChangeSecretRecordBackUpSerializer
from assets.const import HostTypes
@@ -68,10 +68,10 @@ class ChangeSecretManager(AccountBasePlaybookManager):
else:
return self.secret_generator(secret_type).get_secret()
def get_accounts(self, privilege_account) -> BaseAccountQuerySet | None:
def get_accounts(self, privilege_account):
if not privilege_account:
print('Not privilege account')
return
print(f'not privilege account')
return []
asset = privilege_account.asset
accounts = asset.accounts.all()
@@ -108,9 +108,6 @@ class ChangeSecretManager(AccountBasePlaybookManager):
print(f'Windows {asset} does not support ssh key push')
return inventory_hosts
if asset.type == HostTypes.WINDOWS:
accounts = accounts.filter(secret_type=SecretType.PASSWORD)
host['ssh_params'] = {}
for account in accounts:
h = deepcopy(host)
@@ -229,9 +226,6 @@ class ChangeSecretManager(AccountBasePlaybookManager):
def run(self, *args, **kwargs):
if self.secret_type and not self.check_secret():
self.execution.status = 'success'
self.execution.date_finished = timezone.now()
self.execution.save()
return
super().run(*args, **kwargs)
recorders = list(self.name_recorder_mapper.values())

View File

@@ -185,6 +185,5 @@ class Migration(migrations.Migration):
('alias', models.CharField(choices=[('@INPUT', 'Manual input'), ('@USER', 'Dynamic user'), ('@ANON', 'Anonymous account'), ('@SPEC', 'Specified account')], max_length=128, verbose_name='Alias')),
('secret_from_login', models.BooleanField(default=None, null=True, verbose_name='Secret from login')),
],
options={'verbose_name': 'Virtual account'},
),
]

View File

@@ -117,6 +117,5 @@ class DatabaseTypes(BaseType):
@classmethod
def get_community_types(cls):
return [
cls.MYSQL, cls.MARIADB, cls.POSTGRESQL,
cls.MONGODB, cls.REDIS,
cls.MYSQL, cls.MARIADB, cls.MONGODB, cls.REDIS
]

View File

@@ -171,9 +171,12 @@ class AllTypes(ChoicesMixin):
(Category.DEVICE, DeviceTypes),
(Category.DATABASE, DatabaseTypes),
(Category.WEB, WebTypes),
(Category.CLOUD, CloudTypes),
(Category.CUSTOM, CustomTypes),
]
if settings.XPACK_ENABLED:
types.extend([
(Category.CLOUD, CloudTypes),
(Category.CUSTOM, CustomTypes),
])
return types
@classmethod

View File

@@ -1,28 +0,0 @@
# Generated by Django 4.1.13 on 2024-07-09 10:19
from django.db import migrations
def migrate_platform_protocol_primary(apps, schema_editor):
platform_model = apps.get_model('assets', 'Platform')
platforms = platform_model.objects.all()
for platform in platforms:
p = platform.protocols.filter(primary=True).first()
if p:
continue
p = platform.protocols.first()
if not p:
continue
p.primary = True
p.save()
class Migration(migrations.Migration):
dependencies = [
('assets', '0003_auto_20180109_2331'),
]
operations = [
migrations.RunPython(migrate_platform_protocol_primary)
]

View File

@@ -36,7 +36,6 @@ class BaseAutomationSerializer(PeriodTaskSerializerMixin, BulkOrgResourceModelSe
class AutomationExecutionSerializer(serializers.ModelSerializer):
snapshot = serializers.SerializerMethodField(label=_('Automation snapshot'))
status = serializers.SerializerMethodField(label=_("Status"))
trigger = LabeledChoiceField(choices=Trigger.choices, read_only=True, label=_("Trigger mode"))
class Meta:
@@ -46,14 +45,6 @@ class AutomationExecutionSerializer(serializers.ModelSerializer):
]
fields = ['id', 'automation'] + read_only_fields
@staticmethod
def get_status(obj):
if obj.status == 'success':
return _("Success")
elif obj.status == 'pending':
return _("Pending")
return obj.status
@staticmethod
def get_snapshot(obj):
from assets.const import AutomationTypes as AssetTypes

View File

@@ -55,14 +55,14 @@ class UserSessionApi(generics.RetrieveDestroyAPIView):
def retrieve(self, request, *args, **kwargs):
if isinstance(request.user, AnonymousUser):
return Response(status=status.HTTP_403_FORBIDDEN)
return Response(status=status.HTTP_200_OK)
UserSessionManager(request).connect()
return Response(status=status.HTTP_200_OK, data={'ok': True})
return Response(status=status.HTTP_200_OK)
def destroy(self, request, *args, **kwargs):
if isinstance(request.user, AnonymousUser):
return Response(status=status.HTTP_403_FORBIDDEN)
return Response(status=status.HTTP_200_OK)
UserSessionManager(request).disconnect()
return Response(status=status.HTTP_200_OK, data={'ok': True})
return Response(status=status.HTTP_204_NO_CONTENT)

View File

@@ -1,12 +1,14 @@
import copy
from urllib import parse
from django.conf import settings
from django.contrib import auth
from django.http import HttpResponseRedirect, HttpResponse, HttpResponseServerError
from django.urls import reverse
from django.views import View
from django.contrib import auth
from django.urls import reverse
from django.conf import settings
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponseRedirect, HttpResponse, HttpResponseServerError
from onelogin.saml2.auth import OneLogin_Saml2_Auth
from onelogin.saml2.errors import OneLogin_Saml2_Error
from onelogin.saml2.idp_metadata_parser import (
@@ -14,29 +16,23 @@ from onelogin.saml2.idp_metadata_parser import (
dict_deep_merge
)
from common.utils import get_logger
from .settings import JmsSaml2Settings
from common.utils import get_logger
logger = get_logger(__file__)
class PrepareRequestMixin:
@property
def parsed_url(self):
return parse.urlparse(settings.SITE_URL)
def is_secure(self):
return 'on' if self.parsed_url.scheme == 'https' else 'off'
def http_host(self):
return f"{self.parsed_url.hostname}:{self.parsed_url.port}" \
if self.parsed_url.port else self.parsed_url.hostname
@staticmethod
def is_secure():
url_result = parse.urlparse(settings.SITE_URL)
return 'on' if url_result.scheme == 'https' else 'off'
def prepare_django_request(self, request):
result = {
'https': self.is_secure(),
'http_host': self.http_host(),
'http_host': request.META['HTTP_HOST'],
'script_name': request.META['PATH_INFO'],
'get_data': request.GET.copy(),
'post_data': request.POST.copy()
@@ -279,7 +275,7 @@ class Saml2AuthCallbackView(View, PrepareRequestMixin):
logger.debug(log_prompt.format('Redirect'))
redir = post_data.get('RelayState')
if not redir or len(redir) == 0:
redir = "/"
redir = "/"
next_url = saml_instance.redirect_to(redir)
return HttpResponseRedirect(next_url)

View File

@@ -3,4 +3,3 @@ from .connection_token import *
from .private_token import *
from .sso_token import *
from .temp_token import *
from ..backends.passkey.models import *

View File

@@ -37,7 +37,6 @@ class ConnectionTokenSerializer(CommonModelSerializer):
]
fields = fields_small + read_only_fields
extra_kwargs = {
'org_name': {'label': _('Org name')},
'from_ticket': {'read_only': True},
'value': {'read_only': True},
'is_expired': {'read_only': True, 'label': _('Is expired')},

View File

@@ -151,9 +151,11 @@ class BaseBindCallbackView(FlashMessageMixin, IMClientMixin, View):
setattr(user, f'{self.auth_type}_id', auth_user_id)
user.save()
except IntegrityError as e:
msg = _('The %s is already bound to another user') % self.auth_type_label
response = self.get_failed_response(redirect_url, msg, msg)
return response
if e.args[0] == 1062:
msg = _('The %s is already bound to another user') % self.auth_type_label
response = self.get_failed_response(redirect_url, msg, msg)
return response
raise e
ip = get_request_ip(request)
OAuthBindMessage(user, ip, self.auth_type_label, auth_user_id).publish_async()

View File

@@ -47,7 +47,15 @@ class DingTalkBaseMixin(UserConfirmRequiredExceptionMixin, PermissionsMixin, Fla
)
def verify_state(self):
return self.verify_state_with_session_key(DINGTALK_STATE_SESSION_KEY)
state = self.request.GET.get('state')
session_state = self.request.session.get(DINGTALK_STATE_SESSION_KEY)
if state != session_state:
return False
return True
def get_verify_state_failed_response(self, redirect_uri):
msg = _("The system configuration is incorrect. Please contact your administrator")
return self.get_failed_response(redirect_uri, msg, msg)
def get_already_bound_response(self, redirect_url):
msg = _('DingTalk is already bound')

View File

@@ -58,7 +58,15 @@ class FeiShuQRMixin(UserConfirmRequiredExceptionMixin, PermissionsMixin, FlashMe
)
def verify_state(self):
return self.verify_state_with_session_key(self.state_session_key)
state = self.request.GET.get('state')
session_state = self.request.session.get(self.state_session_key)
if state != session_state:
return False
return True
def get_verify_state_failed_response(self, redirect_uri):
msg = _("The system configuration is incorrect. Please contact your administrator")
return self.get_failed_response(redirect_uri, msg, msg)
def get_qr_url(self, redirect_uri):
state = random_string(16)

View File

@@ -1,6 +1,5 @@
# -*- coding: utf-8 -*-
#
from django.utils.translation import gettext_lazy as _
from common.utils import FlashMessageUtil
@@ -33,12 +32,3 @@ class FlashMessageMixin:
def get_failed_response(self, redirect_url, title, msg, interval=10):
return self.get_response(redirect_url, title, msg, 'error', interval)
def get_verify_state_failed_response(self, redirect_uri):
msg = _(
"For your safety, automatic redirection login is not supported on the client."
" If you need to open it in the client, please log in again")
return self.get_failed_response(redirect_uri, msg, msg)
def verify_state_with_session_key(self, session_key):
return self.request.GET.get('state') == self.request.session.get(session_key)

View File

@@ -37,7 +37,15 @@ class SlackMixin(UserConfirmRequiredExceptionMixin, PermissionsMixin, FlashMessa
)
def verify_state(self):
return self.verify_state_with_session_key(SLACK_STATE_SESSION_KEY)
state = self.request.GET.get('state')
session_state = self.request.session.get(SLACK_STATE_SESSION_KEY)
if state != session_state:
return False
return True
def get_verify_state_failed_response(self, redirect_uri):
msg = _("The system configuration is incorrect. Please contact your administrator")
return self.get_failed_response(redirect_uri, msg, msg)
def get_qr_url(self, redirect_uri):
state = random_string(16)

View File

@@ -45,7 +45,15 @@ class WeComBaseMixin(UserConfirmRequiredExceptionMixin, PermissionsMixin, FlashM
)
def verify_state(self):
return self.verify_state_with_session_key(WECOM_STATE_SESSION_KEY)
state = self.request.GET.get('state')
session_state = self.request.session.get(WECOM_STATE_SESSION_KEY)
if state != session_state:
return False
return True
def get_verify_state_failed_response(self, redirect_uri):
msg = _("The system configuration is incorrect. Please contact your administrator")
return self.get_failed_response(redirect_uri, msg, msg)
def get_already_bound_response(self, redirect_url):
msg = _('WeCom is already bound')

View File

@@ -34,10 +34,6 @@ def parse_to_url(url):
url = url.replace('(?P<format>[a-z0-9]+)', '')
url = url.replace('((?P<terminal>[/.]{36})/)?', uid + '/')
url = url.replace('(?P<pk>[/.]+)', uid)
url = url.replace('(?P<label>.*)', uid)
url = url.replace('(?P<res_type>.*)', '1')
url = url.replace('(?P<name>[\\w.@]+)', '')
url = url.replace('<str:name>', 'zh-hans')
url = url.replace('\.', '')
url = url.replace('//', '/')
url = url.strip('$')
@@ -74,9 +70,7 @@ known_unauth_urls = [
"/api/v1/authentication/login-confirm-ticket/status/",
"/api/v1/authentication/mfa/select/",
"/api/v1/authentication/mfa/send-code/",
"/api/v1/authentication/sso/login/",
"/api/v1/authentication/user-session/",
"/api/v1/settings/i18n/zh-hans/"
"/api/v1/authentication/sso/login/"
]
known_error_urls = [

View File

@@ -53,7 +53,7 @@
"SaveSucceed": "保存成功",
"SelectSQL": "选择 SQL",
"SessionClosedBy": "会话被 %s 关闭",
"SessionFinished": "会已结束",
"SessionFinished": "会已结束",
"SessionLockedError": "当前会话已被锁定,无法继续执行命令",
"SessionLockedMessage": "此会话已被 %s 锁定,无法继续执行命令",
"SessionUnlockedMessage": "此会话已被 %s 解锁,可以继续执行命令",

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-16 18:58+0800\n"
"POT-Creation-Date: 2024-07-03 16:39+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"
@@ -64,8 +64,7 @@ msgstr ""
#: accounts/automations/backup_account/handlers.py:219
#: accounts/const/automation.py:110
#: accounts/serializers/automations/change_secret.py:166
#: assets/serializers/automations/base.py:52 audits/const.py:64
#: accounts/serializers/automations/change_secret.py:166 audits/const.py:64
#: audits/models.py:64 audits/signal_handlers/activity_log.py:33
#: common/const/choices.py:18 ops/const.py:74 ops/serializers/celery.py:48
#: terminal/const.py:78 terminal/models/session/sharing.py:121
@@ -304,9 +303,8 @@ msgstr ""
msgid "SFTP"
msgstr ""
#: accounts/const/automation.py:111 assets/serializers/automations/base.py:54
#: common/const/choices.py:16 terminal/const.py:77 tickets/const.py:29
#: tickets/const.py:38
#: accounts/const/automation.py:111 common/const/choices.py:16
#: terminal/const.py:77 tickets/const.py:29 tickets/const.py:38
msgid "Pending"
msgstr ""
@@ -395,7 +393,7 @@ msgstr ""
#: terminal/templates/terminal/_msg_command_warning.html:8
#: terminal/templates/terminal/_msg_session_sharing.html:8
#: tickets/models/ticket/command_confirm.py:13
#: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/ws.py:37
#: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/ws.py:38
msgid "Account"
msgstr ""
@@ -484,7 +482,7 @@ msgstr ""
#: accounts/serializers/account/backup.py:48
#: accounts/serializers/automations/base.py:56
#: assets/models/automations/base.py:122
#: assets/serializers/automations/base.py:40
#: assets/serializers/automations/base.py:39
msgid "Trigger mode"
msgstr ""
@@ -577,8 +575,7 @@ msgid "Date finished"
msgstr ""
#: accounts/models/automations/change_secret.py:44
#: assets/models/automations/base.py:113
#: assets/serializers/automations/base.py:39 audits/models.py:208
#: assets/models/automations/base.py:113 audits/models.py:208
#: audits/serializers.py:54 ops/models/base.py:49 ops/models/job.py:234
#: terminal/models/applet/applet.py:320 terminal/models/applet/host.py:140
#: terminal/models/component/status.py:30
@@ -710,9 +707,9 @@ msgstr ""
#: ops/models/celery.py:80 ops/models/job.py:142 ops/models/playbook.py:28
#: ops/serializers/job.py:18 orgs/models.py:82
#: perms/models/asset_permission.py:61 rbac/models/role.py:29
#: rbac/serializers/role.py:28 settings/models.py:34 settings/models.py:183
#: settings/serializers/msg.py:86 settings/serializers/terminal.py:9
#: terminal/models/applet/applet.py:33 terminal/models/component/endpoint.py:12
#: settings/models.py:34 settings/models.py:183 settings/serializers/msg.py:86
#: settings/serializers/terminal.py:9 terminal/models/applet/applet.py:33
#: terminal/models/component/endpoint.py:12
#: terminal/models/component/endpoint.py:109
#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13
#: terminal/models/component/terminal.py:85
@@ -1235,8 +1232,7 @@ msgstr ""
#: authentication/templates/authentication/_access_key_modal.html:32
#: perms/models/asset_permission.py:82
#: terminal/models/component/endpoint.py:120
#: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44
#: tickets/const.py:36
#: terminal/models/session/sharing.py:29 tickets/const.py:36
msgid "Active"
msgstr "Active"
@@ -1759,7 +1755,7 @@ msgstr ""
msgid "API mode"
msgstr ""
#: assets/const/types.py:248
#: assets/const/types.py:251
msgid "All types"
msgstr ""
@@ -3354,12 +3350,7 @@ msgstr ""
msgid "Actions"
msgstr ""
#: authentication/serializers/connection_token.py:40
#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
msgid "Org name"
msgstr "Organization"
#: authentication/serializers/connection_token.py:43
#: authentication/serializers/connection_token.py:42
#: perms/serializers/permission.py:44 perms/serializers/permission.py:65
#: users/serializers/user.py:127 users/serializers/user.py:273
msgid "Is expired"
@@ -3630,10 +3621,10 @@ msgstr ""
msgid "DingTalk Error"
msgstr ""
#: authentication/views/mixins.py:39
#: authentication/views/dingtalk.py:57 authentication/views/feishu.py:68
#: authentication/views/slack.py:47 authentication/views/wecom.py:55
msgid ""
"For your safety, automatic redirection login is not supported on the client. "
"If you need to open it in the client, please log in again"
"The system configuration is incorrect. Please contact your administrator"
msgstr ""
#: authentication/views/dingtalk.py:61
@@ -3778,7 +3769,7 @@ msgstr ""
msgid "Canceled"
msgstr ""
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:412
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:409
#, python-format
msgid "%(name)s was created successfully"
msgstr ""
@@ -3893,7 +3884,7 @@ msgid ""
"information -> file encryption password to set the encryption password"
msgstr ""
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:38
#, python-format
msgid "%s object does not exist."
msgstr ""
@@ -4240,27 +4231,27 @@ msgstr ""
msgid "Currently playbook is being used in a job"
msgstr ""
#: ops/api/playbook.py:97
#: ops/api/playbook.py:96
msgid "Unsupported file content"
msgstr ""
#: ops/api/playbook.py:99 ops/api/playbook.py:145 ops/api/playbook.py:193
#: ops/api/playbook.py:98 ops/api/playbook.py:144 ops/api/playbook.py:192
msgid "Invalid file path"
msgstr ""
#: ops/api/playbook.py:171
#: ops/api/playbook.py:170
msgid "This file can not be rename"
msgstr ""
#: ops/api/playbook.py:190
#: ops/api/playbook.py:189
msgid "File already exists"
msgstr ""
#: ops/api/playbook.py:208
#: ops/api/playbook.py:207
msgid "File key is required"
msgstr ""
#: ops/api/playbook.py:211
#: ops/api/playbook.py:210
msgid "This file can not be delete"
msgstr ""
@@ -4481,8 +4472,7 @@ msgstr ""
msgid "Run as policy"
msgstr ""
#: ops/models/job.py:222 ops/serializers/job.py:92
#: terminal/notifications.py:174
#: ops/models/job.py:222 terminal/notifications.py:174
msgid "Job"
msgstr ""
@@ -4494,7 +4484,7 @@ msgstr ""
msgid "Material Type"
msgstr ""
#: ops/models/job.py:548
#: ops/models/job.py:545
msgid "Job Execution"
msgstr ""
@@ -4558,11 +4548,7 @@ msgstr ""
msgid "Is finished"
msgstr "Finished"
#: ops/serializers/job.py:89
msgid "Task id"
msgstr ""
#: ops/serializers/job.py:98
#: ops/serializers/job.py:90
msgid "You do not have permission for the current job."
msgstr ""
@@ -4665,6 +4651,10 @@ msgstr "請選擇一個組織後再保存"
msgid "Organization"
msgstr ""
#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
msgid "Org name"
msgstr "Organization"
#: orgs/models.py:14
msgid "GLOBAL"
msgstr ""
@@ -4969,6 +4959,11 @@ msgstr ""
msgid "Perms"
msgstr ""
#: rbac/serializers/role.py:28 terminal/models/applet/applet.py:34
#: terminal/models/virtualapp/virtualapp.py:20
msgid "Display name"
msgstr ""
#: rbac/serializers/rolebinding.py:60
msgid "Has bound this role"
msgstr ""
@@ -5245,7 +5240,7 @@ msgid ""
msgstr ""
#: settings/serializers/auth/base.py:35
msgid "Forgot Password URL"
msgid "Forgot Password"
msgstr ""
#: settings/serializers/auth/base.py:36
@@ -5834,7 +5829,7 @@ msgid "Chat AI"
msgstr ""
#: settings/serializers/feature.py:80
msgid "GPT Base URL"
msgid "Base URL"
msgstr ""
#: settings/serializers/feature.py:81
@@ -6851,11 +6846,6 @@ msgstr ""
msgid "Enterprise"
msgstr ""
#: terminal/models/applet/applet.py:34
#: terminal/models/virtualapp/virtualapp.py:20
msgid "Display name"
msgstr ""
#: terminal/models/applet/applet.py:36
#: terminal/models/virtualapp/virtualapp.py:22
msgid "Author"
@@ -8945,49 +8935,49 @@ msgstr ""
msgid "Failed to synchronize the instance \"%s\""
msgstr ""
#: xpack/plugins/cloud/manager.py:337
#: xpack/plugins/cloud/manager.py:334
#, python-format
msgid ""
"The updated platform of asset \"%s\" is inconsistent with the original "
"platform type. Skip platform and protocol updates"
msgstr ""
#: xpack/plugins/cloud/manager.py:393
#: xpack/plugins/cloud/manager.py:390
#, python-format
msgid "The asset \"%s\" already exists"
msgstr ""
#: xpack/plugins/cloud/manager.py:395
#: xpack/plugins/cloud/manager.py:392
#, python-format
msgid "Update asset \"%s\""
msgstr ""
#: xpack/plugins/cloud/manager.py:398
#: xpack/plugins/cloud/manager.py:395
#, python-format
msgid "Asset \"%s\" has been updated"
msgstr ""
#: xpack/plugins/cloud/manager.py:408
#: xpack/plugins/cloud/manager.py:405
#, python-format
msgid "Prepare to create asset \"%s\""
msgstr ""
#: xpack/plugins/cloud/manager.py:429
#: xpack/plugins/cloud/manager.py:426
#, python-format
msgid "Set nodes \"%s\""
msgstr ""
#: xpack/plugins/cloud/manager.py:455
#: xpack/plugins/cloud/manager.py:452
#, python-format
msgid "Set accounts \"%s\""
msgstr ""
#: xpack/plugins/cloud/manager.py:471
#: xpack/plugins/cloud/manager.py:468
#, python-format
msgid "Set protocols \"%s\""
msgstr ""
#: xpack/plugins/cloud/manager.py:485 xpack/plugins/cloud/tasks.py:27
#: xpack/plugins/cloud/manager.py:482 xpack/plugins/cloud/tasks.py:27
msgid "Run sync instance task"
msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-16 18:58+0800\n"
"POT-Creation-Date: 2024-07-03 16:39+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"
@@ -64,8 +64,7 @@ msgstr "仕上げ"
#: accounts/automations/backup_account/handlers.py:219
#: accounts/const/automation.py:110
#: accounts/serializers/automations/change_secret.py:166
#: assets/serializers/automations/base.py:52 audits/const.py:64
#: accounts/serializers/automations/change_secret.py:166 audits/const.py:64
#: audits/models.py:64 audits/signal_handlers/activity_log.py:33
#: common/const/choices.py:18 ops/const.py:74 ops/serializers/celery.py:48
#: terminal/const.py:78 terminal/models/session/sharing.py:121
@@ -304,9 +303,8 @@ msgstr "メール"
msgid "SFTP"
msgstr "SFTP"
#: accounts/const/automation.py:111 assets/serializers/automations/base.py:54
#: common/const/choices.py:16 terminal/const.py:77 tickets/const.py:29
#: tickets/const.py:38
#: accounts/const/automation.py:111 common/const/choices.py:16
#: terminal/const.py:77 tickets/const.py:29 tickets/const.py:38
msgid "Pending"
msgstr "未定"
@@ -395,7 +393,7 @@ msgstr "ソース ID"
#: terminal/templates/terminal/_msg_command_warning.html:8
#: terminal/templates/terminal/_msg_session_sharing.html:8
#: tickets/models/ticket/command_confirm.py:13
#: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/ws.py:37
#: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/ws.py:38
msgid "Account"
msgstr "アカウント"
@@ -484,7 +482,7 @@ msgstr "アカウントのバックアップスナップショット"
#: accounts/serializers/account/backup.py:48
#: accounts/serializers/automations/base.py:56
#: assets/models/automations/base.py:122
#: assets/serializers/automations/base.py:40
#: assets/serializers/automations/base.py:39
msgid "Trigger mode"
msgstr "トリガーモード"
@@ -577,8 +575,7 @@ msgid "Date finished"
msgstr "終了日"
#: accounts/models/automations/change_secret.py:44
#: assets/models/automations/base.py:113
#: assets/serializers/automations/base.py:39 audits/models.py:208
#: assets/models/automations/base.py:113 audits/models.py:208
#: audits/serializers.py:54 ops/models/base.py:49 ops/models/job.py:234
#: terminal/models/applet/applet.py:320 terminal/models/applet/host.py:140
#: terminal/models/component/status.py:30
@@ -683,7 +680,7 @@ msgstr "鍵の種類"
#: authentication/templates/authentication/_access_key_modal.html:31
#: settings/serializers/auth/radius.py:19
msgid "Secret"
msgstr "秘文"
msgstr "ひみつ"
#: accounts/models/base.py:42
#: accounts/serializers/automations/change_secret.py:41
@@ -710,9 +707,9 @@ msgstr "パスワードルール"
#: ops/models/celery.py:80 ops/models/job.py:142 ops/models/playbook.py:28
#: ops/serializers/job.py:18 orgs/models.py:82
#: perms/models/asset_permission.py:61 rbac/models/role.py:29
#: rbac/serializers/role.py:28 settings/models.py:34 settings/models.py:183
#: settings/serializers/msg.py:86 settings/serializers/terminal.py:9
#: terminal/models/applet/applet.py:33 terminal/models/component/endpoint.py:12
#: settings/models.py:34 settings/models.py:183 settings/serializers/msg.py:86
#: settings/serializers/terminal.py:9 terminal/models/applet/applet.py:33
#: terminal/models/component/endpoint.py:12
#: terminal/models/component/endpoint.py:109
#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13
#: terminal/models/component/terminal.py:85
@@ -985,7 +982,7 @@ msgstr "資産タイプ"
#: accounts/serializers/account/base.py:33 terminal/serializers/storage.py:149
msgid "Passphrase"
msgstr "キーパスワード"
msgstr "パスワード"
#: accounts/serializers/account/base.py:96
msgid ""
@@ -1086,14 +1083,13 @@ msgstr "SSHキー戦略"
#: accounts/serializers/automations/change_secret.py:57
msgid "Please enter your account username"
msgstr "アカウントのユーザー名を入力してください"
msgstr "MFAコードを入力してください"
#: accounts/serializers/automations/change_secret.py:62
msgid ""
"Secret parameter settings, currently only effective for assets of the host "
"type."
msgstr ""
"パラメータ設定は現在、AIX LINUX UNIX タイプの資産に対してのみ有効です。"
msgstr "暗号化パラメータの設定は現在、ホストタイプのリソースにのみ有効です。"
#: accounts/serializers/automations/change_secret.py:84
msgid "* Please enter the correct password length"
@@ -1253,8 +1249,7 @@ msgstr "レビュー担当者"
#: authentication/templates/authentication/_access_key_modal.html:32
#: perms/models/asset_permission.py:82
#: terminal/models/component/endpoint.py:120
#: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44
#: tickets/const.py:36
#: terminal/models/session/sharing.py:29 tickets/const.py:36
msgid "Active"
msgstr "アクティブ"
@@ -1792,7 +1787,7 @@ msgstr "ボタンセレクターを確認する"
msgid "API mode"
msgstr "APIモード"
#: assets/const/types.py:248
#: assets/const/types.py:251
msgid "All types"
msgstr "いろんなタイプ"
@@ -3421,12 +3416,7 @@ msgstr "作業指示情報"
msgid "Actions"
msgstr "アクション"
#: authentication/serializers/connection_token.py:40
#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
msgid "Org name"
msgstr "組織名"
#: authentication/serializers/connection_token.py:43
#: authentication/serializers/connection_token.py:42
#: perms/serializers/permission.py:44 perms/serializers/permission.py:65
#: users/serializers/user.py:127 users/serializers/user.py:273
msgid "Is expired"
@@ -3709,14 +3699,11 @@ msgstr "DingTalkエラー、システム管理者に連絡してください"
msgid "DingTalk Error"
msgstr "DingTalkエラー"
#: authentication/views/mixins.py:39
#: authentication/views/dingtalk.py:57 authentication/views/feishu.py:68
#: authentication/views/slack.py:47 authentication/views/wecom.py:55
msgid ""
"For your safety, automatic redirection login is not supported on the client. "
"If you need to open it in the client, please log in again"
msgstr ""
"安全のため、クライアントでの自動リダイレクトログインはサポートされていませ"
"ん。クライアントで開く必要がある場合は、再度ログインしてください"
"The system configuration is incorrect. Please contact your administrator"
msgstr "システム設定が正しくありません。管理者に連絡してください"
#: authentication/views/dingtalk.py:61
msgid "DingTalk is already bound"
@@ -3862,7 +3849,7 @@ msgstr "ランニング"
msgid "Canceled"
msgstr "キャンセル"
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:412
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:409
#, python-format
msgid "%(name)s was created successfully"
msgstr "%(name)s が正常に作成されました"
@@ -3982,7 +3969,7 @@ msgstr ""
"{} - 暗号化パスワードが設定されていません-個人情報->ファイル暗号化パスワード"
"に暗号化パスワードを設定してください"
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:38
#, python-format
msgid "%s object does not exist."
msgstr "%s オブジェクトは存在しません。"
@@ -4346,27 +4333,27 @@ msgstr "タスクを作成中で、中断できません。後でもう一度お
msgid "Currently playbook is being used in a job"
msgstr "現在プレイブックは1つのジョブで使用されています"
#: ops/api/playbook.py:97
#: ops/api/playbook.py:96
msgid "Unsupported file content"
msgstr "サポートされていないファイルの内容"
#: ops/api/playbook.py:99 ops/api/playbook.py:145 ops/api/playbook.py:193
#: ops/api/playbook.py:98 ops/api/playbook.py:144 ops/api/playbook.py:192
msgid "Invalid file path"
msgstr "無効なファイルパス"
#: ops/api/playbook.py:171
#: ops/api/playbook.py:170
msgid "This file can not be rename"
msgstr "ファイル名を変更することはできません"
#: ops/api/playbook.py:190
#: ops/api/playbook.py:189
msgid "File already exists"
msgstr "ファイルは既に存在します。"
#: ops/api/playbook.py:208
#: ops/api/playbook.py:207
msgid "File key is required"
msgstr "ファイルキーこのフィールドは必須です"
#: ops/api/playbook.py:211
#: ops/api/playbook.py:210
msgid "This file can not be delete"
msgstr "このファイルを削除できません"
@@ -4587,8 +4574,7 @@ msgstr "ユーザーとして実行"
msgid "Run as policy"
msgstr "ユーザー ポリシー"
#: ops/models/job.py:222 ops/serializers/job.py:92
#: terminal/notifications.py:174
#: ops/models/job.py:222 terminal/notifications.py:174
msgid "Job"
msgstr "ジョブ#ジョブ#"
@@ -4600,7 +4586,7 @@ msgstr "Material"
msgid "Material Type"
msgstr "Material を選択してオプションを設定します。"
#: ops/models/job.py:548
#: ops/models/job.py:545
msgid "Job Execution"
msgstr "ジョブ実行"
@@ -4664,11 +4650,7 @@ msgstr "タスクの種類"
msgid "Is finished"
msgstr "終了しました"
#: ops/serializers/job.py:89
msgid "Task id"
msgstr "タスク ID"
#: ops/serializers/job.py:98
#: ops/serializers/job.py:90
msgid "You do not have permission for the current job."
msgstr "あなたは現在のジョブの権限を持っていません。"
@@ -4772,6 +4754,10 @@ msgstr "組織を選択してから保存してください"
msgid "Organization"
msgstr "組織"
#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
msgid "Org name"
msgstr "組織名"
#: orgs/models.py:14
msgid "GLOBAL"
msgstr "グローバル組織"
@@ -5080,6 +5066,11 @@ msgstr "システムロールバインディング"
msgid "Perms"
msgstr "パーマ"
#: rbac/serializers/role.py:28 terminal/models/applet/applet.py:34
#: terminal/models/virtualapp/virtualapp.py:20
msgid "Display name"
msgstr "表示名"
#: rbac/serializers/rolebinding.py:60
msgid "Has bound this role"
msgstr "この役割をバインドしました"
@@ -5361,8 +5352,8 @@ msgstr ""
"スでユーザーを作成します"
#: settings/serializers/auth/base.py:35
msgid "Forgot Password URL"
msgstr "パスワードを忘れた場合のURL"
msgid "Forgot Password"
msgstr "パスワードを忘れた"
#: settings/serializers/auth/base.py:36
msgid "The URL for Forgotten Password on the user login page"
@@ -5459,15 +5450,15 @@ msgstr "DN のバインド"
#: settings/serializers/auth/ldap.py:47
msgid "Binding Distinguished Name"
msgstr "バインドディレクトリ管理者"
msgstr "専有名のバインド"
#: settings/serializers/auth/ldap.py:51
msgid "Binding password"
msgstr "バインドパスワード"
msgstr "古いパスワード"
#: settings/serializers/auth/ldap.py:54
msgid "Search OU"
msgstr "ユーザーOU"
msgstr "システムアーキテクチャ"
#: settings/serializers/auth/ldap.py:56
msgid ""
@@ -5635,7 +5626,7 @@ msgstr "レルム名"
#: settings/serializers/auth/oidc.py:70
msgid "OpenID Connect"
msgstr "OpenID 接続する"
msgstr "接続"
#: settings/serializers/auth/oidc.py:73
msgid "Provider endpoint"
@@ -5763,7 +5754,7 @@ msgstr "認証コード長"
#: settings/serializers/auth/sms.py:26
msgid "Length of the sent verification code"
msgstr "送信された認証コードの長さ"
msgstr "確認コードを送信"
#: settings/serializers/auth/sms.py:31 settings/serializers/auth/sms.py:54
#: settings/serializers/auth/sms.py:62 settings/serializers/auth/sms.py:71
@@ -5989,8 +5980,8 @@ msgid "Chat AI"
msgstr "チャットAI"
#: settings/serializers/feature.py:80
msgid "GPT Base URL"
msgstr "GPTアドレス"
msgid "Base URL"
msgstr "ベースサイトのアドレス"
#: settings/serializers/feature.py:81
msgid "The base URL of the GPT service. For example: https://api.openai.com/v1"
@@ -6083,15 +6074,15 @@ msgstr ""
#: settings/serializers/msg.py:33
msgid "The user to be used for email server authentication"
msgstr ""
"メールサーバーにログインするためのユーザー名。通常、これはあなたのメールアド"
"レスです"
msgstr "これは、SSO認証中にメールが返されない場合にデフォルトで使用されます。"
#: settings/serializers/msg.py:37
msgid ""
"Password to use for the email server. It is used in conjunction with `User` "
"when authenticating to the email server"
msgstr "メールサーバーにログインするためのパスワード"
msgstr ""
"メールサーバーに対するパスワード。メールサーバーに対する認証時に、これがユー"
"ザーとともに使用されます"
#: settings/serializers/msg.py:40
msgid "Sender"
@@ -7099,11 +7090,6 @@ msgstr "コミュニティ版"
msgid "Enterprise"
msgstr "エンタープライズ版"
#: terminal/models/applet/applet.py:34
#: terminal/models/virtualapp/virtualapp.py:20
msgid "Display name"
msgstr "表示名"
#: terminal/models/applet/applet.py:36
#: terminal/models/virtualapp/virtualapp.py:22
msgid "Author"
@@ -9261,7 +9247,7 @@ msgstr "タスク実行完了"
#: xpack/plugins/cloud/manager.py:97
msgid "Synchronization regions"
msgstr "地域を同期する"
msgstr "同期地域"
#: xpack/plugins/cloud/manager.py:115
#, python-format
@@ -9273,7 +9259,7 @@ msgstr "地域 \"%s\" のインスタンスを取得できませんでした、
msgid "Failed to synchronize the instance \"%s\""
msgstr "インスタンス \"%s\" の同期に失敗しました"
#: xpack/plugins/cloud/manager.py:337
#: xpack/plugins/cloud/manager.py:334
#, python-format
msgid ""
"The updated platform of asset \"%s\" is inconsistent with the original "
@@ -9282,42 +9268,42 @@ msgstr ""
"更新された資産 \"%s\" のプラットフォームタイプと元のタイプは一致しません。プ"
"ラットフォームとプロトコルの更新をスキップ"
#: xpack/plugins/cloud/manager.py:393
#: xpack/plugins/cloud/manager.py:390
#, python-format
msgid "The asset \"%s\" already exists"
msgstr "資産 \"%s\" はすでに存在します"
#: xpack/plugins/cloud/manager.py:395
#: xpack/plugins/cloud/manager.py:392
#, python-format
msgid "Update asset \"%s\""
msgstr "資産の更新 \"%s\""
#: xpack/plugins/cloud/manager.py:398
#: xpack/plugins/cloud/manager.py:395
#, python-format
msgid "Asset \"%s\" has been updated"
msgstr "資産 \"%s\" が更新されました"
#: xpack/plugins/cloud/manager.py:408
#: xpack/plugins/cloud/manager.py:405
#, python-format
msgid "Prepare to create asset \"%s\""
msgstr "資産 \"%s\" の作成準備"
#: xpack/plugins/cloud/manager.py:429
#: xpack/plugins/cloud/manager.py:426
#, python-format
msgid "Set nodes \"%s\""
msgstr "ノード \"%s\" の設定"
#: xpack/plugins/cloud/manager.py:455
#: xpack/plugins/cloud/manager.py:452
#, python-format
msgid "Set accounts \"%s\""
msgstr "アカウント \"%s\" の設定"
#: xpack/plugins/cloud/manager.py:471
#: xpack/plugins/cloud/manager.py:468
#, python-format
msgid "Set protocols \"%s\""
msgstr "プロトコル \"%s\" の設定"
#: xpack/plugins/cloud/manager.py:485 xpack/plugins/cloud/tasks.py:27
#: xpack/plugins/cloud/manager.py:482 xpack/plugins/cloud/tasks.py:27
msgid "Run sync instance task"
msgstr "同期インスタンス タスクを実行する"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-16 18:58+0800\n"
"POT-Creation-Date: 2024-07-03 16:39+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"
@@ -63,8 +63,7 @@ msgstr "完成"
#: accounts/automations/backup_account/handlers.py:219
#: accounts/const/automation.py:110
#: accounts/serializers/automations/change_secret.py:166
#: assets/serializers/automations/base.py:52 audits/const.py:64
#: accounts/serializers/automations/change_secret.py:166 audits/const.py:64
#: audits/models.py:64 audits/signal_handlers/activity_log.py:33
#: common/const/choices.py:18 ops/const.py:74 ops/serializers/celery.py:48
#: terminal/const.py:78 terminal/models/session/sharing.py:121
@@ -303,9 +302,8 @@ msgstr "邮箱"
msgid "SFTP"
msgstr "SFTP"
#: accounts/const/automation.py:111 assets/serializers/automations/base.py:54
#: common/const/choices.py:16 terminal/const.py:77 tickets/const.py:29
#: tickets/const.py:38
#: accounts/const/automation.py:111 common/const/choices.py:16
#: terminal/const.py:77 tickets/const.py:29 tickets/const.py:38
msgid "Pending"
msgstr "待定的"
@@ -394,7 +392,7 @@ msgstr "来源 ID"
#: terminal/templates/terminal/_msg_command_warning.html:8
#: terminal/templates/terminal/_msg_session_sharing.html:8
#: tickets/models/ticket/command_confirm.py:13
#: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/ws.py:37
#: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/ws.py:38
msgid "Account"
msgstr "账号"
@@ -483,7 +481,7 @@ msgstr "账号备份快照"
#: accounts/serializers/account/backup.py:48
#: accounts/serializers/automations/base.py:56
#: assets/models/automations/base.py:122
#: assets/serializers/automations/base.py:40
#: assets/serializers/automations/base.py:39
msgid "Trigger mode"
msgstr "触发模式"
@@ -576,8 +574,7 @@ msgid "Date finished"
msgstr "结束日期"
#: accounts/models/automations/change_secret.py:44
#: assets/models/automations/base.py:113
#: assets/serializers/automations/base.py:39 audits/models.py:208
#: assets/models/automations/base.py:113 audits/models.py:208
#: audits/serializers.py:54 ops/models/base.py:49 ops/models/job.py:234
#: terminal/models/applet/applet.py:320 terminal/models/applet/host.py:140
#: terminal/models/component/status.py:30
@@ -682,7 +679,7 @@ msgstr "密文类型"
#: authentication/templates/authentication/_access_key_modal.html:31
#: settings/serializers/auth/radius.py:19
msgid "Secret"
msgstr "密"
msgstr "密"
#: accounts/models/base.py:42
#: accounts/serializers/automations/change_secret.py:41
@@ -709,9 +706,9 @@ msgstr "密码规则"
#: ops/models/celery.py:80 ops/models/job.py:142 ops/models/playbook.py:28
#: ops/serializers/job.py:18 orgs/models.py:82
#: perms/models/asset_permission.py:61 rbac/models/role.py:29
#: rbac/serializers/role.py:28 settings/models.py:34 settings/models.py:183
#: settings/serializers/msg.py:86 settings/serializers/terminal.py:9
#: terminal/models/applet/applet.py:33 terminal/models/component/endpoint.py:12
#: settings/models.py:34 settings/models.py:183 settings/serializers/msg.py:86
#: settings/serializers/terminal.py:9 terminal/models/applet/applet.py:33
#: terminal/models/component/endpoint.py:12
#: terminal/models/component/endpoint.py:109
#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13
#: terminal/models/component/terminal.py:85
@@ -983,7 +980,7 @@ msgstr "资产类型"
#: accounts/serializers/account/base.py:33 terminal/serializers/storage.py:149
msgid "Passphrase"
msgstr "密钥密码"
msgstr "密码"
#: accounts/serializers/account/base.py:96
msgid ""
@@ -1083,13 +1080,13 @@ msgstr "SSH 密钥更改方式"
#: accounts/serializers/automations/change_secret.py:57
msgid "Please enter your account username"
msgstr "请输入您的账户用户名"
msgstr "请输入 MFA 验证码"
#: accounts/serializers/automations/change_secret.py:62
msgid ""
"Secret parameter settings, currently only effective for assets of the host "
"type."
msgstr "参数设置当前仅对 AIX LINUX UNIX 类型资产有效"
msgstr "秘文参数设置,目前只对宿主类型资产有效"
#: accounts/serializers/automations/change_secret.py:84
msgid "* Please enter the correct password length"
@@ -1246,8 +1243,7 @@ msgstr "审批人"
#: authentication/templates/authentication/_access_key_modal.html:32
#: perms/models/asset_permission.py:82
#: terminal/models/component/endpoint.py:120
#: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44
#: tickets/const.py:36
#: terminal/models/session/sharing.py:29 tickets/const.py:36
msgid "Active"
msgstr "激活中"
@@ -1779,7 +1775,7 @@ msgstr "确认按钮选择器"
msgid "API mode"
msgstr "API 模式"
#: assets/const/types.py:248
#: assets/const/types.py:251
msgid "All types"
msgstr "所有类型"
@@ -2719,7 +2715,7 @@ msgstr "原因描述"
#: audits/serializers.py:70 audits/serializers.py:184
msgid "Auth backend display"
msgstr "认证方式"
msgstr "没有匹配到认证后端"
#: audits/serializers.py:134
#, python-format
@@ -3383,12 +3379,7 @@ msgstr "工单信息"
msgid "Actions"
msgstr "动作"
#: authentication/serializers/connection_token.py:40
#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
msgid "Org name"
msgstr "组织名称"
#: authentication/serializers/connection_token.py:43
#: authentication/serializers/connection_token.py:42
#: perms/serializers/permission.py:44 perms/serializers/permission.py:65
#: users/serializers/user.py:127 users/serializers/user.py:273
msgid "Is expired"
@@ -3659,12 +3650,11 @@ msgstr "钉钉错误,请联系系统管理员"
msgid "DingTalk Error"
msgstr "钉钉错误"
#: authentication/views/mixins.py:39
#: authentication/views/dingtalk.py:57 authentication/views/feishu.py:68
#: authentication/views/slack.py:47 authentication/views/wecom.py:55
msgid ""
"For your safety, automatic redirection login is not supported on the client. "
"If you need to open it in the client, please log in again"
msgstr ""
"为了您的安全,客户端不支持自动跳转登录。如果需要在客户端中打开,请重新登录"
"The system configuration is incorrect. Please contact your administrator"
msgstr "企业配置错误,请联系系统管理员"
#: authentication/views/dingtalk.py:61
msgid "DingTalk is already bound"
@@ -3810,7 +3800,7 @@ msgstr "运行中"
msgid "Canceled"
msgstr "取消"
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:412
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:409
#, python-format
msgid "%(name)s was created successfully"
msgstr "%(name)s 创建成功"
@@ -3928,7 +3918,7 @@ msgid ""
"information -> file encryption password to set the encryption password"
msgstr "{} - 未设置加密密码 - 请前往个人信息 -> 文件加密密码中设置加密密码"
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:38
#, python-format
msgid "%s object does not exist."
msgstr "%s对象不存在"
@@ -4282,27 +4272,27 @@ msgstr "正在创建任务,无法中断,请稍后重试。"
msgid "Currently playbook is being used in a job"
msgstr "当前 playbook 正在作业中使用"
#: ops/api/playbook.py:97
#: ops/api/playbook.py:96
msgid "Unsupported file content"
msgstr "不支持的文件内容"
#: ops/api/playbook.py:99 ops/api/playbook.py:145 ops/api/playbook.py:193
#: ops/api/playbook.py:98 ops/api/playbook.py:144 ops/api/playbook.py:192
msgid "Invalid file path"
msgstr "无效的文件路径"
#: ops/api/playbook.py:171
#: ops/api/playbook.py:170
msgid "This file can not be rename"
msgstr "该文件不能重命名"
#: ops/api/playbook.py:190
#: ops/api/playbook.py:189
msgid "File already exists"
msgstr "文件已存在"
#: ops/api/playbook.py:208
#: ops/api/playbook.py:207
msgid "File key is required"
msgstr "文件密钥该字段是必填项。"
#: ops/api/playbook.py:211
#: ops/api/playbook.py:210
msgid "This file can not be delete"
msgstr "无法删除此文件"
@@ -4523,8 +4513,7 @@ msgstr "运行用户"
msgid "Run as policy"
msgstr "用户策略"
#: ops/models/job.py:222 ops/serializers/job.py:92
#: terminal/notifications.py:174
#: ops/models/job.py:222 terminal/notifications.py:174
msgid "Job"
msgstr "作业"
@@ -4536,7 +4525,7 @@ msgstr "Material"
msgid "Material Type"
msgstr "Material 类型"
#: ops/models/job.py:548
#: ops/models/job.py:545
msgid "Job Execution"
msgstr "作业执行"
@@ -4600,11 +4589,7 @@ msgstr "任务类型"
msgid "Is finished"
msgstr "是否完成"
#: ops/serializers/job.py:89
msgid "Task id"
msgstr "任务 ID"
#: ops/serializers/job.py:98
#: ops/serializers/job.py:90
msgid "You do not have permission for the current job."
msgstr "你没有当前作业的权限。"
@@ -4707,6 +4692,10 @@ msgstr "请选择一个组织后再保存"
msgid "Organization"
msgstr "组织"
#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
msgid "Org name"
msgstr "组织名称"
#: orgs/models.py:14
msgid "GLOBAL"
msgstr "全局组织"
@@ -5014,6 +5003,11 @@ msgstr "系统角色绑定"
msgid "Perms"
msgstr "权限"
#: rbac/serializers/role.py:28 terminal/models/applet/applet.py:34
#: terminal/models/virtualapp/virtualapp.py:20
msgid "Display name"
msgstr "显示名称"
#: rbac/serializers/rolebinding.py:60
msgid "Has bound this role"
msgstr "已经绑定"
@@ -5292,8 +5286,8 @@ msgstr ""
"以此邮箱后缀创建用户"
#: settings/serializers/auth/base.py:35
msgid "Forgot Password URL"
msgstr "忘记密码的 URL"
msgid "Forgot Password"
msgstr "忘记密码"
#: settings/serializers/auth/base.py:36
msgid "The URL for Forgotten Password on the user login page"
@@ -5388,15 +5382,15 @@ msgstr "绑定 DN"
#: settings/serializers/auth/ldap.py:47
msgid "Binding Distinguished Name"
msgstr "绑定目录管理员"
msgstr "绑定专有名称"
#: settings/serializers/auth/ldap.py:51
msgid "Binding password"
msgstr "绑定密码"
msgstr "原来密码"
#: settings/serializers/auth/ldap.py:54
msgid "Search OU"
msgstr "用户 OU"
msgstr "系统架构"
#: settings/serializers/auth/ldap.py:56
msgid ""
@@ -5561,7 +5555,7 @@ msgstr "域"
#: settings/serializers/auth/oidc.py:70
msgid "OpenID Connect"
msgstr "OpenID 连接"
msgstr "连接"
#: settings/serializers/auth/oidc.py:73
msgid "Provider endpoint"
@@ -5686,7 +5680,7 @@ msgstr "验证码长度"
#: settings/serializers/auth/sms.py:26
msgid "Length of the sent verification code"
msgstr "发送验证码的长度"
msgstr "发送验证码"
#: settings/serializers/auth/sms.py:31 settings/serializers/auth/sms.py:54
#: settings/serializers/auth/sms.py:62 settings/serializers/auth/sms.py:71
@@ -5903,8 +5897,8 @@ msgid "Chat AI"
msgstr "聊天 AI"
#: settings/serializers/feature.py:80
msgid "GPT Base URL"
msgstr "GPT 地址"
msgid "Base URL"
msgstr "JumpServer 地址"
#: settings/serializers/feature.py:81
msgid "The base URL of the GPT service. For example: https://api.openai.com/v1"
@@ -5993,7 +5987,7 @@ msgstr ""
#: settings/serializers/msg.py:33
msgid "The user to be used for email server authentication"
msgstr "登录到邮件服务器的用户名。这通常是你的邮件地址"
msgstr "SSO认证时如果没有返回邮件地址将使用该后缀"
#: settings/serializers/msg.py:37
msgid ""
@@ -6966,11 +6960,6 @@ msgstr "社区版"
msgid "Enterprise"
msgstr "企业版"
#: terminal/models/applet/applet.py:34
#: terminal/models/virtualapp/virtualapp.py:20
msgid "Display name"
msgstr "显示名称"
#: terminal/models/applet/applet.py:36
#: terminal/models/virtualapp/virtualapp.py:22
msgid "Author"
@@ -8564,7 +8553,7 @@ msgstr "组织管理员"
#: users/serializers/user.py:140
msgid "Can public key authentication"
msgstr "可以使用公钥认证"
msgstr "可以公钥认证"
#: users/serializers/user.py:242
msgid "Full name"
@@ -9087,7 +9076,7 @@ msgstr "任务执行 ID"
#: xpack/plugins/cloud/manager.py:97
msgid "Synchronization regions"
msgstr "同步地区"
msgstr "没有用户需要同步"
#: xpack/plugins/cloud/manager.py:115
#, python-format
@@ -9099,49 +9088,49 @@ msgstr "获取区域 \"%s\" 的实例错误,错误:%s"
msgid "Failed to synchronize the instance \"%s\""
msgstr "无法同步实例 %s"
#: xpack/plugins/cloud/manager.py:337
#: xpack/plugins/cloud/manager.py:334
#, python-format
msgid ""
"The updated platform of asset \"%s\" is inconsistent with the original "
"platform type. Skip platform and protocol updates"
msgstr "资产“%s”的更新平台与原平台类型不一致。跳过平台和协议更新"
#: xpack/plugins/cloud/manager.py:393
#: xpack/plugins/cloud/manager.py:390
#, python-format
msgid "The asset \"%s\" already exists"
msgstr "资产 \"%s\" 已存在"
#: xpack/plugins/cloud/manager.py:395
#: xpack/plugins/cloud/manager.py:392
#, python-format
msgid "Update asset \"%s\""
msgstr "更新资产 \"%s\""
#: xpack/plugins/cloud/manager.py:398
#: xpack/plugins/cloud/manager.py:395
#, python-format
msgid "Asset \"%s\" has been updated"
msgstr "资产 \"%s\" 已更新"
#: xpack/plugins/cloud/manager.py:408
#: xpack/plugins/cloud/manager.py:405
#, python-format
msgid "Prepare to create asset \"%s\""
msgstr "准备创建资产 %s"
#: xpack/plugins/cloud/manager.py:429
#: xpack/plugins/cloud/manager.py:426
#, python-format
msgid "Set nodes \"%s\""
msgstr "删除节点: \"%s\""
#: xpack/plugins/cloud/manager.py:455
#: xpack/plugins/cloud/manager.py:452
#, python-format
msgid "Set accounts \"%s\""
msgstr "删除账号: %s"
#: xpack/plugins/cloud/manager.py:471
#: xpack/plugins/cloud/manager.py:468
#, python-format
msgid "Set protocols \"%s\""
msgstr "设置协议 \"%s\""
#: xpack/plugins/cloud/manager.py:485 xpack/plugins/cloud/tasks.py:27
#: xpack/plugins/cloud/manager.py:482 xpack/plugins/cloud/tasks.py:27
msgid "Run sync instance task"
msgstr "执行同步实例任务"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-16 18:58+0800\n"
"POT-Creation-Date: 2024-07-03 16:39+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"
@@ -65,8 +65,7 @@ msgstr "完成"
#: accounts/automations/backup_account/handlers.py:219
#: accounts/const/automation.py:110
#: accounts/serializers/automations/change_secret.py:166
#: assets/serializers/automations/base.py:52 audits/const.py:64
#: accounts/serializers/automations/change_secret.py:166 audits/const.py:64
#: audits/models.py:64 audits/signal_handlers/activity_log.py:33
#: common/const/choices.py:18 ops/const.py:74 ops/serializers/celery.py:48
#: terminal/const.py:78 terminal/models/session/sharing.py:121
@@ -305,9 +304,8 @@ msgstr "信箱"
msgid "SFTP"
msgstr "SFTP"
#: accounts/const/automation.py:111 assets/serializers/automations/base.py:54
#: common/const/choices.py:16 terminal/const.py:77 tickets/const.py:29
#: tickets/const.py:38
#: accounts/const/automation.py:111 common/const/choices.py:16
#: terminal/const.py:77 tickets/const.py:29 tickets/const.py:38
msgid "Pending"
msgstr "待定的"
@@ -396,7 +394,7 @@ msgstr "來源 ID"
#: terminal/templates/terminal/_msg_command_warning.html:8
#: terminal/templates/terminal/_msg_session_sharing.html:8
#: tickets/models/ticket/command_confirm.py:13
#: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/ws.py:37
#: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/ws.py:38
msgid "Account"
msgstr "帳號"
@@ -485,7 +483,7 @@ msgstr "帳號備份快照"
#: accounts/serializers/account/backup.py:48
#: accounts/serializers/automations/base.py:56
#: assets/models/automations/base.py:122
#: assets/serializers/automations/base.py:40
#: assets/serializers/automations/base.py:39
msgid "Trigger mode"
msgstr "觸發模式"
@@ -578,8 +576,7 @@ msgid "Date finished"
msgstr "結束日期"
#: accounts/models/automations/change_secret.py:44
#: assets/models/automations/base.py:113
#: assets/serializers/automations/base.py:39 audits/models.py:208
#: assets/models/automations/base.py:113 audits/models.py:208
#: audits/serializers.py:54 ops/models/base.py:49 ops/models/job.py:234
#: terminal/models/applet/applet.py:320 terminal/models/applet/host.py:140
#: terminal/models/component/status.py:30
@@ -684,7 +681,7 @@ msgstr "密文類型"
#: authentication/templates/authentication/_access_key_modal.html:31
#: settings/serializers/auth/radius.py:19
msgid "Secret"
msgstr "飛文"
msgstr "金鑰"
#: accounts/models/base.py:42
#: accounts/serializers/automations/change_secret.py:41
@@ -711,9 +708,9 @@ msgstr "密碼規則"
#: ops/models/celery.py:80 ops/models/job.py:142 ops/models/playbook.py:28
#: ops/serializers/job.py:18 orgs/models.py:82
#: perms/models/asset_permission.py:61 rbac/models/role.py:29
#: rbac/serializers/role.py:28 settings/models.py:34 settings/models.py:183
#: settings/serializers/msg.py:86 settings/serializers/terminal.py:9
#: terminal/models/applet/applet.py:33 terminal/models/component/endpoint.py:12
#: settings/models.py:34 settings/models.py:183 settings/serializers/msg.py:86
#: settings/serializers/terminal.py:9 terminal/models/applet/applet.py:33
#: terminal/models/component/endpoint.py:12
#: terminal/models/component/endpoint.py:109
#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13
#: terminal/models/component/terminal.py:85
@@ -771,8 +768,10 @@ msgid "Secret from login"
msgstr "與用戶登錄時相同"
#: accounts/models/virtual.py:18
#, fuzzy
#| msgid "Email account"
msgid "Virtual account"
msgstr "虛擬帳號"
msgstr "信箱帳號"
#: accounts/models/virtual.py:28
msgid "Same with user"
@@ -985,7 +984,7 @@ msgstr "資產類型"
#: accounts/serializers/account/base.py:33 terminal/serializers/storage.py:149
msgid "Passphrase"
msgstr "密鑰密碼"
msgstr "密碼"
#: accounts/serializers/account/base.py:96
msgid ""
@@ -1085,13 +1084,13 @@ msgstr "SSH 金鑰更改方式"
#: accounts/serializers/automations/change_secret.py:57
msgid "Please enter your account username"
msgstr "請輸入您的帳戶使用者名稱"
msgstr "請輸入 MFA 驗證碼"
#: accounts/serializers/automations/change_secret.py:62
msgid ""
"Secret parameter settings, currently only effective for assets of the host "
"type."
msgstr "參數設置,目前只對 AIX LINUX UNIX 類型的資產有效。"
msgstr "密文參數設定, 目前只對宿主型的資產有效。"
#: accounts/serializers/automations/change_secret.py:84
msgid "* Please enter the correct password length"
@@ -1248,8 +1247,7 @@ msgstr "審批人"
#: authentication/templates/authentication/_access_key_modal.html:32
#: perms/models/asset_permission.py:82
#: terminal/models/component/endpoint.py:120
#: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44
#: tickets/const.py:36
#: terminal/models/session/sharing.py:29 tickets/const.py:36
msgid "Active"
msgstr "啟用中"
@@ -1781,7 +1779,7 @@ msgstr "確認按鈕選擇器"
msgid "API mode"
msgstr "API 模式"
#: assets/const/types.py:248
#: assets/const/types.py:251
msgid "All types"
msgstr "所有類型"
@@ -2721,7 +2719,7 @@ msgstr "原因描述"
#: audits/serializers.py:70 audits/serializers.py:184
msgid "Auth backend display"
msgstr "認證方式"
msgstr "没有匹配到认证后端"
#: audits/serializers.py:134
#, python-format
@@ -3385,12 +3383,7 @@ msgstr "工單資訊"
msgid "Actions"
msgstr "動作"
#: authentication/serializers/connection_token.py:40
#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
msgid "Org name"
msgstr "組織名稱"
#: authentication/serializers/connection_token.py:43
#: authentication/serializers/connection_token.py:42
#: perms/serializers/permission.py:44 perms/serializers/permission.py:65
#: users/serializers/user.py:127 users/serializers/user.py:273
msgid "Is expired"
@@ -3661,12 +3654,11 @@ msgstr "釘釘錯誤,請聯絡系統管理員"
msgid "DingTalk Error"
msgstr "釘釘錯誤"
#: authentication/views/mixins.py:39
#: authentication/views/dingtalk.py:57 authentication/views/feishu.py:68
#: authentication/views/slack.py:47 authentication/views/wecom.py:55
msgid ""
"For your safety, automatic redirection login is not supported on the client. "
"If you need to open it in the client, please log in again"
msgstr ""
"為了您的安全,客戶端不支持自動跳轉登錄。如果需要在客戶端中打開,請重新登錄"
"The system configuration is incorrect. Please contact your administrator"
msgstr "企業配置錯誤,請聯絡系統管理員"
#: authentication/views/dingtalk.py:61
msgid "DingTalk is already bound"
@@ -3812,7 +3804,7 @@ msgstr "運行中"
msgid "Canceled"
msgstr "取消"
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:412
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:409
#, python-format
msgid "%(name)s was created successfully"
msgstr "%(name)s 創建成功"
@@ -3930,7 +3922,7 @@ msgid ""
"information -> file encryption password to set the encryption password"
msgstr "{} - 未設置加密密碼 - 請前往個人資訊 -> 文件加密密碼中設置加密密碼"
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:38
#, python-format
msgid "%s object does not exist."
msgstr "%s對象不存在"
@@ -4283,27 +4275,27 @@ msgstr "正在創建任務,無法中斷,請稍後重試。"
msgid "Currently playbook is being used in a job"
msgstr "當前 playbook 正在作業中使用"
#: ops/api/playbook.py:97
#: ops/api/playbook.py:96
msgid "Unsupported file content"
msgstr "不支持的文件內容"
#: ops/api/playbook.py:99 ops/api/playbook.py:145 ops/api/playbook.py:193
#: ops/api/playbook.py:98 ops/api/playbook.py:144 ops/api/playbook.py:192
msgid "Invalid file path"
msgstr "無效的文件路徑"
#: ops/api/playbook.py:171
#: ops/api/playbook.py:170
msgid "This file can not be rename"
msgstr "該文件不能重命名"
#: ops/api/playbook.py:190
#: ops/api/playbook.py:189
msgid "File already exists"
msgstr "文件已存在"
#: ops/api/playbook.py:208
#: ops/api/playbook.py:207
msgid "File key is required"
msgstr "文件金鑰該欄位是必填項。"
#: ops/api/playbook.py:211
#: ops/api/playbook.py:210
msgid "This file can not be delete"
msgstr "無法刪除此文件"
@@ -4526,8 +4518,7 @@ msgstr "執行使用者"
msgid "Run as policy"
msgstr "使用者策略"
#: ops/models/job.py:222 ops/serializers/job.py:92
#: terminal/notifications.py:174
#: ops/models/job.py:222 terminal/notifications.py:174
msgid "Job"
msgstr "作業"
@@ -4539,7 +4530,7 @@ msgstr "Material"
msgid "Material Type"
msgstr "Material 類型"
#: ops/models/job.py:548
#: ops/models/job.py:545
msgid "Job Execution"
msgstr "作業執行"
@@ -4603,11 +4594,7 @@ msgstr "任務類型"
msgid "Is finished"
msgstr "是否完成"
#: ops/serializers/job.py:89
msgid "Task id"
msgstr "任務 ID"
#: ops/serializers/job.py:98
#: ops/serializers/job.py:90
msgid "You do not have permission for the current job."
msgstr "你沒有當前作業的權限。"
@@ -4710,6 +4697,10 @@ msgstr "請選擇一個組織後再保存"
msgid "Organization"
msgstr "組織"
#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
msgid "Org name"
msgstr "組織名稱"
#: orgs/models.py:14
msgid "GLOBAL"
msgstr "全局組織"
@@ -5019,6 +5010,11 @@ msgstr "系統角色綁定"
msgid "Perms"
msgstr "權限"
#: rbac/serializers/role.py:28 terminal/models/applet/applet.py:34
#: terminal/models/virtualapp/virtualapp.py:20
msgid "Display name"
msgstr "顯示名稱"
#: rbac/serializers/rolebinding.py:60
msgid "Has bound this role"
msgstr "已經綁定"
@@ -5297,8 +5293,8 @@ msgstr ""
"統將自動以此電子信箱後綴建立使用者"
#: settings/serializers/auth/base.py:35
msgid "Forgot Password URL"
msgstr "忘記密碼連結"
msgid "Forgot Password"
msgstr "忘記密碼"
#: settings/serializers/auth/base.py:36
msgid "The URL for Forgotten Password on the user login page"
@@ -5393,15 +5389,15 @@ msgstr "綁定 DN"
#: settings/serializers/auth/ldap.py:47
msgid "Binding Distinguished Name"
msgstr "綁定目錄管理員"
msgstr "綁定專有名稱"
#: settings/serializers/auth/ldap.py:51
msgid "Binding password"
msgstr "綁定密碼"
msgstr "原來的密碼"
#: settings/serializers/auth/ldap.py:54
msgid "Search OU"
msgstr "使用者 OU"
msgstr "系統架構"
#: settings/serializers/auth/ldap.py:56
msgid ""
@@ -5566,7 +5562,7 @@ msgstr "域"
#: settings/serializers/auth/oidc.py:70
msgid "OpenID Connect"
msgstr "OpenID 連接"
msgstr "Connect"
#: settings/serializers/auth/oidc.py:73
msgid "Provider endpoint"
@@ -5691,7 +5687,7 @@ msgstr "驗證碼長度"
#: settings/serializers/auth/sms.py:26
msgid "Length of the sent verification code"
msgstr "發送驗證碼長度"
msgstr "發送驗證碼"
#: settings/serializers/auth/sms.py:31 settings/serializers/auth/sms.py:54
#: settings/serializers/auth/sms.py:62 settings/serializers/auth/sms.py:71
@@ -5908,8 +5904,8 @@ msgid "Chat AI"
msgstr "聊天 AI"
#: settings/serializers/feature.py:80
msgid "GPT Base URL"
msgstr "GPT 地址"
msgid "Base URL"
msgstr "JumpServer 地址"
#: settings/serializers/feature.py:81
msgid "The base URL of the GPT service. For example: https://api.openai.com/v1"
@@ -5998,13 +5994,15 @@ msgstr ""
#: settings/serializers/msg.py:33
msgid "The user to be used for email server authentication"
msgstr "登入郵件伺服器的使用者名稱。這通常是你的郵件地址"
msgstr "SSO認證時如果沒有返回郵件地址將使用該後綴"
#: settings/serializers/msg.py:37
msgid ""
"Password to use for the email server. It is used in conjunction with `User` "
"when authenticating to the email server"
msgstr "登入郵件伺服器的密碼"
msgstr ""
"用於電子郵件伺服器的密碼。在向電子郵件伺服器進行身份驗證時,它與使用者一起使"
"用"
#: settings/serializers/msg.py:40
msgid "Sender"
@@ -6970,11 +6968,6 @@ msgstr "社區版"
msgid "Enterprise"
msgstr "企業版"
#: terminal/models/applet/applet.py:34
#: terminal/models/virtualapp/virtualapp.py:20
msgid "Display name"
msgstr "顯示名稱"
#: terminal/models/applet/applet.py:36
#: terminal/models/virtualapp/virtualapp.py:22
msgid "Author"
@@ -9101,7 +9094,7 @@ msgstr "Action 執行 ID"
#: xpack/plugins/cloud/manager.py:97
msgid "Synchronization regions"
msgstr "同步地區"
msgstr "沒有需要同步的使用者"
#: xpack/plugins/cloud/manager.py:115
#, python-format
@@ -9114,7 +9107,7 @@ msgstr ""
msgid "Failed to synchronize the instance \"%s\""
msgstr "Unable to synchronize instance %s"
#: xpack/plugins/cloud/manager.py:337
#: xpack/plugins/cloud/manager.py:334
#, python-format
msgid ""
"The updated platform of asset \"%s\" is inconsistent with the original "
@@ -9123,42 +9116,42 @@ msgstr ""
"The update platform of asset \"%s\" is not consistent with the original "
"platform type. Skip platform and protocol updates"
#: xpack/plugins/cloud/manager.py:393
#: xpack/plugins/cloud/manager.py:390
#, python-format
msgid "The asset \"%s\" already exists"
msgstr "\"資產 \"%s\" 已存在"
#: xpack/plugins/cloud/manager.py:395
#: xpack/plugins/cloud/manager.py:392
#, python-format
msgid "Update asset \"%s\""
msgstr "更新資產 \"%s\""
#: xpack/plugins/cloud/manager.py:398
#: xpack/plugins/cloud/manager.py:395
#, python-format
msgid "Asset \"%s\" has been updated"
msgstr "資產 \"%s\" 已更新"
#: xpack/plugins/cloud/manager.py:408
#: xpack/plugins/cloud/manager.py:405
#, python-format
msgid "Prepare to create asset \"%s\""
msgstr "Preparing to create asset %s"
#: xpack/plugins/cloud/manager.py:429
#: xpack/plugins/cloud/manager.py:426
#, python-format
msgid "Set nodes \"%s\""
msgstr "Delete Node: \"%s\""
#: xpack/plugins/cloud/manager.py:455
#: xpack/plugins/cloud/manager.py:452
#, python-format
msgid "Set accounts \"%s\""
msgstr "刪除帳號: %s"
#: xpack/plugins/cloud/manager.py:471
#: xpack/plugins/cloud/manager.py:468
#, python-format
msgid "Set protocols \"%s\""
msgstr "設定協議 \"%s\""
#: xpack/plugins/cloud/manager.py:485 xpack/plugins/cloud/tasks.py:27
#: xpack/plugins/cloud/manager.py:482 xpack/plugins/cloud/tasks.py:27
msgid "Run sync instance task"
msgstr "執行同步實例任務"

View File

@@ -924,7 +924,7 @@
"RecentSession": "Recent sessions",
"RecentlyUsed": "Recently",
"Recipient": "Recipient",
"RecipientHelpText": "If both recipients A and B are set, the account's ciphertext will be split into two parts; if only one recipient is set, the key will not be split.",
"RecipientHelpText": "If both recipient a and b are set, the account's key will be split into two parts",
"RecipientServer": "Receiving server",
"Reconnect": "Reconnect",
"Refresh": "Refresh",
@@ -963,7 +963,7 @@
"RequiredAssetOrNode": "Please select at least one asset or node",
"RequiredContent": "Please input command",
"RequiredEntryFile": "This file acts as the entry point for running and must be present",
"RequiredRunas": "Enter exec user",
"RequiredRunas": "Please enter the execution user",
"RequiredSystemUserErrMsg": "Please select account",
"RequiredUploadFile": "Please upload the file!",
"Reset": "Reset",
@@ -1101,6 +1101,7 @@
"Setting": "Setting",
"SettingInEndpointHelpText": "Configure service address and port in system settings / component settings / server endpoints",
"Settings": "System settings",
"Settings...": "Settings...",
"Show": "Display",
"ShowAssetAllChildrenNode": "Show all sub-nodes assets",
"ShowAssetOnlyCurrentNode": "Only show current node assets",
@@ -1383,10 +1384,5 @@
"ZoneList": "Zones",
"ZoneUpdate": "Update the zone",
"forceEnableMFAHelpText": "If force enable, user can not disable by themselves",
"removeWarningMsg": "Are you sure you want to remove",
"RetrySelected": "Retry selected",
"ApproveSelected": "Approve selected",
"Running": "Running",
"AdhocCreate": "Create the command",
"UploadHelpText": "Please upload a .zip file containing the following sample directory structure"
"removeWarningMsg": "Are you sure you want to remove"
}

View File

@@ -699,7 +699,7 @@
"LoginAssetToday": "本日のアクティブな資産数",
"LoginAssets": "アクティブな資産",
"LoginConfirm": "ログインレビュー",
"LoginConfirmUser": "ログインレビュー担当者",
"LoginConfirmUser": "確認方法",
"LoginCount": "ログイン回数",
"LoginDate": "ログイン日",
"LoginFailed": "ログイン失敗",
@@ -957,7 +957,7 @@
"RecentSession": "最近の会話",
"RecentlyUsed": "最近使用",
"Recipient": "受取人",
"RecipientHelpText": "受信者 A と B が同時に設定されている場合、アカウントの暗号文は 2 つの部分に分割されます。受信者が 1 つだけ設定されている場合、キーは分割されません。",
"RecipientHelpText": "A B受信者が設定されている場合、アカウントの鍵は前後二つに分割されます",
"RecipientServer": "受信サーバー",
"Reconnect": "再接続",
"Refresh": "更新",
@@ -996,7 +996,7 @@
"RequiredAssetOrNode": "少なくとも一つの資産またはノードを選択してください",
"RequiredContent": "コマンドを入力してください",
"RequiredEntryFile": "このファイルは実行のエントリポイントとして存在する必要があります",
"RequiredRunas": "実行ユーザーを入力",
"RequiredRunas": "実行ユーザーを入力してください",
"RequiredSystemUserErrMsg": "アカウントを選択してください",
"RequiredUploadFile": "ファイルをアップロードしてください!",
"Reset": "復元",
@@ -1135,6 +1135,7 @@
"Setting": "設定",
"SettingInEndpointHelpText": "システム設定/コンポーネント設定/サーバーエンドポイントでサービスのアドレスとポートを設定してください",
"Settings": "システム設定",
"Settings...": "設定...",
"Show": "表示",
"ShowAssetAllChildrenNode": "すべての子ノードの資産を表示",
"ShowAssetOnlyCurrentNode": "現在のノードアセットのみを表示",
@@ -1422,7 +1423,5 @@
"ZoneList": "地域リスト",
"ZoneUpdate": "更新エリア",
"forceEnableMFAHelpText": "強制的に有効化すると、ユーザーは自分で無効化することができません。",
"removeWarningMsg": "削除してもよろしいですか",
"AdhocCreate": "アドホックコマンドを作成",
"UploadHelpText": "次のサンプル構造ディレクトリを含む .zip ファイルをアップロードしてください。"
"removeWarningMsg": "削除してもよろしいですか"
}

View File

@@ -246,7 +246,7 @@
"CeleryTaskLog": "Celery任务日志",
"Certificate": "证书",
"CertificateKey": "客户端密钥",
"ChangeCredentials": "账号改密",
"ChangeCredentials": "改密",
"ChangeCredentialsHelpText": "定时修改账号密钥密码。账号随机生成密码,并同步到目标资产,如果同步成功,更新该账号的密码",
"ChangeField": "变更字段",
"ChangeOrganization": "更改组织",
@@ -508,7 +508,7 @@
"FeiShuOAuth": "飞书认证",
"FeiShuTest": "测试",
"FieldRequiredError": "此字段是必填项",
"FileExplorer": "文件管理",
"FileExplorer": "文件浏览",
"FileManagement": "文件管理",
"FileNameTooLong": "文件名太长",
"FileSizeExceedsLimit": "文件大小超出限制",
@@ -676,7 +676,7 @@
"LoginAssetToday": "今日活跃资产数",
"LoginAssets": "活跃资产",
"LoginConfirm": "登录复核",
"LoginConfirmUser": "登录复核 受理人",
"LoginConfirmUser": "确认方式",
"LoginCount": "登录次数",
"LoginDate": "登录日期",
"LoginFailed": "登录失败",
@@ -926,7 +926,7 @@
"RecentSession": "最近会话",
"RecentlyUsed": "最近使用",
"Recipient": "接收人",
"RecipientHelpText": "如果同时设置了收件人A和B,账号的密将被拆分为两部分;如果只设置了一个收件人,密钥则不会被拆分。",
"RecipientHelpText": "若收件人 A B 都设置,账号的密将被拆分成前后两部分",
"RecipientServer": "接收服务器",
"Reconnect": "重新连接",
"Refresh": "刷新",
@@ -1103,6 +1103,7 @@
"Setting": "设置",
"SettingInEndpointHelpText": "在 系统设置 / 组件设置 / 服务端点 中配置服务地址和端口",
"Settings": "系统设置",
"Settings...": "设置...",
"Show": "显示",
"ShowAssetAllChildrenNode": "显示所有子节点资产",
"ShowAssetOnlyCurrentNode": "仅显示当前节点资产",
@@ -1384,11 +1385,5 @@
"ZoneList": "网域列表",
"ZoneUpdate": "更新网域",
"forceEnableMFAHelpText": "如果强制启用,用户无法自行禁用",
"removeWarningMsg": "你确定要移除",
"VaultHCPMountPoint": "Vault 服务器的挂载点,默认为 jumpserver",
"RetrySelected": "重试所选",
"ApproveSelected": "审批所选",
"Running": "运行中",
"AdhocCreate": "创建命令",
"UploadHelpText": "请上传包含以下示例结构目录的 .zip 压缩文件"
"removeWarningMsg": "你确定要移除"
}

View File

@@ -903,7 +903,7 @@
"LoginCity": "登入城市",
"LoginConfig": "登入配置",
"LoginConfirm": "登入覆核",
"LoginConfirmUser": "登錄複核 受理人",
"LoginConfirmUser": "確認方式",
"LoginCount": "登入次數",
"LoginDate": "登入日期",
"LoginFailed": "登入失敗",
@@ -1239,7 +1239,7 @@
"RecentSession": "最近會話",
"RecentlyUsed": "最近使用",
"Recipient": "接收人",
"RecipientHelpText": "如果同時設定了收件人A和B,帳號的密文將被拆分為兩部分;如果只設定了一個收件人,密鑰則不會被拆分。",
"RecipientHelpText": "若收件人 A B 都設置,帳號的金鑰將被拆分成前後兩部分。如用戶未設置加密密碼 - 請前往個人資訊 -> 偏好設置中設置加密密碼",
"RecipientServer": "接收伺服器",
"Reconnect": "重新連接",
"Refresh": "刷新",
@@ -1459,6 +1459,7 @@
"Setting": "設置",
"SettingInEndpointHelpText": "在 系統設置 / 組件設置 / 服務端點 中配置服務地址和埠",
"Settings": "系統設置",
"Settings...": " Settings...",
"Show": "顯示",
"ShowAssetAllChildrenNode": "顯示所有子節點資產",
"ShowAssetOnlyCurrentNode": "僅顯示當前節點資產",
@@ -1908,7 +1909,7 @@
"consult": "諮詢",
"containerName": "容器名稱",
"contents": "內容",
"AdhocCreate": "創建命令",
"createAdhoc": "創建命令",
"createBy": "創建者",
"createErrorMsg": "創建失敗",
"createSuccessMsg": "導入創建成功,總共:{count}",
@@ -2267,6 +2268,5 @@
"weComTest": "測試",
"week": "周",
"weekOf": "周的星期",
"wildcardsAllowed": "允許的通配符",
"UploadHelpText": "請上傳包含以下範例結構目錄的 .zip 壓縮文件"
"wildcardsAllowed": "允許的通配符"
}

View File

@@ -209,9 +209,6 @@
"asset": "asset",
"cols": "cols",
"confirm": "confirm",
"connectDisabledTipsNoAccount": "Tips: No valid authorization account found, current resource cannot be connected. Please contact the administrator for assistance",
"connectDisabledTipsNoConnectMethod": "Tips: No valid connection method found, current resource cannot be connected. Please contact the administrator for assistance",
"connectDisabledTipsMethodDisabled": "Tips: No valid remote application deployment machine found, current resource cannot be connected. Please contact the administrator for assistance",
"connect info": "connect info",
"download": "download",
"rows": "rows",

View File

@@ -207,9 +207,6 @@
"asset": "资产",
"cols": "列数",
"confirm": "确认",
"connectDisabledTipsNoAccount": "提示:未找到有效的授权账号,当前资源无法连接,请联系管理员进行处理",
"connectDisabledTipsNoConnectMethod": "提示:未找到有效的连接方式,当前资源无法连接,请联系管理员进行处理",
"connectDisabledTipsMethodDisabled": "提示:未找到有效的远程应用发布机,当前资源无法连接,请联系管理员进行处理",
"connect info": "连接信息",
"download": "下载",
"rows": "行数",

View File

@@ -106,7 +106,7 @@ class DateTimeMixin:
@lazyproperty
def user_login_logs_on_the_system_queryset(self):
qs = UserLoginLog.objects.filter(status=LoginStatusChoices.success)
qs = UserLoginLog.objects.all()
qs = self.get_logs_queryset_filter(qs, 'datetime')
queryset = qs.filter(username__in=construct_userlogin_usernames(self.users))
return queryset

View File

@@ -8,7 +8,7 @@ __all__ = ['BASE_DIR', 'PROJECT_DIR', 'VERSION', 'CONFIG']
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_DIR = os.path.dirname(BASE_DIR)
VERSION = '2.0.0'
VERSION = 'v4.0.0'
CONFIG = ConfigManager.load_user_config()

View File

@@ -19,7 +19,7 @@ def kill_ansible_ssh_process(pid):
for child in process.children(recursive=True):
if not _should_kill(child):
continue
return
try:
child.kill()
except Exception as e:

View File

@@ -105,7 +105,7 @@ class PlaybookRunner:
shutil.rmtree(private_env)
kwargs = dict(kwargs)
if self.isolate and not is_macos():
if self.isolate and not is_macos:
kwargs['process_isolation'] = True
kwargs['process_isolation_executable'] = 'bwrap'

View File

@@ -270,10 +270,7 @@ class JobExecutionTaskDetail(APIView):
execution = get_object_or_404(JobExecution, pk=task_id, creator=request.user)
return Response(data={
'status': {
'value': execution.status,
'label': execution.get_status_display()
},
'status': execution.status,
'is_finished': execution.is_finished,
'is_success': execution.is_success,
'time_cost': execution.time_cost,

View File

@@ -248,9 +248,6 @@ class JobExecution(JMSOrgBaseModel):
# clean up zombie execution
def get_status_display(self):
return dict(JobStatus.choices).get(self.status, self.status)
@classmethod
def clean_unexpected_execution(cls):
for execution in cls.objects.filter(status__in=[JobStatus.running]).all():
@@ -423,7 +420,6 @@ class JobExecution(JMSOrgBaseModel):
this.result.update(cb.result)
else:
this.result = cb.result
this.result = json.loads(json.dumps(this.result).replace('\\u0000', ''))
this.finish_task()
def finish_task(self):

View File

@@ -1,4 +1,3 @@
from django.conf import settings
from django.template.loader import render_to_string
from django.utils.translation import gettext
from django.utils.translation import gettext_lazy as _
@@ -135,10 +134,9 @@ class ServerPerformanceCheckUtil(object):
def initial_terminals(self):
terminals = []
exclude_types = [TerminalType.core, TerminalType.celery, TerminalType.kael]
if not settings.XPACK_LICENSE_IS_VALID:
exclude_types.append(TerminalType.magnus)
for terminal in Terminal.objects.filter(is_deleted=False).exclude(type__in=exclude_types):
for terminal in Terminal.objects.filter(is_deleted=False).exclude(
type__in=[TerminalType.core, TerminalType.celery]
):
if not terminal.is_active:
continue
terminal.stat = Status.get_terminal_latest_stat(terminal)

View File

@@ -84,14 +84,6 @@ class JobExecutionSerializer(BulkOrgResourceModelSerializer):
fields = read_only_fields + [
"job", "parameters", "creator"
]
extra_kwargs = {
"task_id": {
"label": _("Task id"),
},
"job": {
"label": _("Job"),
}
}
def validate_job(self, job_obj):
if job_obj.creator != self.context['request'].user:

View File

@@ -1,11 +1,10 @@
# Generated by Django 4.1.13 on 2024-05-09 03:16
import uuid
import django.contrib.auth.models
import django.contrib.contenttypes.models
import django.db.models.deletion
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
@@ -55,7 +54,6 @@ class Migration(migrations.Migration):
'proxy': True,
'indexes': [],
'constraints': [],
'verbose_name': 'ContentType'
},
bases=('contenttypes.contenttype',),
managers=[

View File

@@ -25,7 +25,7 @@ class RoleSerializer(serializers.ModelSerializer):
extra_kwargs = {
'permissions': {'write_only': True},
'users_amount': {'label': _('Users amount')},
'display_name': {'label': _('Name')}
'display_name': {'label': _('Display name')}
}

View File

@@ -32,7 +32,7 @@ class AuthSettingSerializer(serializers.Serializer):
)
FORGOT_PASSWORD_URL = serializers.CharField(
required=False, allow_blank=True, max_length=1024,
label=_("Forgot Password URL"),
label=_("Forgot Password"),
help_text=_("The URL for Forgotten Password on the user login page")
)
LOGIN_REDIRECT_MSG_ENABLED = serializers.BooleanField(

View File

@@ -77,7 +77,7 @@ class ChatAISettingSerializer(serializers.Serializer):
required=False, label=_('Chat AI')
)
GPT_BASE_URL = serializers.CharField(
allow_blank=True, required=False, label=_('GPT Base URL'),
allow_blank=True, required=False, label=_('Base URL'),
help_text=_('The base URL of the GPT service. For example: https://api.openai.com/v1')
)
GPT_API_KEY = EncryptedField(

View File

@@ -14,11 +14,8 @@
RDS_fSingleSessionPerUser: 1
RDS_MaxDisconnectionTime: 60000
RDS_RemoteAppLogoffTimeLimit: 0
TinkerInstaller: Tinker_Installer.exe
INSTALL_APPLETS: true
PYTHON_VERSION: 3.11.6
CHROME_VERSION: 118.0.5993.118
CHROME_DRIVER_VERSION: 118.0.5993.70
TINKER_VERSION: v0.1.6
tasks:
- block:
@@ -28,11 +25,9 @@
method: GET
follow_redirects: none
status_code: [200, 301, 302, 303, 307, 308]
validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
register: core_host_redirects
- name: Check failed
fail:
- fail:
msg: "CORE_HOST {{ CORE_HOST }} is redirecting to {{ core_host_redirects.location }}, please use the final url"
when: core_host_redirects.status_code >= 300 and core_host_redirects.status_code < 400
@@ -43,7 +38,7 @@
include_management_tools: yes
register: rds_install
- name: Stop Tinker before install
- name: Stop Tinker before install (jumpserver)
ansible.windows.win_powershell:
script: |
if (Get-Process -Name 'tinker' -ErrorAction SilentlyContinue) {
@@ -53,36 +48,36 @@
$Ansible.Changed = $false
}
- name: Download JumpServer Tinker installer
- name: Download JumpServer Tinker installer (jumpserver)
ansible.windows.win_get_url:
url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/Tinker_Installer_{{ TINKER_VERSION }}.exe"
dest: "{{ ansible_env.TEMP }}\\Tinker_Installer_{{ TINKER_VERSION }}.exe"
url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/{{ TinkerInstaller }}"
dest: "{{ ansible_env.TEMP }}\\{{ TinkerInstaller }}"
validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
- name: Install JumpServer Tinker
- name: Install JumpServer Tinker (jumpserver)
ansible.windows.win_package:
path: "{{ ansible_env.TEMP }}\\Tinker_Installer_{{ TINKER_VERSION }}.exe"
path: "{{ ansible_env.TEMP }}\\{{ TinkerInstaller }}"
arguments:
- /VERYSILENT
- /SUPPRESSMSGBOXES
- /NORESTART
state: present
- name: Set Tinkerd on the global system path
- name: Set Tinkerd on the global system path (jumpserver)
ansible.windows.win_path:
elements:
- '%USERPROFILE%\AppData\Local\Programs\Tinker\'
scope: user
- name: Download python-{{ PYTHON_VERSION }}
- name: Download python-3.11.6
ansible.windows.win_get_url:
url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/python-{{ PYTHON_VERSION }}-amd64.exe"
dest: "{{ ansible_env.TEMP }}\\python-{{ PYTHON_VERSION }}-amd64.exe"
url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/python-3.11.6-amd64.exe"
dest: "{{ ansible_env.TEMP }}\\python-3.11.6-amd64.exe"
validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
- name: Install the python-{{ PYTHON_VERSION }}
- name: Install the python-3.11.6
ansible.windows.win_package:
path: "{{ ansible_env.TEMP }}\\python-{{ PYTHON_VERSION }}-amd64.exe"
path: "{{ ansible_env.TEMP }}\\python-3.11.6-amd64.exe"
arguments:
- /quiet
- InstallAllUsers=1
@@ -165,7 +160,7 @@
script: |
pip install -r '{{ ansible_env.TEMP }}\pip_packages\pip_packages\requirements.txt' --no-index --find-links='{{ ansible_env.TEMP }}\pip_packages\pip_packages'
- name: Stop chromedriver before install
- name: Stop chromedriver before install (jumpserver)
ansible.windows.win_powershell:
script: |
if (Get-Process -Name 'chromedriver' -ErrorAction SilentlyContinue) {
@@ -175,6 +170,12 @@
$Ansible.Changed = $false
}
- name: Download chromedriver (Chrome)
ansible.windows.win_get_url:
url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/chromedriver-win64.zip"
dest: "{{ ansible_env.TEMP }}\\chromedriver-win64.zip"
validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
- name: Remove old chromedriver (Chrome)
ansible.windows.win_file:
path: "{{ item }}"
@@ -185,24 +186,12 @@
- C:\Program Files\JumpServer\drivers\chromedriver-win64
- C:\Program Files\JumpServer\drivers\chromedriver_win64
- name: Download chromedriver (Chrome)
ansible.windows.win_get_url:
url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/chromedriver-{{ CHROME_DRIVER_VERSION }}-win64.zip"
dest: "{{ ansible_env.TEMP }}\\chromedriver-{{ CHROME_DRIVER_VERSION }}-win64.zip"
validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
- name: Unzip chromedriver (Chrome)
community.windows.win_unzip:
src: "{{ ansible_env.TEMP }}\\chromedriver-{{ CHROME_DRIVER_VERSION }}-win64.zip"
src: "{{ ansible_env.TEMP }}\\chromedriver-win64.zip"
dest: C:\Program Files\JumpServer\drivers
- name: Download Chrome zip package (Chrome)
ansible.windows.win_get_url:
url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/chrome-{{ CHROME_VERSION }}-win.zip"
dest: "{{ ansible_env.TEMP }}\\chrome-{{ CHROME_VERSION }}-win.zip"
validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
- name: Stop Chrome before install
- name: Stop Chrome before install (jumpserver)
ansible.windows.win_powershell:
script: |
if (Get-Process -Name 'chrome' -ErrorAction SilentlyContinue) {
@@ -212,6 +201,12 @@
$Ansible.Changed = $false
}
- name: Download Chrome zip package (Chrome)
ansible.windows.win_get_url:
url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/chrome-win.zip"
dest: "{{ ansible_env.TEMP }}\\chrome-win.zip"
validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
- name: Remove old Chrome (Chrome)
ansible.windows.win_file:
path: "{{ item }}"
@@ -224,7 +219,7 @@
- name: Unzip Chrome (Chrome)
community.windows.win_unzip:
src: "{{ ansible_env.TEMP }}\\chrome-{{ CHROME_VERSION }}-win.zip"
src: "{{ ansible_env.TEMP }}\\chrome-win.zip"
dest: C:\Program Files\JumpServer\applications
- name: Check and Clean global system path (Chrome)

View File

@@ -242,8 +242,7 @@ class ConnectMethodUtil:
'razor': 'TERMINAL_RAZOR_ENABLED',
'magnus': 'TERMINAL_MAGNUS_ENABLED',
}
disabled_component = [comp for comp, attr in component_setting.items() if
not (getattr(settings, attr) and settings.XPACK_LICENSE_IS_VALID)]
disabled_component = [comp for comp, attr in component_setting.items() if not getattr(settings, attr)]
if not disabled_component:
return methods

View File

@@ -9,14 +9,7 @@ __all__ = ['IsSessionAssignee']
class IsSessionAssignee(permissions.IsAuthenticated):
def has_permission(self, request, view):
if not request.user:
return False
if request.user.is_anonymous:
return False
if view.action == 'retrieve':
# Why return True? please refer to the issue: #11678
return True
return False
return True
def has_object_permission(self, request, view, obj):
try:

View File

@@ -41,7 +41,7 @@ class TerminalSmallSerializer(serializers.ModelSerializer):
class TerminalSerializer(BulkModelSerializer):
session_online = serializers.ReadOnlyField(source='get_online_session_count', label=_('Online sessions'))
is_alive = serializers.BooleanField(read_only=True, label=_('Is alive'))
is_active = serializers.BooleanField(read_only=True, label=_('Active'))
is_active = serializers.BooleanField(read_only=True, label='Is active')
load = LabeledChoiceField(
read_only=True, choices=const.ComponentLoad.choices,
label=_('Load status')

View File

@@ -227,7 +227,7 @@ class MFABlockUtils(BlockUtilBase):
class LoginIpBlockUtil(BlockGlobalIpUtilBase):
LIMIT_KEY_TMPL = "_LOGIN_LIMIT_{}"
BLOCK_KEY_TMPL = "_LOGIN_BLOCK_IP_{}"
BLOCK_KEY_TMPL = "_LOGIN_BLOCK_{}"
def validate_emails(emails):

View File

@@ -1,6 +1,6 @@
[tool.poetry]
name = "jumpserver"
version = "v4.0"
version = "v4.0.0"
description = "广受欢迎的开源堡垒机"
authors = ["ibuler <ibuler@qq.com>"]
license = "GPLv3"