From 606d2c89330a934fa116f944af053f09d3392d1b Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Thu, 16 May 2024 17:31:12 +0800 Subject: [PATCH 01/32] =?UTF-8?q?fix:=20=E5=85=B3=E9=97=ADssh=20client?= =?UTF-8?q?=E5=90=8E=EF=BC=8Csftp=EF=BC=8Ctelnet=E4=B8=8D=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=AE=A2=E6=88=B7=E7=AB=AF=E8=BF=9E=E6=8E=A5=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/terminal/connect_methods.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/terminal/connect_methods.py b/apps/terminal/connect_methods.py index 0294ccab1..9f40556da 100644 --- a/apps/terminal/connect_methods.py +++ b/apps/terminal/connect_methods.py @@ -253,8 +253,9 @@ class ConnectMethodUtil: def _filter_disable_protocols_connect_methods(cls, methods): # 过滤一些特殊的协议方式 if not getattr(settings, 'TERMINAL_KOKO_SSH_ENABLED'): - protocol = Protocol.ssh - methods[protocol] = [m for m in methods[protocol] if m['type'] != 'native'] + disable_ssh_client_protocols = [Protocol.ssh, Protocol.sftp, Protocol.telnet] + for protocol in disable_ssh_client_protocols: + methods[protocol] = [m for m in methods[protocol] if m['type'] != 'native'] return methods @classmethod From 5616d31888c0d56cf045b7ac0b0d45d1f6bcd14e Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Thu, 16 May 2024 17:31:12 +0800 Subject: [PATCH 02/32] =?UTF-8?q?perf:=20CeleryTaskExecution=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E6=97=B6=E5=8E=BB=E6=8E=89=E6=97=A0=E7=94=A8=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/ops/signal_handlers.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/ops/signal_handlers.py b/apps/ops/signal_handlers.py index c070fd094..1d1920e05 100644 --- a/apps/ops/signal_handlers.py +++ b/apps/ops/signal_handlers.py @@ -140,6 +140,9 @@ def task_sent_handler(headers=None, body=None, **kwargs): args = [] kwargs = {} + # 不要保存__current_lang和__current_org_id参数,防止系统任务中点击再次执行报错 + kwargs.pop('__current_lang', None) + kwargs.pop('__current_org_id', None) data = { 'id': i, 'name': task, From 4ebcba81e08fc92f34ca0499d2b69bf42e7a83fc Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Wed, 22 May 2024 15:25:38 +0800 Subject: [PATCH 03/32] perf: dates_metrics api speed (#13266) Co-authored-by: feng <1304903146@qq.com> --- apps/jumpserver/api.py | 59 ++++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/apps/jumpserver/api.py b/apps/jumpserver/api.py index 6b5d162e5..6c706430f 100644 --- a/apps/jumpserver/api.py +++ b/apps/jumpserver/api.py @@ -159,31 +159,48 @@ class DatesLoginMetricMixin: query = {f'{field_name}__range': self.date_start_end} return queryset.filter(**query) - def get_date_metrics(self, queryset, field_name, count_field): + def get_date_metrics(self, queryset, field_name, count_fields): queryset = self.filter_date_start_end(queryset, field_name) - queryset = queryset.values_list(field_name, count_field) - date_group_map = defaultdict(set) - for datetime, count_field in queryset: + if not isinstance(count_fields, (list, tuple)): + count_fields = [count_fields] + + values_list = [field_name] + list(count_fields) + queryset = queryset.values_list(*values_list) + + date_group_map = defaultdict(lambda: defaultdict(set)) + + for row in queryset: + datetime = row[0] date_str = str(datetime.date()) - date_group_map[date_str].add(count_field) + for idx, count_field in enumerate(count_fields): + date_group_map[date_str][count_field].add(row[idx + 1]) - return [ - len(date_group_map.get(str(d), set())) - for d in self.dates_list - ] + date_metrics_dict = defaultdict(list) + for field in count_fields: + for date_str in self.dates_list: + count = len(date_group_map.get(str(date_str), {}).get(field, set())) + date_metrics_dict[field].append(count) + + return date_metrics_dict + + def get_dates_metrics_total_count_active_users_and_assets(self): + date_metrics_dict = self.get_date_metrics( + Session.objects, 'date_start', ('user_id', 'asset_id') + ) + return date_metrics_dict.get('user_id', []), date_metrics_dict.get('asset_id', []) def get_dates_metrics_total_count_login(self): - return self.get_date_metrics(UserLoginLog.objects, 'datetime', 'id') - - def get_dates_metrics_total_count_active_users(self): - return self.get_date_metrics(Session.objects, 'date_start', 'user_id') - - def get_dates_metrics_total_count_active_assets(self): - return self.get_date_metrics(Session.objects, 'date_start', 'asset_id') + date_metrics_dict = self.get_date_metrics( + UserLoginLog.objects, 'datetime', 'id' + ) + return date_metrics_dict.get('id', []) def get_dates_metrics_total_count_sessions(self): - return self.get_date_metrics(Session.objects, 'date_start', 'id') + date_metrics_dict = self.get_date_metrics( + Session.objects, 'date_start', 'id' + ) + return date_metrics_dict.get('id', []) def get_dates_login_times_assets(self): assets = self.sessions_queryset.values("asset") \ @@ -412,11 +429,13 @@ class IndexApi(DateTimeMixin, DatesLoginMetricMixin, APIView): }) if _all or query_params.get('dates_metrics'): + user_data, asset_data = self.get_dates_metrics_total_count_active_users_and_assets() + login_data = self.get_dates_metrics_total_count_login() data.update({ 'dates_metrics_date': self.get_dates_metrics_date(), - 'dates_metrics_total_count_login': self.get_dates_metrics_total_count_login(), - 'dates_metrics_total_count_active_users': self.get_dates_metrics_total_count_active_users(), - 'dates_metrics_total_count_active_assets': self.get_dates_metrics_total_count_active_assets(), + 'dates_metrics_total_count_login': login_data, + 'dates_metrics_total_count_active_users': user_data, + 'dates_metrics_total_count_active_assets': asset_data, }) if _all or query_params.get('dates_login_times_top10_assets'): From 7f90fccc4f3e5760dd2112ee95e000b89170df41 Mon Sep 17 00:00:00 2001 From: Bryan Date: Mon, 27 May 2024 10:25:21 +0800 Subject: [PATCH 04/32] perf: The label matching policy is configured with a random selection publisher --- apps/terminal/models/applet/applet.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/terminal/models/applet/applet.py b/apps/terminal/models/applet/applet.py index 9e501eb50..08a7b809a 100644 --- a/apps/terminal/models/applet/applet.py +++ b/apps/terminal/models/applet/applet.py @@ -176,7 +176,7 @@ class Applet(JMSBaseModel): label_value = spec_label.label.value matched = [host for host in hosts if host.name == label_value] if matched: - return matched[0] + return random.choice(matched) hosts = [h for h in hosts if h.auto_create_accounts] prefer_key = self.host_prefer_key_tpl.format(user.id) From 81da9e018ac53851dd65d7ee278f0c202535c837 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Sat, 25 May 2024 22:45:30 +0800 Subject: [PATCH 05/32] fix: windows sync remove account fail and applet deploy rbac perm error and job exection log admin auditor cannot view --- .../remove_account/host/windows/main.yml | 4 +--- apps/ops/ws.py | 20 ++++++++++++++++++- apps/terminal/api/applet/host.py | 2 +- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/apps/accounts/automations/remove_account/host/windows/main.yml b/apps/accounts/automations/remove_account/host/windows/main.yml index 7be9940b3..a3856c1ce 100644 --- a/apps/accounts/automations/remove_account/host/windows/main.yml +++ b/apps/accounts/automations/remove_account/host/windows/main.yml @@ -4,6 +4,4 @@ - name: "Remove account" ansible.windows.win_user: name: "{{ account.username }}" - state: absent - purge: yes - force: yes \ No newline at end of file + state: absent \ No newline at end of file diff --git a/apps/ops/ws.py b/apps/ops/ws.py index 9605835a0..a9660482a 100644 --- a/apps/ops/ws.py +++ b/apps/ops/ws.py @@ -7,6 +7,7 @@ from channels.generic.websocket import AsyncJsonWebsocketConsumer from common.db.utils import close_old_connections from common.utils import get_logger +from rbac.builtin import BuiltinRole from .ansible.utils import get_ansible_task_log_path from .celery.utils import get_celery_task_log_path from .const import CELERY_LOG_MAGIC_MARK @@ -48,13 +49,30 @@ class TaskLogWebsocket(AsyncJsonWebsocketConsumer): else: return None + @sync_to_async + def get_current_user_role_ids(self, user): + roles = user.system_roles.all() | user.org_roles.all() + user_role_ids = set(map(str, roles.values_list('id', flat=True))) + return user_role_ids + async def receive_json(self, content, **kwargs): task_id = content.get('task') task = await self.get_task(task_id) if not task: await self.send_json({'message': 'Task not found', 'task': task_id}) return - if task.name in self.user_tasks and task.creator != self.scope['user']: + + admin_auditor_role_ids = { + BuiltinRole.system_admin.id, + BuiltinRole.system_auditor.id, + BuiltinRole.org_admin.id, + BuiltinRole.org_auditor.id + } + user = self.scope['user'] + user_role_ids = await self.get_current_user_role_ids(user) + has_admin_auditor_role = bool(admin_auditor_role_ids & user_role_ids) + + if not has_admin_auditor_role and task.name in self.user_tasks and task.creator != user: await self.send_json({'message': 'No permission', 'task': task_id}) return diff --git a/apps/terminal/api/applet/host.py b/apps/terminal/api/applet/host.py index 6022a3b49..a67ccf9db 100644 --- a/apps/terminal/api/applet/host.py +++ b/apps/terminal/api/applet/host.py @@ -60,7 +60,7 @@ class AppletHostDeploymentViewSet(viewsets.ModelViewSet): queryset = AppletHostDeployment.objects.all() filterset_fields = ['host', ] rbac_perms = ( - ('applets', 'terminal.view_AppletHostDeployment'), + ('applets', 'terminal.view_applethostdeployment'), ('uninstall', 'terminal.change_applethost'), ) From c103253867f20cf5ea6ed44b5b6550c5da0e8f20 Mon Sep 17 00:00:00 2001 From: Bai Date: Mon, 27 May 2024 18:02:28 +0800 Subject: [PATCH 06/32] perf: perm tree search --- apps/assets/api/tree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/assets/api/tree.py b/apps/assets/api/tree.py index 277ab323e..f5e39b4db 100644 --- a/apps/assets/api/tree.py +++ b/apps/assets/api/tree.py @@ -126,7 +126,7 @@ class NodeChildrenAsTreeApi(SerializeToTreeNodeMixin, NodeChildrenApi): include_assets = self.request.query_params.get('assets', '0') == '1' if not self.instance or not include_assets: return Asset.objects.none() - if self.instance.is_org_root(): + if not self.request.GET.get('search') and self.instance.is_org_root(): return Asset.objects.none() if query_all: assets = self.instance.get_all_assets() From 75df84502415a0cca10aba4b096a52170587face Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 28 May 2024 10:26:02 +0800 Subject: [PATCH 07/32] perf: Remove dependency django-rest-swagger --- apps/jumpserver/settings/base.py | 1 - poetry.lock | 61 +++----------------------------- pyproject.toml | 1 - 3 files changed, 5 insertions(+), 58 deletions(-) diff --git a/apps/jumpserver/settings/base.py b/apps/jumpserver/settings/base.py index a17c48bfc..e110befc3 100644 --- a/apps/jumpserver/settings/base.py +++ b/apps/jumpserver/settings/base.py @@ -138,7 +138,6 @@ INSTALLED_APPS = [ 'rbac.apps.RBACConfig', 'labels.apps.LabelsConfig', 'rest_framework', - 'rest_framework_swagger', 'drf_yasg', 'django_cas_ng', 'channels', diff --git a/poetry.lock b/poetry.lock index c59495a67..863808075 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "adal" @@ -2138,28 +2138,6 @@ type = "legacy" url = "https://pypi.tuna.tsinghua.edu.cn/simple" reference = "tsinghua" -[[package]] -name = "django-rest-swagger" -version = "2.2.0" -description = "Swagger UI for Django REST Framework 3.5+" -optional = false -python-versions = "*" -files = [ - {file = "django-rest-swagger-2.2.0.tar.gz", hash = "sha256:48f6aded9937e90ae7cbe9e6c932b9744b8af80cc4e010088b3278c700e0685b"}, - {file = "django_rest_swagger-2.2.0-py2.py3-none-any.whl", hash = "sha256:b039b0288bab4665cd45dc5d16f94b13911bc4ad0ed55f74ad3b90aa31c87c17"}, -] - -[package.dependencies] -coreapi = ">=2.3.0" -djangorestframework = ">=3.5.4" -openapi-codec = ">=1.3.1" -simplejson = "*" - -[package.source] -type = "legacy" -url = "https://pypi.tuna.tsinghua.edu.cn/simple" -reference = "tsinghua" - [[package]] name = "django-simple-captcha" version = "0.5.18" @@ -2836,14 +2814,8 @@ files = [ [package.dependencies] google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" -grpcio = [ - {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, - {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, -] -grpcio-status = [ - {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, - {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, -] +grpcio = {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} +grpcio-status = {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" requests = ">=2.18.0,<3.0.0.dev0" @@ -3915,16 +3887,6 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -4172,6 +4134,7 @@ files = [ {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, + {file = "msgpack-1.0.8-py3-none-any.whl", hash = "sha256:24f727df1e20b9876fa6e95f840a2a2651e34c0ad147676356f4bf5fbb0206ca"}, {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, ] @@ -5791,11 +5754,9 @@ files = [ {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:049f2e3de919e8e02504780a21ebbf235e21ca8ed5c7538c5b6e705aa6c43d8c"}, {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd86d8e3e346e34f3f03d12e333747b53a1daa74374a727f4714d5b82ee0dd5"}, {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:508226a0df7cb6faeda9f8e84e85743690ca427d7b27af9a73d75fcf0c1eef6e"}, - {file = "pymssql-2.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:47859887adeaf184766b5e0bc845dd23611f3808f9521552063bb36eabc10092"}, {file = "pymssql-2.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d873e553374d5b1c57fe1c43bb75e3bcc2920678db1ef26f6bfed396c7d21b30"}, {file = "pymssql-2.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf31b8b76634c826a91f9999e15b7bfb0c051a0f53b319fd56481a67e5b903bb"}, {file = "pymssql-2.2.8-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:821945c2214fe666fd456c61e09a29a00e7719c9e136c801bffb3a254e9c579b"}, - {file = "pymssql-2.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:cc85b609b4e60eac25fa38bbac1ff854fd2c2a276e0ca4a3614c6f97efb644bb"}, {file = "pymssql-2.2.8-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:ebe7f64d5278d807f14bea08951e02512bfbc6219fd4d4f15bb45ded885cf3d4"}, {file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:253af3d39fc0235627966817262d5c4c94ad09dcbea59664748063470048c29c"}, {file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c9d109df536dc5f7dd851a88d285a4c9cb12a9314b621625f4f5ab1197eb312"}, @@ -5811,13 +5772,11 @@ files = [ {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3906993300650844ec140aa58772c0f5f3e9e9d5709c061334fd1551acdcf066"}, {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7309c7352e4a87c9995c3183ebfe0ff4135e955bb759109637673c61c9f0ca8d"}, {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9b8d603cc1ec7ae585c5a409a1d45e8da067970c79dd550d45c238ae0aa0f79f"}, - {file = "pymssql-2.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:293cb4d0339e221d877d6b19a1905082b658f0100a1e2ccc9dda10de58938901"}, {file = "pymssql-2.2.8-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:895041edd002a2e91d8a4faf0906b6fbfef29d9164bc6beb398421f5927fa40e"}, {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6b2d9c6d38a416c6f2db36ff1cd8e69f9a5387a46f9f4f612623192e0c9404b1"}, {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d63d6f25cf40fe6a03c49be2d4d337858362b8ab944d6684c268e4990807cf0c"}, {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c83ad3ad20951f3a94894b354fa5fa9666dcd5ebb4a635dad507c7d1dd545833"}, {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3933f7f082be74698eea835df51798dab9bc727d94d3d280bffc75ab9265f890"}, - {file = "pymssql-2.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:de313375b90b0f554058992f35c4a4beb3f6ec2f5912d8cd6afb649f95b03a9f"}, {file = "pymssql-2.2.8.tar.gz", hash = "sha256:9baefbfbd07d0142756e2dfcaa804154361ac5806ab9381350aad4e780c3033e"}, ] @@ -6306,7 +6265,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -6314,15 +6272,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -6339,7 +6290,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -6347,7 +6297,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -7905,4 +7854,4 @@ reference = "tsinghua" [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "63da026ae0d9d5e6a62b25d265a50c95666e05f60cdae798c2e0443c93544e3a" +content-hash = "ab796d01426bb06f0eee1ef4e1d2a0cbb45d12e8431502b273effe42919251d6" diff --git a/pyproject.toml b/pyproject.toml index 970bb6c99..08fbc4532 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -83,7 +83,6 @@ django-bootstrap3 = "23.4" django-filter = "23.2" django-formtools = "2.4.1" django-ranged-response = "0.2.0" -django-rest-swagger = "2.2.0" django-simple-captcha = "0.5.18" django-timezone-field = "5.1" djangorestframework = "3.14.0" From 5d1829b9988cf4551abe7a4cfcb87227d27ee559 Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 28 May 2024 10:57:43 +0800 Subject: [PATCH 08/32] fix: Disable the applet connection method when all applet hosts have is_active set to False --- apps/terminal/connect_methods.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/terminal/connect_methods.py b/apps/terminal/connect_methods.py index 9f40556da..a6b7e7e51 100644 --- a/apps/terminal/connect_methods.py +++ b/apps/terminal/connect_methods.py @@ -101,7 +101,7 @@ class AppletMethod: from .models import Applet, AppletHost methods = defaultdict(list) - has_applet_hosts = AppletHost.objects.all().exists() + has_applet_hosts = AppletHost.objects.filter(is_active=True).exists() applets = Applet.objects.filter(is_active=True) for applet in applets: for protocol in applet.protocols: From 4e8d7df0050879d3e0b12825777b4ce0247638c8 Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 28 May 2024 16:04:15 +0800 Subject: [PATCH 09/32] fix: v2->v3 The issue of authorized accounts displaying as empty when there are more than 10,000 authorization rules. --- apps/perms/migrations/0030_auto_20220816_1132.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/perms/migrations/0030_auto_20220816_1132.py b/apps/perms/migrations/0030_auto_20220816_1132.py index fb1c3ad2e..46cdd6316 100644 --- a/apps/perms/migrations/0030_auto_20220816_1132.py +++ b/apps/perms/migrations/0030_auto_20220816_1132.py @@ -9,7 +9,7 @@ def migrate_system_user_to_accounts(apps, schema_editor): bulk_size = 10000 while True: asset_permissions = asset_permission_model.objects \ - .prefetch_related('system_users')[count:bulk_size] + .prefetch_related('system_users')[count:count+bulk_size] if not asset_permissions: break From 0d825927e1cc6155a04fb8360c531986ffaed7a2 Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Wed, 29 May 2024 18:15:13 +0800 Subject: [PATCH 10/32] perf: Optimize GitHub labels and update related workflows (#13315) * perf: Optimize GitHub labels and update related workflows * perf: Optimize issue template * perf: Optimize issue template * Update 1_bug_report.yml * Update 1_bug_report.yml * Update 1_bug_report.yml * Update 1_bug_report.yml * Update 1_bug_report.yml * Update 2_feature_request.yml * Update 2_feature_request.yml * Update 3_question.yml * Update 3_question.yml * Update 3_question.yml * Update 1_bug_report.yml * Update 2_feature_request.yml * Update 1_bug_report_cn.yml * Update 1_bug_report_cn.yml * Update 2_feature_request_cn.yml * Update 1_bug_report_cn.yml * Update 1_bug_report_cn.yml * Update 1_bug_report_cn.yml * Update 3_question_cn.yml * Update 1_bug_report_cn.yml * Update 2_feature_request_cn.yml * Update 3_question_cn.yml * Update 2_feature_request_cn.yml * Update 1_bug_report.yml * Update 1_bug_report_cn.yml * Update 2_feature_request.yml * Update 3_question.yml * perf: Optimize issue template --------- Co-authored-by: Bai Co-authored-by: Bryan --- .github/ISSUE_TEMPLATE/----.md | 35 --------- .github/ISSUE_TEMPLATE/1_bug_report.yml | 72 +++++++++++++++++++ .github/ISSUE_TEMPLATE/1_bug_report_cn.yml | 72 +++++++++++++++++++ .github/ISSUE_TEMPLATE/2_feature_request.yml | 56 +++++++++++++++ .../ISSUE_TEMPLATE/2_feature_request_cn.yml | 56 +++++++++++++++ .github/ISSUE_TEMPLATE/3_question.yml | 60 ++++++++++++++++ .github/ISSUE_TEMPLATE/3_question_cn.yml | 61 ++++++++++++++++ .github/ISSUE_TEMPLATE/bug---.md | 51 ------------- .github/ISSUE_TEMPLATE/question.md | 50 ------------- .github/workflows/issue-close-require.yml | 4 +- .github/workflows/issue-close.yml | 2 +- .github/workflows/issue-comment.yml | 8 +-- .github/workflows/issue-open.yml | 2 +- 13 files changed, 386 insertions(+), 143 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/----.md create mode 100644 .github/ISSUE_TEMPLATE/1_bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/1_bug_report_cn.yml create mode 100644 .github/ISSUE_TEMPLATE/2_feature_request.yml create mode 100644 .github/ISSUE_TEMPLATE/2_feature_request_cn.yml create mode 100644 .github/ISSUE_TEMPLATE/3_question.yml create mode 100644 .github/ISSUE_TEMPLATE/3_question_cn.yml delete mode 100644 .github/ISSUE_TEMPLATE/bug---.md delete mode 100644 .github/ISSUE_TEMPLATE/question.md diff --git a/.github/ISSUE_TEMPLATE/----.md b/.github/ISSUE_TEMPLATE/----.md deleted file mode 100644 index fb9f8bfd6..000000000 --- a/.github/ISSUE_TEMPLATE/----.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -name: 需求建议 -about: 提出针对本项目的想法和建议 -title: "[Feature] 需求标题" -labels: 类型:需求 -assignees: - - ibuler - - baijiangjie ---- - -## 注意 -_针对过于简单的需求描述不予考虑。请确保提供足够的细节和信息以支持功能的开发和实现。_ - -## 功能名称 -[在这里输入功能的名称或标题] - -## 功能描述 -[在这里描述该功能的详细内容,包括其作用、目的和所需的功能] - -## 用户故事(可选) -[如果适用,可以提供用户故事来更好地理解该功能的使用场景和用户期望] - -## 功能要求 -- [要求1:描述该功能的具体要求,如界面设计、交互逻辑等] -- [要求2:描述该功能的另一个具体要求] -- [以此类推,列出所有相关的功能要求] - -## 示例或原型(可选) -[如果有的话,提供该功能的示例或原型图以更好地说明功能的实现方式] - -## 优先级 -[描述该功能的优先级,如高、中、低,或使用数字等其他标识] - -## 备注(可选) -[在这里添加任何其他相关信息或备注] diff --git a/.github/ISSUE_TEMPLATE/1_bug_report.yml b/.github/ISSUE_TEMPLATE/1_bug_report.yml new file mode 100644 index 000000000..cc51f50cf --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1_bug_report.yml @@ -0,0 +1,72 @@ +name: '🐛 Bug Report' +description: 'Report an Bug' +title: '[Bug] ' +labels: ['🐛 Bug'] +assignees: + - baijiangjie +body: + - type: input + attributes: + label: 'Product Version' + description: The versions prior to v2.28 (inclusive) are no longer supported. + validations: + required: true + + - type: checkboxes + attributes: + label: 'Product Edition' + options: + - label: 'Community Edition' + - label: 'Enterprise Edition' + - label: 'Enterprise Trial Edition' + validations: + required: true + + - type: checkboxes + attributes: + label: 'Installation Method' + options: + - label: 'Online Installation (One-click command installation)' + - label: 'Offline Package Installation' + - label: 'All-in-One' + - label: '1Panel' + - label: 'Kubernetes' + - label: 'Source Code' + + - type: textarea + attributes: + label: 'Environment Information' + description: Please provide a clear and concise description outlining your environment information. + validations: + required: true + + - type: textarea + attributes: + label: '🐛 Bug Description' + description: + Please provide a clear and concise description of the defect. If the issue is complex, please provide detailed explanations.
+ Unclear descriptions will not be processed. Please ensure you provide enough detail and information to support replicating and fixing the defect. + validations: + required: true + + - type: textarea + attributes: + label: 'Recurrence Steps' + description: Please provide a clear and concise description outlining how to reproduce the issue. + validations: + required: true + + - type: textarea + attributes: + label: 'Expected Behavior' + description: Please provide a clear and concise description of what you expect to happen. + + - type: textarea + attributes: + label: 'Additional Information' + description: Please add any additional background information about the issue here. + + - type: textarea + attributes: + label: 'Attempted Solutions' + description: If you have already attempted to solve the issue, please list the solutions you have tried here. diff --git a/.github/ISSUE_TEMPLATE/1_bug_report_cn.yml b/.github/ISSUE_TEMPLATE/1_bug_report_cn.yml new file mode 100644 index 000000000..711d789af --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1_bug_report_cn.yml @@ -0,0 +1,72 @@ +name: '🐛 反馈缺陷' +description: '反馈一个缺陷' +title: '[Bug] ' +labels: ['🐛 Bug'] +assignees: + - baijiangjie +body: + - type: input + attributes: + label: '产品版本' + description: 不再支持 v2.28(含)之前的版本。 + validations: + required: true + + - type: checkboxes + attributes: + label: '版本类型' + options: + - label: '社区版' + - label: '企业版' + - label: '企业试用版' + validations: + required: true + + - type: checkboxes + attributes: + label: '安装方式' + options: + - label: '在线安装 (一键命令安装)' + - label: '离线包安装' + - label: 'All-in-One' + - label: '1Panel' + - label: 'Kubernetes' + - label: '源码安装' + + - type: textarea + attributes: + label: '环境信息' + description: 请提供一个清晰且简洁的描述,说明你的环境信息。 + validations: + required: true + + - type: textarea + attributes: + label: '🐛 缺陷描述' + description: | + 请提供一个清晰且简洁的缺陷描述,如果问题比较复杂,也请详细说明。
+ 针对不清晰的描述信息将不予处理。请确保提供足够的细节和信息,以支持对缺陷进行复现和修复。 + validations: + required: true + + - type: textarea + attributes: + label: '复现步骤' + description: 请提供一个清晰且简洁的描述,说明如何复现问题。 + validations: + required: true + + - type: textarea + attributes: + label: '期望结果' + description: 请提供一个清晰且简洁的描述,说明你期望发生什么。 + + - type: textarea + attributes: + label: '补充信息' + description: 在这里添加关于问题的任何其他背景信息。 + + - type: textarea + attributes: + label: '尝试过的解决方案' + description: 如果你已经尝试解决问题,请在此列出你尝试过的解决方案。 diff --git a/.github/ISSUE_TEMPLATE/2_feature_request.yml b/.github/ISSUE_TEMPLATE/2_feature_request.yml new file mode 100644 index 000000000..fe715bc2c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2_feature_request.yml @@ -0,0 +1,56 @@ +name: '⭐️ Feature Request' +description: 'Suggest an idea' +title: '[Feature] ' +labels: ['⭐️ Feature Request'] +assignees: + - baijiangjie + - ibuler +body: + - type: input + attributes: + label: 'Product Version' + description: The versions prior to v2.28 (inclusive) are no longer supported. + validations: + required: true + + - type: checkboxes + attributes: + label: 'Product Edition' + options: + - label: 'Community Edition' + - label: 'Enterprise Edition' + - label: 'Enterprise Trial Edition' + validations: + required: true + + - type: checkboxes + attributes: + label: 'Installation Method' + options: + - label: 'Online Installation (One-click command installation)' + - label: 'Offline Package Installation' + - label: 'All-in-One' + - label: '1Panel' + - label: 'Kubernetes' + - label: 'Source Code' + + - type: textarea + attributes: + label: '⭐️ Feature Description' + description: | + Please add a clear and concise description of the problem you aim to solve with this feature request.
+ Unclear descriptions will not be processed. + validations: + required: true + + - type: textarea + attributes: + label: 'Proposed Solution' + description: Please provide a clear and concise description of the solution you desire. + validations: + required: true + + - type: textarea + attributes: + label: 'Additional Information' + description: Please add any additional background information about the issue here. diff --git a/.github/ISSUE_TEMPLATE/2_feature_request_cn.yml b/.github/ISSUE_TEMPLATE/2_feature_request_cn.yml new file mode 100644 index 000000000..a3c25a00d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2_feature_request_cn.yml @@ -0,0 +1,56 @@ +name: '⭐️ 功能需求' +description: '提出需求或建议' +title: '[Feature] ' +labels: ['⭐️ Feature Request'] +assignees: + - baijiangjie + - ibuler +body: + - type: input + attributes: + label: '产品版本' + description: 不再支持 v2.28(含)之前的版本。 + validations: + required: true + + - type: checkboxes + attributes: + label: '版本类型' + options: + - label: '社区版' + - label: '企业版' + - label: '企业试用版' + validations: + required: true + + - type: checkboxes + attributes: + label: '安装方式' + options: + - label: '在线安装 (一键命令安装)' + - label: '离线包安装' + - label: 'All-in-One' + - label: '1Panel' + - label: 'Kubernetes' + - label: '源码安装' + + - type: textarea + attributes: + label: '⭐️ 需求描述' + description: | + 请添加一个清晰且简洁的问题描述,阐述你希望通过这个功能需求解决的问题。
+ 针对不清晰的描述信息将不予处理。 + validations: + required: true + + - type: textarea + attributes: + label: '解决方案' + description: 请清晰且简洁地描述你想要的解决方案。 + validations: + required: true + + - type: textarea + attributes: + label: '补充信息' + description: 在这里添加关于问题的任何其他背景信息。 diff --git a/.github/ISSUE_TEMPLATE/3_question.yml b/.github/ISSUE_TEMPLATE/3_question.yml new file mode 100644 index 000000000..df612c795 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3_question.yml @@ -0,0 +1,60 @@ +name: '🤔 Question' +description: 'Pose a question' +title: '[Question] ' +labels: ['🤔 Question'] +assignees: + - baijiangjie +body: + - type: input + attributes: + label: 'Product Version' + description: The versions prior to v2.28 (inclusive) are no longer supported. + validations: + required: true + + - type: checkboxes + attributes: + label: 'Product Edition' + options: + - label: 'Community Edition' + - label: 'Enterprise Edition' + - label: 'Enterprise Trial Edition' + validations: + required: true + + - type: checkboxes + attributes: + label: 'Installation Method' + options: + - label: 'Online Installation (One-click command installation)' + - label: 'Offline Package Installation' + - label: 'All-in-One' + - label: '1Panel' + - label: 'Kubernetes' + - label: 'Source Code' + + - type: textarea + attributes: + label: 'Environment Information' + description: Please provide a clear and concise description outlining your environment information. + validations: + required: true + + - type: textarea + attributes: + label: '🤔 Question Description' + description: | + Please provide a clear and concise description of the defect. If the issue is complex, please provide detailed explanations.
+ Unclear descriptions will not be processed. + validations: + required: true + + - type: textarea + attributes: + label: 'Expected Behavior' + description: Please provide a clear and concise description of what you expect to happen. + + - type: textarea + attributes: + label: 'Additional Information' + description: Please add any additional background information about the issue here. diff --git a/.github/ISSUE_TEMPLATE/3_question_cn.yml b/.github/ISSUE_TEMPLATE/3_question_cn.yml new file mode 100644 index 000000000..e311b82ef --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3_question_cn.yml @@ -0,0 +1,61 @@ +name: '🤔 问题咨询' +description: '提出一个问题' +title: '[Question] ' +labels: ['🤔 Question'] +assignees: + - baijiangjie +body: + - type: input + attributes: + label: '产品版本' + description: 不再支持 v2.28(含)之前的版本。 + validations: + required: true + + - type: checkboxes + attributes: + label: '版本类型' + options: + - label: '社区版' + - label: '企业版' + - label: '企业试用版' + validations: + required: true + + - type: checkboxes + attributes: + label: '安装方式' + options: + - label: '在线安装 (一键命令安装)' + - label: '离线包安装' + - label: 'All-in-One' + - label: '1Panel' + - label: 'Kubernetes' + - label: '源码安装' + + - type: textarea + attributes: + label: '环境信息' + description: 请在此详细描述你的环境信息,如操作系统、浏览器和部署架构等。 + validations: + required: true + + - type: textarea + attributes: + label: '🤔 问题描述' + description: | + 请提供一个清晰且简洁的问题描述,如果问题比较复杂,也请详细说明。
+ 针对不清晰的描述信息将不予处理。 + validations: + required: true + + - type: textarea + attributes: + label: '期望结果' + description: 请提供一个清晰且简洁的描述,说明你期望发生什么。 + + - type: textarea + attributes: + label: '补充信息' + description: 在这里添加关于问题的任何其他背景信息。 + diff --git a/.github/ISSUE_TEMPLATE/bug---.md b/.github/ISSUE_TEMPLATE/bug---.md deleted file mode 100644 index 2da1561ed..000000000 --- a/.github/ISSUE_TEMPLATE/bug---.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -name: Bug 提交 -about: 提交产品缺陷帮助我们更好的改进 -title: "[Bug] Bug 标题" -labels: 类型:Bug -assignees: - - baijiangjie ---- - -## 注意 -**JumpServer 版本( v2.28 之前的版本不再支持 )**
-_针对过于简单的 Bug 描述不予考虑。请确保提供足够的细节和信息以支持 Bug 的复现和修复。_ - -## 当前使用的 JumpServer 版本 (必填) -[在这里输入当前使用的 JumpServer 的版本号] - -## 使用的版本类型 (必填) -- [ ] 社区版 -- [ ] 企业版 -- [ ] 企业试用版 - - -## 版本安装方式 (必填) -- [ ] 在线安装 (一键命令) -- [ ] 离线安装 (下载离线包) -- [ ] All-in-One -- [ ] 1Panel 安装 -- [ ] Kubernetes 安装 -- [ ] 源码安装 - -## Bug 描述 (详细) -[在这里描述 Bug 的详细情况,包括其影响和出现的具体情况] - -## 复现步骤 -1. [描述如何复现 Bug 的第一步] -2. [描述如何复现 Bug 的第二步] -3. [以此类推,列出所有复现 Bug 所需的步骤] - -## 期望行为 -[描述 Bug 出现时期望的系统行为或结果] - -## 实际行为 -[描述实际上发生了什么,以及 Bug 出现的具体情况] - -## 系统环境 -- 操作系统:[例如:Windows 10, macOS Big Sur] -- 浏览器/应用版本:[如果适用,请提供相关版本信息] -- 其他相关环境信息:[如果有其他相关环境信息,请在此处提供] - -## 附加信息(可选) -[在这里添加任何其他相关信息,如截图、错误信息等] diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md deleted file mode 100644 index 3f7d673f0..000000000 --- a/.github/ISSUE_TEMPLATE/question.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -name: 问题咨询 -about: 提出针对本项目安装部署、使用及其他方面的相关问题 -title: "[Question] 问题标题" -labels: 类型:提问 -assignees: - - baijiangjie ---- -## 注意 -**请描述您的问题.**
-**JumpServer 版本( v2.28 之前的版本不再支持 )**
-_针对过于简单的 Bug 描述不予考虑。请确保提供足够的细节和信息以支持 Bug 的复现和修复。_ - -## 当前使用的 JumpServer 版本 (必填) -[在这里输入当前使用的 JumpServer 的版本号] - -## 使用的版本类型 (必填) -- [ ] 社区版 -- [ ] 企业版 -- [ ] 企业试用版 - - -## 版本安装方式 (必填) -- [ ] 在线安装 (一键命令) -- [ ] 离线安装 (下载离线包) -- [ ] All-in-One -- [ ] 1Panel 安装 -- [ ] Kubernetes 安装 -- [ ] 源码安装 - -## 问题描述 (详细) -[在这里描述你遇到的问题] - -## 背景信息 -- 操作系统:[例如:Windows 10, macOS Big Sur] -- 浏览器/应用版本:[如果适用,请提供相关版本信息] -- 其他相关环境信息:[如果有其他相关环境信息,请在此处提供] - -## 具体问题 -[在这里详细描述你的问题,包括任何相关细节或错误信息] - -## 尝试过的解决方法 -[如果你已经尝试过解决问题,请在这里列出你已经尝试过的解决方法] - -## 预期结果 -[描述你期望的解决方案或结果] - -## 我们的期望 -[描述你希望我们提供的帮助或支持] - diff --git a/.github/workflows/issue-close-require.yml b/.github/workflows/issue-close-require.yml index 3cbee1504..df341f211 100644 --- a/.github/workflows/issue-close-require.yml +++ b/.github/workflows/issue-close-require.yml @@ -12,7 +12,9 @@ jobs: uses: actions-cool/issues-helper@v2 with: actions: 'close-issues' - labels: '状态:待反馈' + labels: '⏳ Pending feedback' inactive-day: 30 body: | + You haven't provided feedback for over 30 days. + We will close this issue. If you have any further needs, you can reopen it or submit a new issue. 您超过 30 天未反馈信息,我们将关闭该 issue,如有需求您可以重新打开或者提交新的 issue。 diff --git a/.github/workflows/issue-close.yml b/.github/workflows/issue-close.yml index d9ed4bab4..1ff51f456 100644 --- a/.github/workflows/issue-close.yml +++ b/.github/workflows/issue-close.yml @@ -13,4 +13,4 @@ jobs: if: ${{ !github.event.issue.pull_request }} with: actions: 'remove-labels' - labels: '状态:待处理,状态:待反馈' \ No newline at end of file + labels: '🔔 Pending processing,⏳ Pending feedback' \ No newline at end of file diff --git a/.github/workflows/issue-comment.yml b/.github/workflows/issue-comment.yml index 980d701cb..66c03b04b 100644 --- a/.github/workflows/issue-comment.yml +++ b/.github/workflows/issue-comment.yml @@ -13,13 +13,13 @@ jobs: uses: actions-cool/issues-helper@v2 with: actions: 'add-labels' - labels: '状态:待处理' + labels: '🔔 Pending processing' - name: Remove require reply label uses: actions-cool/issues-helper@v2 with: actions: 'remove-labels' - labels: '状态:待反馈' + labels: '⏳ Pending feedback' add-label-if-is-member: runs-on: ubuntu-latest @@ -55,11 +55,11 @@ jobs: uses: actions-cool/issues-helper@v2 with: actions: 'add-labels' - labels: '状态:待反馈' + labels: '⏳ Pending feedback' - name: Remove require handle label if: contains(steps.member_names.outputs.data, github.event.comment.user.login) uses: actions-cool/issues-helper@v2 with: actions: 'remove-labels' - labels: '状态:待处理' + labels: '🔔 Pending processing' diff --git a/.github/workflows/issue-open.yml b/.github/workflows/issue-open.yml index 232d5da29..b1555e113 100644 --- a/.github/workflows/issue-open.yml +++ b/.github/workflows/issue-open.yml @@ -13,4 +13,4 @@ jobs: if: ${{ !github.event.issue.pull_request }} with: actions: 'add-labels' - labels: '状态:待处理' \ No newline at end of file + labels: '🔔 Pending processing' \ No newline at end of file From cdfb11549e5accd0f0ea31fd282800f8463913aa Mon Sep 17 00:00:00 2001 From: jiangweidong <1053570670@qq.com> Date: Thu, 30 May 2024 14:58:19 +0800 Subject: [PATCH 11/32] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3OAuth2=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E8=B7=B3=E8=BF=87=E4=B8=8D=E5=AD=98=E5=9C=A8=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=B8=8D=E5=85=81=E8=AE=B8=E7=99=BB=E5=BD=95=E7=9A=84?= =?UTF-8?q?=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/authentication/backends/oauth2/views.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/apps/authentication/backends/oauth2/views.py b/apps/authentication/backends/oauth2/views.py index 88f82dfa3..eaad1e1b0 100644 --- a/apps/authentication/backends/oauth2/views.py +++ b/apps/authentication/backends/oauth2/views.py @@ -4,7 +4,6 @@ from django.contrib import auth from django.http import HttpResponseRedirect from django.urls import reverse from django.utils.http import urlencode -from django.utils.translation import gettext_lazy as _ from authentication.utils import build_absolute_uri from authentication.views.mixins import FlashMessageMixin @@ -55,11 +54,7 @@ class OAuth2AuthCallbackView(View, FlashMessageMixin): logger.debug(log_prompt.format('Process authenticate')) user = authenticate(code=callback_params['code'], request=request) - if err_msg := getattr(request, 'error_message', ''): - login_url = reverse('authentication:login') + '?admin=1' - return self.get_failed_response(login_url, title=_('Authentication failed'), msg=err_msg) - - if user and user.is_valid: + if user: logger.debug(log_prompt.format('Login: {}'.format(user))) auth.login(self.request, user) logger.debug(log_prompt.format('Redirect')) @@ -68,8 +63,7 @@ class OAuth2AuthCallbackView(View, FlashMessageMixin): ) logger.debug(log_prompt.format('Redirect')) - # OAuth2 服务端认证成功, 但是用户被禁用了, 这时候需要调用服务端的logout - redirect_url = settings.AUTH_OAUTH2_PROVIDER_END_SESSION_ENDPOINT + redirect_url = settings.AUTH_OAUTH2_PROVIDER_END_SESSION_ENDPOINT or '/' return HttpResponseRedirect(redirect_url) From dfd133cf5ac0e8e79141a78b1e170542bb7c3de4 Mon Sep 17 00:00:00 2001 From: jiangweidong Date: Fri, 31 May 2024 11:05:35 +0800 Subject: [PATCH 12/32] perf: optimize user operation logs (#13221) --- apps/audits/backends/db.py | 2 +- apps/audits/const.py | 3 +++ apps/audits/handler.py | 2 +- apps/audits/models.py | 2 ++ apps/audits/signal_handlers/operate_log.py | 25 ++++++++++++++++------ apps/audits/utils.py | 8 ++++++- apps/users/models/user.py | 1 + apps/users/serializers/user.py | 5 +++++ 8 files changed, 38 insertions(+), 10 deletions(-) diff --git a/apps/audits/backends/db.py b/apps/audits/backends/db.py index e8fe43c22..3a47036bb 100644 --- a/apps/audits/backends/db.py +++ b/apps/audits/backends/db.py @@ -52,7 +52,7 @@ class OperateLogStore(object): resource_map = { 'Asset permission': lambda k, v: ActionChoices.display(int(v)) if k == 'Actions' else v } - return resource_map.get(resource_type, lambda k, v: v) + return resource_map.get(resource_type, lambda k, v: _(v)) @classmethod def convert_diff_friendly(cls, op_log): diff --git a/apps/audits/const.py b/apps/audits/const.py index 4418e9e7f..43396148f 100644 --- a/apps/audits/const.py +++ b/apps/audits/const.py @@ -37,6 +37,9 @@ class ActionChoices(TextChoices): approve = 'approve', _('Approve') close = 'close', _('Close') + # Custom action + finished = 'finished', _('Finished') + class LoginTypeChoices(TextChoices): web = "W", _("Web") diff --git a/apps/audits/handler.py b/apps/audits/handler.py index 3f0e444f1..debe0a068 100644 --- a/apps/audits/handler.py +++ b/apps/audits/handler.py @@ -58,7 +58,7 @@ class OperatorLogHandler(metaclass=Singleton): return key = '%s_%s' % (self.CACHE_KEY, instance_id) - cache.set(key, instance_dict, 3 * 60) + cache.set(key, instance_dict, 3) def get_instance_dict_from_cache(self, instance_id): if instance_id is None: diff --git a/apps/audits/models.py b/apps/audits/models.py index 512f50bc1..762147c98 100644 --- a/apps/audits/models.py +++ b/apps/audits/models.py @@ -257,6 +257,8 @@ class UserLoginLog(models.Model): class UserSession(models.Model): + _OPERATE_LOG_ACTION = {'delete': ActionChoices.finished} + id = models.UUIDField(default=uuid.uuid4, primary_key=True) ip = models.GenericIPAddressField(verbose_name=_("Login IP")) key = models.CharField(max_length=128, verbose_name=_("Session key")) diff --git a/apps/audits/signal_handlers/operate_log.py b/apps/audits/signal_handlers/operate_log.py index 39069b108..9f4958ca8 100644 --- a/apps/audits/signal_handlers/operate_log.py +++ b/apps/audits/signal_handlers/operate_log.py @@ -3,7 +3,9 @@ import uuid from django.apps import apps -from django.db.models.signals import post_save, pre_save, m2m_changed, pre_delete +from django.db.models.signals import ( + pre_delete, pre_save, m2m_changed, post_delete, post_save +) from django.dispatch import receiver from django.utils import translation @@ -94,7 +96,7 @@ def signal_of_operate_log_whether_continue( return condition -@receiver(pre_save) +@receiver([pre_save, pre_delete]) def on_object_pre_create_or_update( sender, instance=None, raw=False, using=None, update_fields=None, **kwargs ): @@ -103,6 +105,7 @@ def on_object_pre_create_or_update( ) if not ok: return + with translation.override('en'): # users.PrivateToken Model 没有 id 有 pk字段 instance_id = getattr(instance, 'id', getattr(instance, 'pk', None)) @@ -145,7 +148,7 @@ def on_object_created_or_update( ) -@receiver(pre_delete) +@receiver(post_delete) def on_object_delete(sender, instance=None, **kwargs): ok = signal_of_operate_log_whether_continue(sender, instance, False) if not ok: @@ -153,9 +156,15 @@ def on_object_delete(sender, instance=None, **kwargs): with translation.override('en'): resource_type = sender._meta.verbose_name + action = getattr(sender, '_OPERATE_LOG_ACTION', {}) + action = action.get('delete', ActionChoices.delete) + instance_id = getattr(instance, 'id', getattr(instance, 'pk', None)) + log_id, before = get_instance_dict_from_cache(instance_id) + if not log_id: + log_id, before = None, model_to_dict(instance) create_or_update_operate_log( - ActionChoices.delete, resource_type, - resource=instance, before=model_to_dict(instance) + action, resource_type, log_id=log_id, + resource=instance, before=before, ) @@ -166,7 +175,7 @@ def on_django_start_set_operate_log_monitor_models(sender, **kwargs): 'django_celery_beat', 'contenttypes', 'sessions', 'auth', } exclude_models = { - 'UserPasswordHistory', 'ContentType', + 'UserPasswordHistory', 'ContentType', 'Asset', 'MessageContent', 'SiteMessage', 'PlatformAutomation', 'PlatformProtocol', 'Protocol', 'HistoricalAccount', 'GatheredUser', 'ApprovalRule', @@ -180,11 +189,13 @@ def on_django_start_set_operate_log_monitor_models(sender, **kwargs): 'ApplyCommandTicket', 'ApplyLoginAssetTicket', 'FavoriteAsset', } + include_models = {'UserSession'} for i, app in enumerate(apps.get_models(), 1): app_name = app._meta.app_label model_name = app._meta.object_name if app_name in exclude_apps or \ model_name in exclude_models or \ model_name.endswith('Execution'): - continue + if model_name not in include_models: + continue MODELS_NEED_RECORD.add(model_name) diff --git a/apps/audits/utils.py b/apps/audits/utils.py index d9728fbbd..1b1e4b8e6 100644 --- a/apps/audits/utils.py +++ b/apps/audits/utils.py @@ -49,9 +49,15 @@ def _get_instance_field_value( continue value = getattr(instance, f.name, None) or getattr(instance, f.attname, None) - if not isinstance(value, bool) and not value: + if not isinstance(value, (bool, int)) and not value: continue + choices = getattr(f, 'choices', []) or [] + for c_value, c_label in choices: + if c_value == value: + value = c_label + break + if getattr(f, 'primary_key', False): f.verbose_name = 'id' elif isinstance(value, list): diff --git a/apps/users/models/user.py b/apps/users/models/user.py index e01e2b65e..3be965416 100644 --- a/apps/users/models/user.py +++ b/apps/users/models/user.py @@ -75,6 +75,7 @@ class AuthMixin: if self.can_update_ssh_key(): self.public_key = public_key self.save() + post_user_change_password.send(self.__class__, user=self) def can_update_password(self): return self.is_local diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py index beb69b57e..e9d051820 100644 --- a/apps/users/serializers/user.py +++ b/apps/users/serializers/user.py @@ -17,6 +17,7 @@ from orgs.utils import current_org from rbac.builtin import BuiltinRole from rbac.models import OrgRoleBinding, SystemRoleBinding, Role from rbac.permissions import RBACPermission +from users.signals import post_user_change_password from ..const import PasswordStrategy from ..models import User @@ -268,6 +269,8 @@ class UserSerializer(RolesSerializerMixin, CommonBulkSerializerMixin, ResourceLa instance = self.save_and_set_custom_m2m_fields( validated_data, save_handler, created=False ) + if validated_data.get('public_key'): + post_user_change_password.send(instance.__class__, user=instance) return instance def create(self, validated_data): @@ -275,6 +278,8 @@ class UserSerializer(RolesSerializerMixin, CommonBulkSerializerMixin, ResourceLa instance = self.save_and_set_custom_m2m_fields( validated_data, save_handler, created=True ) + if validated_data.get('public_key'): + post_user_change_password.send(instance.__class__, user=instance) return instance @classmethod From 48b037ac26ff8a5715a6abcab895ac75ffba6671 Mon Sep 17 00:00:00 2001 From: "Gerry.tan" Date: Tue, 14 May 2024 21:32:02 +0800 Subject: [PATCH 13/32] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=20Dameng=20?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/const/database.py | 11 +++++++ apps/assets/const/protocol.py | 7 +++++ .../migrations/0128_auto_20240514_1521.py | 31 +++++++++++++++++++ apps/terminal/connect_methods.py | 3 +- 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 apps/assets/migrations/0128_auto_20240514_1521.py diff --git a/apps/assets/const/database.py b/apps/assets/const/database.py index 261373688..6802ed3b4 100644 --- a/apps/assets/const/database.py +++ b/apps/assets/const/database.py @@ -8,6 +8,7 @@ class DatabaseTypes(BaseType): ORACLE = 'oracle', 'Oracle' SQLSERVER = 'sqlserver', 'SQLServer' DB2 = 'db2', 'DB2' + DAMENG = 'dameng', 'Dameng' CLICKHOUSE = 'clickhouse', 'ClickHouse' MONGODB = 'mongodb', 'MongoDB' REDIS = 'redis', 'Redis' @@ -55,6 +56,15 @@ class DatabaseTypes(BaseType): 'change_secret_enabled': False, 'push_account_enabled': False, }, + cls.DAMENG: { + 'ansible_enabled': False, + 'ping_enabled': False, + 'gather_facts_enabled': False, + 'gather_accounts_enabled': False, + 'verify_account_enabled': False, + 'change_secret_enabled': False, + 'push_account_enabled': False, + }, cls.CLICKHOUSE: { 'ansible_enabled': False, 'ping_enabled': False, @@ -84,6 +94,7 @@ class DatabaseTypes(BaseType): cls.ORACLE: [{'name': 'Oracle'}], cls.SQLSERVER: [{'name': 'SQLServer'}], cls.DB2: [{'name': 'DB2'}], + cls.DAMENG: [{'name': 'Dameng'}], cls.CLICKHOUSE: [{'name': 'ClickHouse'}], cls.MONGODB: [{'name': 'MongoDB'}], cls.REDIS: [ diff --git a/apps/assets/const/protocol.py b/apps/assets/const/protocol.py index 58376b0db..474570bab 100644 --- a/apps/assets/const/protocol.py +++ b/apps/assets/const/protocol.py @@ -23,6 +23,7 @@ class Protocol(ChoicesMixin, models.TextChoices): postgresql = 'postgresql', 'PostgreSQL' sqlserver = 'sqlserver', 'SQLServer' db2 = 'db2', 'DB2' + dameng = 'dameng', 'Dameng' clickhouse = 'clickhouse', 'ClickHouse' redis = 'redis', 'Redis' mongodb = 'mongodb', 'MongoDB' @@ -185,6 +186,12 @@ class Protocol(ChoicesMixin, models.TextChoices): 'secret_types': ['password'], 'xpack': True, }, + cls.dameng: { + 'port': 5236, + 'required': True, + 'secret_types': ['password'], + 'xpack': True, + }, cls.clickhouse: { 'port': 9000, 'required': True, diff --git a/apps/assets/migrations/0128_auto_20240514_1521.py b/apps/assets/migrations/0128_auto_20240514_1521.py new file mode 100644 index 000000000..cad8628fa --- /dev/null +++ b/apps/assets/migrations/0128_auto_20240514_1521.py @@ -0,0 +1,31 @@ +# Generated by Django 4.1.10 on 2023-10-07 06:37 + +from django.db import migrations + + +def add_dameng_platform(apps, schema_editor): + platform_cls = apps.get_model('assets', 'Platform') + automation_cls = apps.get_model('assets', 'PlatformAutomation') + platform, _ = platform_cls.objects.update_or_create( + name='Dameng', defaults={ + 'name': 'Dameng', 'category': 'database', + 'internal': True, 'type': 'dameng', + 'domain_enabled': True, 'su_enabled': False, + 'su_method': None, 'comment': 'Dameng', 'created_by': 'System', + 'updated_by': 'System', 'custom_fields': [] + } + ) + platform.protocols.update_or_create(name='dameng', defaults={ + 'name': 'dameng', 'port': 5236, 'primary': True, 'setting': {} + }) + automation_cls.objects.update_or_create(platform=platform, defaults={'ansible_enabled': False}) + + +class Migration(migrations.Migration): + dependencies = [ + ('assets', '0127_automation_remove_account'), + ] + + operations = [ + migrations.RunPython(add_dameng_platform) + ] diff --git a/apps/terminal/connect_methods.py b/apps/terminal/connect_methods.py index a6b7e7e51..9e815a29a 100644 --- a/apps/terminal/connect_methods.py +++ b/apps/terminal/connect_methods.py @@ -166,7 +166,8 @@ class ConnectMethodUtil: 'support': [ Protocol.mysql, Protocol.postgresql, Protocol.oracle, Protocol.sqlserver, - Protocol.mariadb, Protocol.db2 + Protocol.mariadb, Protocol.db2, + Protocol.dameng ], 'match': 'm2m' }, From 15d4fafbdb34983bf900589b5de89ff0858fdf4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=81=E5=B9=BF?= Date: Tue, 4 Jun 2024 16:22:54 +0800 Subject: [PATCH 14/32] chrome: change github action --- .github/workflows/jms-generic-action-handler.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/jms-generic-action-handler.yml b/.github/workflows/jms-generic-action-handler.yml index 3f499cfb9..450891696 100644 --- a/.github/workflows/jms-generic-action-handler.yml +++ b/.github/workflows/jms-generic-action-handler.yml @@ -10,3 +10,4 @@ jobs: - uses: jumpserver/action-generic-handler@master env: GITHUB_TOKEN: ${{ secrets.PRIVATE_TOKEN }} + I18N_TOKEN: ${{ secrets.I18N_TOKEN }} From 40a4efc99288dd5dfe901be6548efbecb3359752 Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 4 Jun 2024 16:17:26 +0800 Subject: [PATCH 15/32] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=99=BB=E5=BD=95=E6=8A=A5=E9=94=99=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E6=B5=8F=E8=A7=88=E5=99=A8=E5=90=8E=E4=BE=9D=E6=97=A7=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98(=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E8=B6=85=E6=97=B6=EF=BC=8C=E8=AF=B7=E9=87=8D=E6=96=B0=E7=99=BB?= =?UTF-8?q?=E5=BD=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/authentication/views/login.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/authentication/views/login.py b/apps/authentication/views/login.py index 2f48c21e2..4dd1236a4 100644 --- a/apps/authentication/views/login.py +++ b/apps/authentication/views/login.py @@ -249,6 +249,8 @@ class UserLoginView(mixins.AuthMixin, UserLoginContextMixin, FormView): def form_valid(self, form): if not self.request.session.test_cookie_worked(): form.add_error(None, _("Login timeout, please try again.")) + # 当 session 过期后,刷新浏览器重新提交依旧会报错,所以需要重新设置 test_cookie + self.request.session.set_test_cookie() return self.form_invalid(form) # https://docs.djangoproject.com/en/3.1/topics/http/sessions/#setting-test-cookies From 440a7ae9cc4412ce239d5238c87f6fc242809788 Mon Sep 17 00:00:00 2001 From: Bai Date: Thu, 6 Jun 2024 16:27:10 +0800 Subject: [PATCH 16/32] =?UTF-8?q?perf:=20=E6=B7=BB=E5=8A=A0=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E9=A1=B9=20FILE=5FUPLOAD=5FTEMP=5FDIR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/jumpserver/conf.py | 4 +++- apps/jumpserver/settings/base.py | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/jumpserver/conf.py b/apps/jumpserver/conf.py index 9089454da..691c04ad5 100644 --- a/apps/jumpserver/conf.py +++ b/apps/jumpserver/conf.py @@ -619,7 +619,9 @@ class Config(dict): # Ansible Receptor 'RECEPTOR_ENABLED': False, 'ANSIBLE_RECEPTOR_GATEWAY_PROXY_HOST': 'jms_celery', - 'ANSIBLE_RECEPTOR_TCP_LISTEN_ADDRESS': 'receptor:7521' + 'ANSIBLE_RECEPTOR_TCP_LISTEN_ADDRESS': 'receptor:7521', + + 'FILE_UPLOAD_TEMP_DIR': None } diff --git a/apps/jumpserver/settings/base.py b/apps/jumpserver/settings/base.py index e110befc3..2a915ae4e 100644 --- a/apps/jumpserver/settings/base.py +++ b/apps/jumpserver/settings/base.py @@ -319,6 +319,8 @@ PRIVATE_STORAGE_AUTH_FUNCTION = 'jumpserver.rewriting.storage.permissions.allow_ PRIVATE_STORAGE_INTERNAL_URL = '/private-media/' PRIVATE_STORAGE_SERVER = 'jumpserver.rewriting.storage.servers.StaticFileServer' +FILE_UPLOAD_TEMP_DIR = CONFIG.FILE_UPLOAD_TEMP_DIR + # Use django-bootstrap-form to format template, input max width arg # BOOTSTRAP_COLUMN_COUNT = 11 From 2b220d375350c8fe18d6fc4e32f32207fc3d2593 Mon Sep 17 00:00:00 2001 From: halo Date: Fri, 7 Jun 2024 15:46:43 +0800 Subject: [PATCH 17/32] =?UTF-8?q?perf:=20=E5=8E=BB=E6=8E=89account?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96=E4=B8=ADparams=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/accounts/serializers/account/account.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/accounts/serializers/account/account.py b/apps/accounts/serializers/account/account.py index c15bc0305..a885de52b 100644 --- a/apps/accounts/serializers/account/account.py +++ b/apps/accounts/serializers/account/account.py @@ -225,7 +225,7 @@ class AccountSerializer(AccountCreateUpdateSerializerMixin, BaseAccountSerialize fields = BaseAccountSerializer.Meta.fields + [ 'su_from', 'asset', 'version', 'source', 'source_id', 'connectivity', - ] + AccountCreateUpdateSerializerMixin.Meta.fields + ] + list(set(AccountCreateUpdateSerializerMixin.Meta.fields) - {'params'}) read_only_fields = BaseAccountSerializer.Meta.read_only_fields + [ 'connectivity' ] From 9439035b866ccf8ef1d10385911ec12e99b38a48 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Fri, 7 Jun 2024 11:20:09 +0800 Subject: [PATCH 18/32] =?UTF-8?q?fix:=20=E8=B4=A6=E5=8F=B7=E5=A4=87?= =?UTF-8?q?=E4=BB=BD=EF=BC=8C=E4=BA=91=E5=90=8C=E6=AD=A5=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=B8=8D=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/ops/celery/decorator.py | 21 ++++++++++++--------- apps/ops/celery/utils.py | 3 +++ apps/settings/serializers/auth/ldap.py | 9 ++++++--- apps/settings/tasks/ldap.py | 18 +++++++----------- 4 files changed, 28 insertions(+), 23 deletions(-) diff --git a/apps/ops/celery/decorator.py b/apps/ops/celery/decorator.py index 45626bb0f..317a7f7ae 100644 --- a/apps/ops/celery/decorator.py +++ b/apps/ops/celery/decorator.py @@ -57,21 +57,22 @@ def register_as_period_task( task = '{func.__module__}.{func.__name__}'.format(func=func) _name = name if name else task add_register_period_task({ - _name: { - 'task': task, - 'interval': interval, - 'crontab': crontab, - 'args': args, - 'kwargs': kwargs if kwargs else {}, - 'enabled': True, - 'description': description - } + _name: { + 'task': task, + 'interval': interval, + 'crontab': crontab, + 'args': args, + 'kwargs': kwargs if kwargs else {}, + 'description': description + } }) @wraps(func) def wrapper(*args, **kwargs): return func(*args, **kwargs) + return wrapper + return decorate @@ -85,6 +86,7 @@ def after_app_ready_start(func): @wraps(func) def decorate(*args, **kwargs): return func(*args, **kwargs) + return decorate @@ -98,4 +100,5 @@ def after_app_shutdown_clean_periodic(func): @wraps(func) def decorate(*args, **kwargs): return func(*args, **kwargs) + return decorate diff --git a/apps/ops/celery/utils.py b/apps/ops/celery/utils.py index 580a256fe..1db7b4675 100644 --- a/apps/ops/celery/utils.py +++ b/apps/ops/celery/utils.py @@ -80,6 +80,9 @@ def create_or_update_celery_periodic_tasks(tasks): description=detail.get('description') or '', last_run_at=last_run_at, ) + enabled = detail.get('enabled') + if enabled is not None: + defaults["enabled"] = enabled task = PeriodicTask.objects.update_or_create( defaults=defaults, name=name, ) diff --git a/apps/settings/serializers/auth/ldap.py b/apps/settings/serializers/auth/ldap.py index 5e0abf1c3..e47a8cf9f 100644 --- a/apps/settings/serializers/auth/ldap.py +++ b/apps/settings/serializers/auth/ldap.py @@ -93,7 +93,10 @@ class LDAPSettingSerializer(serializers.Serializer): AUTH_LDAP = serializers.BooleanField(required=False, label=_('Enable LDAP auth')) - @staticmethod - def post_save(): + def post_save(self): + keys = ['AUTH_LDAP_SYNC_IS_PERIODIC', 'AUTH_LDAP_SYNC_INTERVAL', 'AUTH_LDAP_SYNC_CRONTAB'] + kwargs = {k: self.validated_data[k] for k in keys if k in self.validated_data} + if not kwargs: + return from settings.tasks import import_ldap_user_periodic - import_ldap_user_periodic() + import_ldap_user_periodic(**kwargs) diff --git a/apps/settings/tasks/ldap.py b/apps/settings/tasks/ldap.py index e600017cb..1882bf37b 100644 --- a/apps/settings/tasks/ldap.py +++ b/apps/settings/tasks/ldap.py @@ -9,7 +9,7 @@ from common.utils import get_logger from common.utils.timezone import local_now_display from ops.celery.decorator import after_app_ready_start from ops.celery.utils import ( - create_or_update_celery_periodic_tasks, delete_celery_periodic_task + create_or_update_celery_periodic_tasks, disable_celery_periodic_task ) from orgs.models import Organization from settings.notifications import LDAPImportMessage @@ -65,20 +65,15 @@ def import_ldap_user(): @shared_task(verbose_name=_('Registration periodic import ldap user task')) @after_app_ready_start -def import_ldap_user_periodic(): - if not settings.AUTH_LDAP: - return +def import_ldap_user_periodic(**kwargs): task_name = 'import_ldap_user_periodic' - delete_celery_periodic_task(task_name) - if not settings.AUTH_LDAP_SYNC_IS_PERIODIC: - return - - interval = settings.AUTH_LDAP_SYNC_INTERVAL + interval = kwargs.get('AUTH_LDAP_SYNC_INTERVAL', settings.AUTH_LDAP_SYNC_INTERVAL) + enabled = kwargs.get('AUTH_LDAP_SYNC_IS_PERIODIC', settings.AUTH_LDAP_SYNC_IS_PERIODIC) + crontab = kwargs.get('AUTH_LDAP_SYNC_CRONTAB', settings.AUTH_LDAP_SYNC_CRONTAB) if isinstance(interval, int): interval = interval * 3600 else: interval = None - crontab = settings.AUTH_LDAP_SYNC_CRONTAB if crontab: # 优先使用 crontab interval = None @@ -86,7 +81,8 @@ def import_ldap_user_periodic(): task_name: { 'task': import_ldap_user.name, 'interval': interval, - 'crontab': crontab + 'crontab': crontab, + 'enabled': enabled } } create_or_update_celery_periodic_tasks(tasks) From 7ad4d9116ae1db53c35e1e8c882ecc1b30da0899 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Tue, 11 Jun 2024 18:19:38 +0800 Subject: [PATCH 19/32] =?UTF-8?q?fix:=20LDAP=E5=AE=9A=E6=97=B6=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E4=BB=BB=E5=8A=A1=E8=AE=BE=E7=BD=AE=E5=A4=9A=E4=B8=AA?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=BA=BA=EF=BC=8C=E6=B6=88=E6=81=AF=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E5=88=86=E9=99=A4=E7=AC=AC=E4=B8=80=E4=B8=AA=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=EF=BC=8C=E5=85=B6=E5=AE=83=E4=BA=BA=E9=83=BD=E4=B8=8D?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/settings/notifications.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/settings/notifications.py b/apps/settings/notifications.py index 5a80c966e..19a44e139 100644 --- a/apps/settings/notifications.py +++ b/apps/settings/notifications.py @@ -11,13 +11,13 @@ logger = get_logger(__file__) class LDAPImportMessage(UserMessage): def __init__(self, user, extra_kwargs): super().__init__(user) - self.orgs = extra_kwargs.pop('orgs', []) - self.end_time = extra_kwargs.pop('end_time', '') - self.start_time = extra_kwargs.pop('start_time', '') - self.time_start_display = extra_kwargs.pop('time_start_display', '') - self.new_users = extra_kwargs.pop('new_users', []) - self.errors = extra_kwargs.pop('errors', []) - self.cost_time = extra_kwargs.pop('cost_time', '') + self.orgs = extra_kwargs.get('orgs', []) + self.end_time = extra_kwargs.get('end_time', '') + self.start_time = extra_kwargs.get('start_time', '') + self.time_start_display = extra_kwargs.get('time_start_display', '') + self.new_users = extra_kwargs.get('new_users', []) + self.errors = extra_kwargs.get('errors', []) + self.cost_time = extra_kwargs.get('cost_time', '') def get_html_msg(self) -> dict: subject = _('Notification of Synchronized LDAP User Task Results') From 948e9ecb4b11eb9eaf60fbb289cf3f1c70055929 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Tue, 4 Jun 2024 19:34:18 +0800 Subject: [PATCH 20/32] =?UTF-8?q?perf:=20=E5=91=BD=E4=BB=A4=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E6=94=AF=E6=8C=81ES8=E7=9A=84=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/common/plugins/es.py | 106 ++++++++++++++++++------- poetry.lock | 161 ++++++++++++++++++++++++++++++++------ pyproject.toml | 5 +- 3 files changed, 221 insertions(+), 51 deletions(-) diff --git a/apps/common/plugins/es.py b/apps/common/plugins/es.py index 8e2126f85..ed17d9c2c 100644 --- a/apps/common/plugins/es.py +++ b/apps/common/plugins/es.py @@ -14,9 +14,13 @@ from uuid import UUID from django.utils.translation import gettext_lazy as _ from django.db.models import QuerySet as DJQuerySet -from elasticsearch import Elasticsearch -from elasticsearch.helpers import bulk -from elasticsearch.exceptions import RequestError, NotFoundError +from elasticsearch7 import Elasticsearch +from elasticsearch7.helpers import bulk +from elasticsearch7.exceptions import RequestError +from elasticsearch7.exceptions import NotFoundError as NotFoundError7 + +from elasticsearch8.exceptions import NotFoundError as NotFoundError8 +from elasticsearch8.exceptions import BadRequestError from common.utils.common import lazyproperty from common.utils import get_logger @@ -36,9 +40,71 @@ class NotSupportElasticsearch8(JMSException): default_detail = _('Not Support Elasticsearch8') -class ES(object): - def __init__(self, config, properties, keyword_fields, exact_fields=None, match_fields=None): +class ESClient(object): + def __new__(cls, *args, **kwargs): + version = kwargs.pop('version') + if version == 6: + return ESClientV6(*args, **kwargs) + if version == 7: + return ESClientV7(*args, **kwargs) + elif version == 8: + return ESClientV8(*args, **kwargs) + raise ValueError('Unsupported ES_VERSION %r' % version) + + +class ESClientBase(object): + @classmethod + def get_properties(cls, data, index): + return data[index]['mappings']['properties'] + + @classmethod + def get_mapping(cls, properties): + return {'mappings': {'properties': properties}} + + +class ESClientV7(ESClientBase): + def __init__(self, *args, **kwargs): + from elasticsearch7 import Elasticsearch + self.es = Elasticsearch(*args, **kwargs) + + @classmethod + def get_sort(cls, field, direction): + return f'{field}:{direction}' + + +class ESClientV6(ESClientV7): + + @classmethod + def get_properties(cls, data, index): + return data[index]['mappings']['data']['properties'] + + @classmethod + def get_mapping(cls, properties): + return {'mappings': {'data': {'properties': properties}}} + + +class ESClientV8(ESClientBase): + def __init__(self, *args, **kwargs): + from elasticsearch8 import Elasticsearch + self.es = Elasticsearch(*args, **kwargs) + + @classmethod + def get_sort(cls, field, direction): + return {field: {'order': direction}} + + +def get_es_client_version(**kwargs): + es = kwargs.get('es') + info = es.info() + version = int(info['version']['number'].split('.')[0]) + return version + + +class ES(object): + + def __init__(self, config, properties, keyword_fields, exact_fields=None, match_fields=None): + self.version = 7 self.config = config hosts = self.config.get('HOSTS') kwargs = self.config.get('OTHER', {}) @@ -47,6 +113,9 @@ class ES(object): if ignore_verify_certs: kwargs['verify_certs'] = None self.es = Elasticsearch(hosts=hosts, max_retries=0, **kwargs) + self.version = get_es_client_version(es=self.es) + self.client = ESClient(version=self.version, hosts=hosts, max_retries=0, **kwargs) + self.es = self.client.es self.index_prefix = self.config.get('INDEX') or 'jumpserver' self.is_index_by_date = bool(self.config.get('INDEX_BY_DATE', False)) @@ -83,26 +152,14 @@ class ES(object): if not self.ping(timeout=2): return False - info = self.es.info() - version = info['version']['number'].split('.')[0] - - if version == '8': - raise NotSupportElasticsearch8 - try: # 获取索引信息,如果没有定义,直接返回 data = self.es.indices.get_mapping(index=self.index) - except NotFoundError: + except (NotFoundError8, NotFoundError7): return False try: - if version == '6': - # 检测索引是不是新的类型 es6 - properties = data[self.index]['mappings']['data']['properties'] - else: - # 检测索引是不是新的类型 es7 default index type: _doc - properties = data[self.index]['mappings']['properties'] - + properties = self.client.get_properties(data=data, index=self.index) for keyword in self.keyword_fields: if not properties[keyword]['type'] == 'keyword': break @@ -118,12 +175,7 @@ class ES(object): def _ensure_index_exists(self): try: - info = self.es.info() - version = info['version']['number'].split('.')[0] - if version == '6': - mappings = {'mappings': {'data': {'properties': self.properties}}} - else: - mappings = {'mappings': {'properties': self.properties}} + mappings = self.client.get_mapping(self.properties) if self.is_index_by_date: mappings['aliases'] = { @@ -132,7 +184,7 @@ class ES(object): try: self.es.indices.create(index=self.index, body=mappings) - except RequestError as e: + except (RequestError, BadRequestError) as e: if e.error == 'resource_already_exists_exception': logger.warning(e) else: @@ -367,7 +419,7 @@ class QuerySet(DJQuerySet): else: direction = 'asc' field = field.lstrip('-+') - sort = f'{field}:{direction}' + sort = self._storage.client.get_sort(field, direction) return sort def __execute(self): diff --git a/poetry.lock b/poetry.lock index 863808075..92c52385e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "adal" @@ -1782,7 +1782,7 @@ reference = "tsinghua" [[package]] name = "data-tree" version = "0.0.1" -description = "" +description = "UNKNOWN" optional = false python-versions = "*" files = [ @@ -2367,22 +2367,45 @@ url = "https://pypi.tuna.tsinghua.edu.cn/simple" reference = "tsinghua" [[package]] -name = "elasticsearch" -version = "7.8.0" -description = "Python client for Elasticsearch" +name = "elastic-transport" +version = "8.13.1" +description = "Transport classes and utilities shared among Python Elastic client libraries" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4" +python-versions = ">=3.7" files = [ - {file = "elasticsearch-7.8.0-py2.py3-none-any.whl", hash = "sha256:6fb566dd23b91b5871ce12212888674b4cf33374e92b71b1080916c931e44dcb"}, - {file = "elasticsearch-7.8.0.tar.gz", hash = "sha256:e637d8cf4e27e279b5ff8ca8edc0c086f4b5df4bf2b48e2f950b7833aca3a792"}, + {file = "elastic_transport-8.13.1-py3-none-any.whl", hash = "sha256:5d4bb6b8e9d74a9c16de274e91a5caf65a3a8d12876f1e99152975e15b2746fe"}, + {file = "elastic_transport-8.13.1.tar.gz", hash = "sha256:16339d392b4bbe86ad00b4bdeecff10edf516d32bc6c16053846625f2c6ea250"}, ] [package.dependencies] certifi = "*" -urllib3 = ">=1.21.1" +urllib3 = ">=1.26.2,<3" [package.extras] -async = ["aiohttp (>=3,<4)", "yarl"] +develop = ["aiohttp", "furo", "httpx", "mock", "opentelemetry-api", "opentelemetry-sdk", "orjson", "pytest", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "pytest-mock", "requests", "respx", "sphinx (>2)", "sphinx-autodoc-typehints", "trustme"] + +[package.source] +type = "legacy" +url = "https://pypi.tuna.tsinghua.edu.cn/simple" +reference = "tsinghua" + +[[package]] +name = "elasticsearch7" +version = "7.17.9" +description = "Python client for Elasticsearch" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4" +files = [ + {file = "elasticsearch7-7.17.9-py2.py3-none-any.whl", hash = "sha256:24cfa00438dd1c0328f4c61e064bcfd4bbf5ff7684e2ec49cc46efbb7598b055"}, + {file = "elasticsearch7-7.17.9.tar.gz", hash = "sha256:4868965d7d6af948c6f31510523f610e9b81299acd2fd35325e46090d786584d"}, +] + +[package.dependencies] +certifi = "*" +urllib3 = ">=1.21.1,<2" + +[package.extras] +async = ["aiohttp (>=3,<4)"] develop = ["black", "coverage", "jinja2", "mock", "pytest", "pytest-cov", "pyyaml", "requests (>=2.0.0,<3.0.0)", "sphinx (<1.7)", "sphinx-rtd-theme"] docs = ["sphinx (<1.7)", "sphinx-rtd-theme"] requests = ["requests (>=2.4.0,<3.0.0)"] @@ -2392,6 +2415,31 @@ type = "legacy" url = "https://pypi.tuna.tsinghua.edu.cn/simple" reference = "tsinghua" +[[package]] +name = "elasticsearch8" +version = "8.13.2" +description = "Python client for Elasticsearch" +optional = false +python-versions = ">=3.7" +files = [ + {file = "elasticsearch8-8.13.2-py3-none-any.whl", hash = "sha256:1691496d9a39b5504f768e2a3000574f0e9c684842b449f692ffc364a2171758"}, + {file = "elasticsearch8-8.13.2.tar.gz", hash = "sha256:ae5f08a15f24b7af0025290f303c7777d781ebedb23c1805a46114ea0f918d0e"}, +] + +[package.dependencies] +elastic-transport = ">=8.13,<9" + +[package.extras] +async = ["aiohttp (>=3,<4)"] +orjson = ["orjson (>=3)"] +requests = ["requests (>=2.4.0,!=2.32.2,<3.0.0)"] +vectorstore-mmr = ["numpy (>=1)", "simsimd (>=3)"] + +[package.source] +type = "legacy" +url = "https://pypi.tuna.tsinghua.edu.cn/simple" +reference = "tsinghua" + [[package]] name = "enum-compat" version = "0.0.3" @@ -2437,6 +2485,17 @@ files = [ {file = "ephem-4.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8f9b27117e7a82f7f70db9cb23b5cc36d37b166a2f73c55e14d7225d0ab95afa"}, {file = "ephem-4.1.4-cp311-cp311-win32.whl", hash = "sha256:9bb21c0b117c9122c0141b0a71ee6fbbb087ed2aab4a7ab60f009e95e9f4a521"}, {file = "ephem-4.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:55d7fb5c34b2e453e01fa4ca7ee375b19b438c9401ae8c4099ae4a3a37656972"}, + {file = "ephem-4.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f9e24aeea560dfcece3c2e313eb94e6be3e84888091455e541fa88f3a44da584"}, + {file = "ephem-4.1.4-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:653d99386932e5f78bb9cfc4495030ad9f3345eb4c2b32dca55547da8f1f0332"}, + {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53786461a6d5799d5fffe76622ad51444b264d1c7263b92a6dfcac640c3da93a"}, + {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:268f57f8768ccb0abbdf4cefb4781c7db812950019868f687b407b428513ee53"}, + {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d630aa287255ea9fba6962f351e4e0729bb620570684d52fbfcc31b11527f09e"}, + {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5f229bbf62ecb4cd6bb3374b15d0f8ff7b3d970c2936fccd89bdf9d693907a2"}, + {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d60d56f182de54bd84fadd6ea2dd8e8ef6fdef6a698c7cafd404ecb6eeefa598"}, + {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:404500c8d0030d75ec15bb6b98eee78ad163fd5252102c962ae6fb39c9488198"}, + {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fb020d6cc5ab1ad1cd9d3da4a6e2506beebb41d1b337d79cc20cc0a17f550f1"}, + {file = "ephem-4.1.4-cp312-cp312-win32.whl", hash = "sha256:29e71636ee4719419d03184abc85085f76989c79a61844f5e60acbf2513d2b42"}, + {file = "ephem-4.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:549654f63d88e0ab6248ae25ac2939131474ab9f3a91bee6b68ca6f214747c2a"}, {file = "ephem-4.1.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:40067fc050c946c8d4c2d779805b61f063471a091e6124cbabcf61ac538011b2"}, {file = "ephem-4.1.4-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e2abe97aa2b091090012768b4d94793213cc01f0bf040dcc311a380ab08df69"}, {file = "ephem-4.1.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b2677d3a5b42aedc578de10b0eecdba6a50731f159cb28f7ad38c5f62143494"}, @@ -3127,14 +3186,24 @@ reference = "tsinghua" [[package]] name = "httpcore" version = "1.0.5" -description = "" +description = "A minimal low-level HTTP client." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, ] +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + [package.source] type = "legacy" url = "https://pypi.tuna.tsinghua.edu.cn/simple" @@ -3547,12 +3616,12 @@ reference = "tsinghua" [[package]] name = "jms-storage" -version = "0.0.58" +version = "0.0.59" description = "Jumpserver storage python sdk tools" optional = false python-versions = "*" files = [ - {file = "jms-storage-0.0.58.tar.gz", hash = "sha256:9508864c5b65b2628291c39e3eeccedffd77448545a0359a4cb12c6435592e62"}, + {file = "jms-storage-0.0.59.tar.gz", hash = "sha256:62171d5182f4ab774dbe4204aed8dabc37926869067e2ed4dd52afab1df8d1d3"}, ] [package.dependencies] @@ -3564,7 +3633,6 @@ certifi = "2023.7.22" chardet = "5.1.0" crcmod = "1.7" docutils = "0.20.1" -elasticsearch = "7.8.0" esdk-obs-python = "3.21.4" idna = "3.4" oss2 = "2.18.1" @@ -3887,6 +3955,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -4134,7 +4212,6 @@ files = [ {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, - {file = "msgpack-1.0.8-py3-none-any.whl", hash = "sha256:24f727df1e20b9876fa6e95f840a2a2651e34c0ad147676356f4bf5fbb0206ca"}, {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, ] @@ -4417,14 +4494,26 @@ reference = "tsinghua" [[package]] name = "openai" version = "1.29.0" -description = "" +description = "The official Python library for the openai API" optional = false -python-versions = "*" +python-versions = ">=3.7.1" files = [ {file = "openai-1.29.0-py3-none-any.whl", hash = "sha256:c61cd12376c84362d406341f9e2f9a9d6b81c082b133b44484dc0f43954496b1"}, {file = "openai-1.29.0.tar.gz", hash = "sha256:d5a769f485610cff8bae14343fa45a8b1d346be3d541fa5b28ccd040dbc8baf8"}, ] +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.7,<5" + +[package.extras] +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] + [package.source] type = "legacy" url = "https://pypi.tuna.tsinghua.edu.cn/simple" @@ -5320,14 +5409,22 @@ reference = "tsinghua" [[package]] name = "pydantic" version = "2.7.1" -description = "" +description = "Data validation using Python type hints" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ {file = "pydantic-2.7.1-py3-none-any.whl", hash = "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5"}, {file = "pydantic-2.7.1.tar.gz", hash = "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"}, ] +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.18.2" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + [package.source] type = "legacy" url = "https://pypi.tuna.tsinghua.edu.cn/simple" @@ -5336,9 +5433,9 @@ reference = "tsinghua" [[package]] name = "pydantic-core" version = "2.18.2" -description = "" +description = "Core functionality for Pydantic validation and serialization" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ {file = "pydantic_core-2.18.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81"}, {file = "pydantic_core-2.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2"}, @@ -5421,6 +5518,9 @@ files = [ {file = "pydantic_core-2.18.2.tar.gz", hash = "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e"}, ] +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + [package.source] type = "legacy" url = "https://pypi.tuna.tsinghua.edu.cn/simple" @@ -5754,9 +5854,11 @@ files = [ {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:049f2e3de919e8e02504780a21ebbf235e21ca8ed5c7538c5b6e705aa6c43d8c"}, {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd86d8e3e346e34f3f03d12e333747b53a1daa74374a727f4714d5b82ee0dd5"}, {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:508226a0df7cb6faeda9f8e84e85743690ca427d7b27af9a73d75fcf0c1eef6e"}, + {file = "pymssql-2.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:47859887adeaf184766b5e0bc845dd23611f3808f9521552063bb36eabc10092"}, {file = "pymssql-2.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d873e553374d5b1c57fe1c43bb75e3bcc2920678db1ef26f6bfed396c7d21b30"}, {file = "pymssql-2.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf31b8b76634c826a91f9999e15b7bfb0c051a0f53b319fd56481a67e5b903bb"}, {file = "pymssql-2.2.8-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:821945c2214fe666fd456c61e09a29a00e7719c9e136c801bffb3a254e9c579b"}, + {file = "pymssql-2.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:cc85b609b4e60eac25fa38bbac1ff854fd2c2a276e0ca4a3614c6f97efb644bb"}, {file = "pymssql-2.2.8-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:ebe7f64d5278d807f14bea08951e02512bfbc6219fd4d4f15bb45ded885cf3d4"}, {file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:253af3d39fc0235627966817262d5c4c94ad09dcbea59664748063470048c29c"}, {file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c9d109df536dc5f7dd851a88d285a4c9cb12a9314b621625f4f5ab1197eb312"}, @@ -5772,11 +5874,13 @@ files = [ {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3906993300650844ec140aa58772c0f5f3e9e9d5709c061334fd1551acdcf066"}, {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7309c7352e4a87c9995c3183ebfe0ff4135e955bb759109637673c61c9f0ca8d"}, {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9b8d603cc1ec7ae585c5a409a1d45e8da067970c79dd550d45c238ae0aa0f79f"}, + {file = "pymssql-2.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:293cb4d0339e221d877d6b19a1905082b658f0100a1e2ccc9dda10de58938901"}, {file = "pymssql-2.2.8-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:895041edd002a2e91d8a4faf0906b6fbfef29d9164bc6beb398421f5927fa40e"}, {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6b2d9c6d38a416c6f2db36ff1cd8e69f9a5387a46f9f4f612623192e0c9404b1"}, {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d63d6f25cf40fe6a03c49be2d4d337858362b8ab944d6684c268e4990807cf0c"}, {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c83ad3ad20951f3a94894b354fa5fa9666dcd5ebb4a635dad507c7d1dd545833"}, {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3933f7f082be74698eea835df51798dab9bc727d94d3d280bffc75ab9265f890"}, + {file = "pymssql-2.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:de313375b90b0f554058992f35c4a4beb3f6ec2f5912d8cd6afb649f95b03a9f"}, {file = "pymssql-2.2.8.tar.gz", hash = "sha256:9baefbfbd07d0142756e2dfcaa804154361ac5806ab9381350aad4e780c3033e"}, ] @@ -6265,6 +6369,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -6272,8 +6377,16 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -6290,6 +6403,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -6297,6 +6411,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -7854,4 +7969,4 @@ reference = "tsinghua" [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "ab796d01426bb06f0eee1ef4e1d2a0cbb45d12e8431502b273effe42919251d6" +content-hash = "54280c08e758b0767dbf7dd249a0d68f4a16c6de69a86723f00b2793c6bfd186" diff --git a/pyproject.toml b/pyproject.toml index 08fbc4532..6af57bf1d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,7 +47,7 @@ pynacl = "1.5.0" python-dateutil = "2.8.2" pyyaml = "6.0.1" requests = "2.31.0" -jms-storage = "^0.0.58" +jms-storage = "^0.0.59" simplejson = "3.19.1" six = "1.16.0" sshtunnel = "0.4.0" @@ -155,6 +155,9 @@ annotated-types = "^0.6.0" httpx = "^0.27.0" distro = "1.9.0" tqdm = "4.66.4" +elasticsearch7 = "7.17.9" +elasticsearch8 = "8.13.2" + [tool.poetry.group.xpack.dependencies] From 68244b2b373468237f92e2b7e0c134f4b981aa53 Mon Sep 17 00:00:00 2001 From: Bai Date: Wed, 12 Jun 2024 14:29:03 +0800 Subject: [PATCH 21/32] =?UTF-8?q?perf:=20=E6=9B=B4=E6=96=B0=20lock=20?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 88 ++++++----------------------------------------------- 1 file changed, 10 insertions(+), 78 deletions(-) diff --git a/poetry.lock b/poetry.lock index 92c52385e..a7c673f18 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1782,7 +1782,7 @@ reference = "tsinghua" [[package]] name = "data-tree" version = "0.0.1" -description = "UNKNOWN" +description = "" optional = false python-versions = "*" files = [ @@ -2485,17 +2485,6 @@ files = [ {file = "ephem-4.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8f9b27117e7a82f7f70db9cb23b5cc36d37b166a2f73c55e14d7225d0ab95afa"}, {file = "ephem-4.1.4-cp311-cp311-win32.whl", hash = "sha256:9bb21c0b117c9122c0141b0a71ee6fbbb087ed2aab4a7ab60f009e95e9f4a521"}, {file = "ephem-4.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:55d7fb5c34b2e453e01fa4ca7ee375b19b438c9401ae8c4099ae4a3a37656972"}, - {file = "ephem-4.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f9e24aeea560dfcece3c2e313eb94e6be3e84888091455e541fa88f3a44da584"}, - {file = "ephem-4.1.4-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:653d99386932e5f78bb9cfc4495030ad9f3345eb4c2b32dca55547da8f1f0332"}, - {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53786461a6d5799d5fffe76622ad51444b264d1c7263b92a6dfcac640c3da93a"}, - {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:268f57f8768ccb0abbdf4cefb4781c7db812950019868f687b407b428513ee53"}, - {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d630aa287255ea9fba6962f351e4e0729bb620570684d52fbfcc31b11527f09e"}, - {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5f229bbf62ecb4cd6bb3374b15d0f8ff7b3d970c2936fccd89bdf9d693907a2"}, - {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d60d56f182de54bd84fadd6ea2dd8e8ef6fdef6a698c7cafd404ecb6eeefa598"}, - {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:404500c8d0030d75ec15bb6b98eee78ad163fd5252102c962ae6fb39c9488198"}, - {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fb020d6cc5ab1ad1cd9d3da4a6e2506beebb41d1b337d79cc20cc0a17f550f1"}, - {file = "ephem-4.1.4-cp312-cp312-win32.whl", hash = "sha256:29e71636ee4719419d03184abc85085f76989c79a61844f5e60acbf2513d2b42"}, - {file = "ephem-4.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:549654f63d88e0ab6248ae25ac2939131474ab9f3a91bee6b68ca6f214747c2a"}, {file = "ephem-4.1.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:40067fc050c946c8d4c2d779805b61f063471a091e6124cbabcf61ac538011b2"}, {file = "ephem-4.1.4-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e2abe97aa2b091090012768b4d94793213cc01f0bf040dcc311a380ab08df69"}, {file = "ephem-4.1.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b2677d3a5b42aedc578de10b0eecdba6a50731f159cb28f7ad38c5f62143494"}, @@ -3186,24 +3175,14 @@ reference = "tsinghua" [[package]] name = "httpcore" version = "1.0.5" -description = "A minimal low-level HTTP client." +description = "" optional = false -python-versions = ">=3.8" +python-versions = "*" files = [ {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, ] -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] - [package.source] type = "legacy" url = "https://pypi.tuna.tsinghua.edu.cn/simple" @@ -3955,16 +3934,6 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -4212,6 +4181,7 @@ files = [ {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, + {file = "msgpack-1.0.8-py3-none-any.whl", hash = "sha256:24f727df1e20b9876fa6e95f840a2a2651e34c0ad147676356f4bf5fbb0206ca"}, {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, ] @@ -4494,26 +4464,14 @@ reference = "tsinghua" [[package]] name = "openai" version = "1.29.0" -description = "The official Python library for the openai API" +description = "" optional = false -python-versions = ">=3.7.1" +python-versions = "*" files = [ {file = "openai-1.29.0-py3-none-any.whl", hash = "sha256:c61cd12376c84362d406341f9e2f9a9d6b81c082b133b44484dc0f43954496b1"}, {file = "openai-1.29.0.tar.gz", hash = "sha256:d5a769f485610cff8bae14343fa45a8b1d346be3d541fa5b28ccd040dbc8baf8"}, ] -[package.dependencies] -anyio = ">=3.5.0,<5" -distro = ">=1.7.0,<2" -httpx = ">=0.23.0,<1" -pydantic = ">=1.9.0,<3" -sniffio = "*" -tqdm = ">4" -typing-extensions = ">=4.7,<5" - -[package.extras] -datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] - [package.source] type = "legacy" url = "https://pypi.tuna.tsinghua.edu.cn/simple" @@ -5409,22 +5367,14 @@ reference = "tsinghua" [[package]] name = "pydantic" version = "2.7.1" -description = "Data validation using Python type hints" +description = "" optional = false -python-versions = ">=3.8" +python-versions = "*" files = [ {file = "pydantic-2.7.1-py3-none-any.whl", hash = "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5"}, {file = "pydantic-2.7.1.tar.gz", hash = "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"}, ] -[package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.18.2" -typing-extensions = ">=4.6.1" - -[package.extras] -email = ["email-validator (>=2.0.0)"] - [package.source] type = "legacy" url = "https://pypi.tuna.tsinghua.edu.cn/simple" @@ -5433,9 +5383,9 @@ reference = "tsinghua" [[package]] name = "pydantic-core" version = "2.18.2" -description = "Core functionality for Pydantic validation and serialization" +description = "" optional = false -python-versions = ">=3.8" +python-versions = "*" files = [ {file = "pydantic_core-2.18.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81"}, {file = "pydantic_core-2.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2"}, @@ -5518,9 +5468,6 @@ files = [ {file = "pydantic_core-2.18.2.tar.gz", hash = "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e"}, ] -[package.dependencies] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" - [package.source] type = "legacy" url = "https://pypi.tuna.tsinghua.edu.cn/simple" @@ -5854,11 +5801,9 @@ files = [ {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:049f2e3de919e8e02504780a21ebbf235e21ca8ed5c7538c5b6e705aa6c43d8c"}, {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd86d8e3e346e34f3f03d12e333747b53a1daa74374a727f4714d5b82ee0dd5"}, {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:508226a0df7cb6faeda9f8e84e85743690ca427d7b27af9a73d75fcf0c1eef6e"}, - {file = "pymssql-2.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:47859887adeaf184766b5e0bc845dd23611f3808f9521552063bb36eabc10092"}, {file = "pymssql-2.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d873e553374d5b1c57fe1c43bb75e3bcc2920678db1ef26f6bfed396c7d21b30"}, {file = "pymssql-2.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf31b8b76634c826a91f9999e15b7bfb0c051a0f53b319fd56481a67e5b903bb"}, {file = "pymssql-2.2.8-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:821945c2214fe666fd456c61e09a29a00e7719c9e136c801bffb3a254e9c579b"}, - {file = "pymssql-2.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:cc85b609b4e60eac25fa38bbac1ff854fd2c2a276e0ca4a3614c6f97efb644bb"}, {file = "pymssql-2.2.8-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:ebe7f64d5278d807f14bea08951e02512bfbc6219fd4d4f15bb45ded885cf3d4"}, {file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:253af3d39fc0235627966817262d5c4c94ad09dcbea59664748063470048c29c"}, {file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c9d109df536dc5f7dd851a88d285a4c9cb12a9314b621625f4f5ab1197eb312"}, @@ -5874,13 +5819,11 @@ files = [ {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3906993300650844ec140aa58772c0f5f3e9e9d5709c061334fd1551acdcf066"}, {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7309c7352e4a87c9995c3183ebfe0ff4135e955bb759109637673c61c9f0ca8d"}, {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9b8d603cc1ec7ae585c5a409a1d45e8da067970c79dd550d45c238ae0aa0f79f"}, - {file = "pymssql-2.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:293cb4d0339e221d877d6b19a1905082b658f0100a1e2ccc9dda10de58938901"}, {file = "pymssql-2.2.8-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:895041edd002a2e91d8a4faf0906b6fbfef29d9164bc6beb398421f5927fa40e"}, {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6b2d9c6d38a416c6f2db36ff1cd8e69f9a5387a46f9f4f612623192e0c9404b1"}, {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d63d6f25cf40fe6a03c49be2d4d337858362b8ab944d6684c268e4990807cf0c"}, {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c83ad3ad20951f3a94894b354fa5fa9666dcd5ebb4a635dad507c7d1dd545833"}, {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3933f7f082be74698eea835df51798dab9bc727d94d3d280bffc75ab9265f890"}, - {file = "pymssql-2.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:de313375b90b0f554058992f35c4a4beb3f6ec2f5912d8cd6afb649f95b03a9f"}, {file = "pymssql-2.2.8.tar.gz", hash = "sha256:9baefbfbd07d0142756e2dfcaa804154361ac5806ab9381350aad4e780c3033e"}, ] @@ -6369,7 +6312,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -6377,16 +6319,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -6403,7 +6337,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -6411,7 +6344,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, From 3608b025e5fbbab97e8c4632166a21f40ad607bc Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Wed, 12 Jun 2024 15:47:33 +0800 Subject: [PATCH 22/32] =?UTF-8?q?fix:=20es8=E4=BC=9A=E8=AF=9D=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E6=9F=A5=E8=AF=A2=E4=B8=8D=E5=88=B0=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/common/plugins/es.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/apps/common/plugins/es.py b/apps/common/plugins/es.py index ed17d9c2c..ecbfbd356 100644 --- a/apps/common/plugins/es.py +++ b/apps/common/plugins/es.py @@ -43,7 +43,8 @@ class NotSupportElasticsearch8(JMSException): class ESClient(object): def __new__(cls, *args, **kwargs): - version = kwargs.pop('version') + hosts = kwargs.get('hosts', []) + version = get_es_client_version(hosts=hosts) if version == 6: return ESClientV6(*args, **kwargs) if version == 7: @@ -94,8 +95,8 @@ class ESClientV8(ESClientBase): return {field: {'order': direction}} -def get_es_client_version(**kwargs): - es = kwargs.get('es') +def get_es_client_version(hosts, **kwargs): + es = Elasticsearch(hosts=hosts, max_retries=0, **kwargs) info = es.info() version = int(info['version']['number'].split('.')[0]) return version @@ -112,9 +113,7 @@ class ES(object): ignore_verify_certs = kwargs.pop('IGNORE_VERIFY_CERTS', False) if ignore_verify_certs: kwargs['verify_certs'] = None - self.es = Elasticsearch(hosts=hosts, max_retries=0, **kwargs) - self.version = get_es_client_version(es=self.es) - self.client = ESClient(version=self.version, hosts=hosts, max_retries=0, **kwargs) + self.client = ESClient(hosts=hosts, max_retries=0, **kwargs) self.es = self.client.es self.index_prefix = self.config.get('INDEX') or 'jumpserver' self.is_index_by_date = bool(self.config.get('INDEX_BY_DATE', False)) @@ -227,11 +226,15 @@ class ES(object): def _filter(self, query: dict, from_=None, size=None, sort=None): body = self.get_query_body(**query) - - data = self.es.search( - index=self.query_index, body=body, - from_=from_, size=size, sort=sort - ) + search_params = { + 'index': self.query_index, + 'body': body, + 'from_': from_, + 'size': size + } + if sort is not None: + search_params['sort'] = sort + data = self.es.search(**search_params) source_data = [] for item in data['hits']['hits']: From 0a0312695bebafe0b9785d0c74519aa8b589e490 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Thu, 13 Jun 2024 10:29:51 +0800 Subject: [PATCH 23/32] =?UTF-8?q?fix:=20es=E4=BD=BF=E7=94=A8https=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/common/plugins/es.py | 26 +- apps/locale/ja/LC_MESSAGES/django.mo | 4 +- apps/locale/ja/LC_MESSAGES/django.po | 439 +++++++++++----------- apps/locale/zh/LC_MESSAGES/django.mo | 4 +- apps/locale/zh/LC_MESSAGES/django.po | 437 ++++++++++----------- apps/locale/zh_Hant/LC_MESSAGES/django.mo | 4 +- apps/locale/zh_Hant/LC_MESSAGES/django.po | 437 ++++++++++----------- 7 files changed, 701 insertions(+), 650 deletions(-) diff --git a/apps/common/plugins/es.py b/apps/common/plugins/es.py index ecbfbd356..0b1bf702b 100644 --- a/apps/common/plugins/es.py +++ b/apps/common/plugins/es.py @@ -16,7 +16,7 @@ from django.utils.translation import gettext_lazy as _ from django.db.models import QuerySet as DJQuerySet from elasticsearch7 import Elasticsearch from elasticsearch7.helpers import bulk -from elasticsearch7.exceptions import RequestError +from elasticsearch7.exceptions import RequestError, SSLError from elasticsearch7.exceptions import NotFoundError as NotFoundError7 from elasticsearch8.exceptions import NotFoundError as NotFoundError8 @@ -40,11 +40,16 @@ class NotSupportElasticsearch8(JMSException): default_detail = _('Not Support Elasticsearch8') +class InvalidElasticsearchSSL(JMSException): + default_code = 'invalid_elasticsearch_SSL' + default_detail = _( + 'Connection failed: Self-signed certificate used. Please check server certificate configuration') + + class ESClient(object): def __new__(cls, *args, **kwargs): - hosts = kwargs.get('hosts', []) - version = get_es_client_version(hosts=hosts) + version = get_es_client_version(**kwargs) if version == 6: return ESClientV6(*args, **kwargs) if version == 7: @@ -95,11 +100,16 @@ class ESClientV8(ESClientBase): return {field: {'order': direction}} -def get_es_client_version(hosts, **kwargs): - es = Elasticsearch(hosts=hosts, max_retries=0, **kwargs) - info = es.info() - version = int(info['version']['number'].split('.')[0]) - return version +def get_es_client_version(**kwargs): + try: + es = Elasticsearch(**kwargs) + info = es.info() + version = int(info['version']['number'].split('.')[0]) + return version + except SSLError: + raise InvalidElasticsearchSSL + except Exception: + raise InvalidElasticsearch class ES(object): diff --git a/apps/locale/ja/LC_MESSAGES/django.mo b/apps/locale/ja/LC_MESSAGES/django.mo index 3505cc8c4..514c6d921 100644 --- a/apps/locale/ja/LC_MESSAGES/django.mo +++ b/apps/locale/ja/LC_MESSAGES/django.mo @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e4baadc170ded5134bed55533c4c04e694be6ea7b8e151d80c1092728e26a75b -size 177500 +oid sha256:4c47b806817e09e63c804277a1a2db8bdf959807e482605322be323922c38209 +size 177735 diff --git a/apps/locale/ja/LC_MESSAGES/django.po b/apps/locale/ja/LC_MESSAGES/django.po index 84396439e..f8e79e1d9 100644 --- a/apps/locale/ja/LC_MESSAGES/django.po +++ b/apps/locale/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-08 14:11+0800\n" +"POT-Creation-Date: 2024-06-13 10:19+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -36,7 +36,7 @@ msgstr "成功: %s、失敗: %s、合計: %s" #: settings/serializers/auth/ldap.py:25 settings/serializers/auth/ldap.py:47 #: settings/serializers/msg.py:35 terminal/serializers/storage.py:123 #: terminal/serializers/storage.py:142 users/forms/profile.py:21 -#: users/serializers/user.py:110 +#: users/serializers/user.py:111 #: users/templates/users/_msg_user_created.html:13 #: users/templates/users/user_password_verify.html:18 #: xpack/plugins/cloud/serializers/account_attrs.py:28 @@ -84,7 +84,7 @@ msgstr "匿名ユーザー" msgid "Specified account" msgstr "特定のアカウント" -#: accounts/const/account.py:26 users/models/user.py:752 +#: accounts/const/account.py:26 users/models/user.py:753 msgid "Local" msgstr "ローカル" @@ -107,7 +107,7 @@ msgid "Update" msgstr "更新" #: accounts/const/account.py:34 accounts/const/automation.py:109 -#: accounts/serializers/automations/change_secret.py:164 audits/const.py:62 +#: accounts/serializers/automations/change_secret.py:164 audits/const.py:65 #: audits/signal_handlers/activity_log.py:33 common/const/choices.py:19 #: ops/const.py:76 terminal/const.py:79 xpack/plugins/cloud/const.py:47 msgid "Failed" @@ -211,7 +211,7 @@ msgstr "作成のみ" #: authentication/serializers/password_mfa.py:24 #: notifications/backends/__init__.py:10 settings/serializers/msg.py:22 #: settings/serializers/msg.py:64 users/forms/profile.py:100 -#: users/forms/profile.py:108 users/models/user.py:816 +#: users/forms/profile.py:108 users/models/user.py:817 #: users/templates/users/forgot_password.html:162 #: users/views/profile/reset.py:94 msgid "Email" @@ -222,7 +222,7 @@ msgid "SFTP" msgstr "SFTP" #: accounts/const/automation.py:110 -#: accounts/serializers/automations/change_secret.py:163 audits/const.py:61 +#: accounts/serializers/automations/change_secret.py:163 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:46 #: terminal/const.py:78 terminal/models/session/sharing.py:121 @@ -280,7 +280,7 @@ msgstr "ユーザー %s がパスワードを閲覧/導き出しました" #: terminal/serializers/session.py:28 #: terminal/templates/terminal/_msg_command_warning.html:4 #: terminal/templates/terminal/_msg_session_sharing.html:4 -#: tickets/models/ticket/apply_asset.py:16 xpack/plugins/cloud/models.py:252 +#: tickets/models/ticket/apply_asset.py:16 xpack/plugins/cloud/models.py:261 msgid "Asset" msgstr "資産" @@ -292,14 +292,14 @@ msgstr "資産" msgid "Su from" msgstr "から切り替え" -#: accounts/models/account.py:55 assets/const/protocol.py:177 +#: accounts/models/account.py:55 assets/const/protocol.py:178 #: settings/serializers/auth/cas.py:20 terminal/models/applet/applet.py:35 #: terminal/models/virtualapp/virtualapp.py:21 msgid "Version" msgstr "バージョン" #: accounts/models/account.py:57 accounts/serializers/account/account.py:215 -#: users/models/user.py:859 +#: users/models/user.py:860 msgid "Source" msgstr "ソース" @@ -319,7 +319,7 @@ msgstr "ソース ID" #: terminal/backends/command/models.py:18 terminal/models/session/session.py:34 #: 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:85 +#: tickets/models/ticket/command_confirm.py:13 xpack/plugins/cloud/models.py:86 msgid "Account" msgstr "アカウント" @@ -414,7 +414,7 @@ msgid "Trigger mode" msgstr "トリガーモード" #: accounts/models/automations/backup_account.py:133 audits/models.py:203 -#: terminal/models/session/sharing.py:125 xpack/plugins/cloud/models.py:204 +#: terminal/models/session/sharing.py:125 xpack/plugins/cloud/models.py:213 msgid "Reason" msgstr "理由" @@ -509,8 +509,8 @@ msgstr "終了日" #: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:136 #: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:281 #: tickets/serializers/super_ticket.py:13 -#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:200 -#: xpack/plugins/cloud/models.py:256 +#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:209 +#: xpack/plugins/cloud/models.py:265 msgid "Status" msgstr "ステータス" @@ -546,7 +546,7 @@ msgstr "最終ログイン日" #: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9 #: terminal/serializers/storage.py:136 users/forms/profile.py:31 -#: users/forms/profile.py:114 users/models/user.py:812 +#: users/forms/profile.py:114 users/models/user.py:813 #: users/templates/users/_msg_user_created.html:12 #: xpack/plugins/cloud/serializers/account_attrs.py:26 msgid "Username" @@ -591,7 +591,7 @@ msgid "Verify asset account" msgstr "アカウントの確認" #: accounts/models/base.py:37 accounts/models/base.py:67 -#: accounts/serializers/account/account.py:440 +#: accounts/serializers/account/account.py:443 #: accounts/serializers/account/base.py:17 #: accounts/serializers/automations/change_secret.py:47 #: authentication/serializers/connect_token_secret.py:42 @@ -642,8 +642,8 @@ msgstr "パスワードルール" #: terminal/models/virtualapp/provider.py:10 #: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87 #: users/forms/profile.py:32 users/models/group.py:13 -#: users/models/preference.py:11 users/models/user.py:814 -#: xpack/plugins/cloud/models.py:32 xpack/plugins/cloud/models.py:272 +#: users/models/preference.py:11 users/models/user.py:815 +#: xpack/plugins/cloud/models.py:33 xpack/plugins/cloud/models.py:281 #: xpack/plugins/cloud/serializers/task.py:70 msgid "Name" msgstr "名前" @@ -658,7 +658,7 @@ msgstr "特権アカウント" #: authentication/serializers/connect_token_secret.py:117 #: terminal/models/applet/applet.py:40 #: terminal/models/component/endpoint.py:120 -#: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:174 +#: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:175 msgid "Is active" msgstr "アクティブです。" @@ -674,7 +674,7 @@ msgstr "プラットフォーム" msgid "Push params" msgstr "パラメータをプッシュする" -#: accounts/models/template.py:26 xpack/plugins/cloud/models.py:329 +#: accounts/models/template.py:26 xpack/plugins/cloud/models.py:338 msgid "Account template" msgstr "アカウント テンプレート" @@ -844,18 +844,24 @@ msgstr "アセットはアカウント タイプをサポートしていませ msgid "Account has exist" msgstr "アカウントはすでに存在しています" -#: accounts/serializers/account/account.py:441 +#: accounts/serializers/account/account.py:438 +#: accounts/serializers/account/template.py:72 +#: assets/serializers/asset/common.py:384 +msgid "Spec info" +msgstr "特別情報" + +#: accounts/serializers/account/account.py:444 #: authentication/serializers/connect_token_secret.py:159 #: authentication/templates/authentication/_access_key_modal.html:30 #: perms/models/perm_node.py:21 users/serializers/group.py:33 msgid "ID" msgstr "ID" -#: accounts/serializers/account/account.py:451 acls/serializers/base.py:116 +#: accounts/serializers/account/account.py:454 acls/serializers/base.py:116 #: acls/templates/acls/asset_login_reminder.html:5 #: acls/templates/acls/user_login_reminder.html:5 #: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:54 -#: audits/models.py:90 audits/models.py:172 audits/models.py:269 +#: audits/models.py:90 audits/models.py:172 audits/models.py:271 #: audits/serializers.py:171 authentication/models/connection_token.py:32 #: authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 @@ -867,12 +873,12 @@ msgstr "ID" #: terminal/notifications.py:205 terminal/serializers/command.py:16 #: terminal/templates/terminal/_msg_command_warning.html:6 #: terminal/templates/terminal/_msg_session_sharing.html:6 -#: tickets/models/comment.py:21 users/const.py:14 users/models/user.py:1019 -#: users/models/user.py:1057 users/serializers/group.py:21 +#: tickets/models/comment.py:21 users/const.py:14 users/models/user.py:1020 +#: users/models/user.py:1058 users/serializers/group.py:21 msgid "User" msgstr "ユーザー" -#: accounts/serializers/account/account.py:452 +#: accounts/serializers/account/account.py:455 #: authentication/templates/authentication/_access_key_modal.html:33 #: terminal/notifications.py:158 terminal/notifications.py:207 msgid "Date" @@ -904,12 +910,7 @@ msgstr "資産タイプ" msgid "Key password" msgstr "キーパスワード" -#: accounts/serializers/account/base.py:78 -#: assets/serializers/asset/common.py:384 -msgid "Spec info" -msgstr "特別情報" - -#: accounts/serializers/account/base.py:80 +#: accounts/serializers/account/base.py:79 msgid "" "Tip: If no username is required for authentication, fill in `null`, If AD " "account, like `username@domain`" @@ -941,15 +942,15 @@ msgstr "特殊記号" msgid "Exclude symbol" msgstr "除外文字" -#: accounts/serializers/account/template.py:38 +#: accounts/serializers/account/template.py:39 msgid "Secret generation strategy for account creation" msgstr "账号创建时,密文生成策略" -#: accounts/serializers/account/template.py:39 +#: accounts/serializers/account/template.py:40 msgid "Whether to automatically push the account to the asset" msgstr "是否自动推送账号到资产" -#: accounts/serializers/account/template.py:42 +#: accounts/serializers/account/template.py:43 msgid "" "Associated platform, you can configure push parameters. If not associated, " "default parameters will be used" @@ -965,8 +966,8 @@ msgstr "关联平台,可以配置推送参数,如果不关联,则使用默 #: terminal/models/component/endpoint.py:119 #: terminal/models/session/session.py:47 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 -#: tickets/models/ticket/general.py:295 users/models/user.py:850 -#: xpack/plugins/cloud/models.py:39 xpack/plugins/cloud/models.py:106 +#: tickets/models/ticket/general.py:295 users/models/user.py:851 +#: xpack/plugins/cloud/models.py:40 xpack/plugins/cloud/models.py:108 msgid "Comment" msgstr "コメント" @@ -1141,13 +1142,13 @@ msgstr "通知" #: acls/models/base.py:37 assets/models/_user.py:51 #: assets/models/cmd_filter.py:76 terminal/models/component/endpoint.py:112 -#: xpack/plugins/cloud/models.py:278 +#: xpack/plugins/cloud/models.py:287 msgid "Priority" msgstr "優先順位" #: acls/models/base.py:38 assets/models/_user.py:51 #: assets/models/cmd_filter.py:76 terminal/models/component/endpoint.py:113 -#: xpack/plugins/cloud/models.py:279 +#: xpack/plugins/cloud/models.py:288 msgid "1-100, the lower the value will be match first" msgstr "1-100、低い値は最初に一致します" @@ -1184,7 +1185,7 @@ msgid "Command" msgstr "コマンド" #: acls/models/command_acl.py:17 assets/models/cmd_filter.py:59 -#: xpack/plugins/cloud/models.py:295 +#: xpack/plugins/cloud/models.py:304 msgid "Regex" msgstr "正規情報" @@ -1329,14 +1330,14 @@ msgid "Thank you" msgstr "ありがとうございます。" #: acls/templates/acls/user_login_reminder.html:7 audits/models.py:194 -#: audits/models.py:263 +#: audits/models.py:265 #: authentication/templates/authentication/_msg_different_city.html:11 #: tickets/models/ticket/login_confirm.py:11 msgid "Login city" msgstr "ログイン都市" #: acls/templates/acls/user_login_reminder.html:8 audits/models.py:197 -#: audits/models.py:264 audits/serializers.py:68 +#: audits/models.py:266 audits/serializers.py:68 msgid "User agent" msgstr "ユーザーエージェント" @@ -1354,7 +1355,7 @@ msgstr "" msgid "Applications" msgstr "アプリケーション" -#: applications/models.py:16 xpack/plugins/cloud/models.py:37 +#: applications/models.py:16 xpack/plugins/cloud/models.py:38 #: xpack/plugins/cloud/serializers/account.py:68 msgid "Attrs" msgstr "ツールバーの" @@ -1420,8 +1421,7 @@ msgid "Unable to connect to port {port} on {address}" msgstr "{port} のポート {address} に接続できません" #: assets/automations/ping_gateway/manager.py:58 -#: authentication/backends/oauth2/views.py:60 authentication/middleware.py:93 -#: xpack/plugins/cloud/providers/fc.py:47 +#: authentication/middleware.py:93 xpack/plugins/cloud/providers/fc.py:47 msgid "Authentication failed" msgstr "認証に失敗しました" @@ -1430,7 +1430,7 @@ msgstr "認証に失敗しました" msgid "Connect failed" msgstr "接続に失敗しました" -#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:44 +#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:47 #: audits/signal_handlers/activity_log.py:62 common/utils/ip/geoip/utils.py:31 #: common/utils/ip/geoip/utils.py:37 common/utils/ip/utils.py:104 msgid "Unknown" @@ -1452,7 +1452,7 @@ msgstr "テストゲートウェイ" msgid "Gather facts" msgstr "資産情報の収集" -#: assets/const/base.py:32 audits/const.py:55 +#: assets/const/base.py:32 audits/const.py:58 #: terminal/serializers/applet_host.py:32 msgid "Disabled" msgstr "無効" @@ -1464,7 +1464,7 @@ msgstr "無効" msgid "Basic" msgstr "基本" -#: assets/const/base.py:34 assets/const/protocol.py:268 +#: assets/const/base.py:34 assets/const/protocol.py:275 #: assets/models/asset/web.py:13 msgid "Script" msgstr "脚本" @@ -1486,7 +1486,7 @@ msgid "Cloud service" msgstr "クラウド サービス" #: assets/const/category.py:14 assets/models/asset/gpt.py:11 -#: assets/models/asset/web.py:16 audits/const.py:42 +#: assets/models/asset/web.py:16 audits/const.py:45 #: terminal/models/applet/applet.py:27 users/const.py:64 msgid "Web" msgstr "Web" @@ -1532,19 +1532,19 @@ msgstr "ChatGPT" msgid "Other" msgstr "その他" -#: assets/const/protocol.py:45 +#: assets/const/protocol.py:46 msgid "Old SSH version" msgstr "古いSSHバージョン" -#: assets/const/protocol.py:46 +#: assets/const/protocol.py:47 msgid "Old SSH version like openssh 5.x or 6.x" msgstr "openssh 5.x または 6.x などの古い SSH バージョン" -#: assets/const/protocol.py:57 +#: assets/const/protocol.py:58 msgid "SFTP root" msgstr "SFTPルート" -#: assets/const/protocol.py:59 +#: assets/const/protocol.py:60 #, python-brace-format msgid "" "SFTP root directory, Support variable:
- ${ACCOUNT} The connected " @@ -1555,89 +1555,89 @@ msgstr "" "ユーザー名
-${HOME}接続されたアカウントのホームディレクトリ
-${USER}" "ユーザーのユーザー名" -#: assets/const/protocol.py:74 +#: assets/const/protocol.py:75 msgid "Console" msgstr "Console" -#: assets/const/protocol.py:75 +#: assets/const/protocol.py:76 msgid "Connect to console session" msgstr "コンソールセッションに接続" -#: assets/const/protocol.py:79 +#: assets/const/protocol.py:80 msgid "Any" msgstr "任意" -#: assets/const/protocol.py:81 settings/serializers/security.py:232 +#: assets/const/protocol.py:82 settings/serializers/security.py:232 msgid "Security" msgstr "セキュリティ" -#: assets/const/protocol.py:82 +#: assets/const/protocol.py:83 msgid "Security layer to use for the connection" msgstr "接続に使用するセキュリティ レイヤー" -#: assets/const/protocol.py:88 +#: assets/const/protocol.py:89 msgid "AD domain" msgstr "AD ドメイン" -#: assets/const/protocol.py:103 +#: assets/const/protocol.py:104 msgid "Username prompt" msgstr "ユーザー名プロンプト" -#: assets/const/protocol.py:104 +#: assets/const/protocol.py:105 msgid "We will send username when we see this prompt" msgstr "このプロンプトが表示されたらユーザー名を送信します" -#: assets/const/protocol.py:109 +#: assets/const/protocol.py:110 msgid "Password prompt" msgstr "パスワードプロンプト" -#: assets/const/protocol.py:110 +#: assets/const/protocol.py:111 msgid "We will send password when we see this prompt" msgstr "このプロンプトが表示されたらパスワードを送信します" -#: assets/const/protocol.py:115 +#: assets/const/protocol.py:116 msgid "Success prompt" msgstr "成功プロンプト" -#: assets/const/protocol.py:116 +#: assets/const/protocol.py:117 msgid "We will consider login success when we see this prompt" msgstr "このプロンプトが表示されたらログイン成功とみなします" -#: assets/const/protocol.py:127 assets/models/asset/database.py:10 +#: assets/const/protocol.py:128 assets/models/asset/database.py:10 #: settings/serializers/msg.py:47 msgid "Use SSL" msgstr "SSLの使用" -#: assets/const/protocol.py:162 +#: assets/const/protocol.py:163 msgid "SYSDBA" msgstr "SYSDBA" -#: assets/const/protocol.py:163 +#: assets/const/protocol.py:164 msgid "Connect as SYSDBA" msgstr "SYSDBA として接続" -#: assets/const/protocol.py:178 +#: assets/const/protocol.py:179 msgid "" "SQL Server version, Different versions have different connection drivers" msgstr "SQL Server のバージョン。バージョンによって接続ドライバが異なります" -#: assets/const/protocol.py:202 +#: assets/const/protocol.py:209 msgid "Auth source" msgstr "認証データベース" -#: assets/const/protocol.py:203 +#: assets/const/protocol.py:210 msgid "The database to authenticate against" msgstr "認証するデータベース" -#: assets/const/protocol.py:215 +#: assets/const/protocol.py:222 msgid "Auth username" msgstr "ユーザー名で認証する" -#: assets/const/protocol.py:238 +#: assets/const/protocol.py:245 msgid "Safe mode" msgstr "安全モード" -#: assets/const/protocol.py:240 +#: assets/const/protocol.py:247 msgid "" "When safe mode is enabled, some operations will be disabled, such as: New " "tab, right click, visit other website, etc." @@ -1645,24 +1645,24 @@ msgstr "" "安全モードが有効になっている場合、新しいタブ、右クリック、他のウェブサイトへ" "のアクセスなど、一部の操作が無効になります" -#: assets/const/protocol.py:245 assets/models/asset/web.py:9 +#: assets/const/protocol.py:252 assets/models/asset/web.py:9 #: assets/serializers/asset/info/spec.py:16 msgid "Autofill" msgstr "自動充填" -#: assets/const/protocol.py:253 assets/models/asset/web.py:10 +#: assets/const/protocol.py:260 assets/models/asset/web.py:10 msgid "Username selector" msgstr "ユーザー名ピッカー" -#: assets/const/protocol.py:258 assets/models/asset/web.py:11 +#: assets/const/protocol.py:265 assets/models/asset/web.py:11 msgid "Password selector" msgstr "パスワードセレクター" -#: assets/const/protocol.py:263 assets/models/asset/web.py:12 +#: assets/const/protocol.py:270 assets/models/asset/web.py:12 msgid "Submit selector" msgstr "ボタンセレクターを確認する" -#: assets/const/protocol.py:286 +#: assets/const/protocol.py:293 msgid "API mode" msgstr "APIモード" @@ -1688,19 +1688,19 @@ msgstr "SSHパブリックキー" #: assets/models/_user.py:28 assets/models/automations/base.py:114 #: assets/models/cmd_filter.py:41 assets/models/group.py:19 -#: audits/models.py:267 common/db/models.py:34 ops/models/base.py:54 -#: ops/models/job.py:240 users/models/user.py:1058 +#: audits/models.py:269 common/db/models.py:34 ops/models/base.py:54 +#: ops/models/job.py:240 users/models/user.py:1059 msgid "Date created" msgstr "作成された日付" #: assets/models/_user.py:29 assets/models/cmd_filter.py:42 -#: common/db/models.py:35 users/models/user.py:868 +#: common/db/models.py:35 users/models/user.py:869 msgid "Date updated" msgstr "更新日" #: assets/models/_user.py:30 assets/models/cmd_filter.py:44 #: assets/models/cmd_filter.py:91 assets/models/group.py:18 -#: common/db/models.py:32 users/models/user.py:857 +#: common/db/models.py:32 users/models/user.py:858 #: users/serializers/group.py:32 msgid "Created by" msgstr "によって作成された" @@ -1792,20 +1792,20 @@ msgstr "アドレス" #: assets/models/asset/common.py:161 assets/models/platform.py:134 #: authentication/backends/passkey/models.py:12 #: authentication/serializers/connect_token_secret.py:118 -#: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:325 +#: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:334 msgid "Platform" msgstr "プラットフォーム" #: assets/models/asset/common.py:163 assets/models/domain.py:22 #: authentication/serializers/connect_token_secret.py:136 -#: perms/serializers/user_permission.py:28 xpack/plugins/cloud/models.py:327 +#: perms/serializers/user_permission.py:28 xpack/plugins/cloud/models.py:336 msgid "Domain" msgstr "ドメイン" #: assets/models/asset/common.py:165 assets/models/automations/base.py:18 #: assets/models/cmd_filter.py:32 assets/models/node.py:553 #: perms/models/asset_permission.py:72 perms/serializers/permission.py:37 -#: tickets/models/ticket/apply_asset.py:14 xpack/plugins/cloud/models.py:326 +#: tickets/models/ticket/apply_asset.py:14 xpack/plugins/cloud/models.py:335 msgid "Node" msgstr "ノード" @@ -1889,7 +1889,7 @@ msgstr "確認済みの日付" #: assets/models/cmd_filter.py:28 perms/models/asset_permission.py:66 #: perms/serializers/permission.py:34 users/models/group.py:25 -#: users/models/user.py:820 +#: users/models/user.py:821 msgid "User group" msgstr "ユーザーグループ" @@ -1939,7 +1939,7 @@ msgstr "デフォルト" msgid "Default asset group" msgstr "デフォルトアセットグループ" -#: assets/models/label.py:15 rbac/const.py:6 users/models/user.py:1043 +#: assets/models/label.py:15 rbac/const.py:6 users/models/user.py:1044 msgid "System" msgstr "システム" @@ -2004,7 +2004,7 @@ msgstr "開ける" msgid "Setting" msgstr "設定" -#: assets/models/platform.py:38 audits/const.py:56 +#: assets/models/platform.py:38 audits/const.py:59 #: authentication/backends/passkey/models.py:11 settings/models.py:37 #: terminal/serializers/applet_host.py:33 msgid "Enabled" @@ -2133,7 +2133,7 @@ msgstr "" #: authentication/serializers/connect_token_secret.py:30 #: authentication/serializers/connect_token_secret.py:75 #: perms/models/asset_permission.py:76 perms/serializers/permission.py:42 -#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:328 +#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:337 #: xpack/plugins/cloud/serializers/task.py:33 msgid "Protocols" msgstr "プロトコル" @@ -2470,31 +2470,36 @@ msgstr "承認" msgid "Close" msgstr "閉じる" -#: audits/const.py:43 settings/serializers/terminal.py:6 +#: audits/const.py:41 ops/models/celery.py:84 +#: terminal/models/session/sharing.py:128 tickets/const.py:25 +msgid "Finished" +msgstr "終了" + +#: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:175 #: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 #: terminal/serializers/session.py:69 msgid "Terminal" msgstr "ターミナル" -#: audits/const.py:48 audits/models.py:132 +#: audits/const.py:51 audits/models.py:132 msgid "Operate log" msgstr "ログの操作" -#: audits/const.py:49 +#: audits/const.py:52 msgid "Session log" msgstr "セッションログ" -#: audits/const.py:50 +#: audits/const.py:53 msgid "Login log" msgstr "ログインログ" -#: audits/const.py:51 terminal/models/applet/host.py:144 +#: audits/const.py:54 terminal/models/applet/host.py:144 #: terminal/models/component/task.py:22 msgid "Task" msgstr "タスク" -#: audits/const.py:57 +#: audits/const.py:60 msgid "-" msgstr "-" @@ -2578,18 +2583,18 @@ msgstr "による変更" msgid "Password change log" msgstr "パスワード変更ログ" -#: audits/models.py:190 audits/models.py:265 +#: audits/models.py:190 audits/models.py:267 msgid "Login type" msgstr "ログインタイプ" -#: audits/models.py:192 audits/models.py:261 +#: audits/models.py:192 audits/models.py:263 #: tickets/models/ticket/login_confirm.py:10 msgid "Login IP" msgstr "ログインIP" #: audits/models.py:200 audits/serializers.py:52 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 -#: users/forms/profile.py:63 users/models/user.py:837 +#: users/forms/profile.py:63 users/models/user.py:838 #: users/serializers/profile.py:102 msgid "MFA" msgstr "MFA" @@ -2598,7 +2603,7 @@ msgstr "MFA" msgid "Date login" msgstr "日付ログイン" -#: audits/models.py:212 audits/models.py:266 audits/serializers.py:70 +#: audits/models.py:212 audits/models.py:268 audits/serializers.py:70 #: audits/serializers.py:184 msgid "Authentication backend" msgstr "認証バックエンド" @@ -2607,15 +2612,15 @@ msgstr "認証バックエンド" msgid "User login log" msgstr "ユーザーログインログ" -#: audits/models.py:262 +#: audits/models.py:264 msgid "Session key" msgstr "セッションID" -#: audits/models.py:298 +#: audits/models.py:300 msgid "User session" msgstr "ユーザーセッション" -#: audits/models.py:300 +#: audits/models.py:302 msgid "Offline user session" msgstr "オフラインユーザセッション" @@ -2638,7 +2643,7 @@ msgstr "ユーザー %s %s が現在のリソースをサブスクライブし #: audits/serializers.py:172 authentication/models/connection_token.py:47 #: authentication/models/temp_token.py:13 perms/models/asset_permission.py:80 #: tickets/models/ticket/apply_application.py:31 -#: tickets/models/ticket/apply_asset.py:20 users/models/user.py:855 +#: tickets/models/ticket/apply_asset.py:20 users/models/user.py:856 msgid "Date expired" msgstr "期限切れの日付" @@ -2671,29 +2676,29 @@ msgstr "認証トークン" #: audits/signal_handlers/login_log.py:37 authentication/notifications.py:73 #: authentication/views/login.py:77 notifications/backends/__init__.py:11 -#: settings/serializers/auth/wecom.py:10 users/models/user.py:759 -#: users/models/user.py:869 +#: settings/serializers/auth/wecom.py:10 users/models/user.py:760 +#: users/models/user.py:870 msgid "WeCom" msgstr "企業微信" #: audits/signal_handlers/login_log.py:38 authentication/views/feishu.py:105 #: authentication/views/login.py:89 notifications/backends/__init__.py:14 -#: settings/serializers/auth/feishu.py:10 users/models/user.py:761 -#: users/models/user.py:871 +#: settings/serializers/auth/feishu.py:10 users/models/user.py:762 +#: users/models/user.py:872 msgid "FeiShu" msgstr "本を飛ばす" #: audits/signal_handlers/login_log.py:40 authentication/views/login.py:101 #: authentication/views/slack.py:87 notifications/backends/__init__.py:16 -#: settings/serializers/auth/slack.py:10 users/models/user.py:763 -#: users/models/user.py:873 +#: settings/serializers/auth/slack.py:10 users/models/user.py:764 +#: users/models/user.py:874 msgid "Slack" msgstr "" #: audits/signal_handlers/login_log.py:41 authentication/views/dingtalk.py:161 #: authentication/views/login.py:83 notifications/backends/__init__.py:12 -#: settings/serializers/auth/dingtalk.py:10 users/models/user.py:760 -#: users/models/user.py:870 +#: settings/serializers/auth/dingtalk.py:10 users/models/user.py:761 +#: users/models/user.py:871 msgid "DingTalk" msgstr "DingTalk" @@ -3292,7 +3297,7 @@ msgstr "アクション" #: authentication/serializers/connection_token.py:42 #: perms/serializers/permission.py:40 perms/serializers/permission.py:60 -#: users/serializers/user.py:101 users/serializers/user.py:178 +#: users/serializers/user.py:102 users/serializers/user.py:179 msgid "Is expired" msgstr "期限切れです" @@ -3306,8 +3311,8 @@ msgid "Access IP" msgstr "Access IP" #: authentication/serializers/token.py:92 perms/serializers/permission.py:39 -#: perms/serializers/permission.py:61 users/serializers/user.py:102 -#: users/serializers/user.py:175 +#: perms/serializers/permission.py:61 users/serializers/user.py:103 +#: users/serializers/user.py:176 msgid "Is valid" msgstr "有効です" @@ -3332,13 +3337,13 @@ msgid "Show" msgstr "表示" #: authentication/templates/authentication/_access_key_modal.html:66 -#: users/const.py:42 users/models/user.py:654 users/serializers/profile.py:92 +#: users/const.py:42 users/models/user.py:655 users/serializers/profile.py:92 #: users/templates/users/user_verify_mfa.html:36 msgid "Disable" msgstr "無効化" #: authentication/templates/authentication/_access_key_modal.html:67 -#: users/const.py:43 users/models/user.py:655 users/serializers/profile.py:93 +#: users/const.py:43 users/models/user.py:656 users/serializers/profile.py:93 #: users/templates/users/mfa_setting.html:26 #: users/templates/users/mfa_setting.html:68 msgid "Enable" @@ -3652,11 +3657,11 @@ msgstr "{} 認証へのリダイレクト" msgid "Login timeout, please try again." msgstr "ログインタイムアウト、もう一度お試しください" -#: authentication/views/login.py:294 +#: authentication/views/login.py:296 msgid "User email already exists ({})" msgstr "ユーザー メールボックスは既に存在します ({})" -#: authentication/views/login.py:372 +#: authentication/views/login.py:374 msgid "" "Wait for {} confirm, You also can copy link to her/him
\n" " Don't close this page" @@ -3664,15 +3669,15 @@ msgstr "" "{} 確認を待ちます。彼女/彼へのリンクをコピーすることもできます
\n" " このページを閉じないでください" -#: authentication/views/login.py:377 +#: authentication/views/login.py:379 msgid "No ticket found" msgstr "チケットが見つかりません" -#: authentication/views/login.py:413 +#: authentication/views/login.py:415 msgid "Logout success" msgstr "ログアウト成功" -#: authentication/views/login.py:414 +#: authentication/views/login.py:416 msgid "Logout success, return login page" msgstr "ログアウト成功、ログインページを返す" @@ -3816,7 +3821,7 @@ msgstr "は破棄されます" msgid "discard time" msgstr "時間を捨てる" -#: common/db/models.py:33 users/models/user.py:858 +#: common/db/models.py:33 users/models/user.py:859 msgid "Updated by" msgstr "によって更新" @@ -3881,14 +3886,22 @@ msgstr "このアクションでは、MFAの確認が必要です。" msgid "Unexpect error occur" msgstr "予期しないエラーが発生します" -#: common/plugins/es.py:31 +#: common/plugins/es.py:35 msgid "Invalid elasticsearch config" msgstr "無効なElasticsearch構成" -#: common/plugins/es.py:36 +#: common/plugins/es.py:40 msgid "Not Support Elasticsearch8" msgstr "サポートされていません Elasticsearch8" +#: common/plugins/es.py:46 +msgid "" +"Connection failed: Self-signed certificate used. Please check server " +"certificate configuration" +msgstr "" +"接続失敗:自己署名証明書が使用されています,サーバーの証明書設定を確認してく" +"ださい" + #: common/sdk/im/exceptions.py:23 msgid "Network error, please contact system administrator" msgstr "ネットワークエラー、システム管理者に連絡してください" @@ -3984,7 +3997,7 @@ msgstr "間違ったデータ タイプです。リストにする必要があ msgid "Invalid choice: {}" msgstr "無効なオプション: {}" -#: common/serializers/mixin.py:406 labels/apps.py:8 +#: common/serializers/mixin.py:417 labels/apps.py:8 msgid "Labels" msgstr "ラベル" @@ -4138,7 +4151,7 @@ msgstr "タスク開始待ち" msgid "Task {} not found" msgstr "タスクは存在しません" -#: ops/api/celery.py:267 +#: ops/api/celery.py:269 msgid "Task {} args or kwargs error" msgstr "タスク実行パラメータエラー" @@ -4360,7 +4373,7 @@ msgid "Date last run" msgstr "最終実行日" #: ops/models/base.py:51 ops/models/job.py:237 -#: xpack/plugins/cloud/models.py:198 +#: xpack/plugins/cloud/models.py:207 msgid "Result" msgstr "結果" @@ -4384,11 +4397,6 @@ msgstr "タスクモニターを表示できます" msgid "Kwargs" msgstr "クワーグ" -#: ops/models/celery.py:84 terminal/models/session/sharing.py:128 -#: tickets/const.py:25 -msgid "Finished" -msgstr "終了" - #: ops/models/celery.py:87 msgid "Date published" msgstr "発売日" @@ -4839,7 +4847,7 @@ msgid "Scope" msgstr "スコープ" #: rbac/models/role.py:46 rbac/models/rolebinding.py:52 -#: users/models/user.py:824 +#: users/models/user.py:825 msgid "Role" msgstr "ロール" @@ -7350,7 +7358,7 @@ msgstr "アクセスキー" msgid "Access key secret" msgstr "アクセスキーシークレット" -#: terminal/serializers/storage.py:68 xpack/plugins/cloud/models.py:249 +#: terminal/serializers/storage.py:68 xpack/plugins/cloud/models.py:258 msgid "Region" msgstr "リージョン" @@ -7370,7 +7378,7 @@ msgstr "エンドポイントサフィックス" msgid "HOST" msgstr "ホスト" -#: terminal/serializers/storage.py:146 users/models/user.py:844 +#: terminal/serializers/storage.py:146 users/models/user.py:845 #: xpack/plugins/cloud/serializers/account_attrs.py:213 msgid "Private key" msgstr "ssh秘密鍵" @@ -8085,7 +8093,7 @@ msgstr "公開鍵は古いものと同じであってはなりません。" msgid "Not a valid ssh public key" msgstr "有効なssh公開鍵ではありません" -#: users/forms/profile.py:172 users/models/user.py:847 +#: users/forms/profile.py:172 users/models/user.py:848 #: xpack/plugins/cloud/serializers/account_attrs.py:210 msgid "Public key" msgstr "公開キー" @@ -8094,78 +8102,78 @@ msgstr "公開キー" msgid "Preference" msgstr "ユーザー設定" -#: users/models/user.py:656 users/serializers/profile.py:94 +#: users/models/user.py:657 users/serializers/profile.py:94 msgid "Force enable" msgstr "強制有効" -#: users/models/user.py:762 +#: users/models/user.py:763 msgid "Lark" msgstr "" -#: users/models/user.py:826 users/serializers/user.py:176 +#: users/models/user.py:827 users/serializers/user.py:177 msgid "Is service account" msgstr "サービスアカウントです" -#: users/models/user.py:828 +#: users/models/user.py:829 msgid "Avatar" msgstr "アバター" -#: users/models/user.py:831 +#: users/models/user.py:832 msgid "Wechat" msgstr "微信" -#: users/models/user.py:834 users/serializers/user.py:112 +#: users/models/user.py:835 users/serializers/user.py:113 msgid "Phone" msgstr "電話" -#: users/models/user.py:840 +#: users/models/user.py:841 msgid "OTP secret key" msgstr "OTP 秘密" # msgid "Private key" # msgstr "ssh秘密鍵" -#: users/models/user.py:852 users/serializers/profile.py:128 -#: users/serializers/user.py:173 +#: users/models/user.py:853 users/serializers/profile.py:128 +#: users/serializers/user.py:174 msgid "Is first login" msgstr "最初のログインです" -#: users/models/user.py:862 +#: users/models/user.py:863 msgid "Date password last updated" msgstr "最終更新日パスワード" -#: users/models/user.py:865 +#: users/models/user.py:866 msgid "Need update password" msgstr "更新パスワードが必要" -#: users/models/user.py:867 +#: users/models/user.py:868 msgid "Date api key used" msgstr "Api key 最後に使用した日付" -#: users/models/user.py:1000 +#: users/models/user.py:1001 msgid "Can not delete admin user" msgstr "管理者ユーザーを削除できませんでした" -#: users/models/user.py:1028 +#: users/models/user.py:1029 msgid "Can invite user" msgstr "ユーザーを招待できます" -#: users/models/user.py:1029 +#: users/models/user.py:1030 msgid "Can remove user" msgstr "ユーザーを削除できます" -#: users/models/user.py:1030 +#: users/models/user.py:1031 msgid "Can match user" msgstr "ユーザーに一致できます" -#: users/models/user.py:1039 +#: users/models/user.py:1040 msgid "Administrator" msgstr "管理者" -#: users/models/user.py:1042 +#: users/models/user.py:1043 msgid "Administrator is the super user of system" msgstr "管理者はシステムのスーパーユーザーです" -#: users/models/user.py:1067 +#: users/models/user.py:1068 msgid "User password history" msgstr "ユーザーパスワード履歴" @@ -8299,71 +8307,71 @@ msgstr "パスワードがセキュリティルールと一致しない" msgid "The new password cannot be the last {} passwords" msgstr "新しいパスワードを最後の {} 個のパスワードにすることはできません" -#: users/serializers/user.py:45 +#: users/serializers/user.py:46 msgid "System roles" msgstr "システムの役割" -#: users/serializers/user.py:49 +#: users/serializers/user.py:50 msgid "Org roles" msgstr "組織ロール" -#: users/serializers/user.py:52 +#: users/serializers/user.py:53 msgid "Organizations and roles" msgstr "そしきとやくわり" -#: users/serializers/user.py:94 +#: users/serializers/user.py:95 msgid "Password strategy" msgstr "パスワード戦略" -#: users/serializers/user.py:96 +#: users/serializers/user.py:97 msgid "MFA enabled" msgstr "MFA有効化" -#: users/serializers/user.py:98 +#: users/serializers/user.py:99 msgid "MFA force enabled" msgstr "MFAフォース有効化" -#: users/serializers/user.py:100 +#: users/serializers/user.py:101 msgid "Login blocked" msgstr "ログインがロックされました" -#: users/serializers/user.py:103 users/serializers/user.py:182 +#: users/serializers/user.py:104 users/serializers/user.py:183 msgid "Is OTP bound" msgstr "仮想MFAがバインドされているか" -#: users/serializers/user.py:104 +#: users/serializers/user.py:105 msgid "Super Administrator" msgstr "スーパーアドミニストレーター" -#: users/serializers/user.py:105 +#: users/serializers/user.py:106 msgid "Organization Administrator" msgstr "組織管理者" -#: users/serializers/user.py:107 +#: users/serializers/user.py:108 msgid "Can public key authentication" msgstr "公開鍵認証が可能" -#: users/serializers/user.py:177 +#: users/serializers/user.py:178 msgid "Is org admin" msgstr "組織管理者です" -#: users/serializers/user.py:179 +#: users/serializers/user.py:180 msgid "Avatar url" msgstr "アバターURL" -#: users/serializers/user.py:183 +#: users/serializers/user.py:184 msgid "MFA level" msgstr "MFA レベル" -#: users/serializers/user.py:305 +#: users/serializers/user.py:310 msgid "Select users" msgstr "ユーザーの選択" -#: users/serializers/user.py:306 +#: users/serializers/user.py:311 msgid "For security, only list several users" msgstr "セキュリティのために、複数のユーザーのみをリストします" -#: users/serializers/user.py:339 +#: users/serializers/user.py:344 msgid "name not unique" msgstr "名前が一意ではない" @@ -8779,7 +8787,7 @@ msgstr "プライベートIP" msgid "Public IP" msgstr "パブリックIP" -#: xpack/plugins/cloud/const.py:42 xpack/plugins/cloud/models.py:299 +#: xpack/plugins/cloud/const.py:42 xpack/plugins/cloud/models.py:308 msgid "Instance name" msgstr "インスタンス名" @@ -8824,157 +8832,164 @@ msgstr "利用できないアカウント" msgid "Cloud center" msgstr "クラウドセンター" -#: xpack/plugins/cloud/models.py:34 +#: xpack/plugins/cloud/models.py:35 msgid "Provider" msgstr "プロバイダー" -#: xpack/plugins/cloud/models.py:38 +#: xpack/plugins/cloud/models.py:39 msgid "Validity" msgstr "有効性" -#: xpack/plugins/cloud/models.py:43 +#: xpack/plugins/cloud/models.py:44 msgid "Cloud account" msgstr "クラウドアカウント" -#: xpack/plugins/cloud/models.py:45 +#: xpack/plugins/cloud/models.py:46 msgid "Test cloud account" msgstr "クラウドアカウントのテスト" -#: xpack/plugins/cloud/models.py:88 xpack/plugins/cloud/serializers/task.py:159 +#: xpack/plugins/cloud/models.py:89 xpack/plugins/cloud/serializers/task.py:159 msgid "Regions" msgstr "リージョン" -#: xpack/plugins/cloud/models.py:91 +#: xpack/plugins/cloud/models.py:92 msgid "Hostname strategy" msgstr "ホスト名戦略" -#: xpack/plugins/cloud/models.py:96 xpack/plugins/cloud/serializers/task.py:162 +#: xpack/plugins/cloud/models.py:97 xpack/plugins/cloud/serializers/task.py:162 msgid "IP network segment group" msgstr "IPネットワークセグメントグループ" -#: xpack/plugins/cloud/models.py:99 xpack/plugins/cloud/serializers/task.py:167 +#: xpack/plugins/cloud/models.py:100 +#: xpack/plugins/cloud/serializers/task.py:167 msgid "Sync IP type" msgstr "同期IPタイプ" -#: xpack/plugins/cloud/models.py:102 +#: xpack/plugins/cloud/models.py:103 #: xpack/plugins/cloud/serializers/task.py:185 msgid "Always update" msgstr "常に更新" -#: xpack/plugins/cloud/models.py:104 +#: xpack/plugins/cloud/models.py:105 msgid "Fully synchronous" msgstr "完全同期" -#: xpack/plugins/cloud/models.py:109 +#: xpack/plugins/cloud/models.py:106 +#, fuzzy +#| msgid "permed assets" +msgid "Release assets" +msgstr "パーマ資産" + +#: xpack/plugins/cloud/models.py:111 msgid "Date last sync" msgstr "最終同期日" -#: xpack/plugins/cloud/models.py:112 xpack/plugins/cloud/models.py:317 -#: xpack/plugins/cloud/models.py:341 +#: xpack/plugins/cloud/models.py:114 xpack/plugins/cloud/models.py:326 +#: xpack/plugins/cloud/models.py:350 msgid "Strategy" msgstr "戦略" -#: xpack/plugins/cloud/models.py:117 xpack/plugins/cloud/models.py:196 +#: xpack/plugins/cloud/models.py:119 xpack/plugins/cloud/models.py:205 msgid "Sync instance task" msgstr "インスタンスの同期タスク" -#: xpack/plugins/cloud/models.py:207 xpack/plugins/cloud/models.py:259 +#: xpack/plugins/cloud/models.py:216 xpack/plugins/cloud/models.py:268 msgid "Date sync" msgstr "日付の同期" -#: xpack/plugins/cloud/models.py:211 +#: xpack/plugins/cloud/models.py:220 msgid "Sync instance snapshot" msgstr "インスタンススナップショットの同期" -#: xpack/plugins/cloud/models.py:215 +#: xpack/plugins/cloud/models.py:224 msgid "Sync instance task execution" msgstr "インスタンスタスクの同期実行" -#: xpack/plugins/cloud/models.py:239 +#: xpack/plugins/cloud/models.py:248 msgid "Sync task" msgstr "同期タスク" -#: xpack/plugins/cloud/models.py:243 +#: xpack/plugins/cloud/models.py:252 msgid "Sync instance task history" msgstr "インスタンスタスク履歴の同期" -#: xpack/plugins/cloud/models.py:246 +#: xpack/plugins/cloud/models.py:255 msgid "Instance" msgstr "インスタンス" -#: xpack/plugins/cloud/models.py:263 +#: xpack/plugins/cloud/models.py:272 msgid "Sync instance detail" msgstr "同期インスタンスの詳細" -#: xpack/plugins/cloud/models.py:275 xpack/plugins/cloud/serializers/task.py:72 +#: xpack/plugins/cloud/models.py:284 xpack/plugins/cloud/serializers/task.py:72 msgid "Rule relation" msgstr "条件関係" -#: xpack/plugins/cloud/models.py:284 +#: xpack/plugins/cloud/models.py:293 msgid "Task strategy" msgstr "ミッション戦略です" -#: xpack/plugins/cloud/models.py:288 +#: xpack/plugins/cloud/models.py:297 msgid "Equal" msgstr "等しい" -#: xpack/plugins/cloud/models.py:289 +#: xpack/plugins/cloud/models.py:298 msgid "Not Equal" msgstr "不等于" -#: xpack/plugins/cloud/models.py:290 +#: xpack/plugins/cloud/models.py:299 msgid "In" msgstr "で..." -#: xpack/plugins/cloud/models.py:291 +#: xpack/plugins/cloud/models.py:300 msgid "Contains" msgstr "含む" -#: xpack/plugins/cloud/models.py:292 +#: xpack/plugins/cloud/models.py:301 msgid "Exclude" msgstr "除外" -#: xpack/plugins/cloud/models.py:293 +#: xpack/plugins/cloud/models.py:302 msgid "Startswith" msgstr "始まる..." -#: xpack/plugins/cloud/models.py:294 +#: xpack/plugins/cloud/models.py:303 msgid "Endswith" msgstr "終わる..." -#: xpack/plugins/cloud/models.py:300 +#: xpack/plugins/cloud/models.py:309 msgid "Instance platform" msgstr "インスタンス名" -#: xpack/plugins/cloud/models.py:301 +#: xpack/plugins/cloud/models.py:310 msgid "Instance address" msgstr "インスタンスアドレス" -#: xpack/plugins/cloud/models.py:308 +#: xpack/plugins/cloud/models.py:317 msgid "Rule attr" msgstr "ルール属性" -#: xpack/plugins/cloud/models.py:312 +#: xpack/plugins/cloud/models.py:321 msgid "Rule match" msgstr "ルール一致" -#: xpack/plugins/cloud/models.py:314 +#: xpack/plugins/cloud/models.py:323 msgid "Rule value" msgstr "ルール値" -#: xpack/plugins/cloud/models.py:321 xpack/plugins/cloud/serializers/task.py:75 +#: xpack/plugins/cloud/models.py:330 xpack/plugins/cloud/serializers/task.py:75 msgid "Strategy rule" msgstr "戦略ルール" -#: xpack/plugins/cloud/models.py:336 +#: xpack/plugins/cloud/models.py:345 msgid "Action attr" msgstr "アクション属性" -#: xpack/plugins/cloud/models.py:338 +#: xpack/plugins/cloud/models.py:347 msgid "Action value" msgstr "アクション値" -#: xpack/plugins/cloud/models.py:345 xpack/plugins/cloud/serializers/task.py:78 +#: xpack/plugins/cloud/models.py:354 xpack/plugins/cloud/serializers/task.py:78 msgid "Strategy action" msgstr "戦略アクション" diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 8e21d8aec..d9ea633d9 100644 --- a/apps/locale/zh/LC_MESSAGES/django.mo +++ b/apps/locale/zh/LC_MESSAGES/django.mo @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:08667579241592ecacd1baf330147a720a9e41171444b925f90778613a7e1d9a -size 145230 +oid sha256:d83f99f39e0052ea2592a3f5bb4be56a94be0963436b45031083891c44a44ba0 +size 145454 diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 5b7b5cd97..8a80c77b6 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-08 14:11+0800\n" +"POT-Creation-Date: 2024-06-13 10:19+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -35,7 +35,7 @@ msgstr "成功: %s, 失败: %s, 总数: %s" #: settings/serializers/auth/ldap.py:25 settings/serializers/auth/ldap.py:47 #: settings/serializers/msg.py:35 terminal/serializers/storage.py:123 #: terminal/serializers/storage.py:142 users/forms/profile.py:21 -#: users/serializers/user.py:110 +#: users/serializers/user.py:111 #: users/templates/users/_msg_user_created.html:13 #: users/templates/users/user_password_verify.html:18 #: xpack/plugins/cloud/serializers/account_attrs.py:28 @@ -83,7 +83,7 @@ msgstr "匿名账号" msgid "Specified account" msgstr "指定账号" -#: accounts/const/account.py:26 users/models/user.py:752 +#: accounts/const/account.py:26 users/models/user.py:753 msgid "Local" msgstr "数据库" @@ -106,7 +106,7 @@ msgid "Update" msgstr "更新" #: accounts/const/account.py:34 accounts/const/automation.py:109 -#: accounts/serializers/automations/change_secret.py:164 audits/const.py:62 +#: accounts/serializers/automations/change_secret.py:164 audits/const.py:65 #: audits/signal_handlers/activity_log.py:33 common/const/choices.py:19 #: ops/const.py:76 terminal/const.py:79 xpack/plugins/cloud/const.py:47 msgid "Failed" @@ -210,7 +210,7 @@ msgstr "仅创建" #: authentication/serializers/password_mfa.py:24 #: notifications/backends/__init__.py:10 settings/serializers/msg.py:22 #: settings/serializers/msg.py:64 users/forms/profile.py:100 -#: users/forms/profile.py:108 users/models/user.py:816 +#: users/forms/profile.py:108 users/models/user.py:817 #: users/templates/users/forgot_password.html:162 #: users/views/profile/reset.py:94 msgid "Email" @@ -221,7 +221,7 @@ msgid "SFTP" msgstr "SFTP" #: accounts/const/automation.py:110 -#: accounts/serializers/automations/change_secret.py:163 audits/const.py:61 +#: accounts/serializers/automations/change_secret.py:163 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:46 #: terminal/const.py:78 terminal/models/session/sharing.py:121 @@ -279,7 +279,7 @@ msgstr "用户 %s 查看/导出 了密码" #: terminal/serializers/session.py:28 #: terminal/templates/terminal/_msg_command_warning.html:4 #: terminal/templates/terminal/_msg_session_sharing.html:4 -#: tickets/models/ticket/apply_asset.py:16 xpack/plugins/cloud/models.py:252 +#: tickets/models/ticket/apply_asset.py:16 xpack/plugins/cloud/models.py:261 msgid "Asset" msgstr "资产" @@ -291,14 +291,14 @@ msgstr "资产" msgid "Su from" msgstr "切换自" -#: accounts/models/account.py:55 assets/const/protocol.py:177 +#: accounts/models/account.py:55 assets/const/protocol.py:178 #: settings/serializers/auth/cas.py:20 terminal/models/applet/applet.py:35 #: terminal/models/virtualapp/virtualapp.py:21 msgid "Version" msgstr "版本" #: accounts/models/account.py:57 accounts/serializers/account/account.py:215 -#: users/models/user.py:859 +#: users/models/user.py:860 msgid "Source" msgstr "来源" @@ -318,7 +318,7 @@ msgstr "来源 ID" #: terminal/backends/command/models.py:18 terminal/models/session/session.py:34 #: 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:85 +#: tickets/models/ticket/command_confirm.py:13 xpack/plugins/cloud/models.py:86 msgid "Account" msgstr "账号" @@ -413,7 +413,7 @@ msgid "Trigger mode" msgstr "触发模式" #: accounts/models/automations/backup_account.py:133 audits/models.py:203 -#: terminal/models/session/sharing.py:125 xpack/plugins/cloud/models.py:204 +#: terminal/models/session/sharing.py:125 xpack/plugins/cloud/models.py:213 msgid "Reason" msgstr "原因" @@ -508,8 +508,8 @@ msgstr "结束日期" #: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:136 #: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:281 #: tickets/serializers/super_ticket.py:13 -#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:200 -#: xpack/plugins/cloud/models.py:256 +#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:209 +#: xpack/plugins/cloud/models.py:265 msgid "Status" msgstr "状态" @@ -545,7 +545,7 @@ msgstr "最后登录日期" #: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9 #: terminal/serializers/storage.py:136 users/forms/profile.py:31 -#: users/forms/profile.py:114 users/models/user.py:812 +#: users/forms/profile.py:114 users/models/user.py:813 #: users/templates/users/_msg_user_created.html:12 #: xpack/plugins/cloud/serializers/account_attrs.py:26 msgid "Username" @@ -590,7 +590,7 @@ msgid "Verify asset account" msgstr "账号验证" #: accounts/models/base.py:37 accounts/models/base.py:67 -#: accounts/serializers/account/account.py:440 +#: accounts/serializers/account/account.py:443 #: accounts/serializers/account/base.py:17 #: accounts/serializers/automations/change_secret.py:47 #: authentication/serializers/connect_token_secret.py:42 @@ -641,8 +641,8 @@ msgstr "密码规则" #: terminal/models/virtualapp/provider.py:10 #: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87 #: users/forms/profile.py:32 users/models/group.py:13 -#: users/models/preference.py:11 users/models/user.py:814 -#: xpack/plugins/cloud/models.py:32 xpack/plugins/cloud/models.py:272 +#: users/models/preference.py:11 users/models/user.py:815 +#: xpack/plugins/cloud/models.py:33 xpack/plugins/cloud/models.py:281 #: xpack/plugins/cloud/serializers/task.py:70 msgid "Name" msgstr "名称" @@ -657,7 +657,7 @@ msgstr "特权账号" #: authentication/serializers/connect_token_secret.py:117 #: terminal/models/applet/applet.py:40 #: terminal/models/component/endpoint.py:120 -#: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:174 +#: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:175 msgid "Is active" msgstr "激活" @@ -673,7 +673,7 @@ msgstr "系统平台" msgid "Push params" msgstr "账号推送参数" -#: accounts/models/template.py:26 xpack/plugins/cloud/models.py:329 +#: accounts/models/template.py:26 xpack/plugins/cloud/models.py:338 msgid "Account template" msgstr "账号模板" @@ -842,18 +842,24 @@ msgstr "资产不支持账号类型: %s" msgid "Account has exist" msgstr "账号已存在" -#: accounts/serializers/account/account.py:441 +#: accounts/serializers/account/account.py:438 +#: accounts/serializers/account/template.py:72 +#: assets/serializers/asset/common.py:384 +msgid "Spec info" +msgstr "特殊信息" + +#: accounts/serializers/account/account.py:444 #: authentication/serializers/connect_token_secret.py:159 #: authentication/templates/authentication/_access_key_modal.html:30 #: perms/models/perm_node.py:21 users/serializers/group.py:33 msgid "ID" msgstr "ID" -#: accounts/serializers/account/account.py:451 acls/serializers/base.py:116 +#: accounts/serializers/account/account.py:454 acls/serializers/base.py:116 #: acls/templates/acls/asset_login_reminder.html:5 #: acls/templates/acls/user_login_reminder.html:5 #: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:54 -#: audits/models.py:90 audits/models.py:172 audits/models.py:269 +#: audits/models.py:90 audits/models.py:172 audits/models.py:271 #: audits/serializers.py:171 authentication/models/connection_token.py:32 #: authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 @@ -865,12 +871,12 @@ msgstr "ID" #: terminal/notifications.py:205 terminal/serializers/command.py:16 #: terminal/templates/terminal/_msg_command_warning.html:6 #: terminal/templates/terminal/_msg_session_sharing.html:6 -#: tickets/models/comment.py:21 users/const.py:14 users/models/user.py:1019 -#: users/models/user.py:1057 users/serializers/group.py:21 +#: tickets/models/comment.py:21 users/const.py:14 users/models/user.py:1020 +#: users/models/user.py:1058 users/serializers/group.py:21 msgid "User" msgstr "用户" -#: accounts/serializers/account/account.py:452 +#: accounts/serializers/account/account.py:455 #: authentication/templates/authentication/_access_key_modal.html:33 #: terminal/notifications.py:158 terminal/notifications.py:207 msgid "Date" @@ -902,12 +908,7 @@ msgstr "资产类型" msgid "Key password" msgstr "密钥密码" -#: accounts/serializers/account/base.py:78 -#: assets/serializers/asset/common.py:384 -msgid "Spec info" -msgstr "特殊信息" - -#: accounts/serializers/account/base.py:80 +#: accounts/serializers/account/base.py:79 msgid "" "Tip: If no username is required for authentication, fill in `null`, If AD " "account, like `username@domain`" @@ -939,15 +940,15 @@ msgstr "特殊字符" msgid "Exclude symbol" msgstr "排除字符" -#: accounts/serializers/account/template.py:38 +#: accounts/serializers/account/template.py:39 msgid "Secret generation strategy for account creation" msgstr "密码生成策略,用于账号创建时,设置密码" -#: accounts/serializers/account/template.py:39 +#: accounts/serializers/account/template.py:40 msgid "Whether to automatically push the account to the asset" msgstr "是否自动推送账号到资产" -#: accounts/serializers/account/template.py:42 +#: accounts/serializers/account/template.py:43 msgid "" "Associated platform, you can configure push parameters. If not associated, " "default parameters will be used" @@ -963,8 +964,8 @@ msgstr "关联平台,可配置推送参数,如果不关联,将使用默认 #: terminal/models/component/endpoint.py:119 #: terminal/models/session/session.py:47 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 -#: tickets/models/ticket/general.py:295 users/models/user.py:850 -#: xpack/plugins/cloud/models.py:39 xpack/plugins/cloud/models.py:106 +#: tickets/models/ticket/general.py:295 users/models/user.py:851 +#: xpack/plugins/cloud/models.py:40 xpack/plugins/cloud/models.py:108 msgid "Comment" msgstr "备注" @@ -1135,13 +1136,13 @@ msgstr "通知" #: acls/models/base.py:37 assets/models/_user.py:51 #: assets/models/cmd_filter.py:76 terminal/models/component/endpoint.py:112 -#: xpack/plugins/cloud/models.py:278 +#: xpack/plugins/cloud/models.py:287 msgid "Priority" msgstr "优先级" #: acls/models/base.py:38 assets/models/_user.py:51 #: assets/models/cmd_filter.py:76 terminal/models/component/endpoint.py:113 -#: xpack/plugins/cloud/models.py:279 +#: xpack/plugins/cloud/models.py:288 msgid "1-100, the lower the value will be match first" msgstr "优先级可选范围为 1-100 (数值越小越优先)" @@ -1178,7 +1179,7 @@ msgid "Command" msgstr "命令" #: acls/models/command_acl.py:17 assets/models/cmd_filter.py:59 -#: xpack/plugins/cloud/models.py:295 +#: xpack/plugins/cloud/models.py:304 msgid "Regex" msgstr "正则表达式" @@ -1322,14 +1323,14 @@ msgid "Thank you" msgstr "谢谢" #: acls/templates/acls/user_login_reminder.html:7 audits/models.py:194 -#: audits/models.py:263 +#: audits/models.py:265 #: authentication/templates/authentication/_msg_different_city.html:11 #: tickets/models/ticket/login_confirm.py:11 msgid "Login city" msgstr "登录城市" #: acls/templates/acls/user_login_reminder.html:8 audits/models.py:197 -#: audits/models.py:264 audits/serializers.py:68 +#: audits/models.py:266 audits/serializers.py:68 msgid "User agent" msgstr "用户代理" @@ -1346,7 +1347,7 @@ msgstr "" msgid "Applications" msgstr "应用管理" -#: applications/models.py:16 xpack/plugins/cloud/models.py:37 +#: applications/models.py:16 xpack/plugins/cloud/models.py:38 #: xpack/plugins/cloud/serializers/account.py:68 msgid "Attrs" msgstr "属性" @@ -1410,8 +1411,7 @@ msgid "Unable to connect to port {port} on {address}" msgstr "无法连接到 {port} 上的端口 {address}" #: assets/automations/ping_gateway/manager.py:58 -#: authentication/backends/oauth2/views.py:60 authentication/middleware.py:93 -#: xpack/plugins/cloud/providers/fc.py:47 +#: authentication/middleware.py:93 xpack/plugins/cloud/providers/fc.py:47 msgid "Authentication failed" msgstr "认证失败" @@ -1420,7 +1420,7 @@ msgstr "认证失败" msgid "Connect failed" msgstr "连接失败" -#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:44 +#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:47 #: audits/signal_handlers/activity_log.py:62 common/utils/ip/geoip/utils.py:31 #: common/utils/ip/geoip/utils.py:37 common/utils/ip/utils.py:104 msgid "Unknown" @@ -1442,7 +1442,7 @@ msgstr "测试网关" msgid "Gather facts" msgstr "收集资产信息" -#: assets/const/base.py:32 audits/const.py:55 +#: assets/const/base.py:32 audits/const.py:58 #: terminal/serializers/applet_host.py:32 msgid "Disabled" msgstr "禁用" @@ -1454,7 +1454,7 @@ msgstr "禁用" msgid "Basic" msgstr "基本" -#: assets/const/base.py:34 assets/const/protocol.py:268 +#: assets/const/base.py:34 assets/const/protocol.py:275 #: assets/models/asset/web.py:13 msgid "Script" msgstr "脚本" @@ -1476,7 +1476,7 @@ msgid "Cloud service" msgstr "云服务" #: assets/const/category.py:14 assets/models/asset/gpt.py:11 -#: assets/models/asset/web.py:16 audits/const.py:42 +#: assets/models/asset/web.py:16 audits/const.py:45 #: terminal/models/applet/applet.py:27 users/const.py:64 msgid "Web" msgstr "Web" @@ -1522,19 +1522,19 @@ msgstr "ChatGPT" msgid "Other" msgstr "其它" -#: assets/const/protocol.py:45 +#: assets/const/protocol.py:46 msgid "Old SSH version" msgstr "Old SSH version" -#: assets/const/protocol.py:46 +#: assets/const/protocol.py:47 msgid "Old SSH version like openssh 5.x or 6.x" msgstr "旧的 SSH 版本,例如 openssh 5.x 或 6.x" -#: assets/const/protocol.py:57 +#: assets/const/protocol.py:58 msgid "SFTP root" msgstr "SFTP 根路径" -#: assets/const/protocol.py:59 +#: assets/const/protocol.py:60 #, python-brace-format msgid "" "SFTP root directory, Support variable:
- ${ACCOUNT} The connected " @@ -1544,113 +1544,113 @@ msgstr "" "SFTP根目录,支持变量:
-${ACCOUNT}已连接帐户用户名
-${HOME}连接帐户的主" "目录
-${USER}用户的用户名" -#: assets/const/protocol.py:74 +#: assets/const/protocol.py:75 msgid "Console" msgstr "控制台" -#: assets/const/protocol.py:75 +#: assets/const/protocol.py:76 msgid "Connect to console session" msgstr "连接到控制台会话" -#: assets/const/protocol.py:79 +#: assets/const/protocol.py:80 msgid "Any" msgstr "任意" -#: assets/const/protocol.py:81 settings/serializers/security.py:232 +#: assets/const/protocol.py:82 settings/serializers/security.py:232 msgid "Security" msgstr "安全" -#: assets/const/protocol.py:82 +#: assets/const/protocol.py:83 msgid "Security layer to use for the connection" msgstr "连接 RDP 使用的安全层" -#: assets/const/protocol.py:88 +#: assets/const/protocol.py:89 msgid "AD domain" msgstr "AD 网域" -#: assets/const/protocol.py:103 +#: assets/const/protocol.py:104 msgid "Username prompt" msgstr "用户名提示" -#: assets/const/protocol.py:104 +#: assets/const/protocol.py:105 msgid "We will send username when we see this prompt" msgstr "当我们看到这个提示时,我们将发送用户名" -#: assets/const/protocol.py:109 +#: assets/const/protocol.py:110 msgid "Password prompt" msgstr "密码提示" -#: assets/const/protocol.py:110 +#: assets/const/protocol.py:111 msgid "We will send password when we see this prompt" msgstr "当我们看到这个提示时,我们将发送密码" -#: assets/const/protocol.py:115 +#: assets/const/protocol.py:116 msgid "Success prompt" msgstr "成功提示" -#: assets/const/protocol.py:116 +#: assets/const/protocol.py:117 msgid "We will consider login success when we see this prompt" msgstr "当我们看到这个提示时,我们将认为登录成功" -#: assets/const/protocol.py:127 assets/models/asset/database.py:10 +#: assets/const/protocol.py:128 assets/models/asset/database.py:10 #: settings/serializers/msg.py:47 msgid "Use SSL" msgstr "使用 SSL" -#: assets/const/protocol.py:162 +#: assets/const/protocol.py:163 msgid "SYSDBA" msgstr "SYSDBA" -#: assets/const/protocol.py:163 +#: assets/const/protocol.py:164 msgid "Connect as SYSDBA" msgstr "以 SYSDBA 角色连接" -#: assets/const/protocol.py:178 +#: assets/const/protocol.py:179 msgid "" "SQL Server version, Different versions have different connection drivers" msgstr "SQL Server 版本,不同版本有不同的连接驱动" -#: assets/const/protocol.py:202 +#: assets/const/protocol.py:209 msgid "Auth source" msgstr "认证数据库" -#: assets/const/protocol.py:203 +#: assets/const/protocol.py:210 msgid "The database to authenticate against" msgstr "要进行身份验证的数据库" -#: assets/const/protocol.py:215 +#: assets/const/protocol.py:222 msgid "Auth username" msgstr "使用用户名认证" -#: assets/const/protocol.py:238 +#: assets/const/protocol.py:245 msgid "Safe mode" msgstr "安全模式" -#: assets/const/protocol.py:240 +#: assets/const/protocol.py:247 msgid "" "When safe mode is enabled, some operations will be disabled, such as: New " "tab, right click, visit other website, etc." msgstr "" "当安全模式启用时,一些操作将被禁用,例如:新建标签页、右键、访问其它网站 等" -#: assets/const/protocol.py:245 assets/models/asset/web.py:9 +#: assets/const/protocol.py:252 assets/models/asset/web.py:9 #: assets/serializers/asset/info/spec.py:16 msgid "Autofill" msgstr "自动代填" -#: assets/const/protocol.py:253 assets/models/asset/web.py:10 +#: assets/const/protocol.py:260 assets/models/asset/web.py:10 msgid "Username selector" msgstr "用户名选择器" -#: assets/const/protocol.py:258 assets/models/asset/web.py:11 +#: assets/const/protocol.py:265 assets/models/asset/web.py:11 msgid "Password selector" msgstr "密码选择器" -#: assets/const/protocol.py:263 assets/models/asset/web.py:12 +#: assets/const/protocol.py:270 assets/models/asset/web.py:12 msgid "Submit selector" msgstr "确认按钮选择器" -#: assets/const/protocol.py:286 +#: assets/const/protocol.py:293 msgid "API mode" msgstr "API 模式" @@ -1678,19 +1678,19 @@ msgstr "SSH公钥" # msgstr "备注" #: assets/models/_user.py:28 assets/models/automations/base.py:114 #: assets/models/cmd_filter.py:41 assets/models/group.py:19 -#: audits/models.py:267 common/db/models.py:34 ops/models/base.py:54 -#: ops/models/job.py:240 users/models/user.py:1058 +#: audits/models.py:269 common/db/models.py:34 ops/models/base.py:54 +#: ops/models/job.py:240 users/models/user.py:1059 msgid "Date created" msgstr "创建日期" #: assets/models/_user.py:29 assets/models/cmd_filter.py:42 -#: common/db/models.py:35 users/models/user.py:868 +#: common/db/models.py:35 users/models/user.py:869 msgid "Date updated" msgstr "更新日期" #: assets/models/_user.py:30 assets/models/cmd_filter.py:44 #: assets/models/cmd_filter.py:91 assets/models/group.py:18 -#: common/db/models.py:32 users/models/user.py:857 +#: common/db/models.py:32 users/models/user.py:858 #: users/serializers/group.py:32 msgid "Created by" msgstr "创建者" @@ -1782,20 +1782,20 @@ msgstr "地址" #: assets/models/asset/common.py:161 assets/models/platform.py:134 #: authentication/backends/passkey/models.py:12 #: authentication/serializers/connect_token_secret.py:118 -#: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:325 +#: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:334 msgid "Platform" msgstr "系统平台" #: assets/models/asset/common.py:163 assets/models/domain.py:22 #: authentication/serializers/connect_token_secret.py:136 -#: perms/serializers/user_permission.py:28 xpack/plugins/cloud/models.py:327 +#: perms/serializers/user_permission.py:28 xpack/plugins/cloud/models.py:336 msgid "Domain" msgstr "网域" #: assets/models/asset/common.py:165 assets/models/automations/base.py:18 #: assets/models/cmd_filter.py:32 assets/models/node.py:553 #: perms/models/asset_permission.py:72 perms/serializers/permission.py:37 -#: tickets/models/ticket/apply_asset.py:14 xpack/plugins/cloud/models.py:326 +#: tickets/models/ticket/apply_asset.py:14 xpack/plugins/cloud/models.py:335 msgid "Node" msgstr "节点" @@ -1879,7 +1879,7 @@ msgstr "校验日期" #: assets/models/cmd_filter.py:28 perms/models/asset_permission.py:66 #: perms/serializers/permission.py:34 users/models/group.py:25 -#: users/models/user.py:820 +#: users/models/user.py:821 msgid "User group" msgstr "用户组" @@ -1929,7 +1929,7 @@ msgstr "默认" msgid "Default asset group" msgstr "默认资产组" -#: assets/models/label.py:15 rbac/const.py:6 users/models/user.py:1043 +#: assets/models/label.py:15 rbac/const.py:6 users/models/user.py:1044 msgid "System" msgstr "系统" @@ -1994,7 +1994,7 @@ msgstr "开放的" msgid "Setting" msgstr "设置" -#: assets/models/platform.py:38 audits/const.py:56 +#: assets/models/platform.py:38 audits/const.py:59 #: authentication/backends/passkey/models.py:11 settings/models.py:37 #: terminal/serializers/applet_host.py:33 msgid "Enabled" @@ -2121,7 +2121,7 @@ msgstr "资产中批量更新平台,不符合平台类型跳过的资产" #: authentication/serializers/connect_token_secret.py:30 #: authentication/serializers/connect_token_secret.py:75 #: perms/models/asset_permission.py:76 perms/serializers/permission.py:42 -#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:328 +#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:337 #: xpack/plugins/cloud/serializers/task.py:33 msgid "Protocols" msgstr "协议组" @@ -2451,31 +2451,36 @@ msgstr "同意" msgid "Close" msgstr "关闭" -#: audits/const.py:43 settings/serializers/terminal.py:6 +#: audits/const.py:41 ops/models/celery.py:84 +#: terminal/models/session/sharing.py:128 tickets/const.py:25 +msgid "Finished" +msgstr "结束" + +#: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:175 #: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 #: terminal/serializers/session.py:69 msgid "Terminal" msgstr "终端" -#: audits/const.py:48 audits/models.py:132 +#: audits/const.py:51 audits/models.py:132 msgid "Operate log" msgstr "操作日志" -#: audits/const.py:49 +#: audits/const.py:52 msgid "Session log" msgstr "会话日志" -#: audits/const.py:50 +#: audits/const.py:53 msgid "Login log" msgstr "登录日志" -#: audits/const.py:51 terminal/models/applet/host.py:144 +#: audits/const.py:54 terminal/models/applet/host.py:144 #: terminal/models/component/task.py:22 msgid "Task" msgstr "任务" -#: audits/const.py:57 +#: audits/const.py:60 msgid "-" msgstr "-" @@ -2559,18 +2564,18 @@ msgstr "修改者" msgid "Password change log" msgstr "改密日志" -#: audits/models.py:190 audits/models.py:265 +#: audits/models.py:190 audits/models.py:267 msgid "Login type" msgstr "登录方式" -#: audits/models.py:192 audits/models.py:261 +#: audits/models.py:192 audits/models.py:263 #: tickets/models/ticket/login_confirm.py:10 msgid "Login IP" msgstr "登录 IP" #: audits/models.py:200 audits/serializers.py:52 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 -#: users/forms/profile.py:63 users/models/user.py:837 +#: users/forms/profile.py:63 users/models/user.py:838 #: users/serializers/profile.py:102 msgid "MFA" msgstr "MFA" @@ -2579,7 +2584,7 @@ msgstr "MFA" msgid "Date login" msgstr "登录日期" -#: audits/models.py:212 audits/models.py:266 audits/serializers.py:70 +#: audits/models.py:212 audits/models.py:268 audits/serializers.py:70 #: audits/serializers.py:184 msgid "Authentication backend" msgstr "认证方式" @@ -2588,15 +2593,15 @@ msgstr "认证方式" msgid "User login log" msgstr "用户登录日志" -#: audits/models.py:262 +#: audits/models.py:264 msgid "Session key" msgstr "会话标识" -#: audits/models.py:298 +#: audits/models.py:300 msgid "User session" msgstr "用户会话" -#: audits/models.py:300 +#: audits/models.py:302 msgid "Offline user session" msgstr "下线用户会话" @@ -2619,7 +2624,7 @@ msgstr "用户 %s %s 了当前资源" #: audits/serializers.py:172 authentication/models/connection_token.py:47 #: authentication/models/temp_token.py:13 perms/models/asset_permission.py:80 #: tickets/models/ticket/apply_application.py:31 -#: tickets/models/ticket/apply_asset.py:20 users/models/user.py:855 +#: tickets/models/ticket/apply_asset.py:20 users/models/user.py:856 msgid "Date expired" msgstr "失效日期" @@ -2652,29 +2657,29 @@ msgstr "认证令牌" #: audits/signal_handlers/login_log.py:37 authentication/notifications.py:73 #: authentication/views/login.py:77 notifications/backends/__init__.py:11 -#: settings/serializers/auth/wecom.py:10 users/models/user.py:759 -#: users/models/user.py:869 +#: settings/serializers/auth/wecom.py:10 users/models/user.py:760 +#: users/models/user.py:870 msgid "WeCom" msgstr "企业微信" #: audits/signal_handlers/login_log.py:38 authentication/views/feishu.py:105 #: authentication/views/login.py:89 notifications/backends/__init__.py:14 -#: settings/serializers/auth/feishu.py:10 users/models/user.py:761 -#: users/models/user.py:871 +#: settings/serializers/auth/feishu.py:10 users/models/user.py:762 +#: users/models/user.py:872 msgid "FeiShu" msgstr "飞书" #: audits/signal_handlers/login_log.py:40 authentication/views/login.py:101 #: authentication/views/slack.py:87 notifications/backends/__init__.py:16 -#: settings/serializers/auth/slack.py:10 users/models/user.py:763 -#: users/models/user.py:873 +#: settings/serializers/auth/slack.py:10 users/models/user.py:764 +#: users/models/user.py:874 msgid "Slack" msgstr "" #: audits/signal_handlers/login_log.py:41 authentication/views/dingtalk.py:161 #: authentication/views/login.py:83 notifications/backends/__init__.py:12 -#: settings/serializers/auth/dingtalk.py:10 users/models/user.py:760 -#: users/models/user.py:870 +#: settings/serializers/auth/dingtalk.py:10 users/models/user.py:761 +#: users/models/user.py:871 msgid "DingTalk" msgstr "钉钉" @@ -3258,7 +3263,7 @@ msgstr "动作" #: authentication/serializers/connection_token.py:42 #: perms/serializers/permission.py:40 perms/serializers/permission.py:60 -#: users/serializers/user.py:101 users/serializers/user.py:178 +#: users/serializers/user.py:102 users/serializers/user.py:179 msgid "Is expired" msgstr "已过期" @@ -3272,8 +3277,8 @@ msgid "Access IP" msgstr "IP 白名单" #: authentication/serializers/token.py:92 perms/serializers/permission.py:39 -#: perms/serializers/permission.py:61 users/serializers/user.py:102 -#: users/serializers/user.py:175 +#: perms/serializers/permission.py:61 users/serializers/user.py:103 +#: users/serializers/user.py:176 msgid "Is valid" msgstr "是否有效" @@ -3298,13 +3303,13 @@ msgid "Show" msgstr "显示" #: authentication/templates/authentication/_access_key_modal.html:66 -#: users/const.py:42 users/models/user.py:654 users/serializers/profile.py:92 +#: users/const.py:42 users/models/user.py:655 users/serializers/profile.py:92 #: users/templates/users/user_verify_mfa.html:36 msgid "Disable" msgstr "禁用" #: authentication/templates/authentication/_access_key_modal.html:67 -#: users/const.py:43 users/models/user.py:655 users/serializers/profile.py:93 +#: users/const.py:43 users/models/user.py:656 users/serializers/profile.py:93 #: users/templates/users/mfa_setting.html:26 #: users/templates/users/mfa_setting.html:68 msgid "Enable" @@ -3606,11 +3611,11 @@ msgstr "正在跳转到 {} 认证" msgid "Login timeout, please try again." msgstr "登录超时,请重新登录" -#: authentication/views/login.py:294 +#: authentication/views/login.py:296 msgid "User email already exists ({})" msgstr "用户邮箱已存在 ({})" -#: authentication/views/login.py:372 +#: authentication/views/login.py:374 msgid "" "Wait for {} confirm, You also can copy link to her/him
\n" " Don't close this page" @@ -3618,15 +3623,15 @@ msgstr "" "等待 {} 确认, 你也可以复制链接发给他/她
\n" " 不要关闭本页面" -#: authentication/views/login.py:377 +#: authentication/views/login.py:379 msgid "No ticket found" msgstr "没有发现工单" -#: authentication/views/login.py:413 +#: authentication/views/login.py:415 msgid "Logout success" msgstr "退出登录成功" -#: authentication/views/login.py:414 +#: authentication/views/login.py:416 msgid "Logout success, return login page" msgstr "退出登录成功,返回到登录页面" @@ -3770,7 +3775,7 @@ msgstr "忽略的" msgid "discard time" msgstr "忽略时间" -#: common/db/models.py:33 users/models/user.py:858 +#: common/db/models.py:33 users/models/user.py:859 msgid "Updated by" msgstr "最后更新者" @@ -3833,14 +3838,20 @@ msgstr "此操作需要确认当前用户" msgid "Unexpect error occur" msgstr "发生意外错误" -#: common/plugins/es.py:31 +#: common/plugins/es.py:35 msgid "Invalid elasticsearch config" msgstr "无效的 Elasticsearch 配置" -#: common/plugins/es.py:36 +#: common/plugins/es.py:40 msgid "Not Support Elasticsearch8" msgstr "不支持 Elasticsearch8" +#: common/plugins/es.py:46 +msgid "" +"Connection failed: Self-signed certificate used. Please check server " +"certificate configuration" +msgstr "连接失败:使用了自签名证书,请检查服务器证书配置" + #: common/sdk/im/exceptions.py:23 msgid "Network error, please contact system administrator" msgstr "网络错误,请联系系统管理员" @@ -3936,7 +3947,7 @@ msgstr "错误的数据类型,应该是列表" msgid "Invalid choice: {}" msgstr "无效选项: {}" -#: common/serializers/mixin.py:406 labels/apps.py:8 +#: common/serializers/mixin.py:417 labels/apps.py:8 msgid "Labels" msgstr "标签管理" @@ -4087,7 +4098,7 @@ msgstr "等待任务开始" msgid "Task {} not found" msgstr "任务 {} 不存在" -#: ops/api/celery.py:267 +#: ops/api/celery.py:269 msgid "Task {} args or kwargs error" msgstr "任务 {} 执行参数错误" @@ -4304,7 +4315,7 @@ msgid "Date last run" msgstr "最后运行日期" #: ops/models/base.py:51 ops/models/job.py:237 -#: xpack/plugins/cloud/models.py:198 +#: xpack/plugins/cloud/models.py:207 msgid "Result" msgstr "结果" @@ -4328,11 +4339,6 @@ msgstr "可以查看任务监控" msgid "Kwargs" msgstr "其它参数" -#: ops/models/celery.py:84 terminal/models/session/sharing.py:128 -#: tickets/const.py:25 -msgid "Finished" -msgstr "结束" - #: ops/models/celery.py:87 msgid "Date published" msgstr "发布日期" @@ -4782,7 +4788,7 @@ msgid "Scope" msgstr "范围" #: rbac/models/role.py:46 rbac/models/rolebinding.py:52 -#: users/models/user.py:824 +#: users/models/user.py:825 msgid "Role" msgstr "角色" @@ -7243,7 +7249,7 @@ msgstr "Access key ID(AK)" msgid "Access key secret" msgstr "Access key secret(SK)" -#: terminal/serializers/storage.py:68 xpack/plugins/cloud/models.py:249 +#: terminal/serializers/storage.py:68 xpack/plugins/cloud/models.py:258 msgid "Region" msgstr "地域" @@ -7263,7 +7269,7 @@ msgstr "端点后缀" msgid "HOST" msgstr "主机" -#: terminal/serializers/storage.py:146 users/models/user.py:844 +#: terminal/serializers/storage.py:146 users/models/user.py:845 #: xpack/plugins/cloud/serializers/account_attrs.py:213 msgid "Private key" msgstr "ssh私钥" @@ -7972,7 +7978,7 @@ msgstr "不能和原来的密钥相同" msgid "Not a valid ssh public key" msgstr "SSH密钥不合法" -#: users/forms/profile.py:172 users/models/user.py:847 +#: users/forms/profile.py:172 users/models/user.py:848 #: xpack/plugins/cloud/serializers/account_attrs.py:210 msgid "Public key" msgstr "SSH公钥" @@ -7981,78 +7987,78 @@ msgstr "SSH公钥" msgid "Preference" msgstr "用户设置" -#: users/models/user.py:656 users/serializers/profile.py:94 +#: users/models/user.py:657 users/serializers/profile.py:94 msgid "Force enable" msgstr "强制启用" -#: users/models/user.py:762 +#: users/models/user.py:763 msgid "Lark" msgstr "" -#: users/models/user.py:826 users/serializers/user.py:176 +#: users/models/user.py:827 users/serializers/user.py:177 msgid "Is service account" msgstr "服务账号" -#: users/models/user.py:828 +#: users/models/user.py:829 msgid "Avatar" msgstr "头像" -#: users/models/user.py:831 +#: users/models/user.py:832 msgid "Wechat" msgstr "微信" -#: users/models/user.py:834 users/serializers/user.py:112 +#: users/models/user.py:835 users/serializers/user.py:113 msgid "Phone" msgstr "手机" -#: users/models/user.py:840 +#: users/models/user.py:841 msgid "OTP secret key" msgstr "OTP 密钥" # msgid "Private key" # msgstr "ssh私钥" -#: users/models/user.py:852 users/serializers/profile.py:128 -#: users/serializers/user.py:173 +#: users/models/user.py:853 users/serializers/profile.py:128 +#: users/serializers/user.py:174 msgid "Is first login" msgstr "首次登录" -#: users/models/user.py:862 +#: users/models/user.py:863 msgid "Date password last updated" msgstr "最后更新密码日期" -#: users/models/user.py:865 +#: users/models/user.py:866 msgid "Need update password" msgstr "需要更新密码" -#: users/models/user.py:867 +#: users/models/user.py:868 msgid "Date api key used" msgstr "Api key 最后使用日期" -#: users/models/user.py:1000 +#: users/models/user.py:1001 msgid "Can not delete admin user" msgstr "无法删除管理员用户" -#: users/models/user.py:1028 +#: users/models/user.py:1029 msgid "Can invite user" msgstr "可以邀请用户" -#: users/models/user.py:1029 +#: users/models/user.py:1030 msgid "Can remove user" msgstr "可以移除用户" -#: users/models/user.py:1030 +#: users/models/user.py:1031 msgid "Can match user" msgstr "可以匹配用户" -#: users/models/user.py:1039 +#: users/models/user.py:1040 msgid "Administrator" msgstr "管理员" -#: users/models/user.py:1042 +#: users/models/user.py:1043 msgid "Administrator is the super user of system" msgstr "Administrator是初始的超级管理员" -#: users/models/user.py:1067 +#: users/models/user.py:1068 msgid "User password history" msgstr "用户密码历史" @@ -8182,71 +8188,71 @@ msgstr "密码不满足安全规则" msgid "The new password cannot be the last {} passwords" msgstr "新密码不能是最近 {} 次的密码" -#: users/serializers/user.py:45 +#: users/serializers/user.py:46 msgid "System roles" msgstr "系统角色" -#: users/serializers/user.py:49 +#: users/serializers/user.py:50 msgid "Org roles" msgstr "组织角色" -#: users/serializers/user.py:52 +#: users/serializers/user.py:53 msgid "Organizations and roles" msgstr "组织和角色" -#: users/serializers/user.py:94 +#: users/serializers/user.py:95 msgid "Password strategy" msgstr "密码策略" -#: users/serializers/user.py:96 +#: users/serializers/user.py:97 msgid "MFA enabled" msgstr "MFA 已启用" -#: users/serializers/user.py:98 +#: users/serializers/user.py:99 msgid "MFA force enabled" msgstr "强制 MFA" -#: users/serializers/user.py:100 +#: users/serializers/user.py:101 msgid "Login blocked" msgstr "登录被锁定" -#: users/serializers/user.py:103 users/serializers/user.py:182 +#: users/serializers/user.py:104 users/serializers/user.py:183 msgid "Is OTP bound" msgstr "是否绑定了虚拟 MFA" -#: users/serializers/user.py:104 +#: users/serializers/user.py:105 msgid "Super Administrator" msgstr "超级管理员" -#: users/serializers/user.py:105 +#: users/serializers/user.py:106 msgid "Organization Administrator" msgstr "组织管理员" -#: users/serializers/user.py:107 +#: users/serializers/user.py:108 msgid "Can public key authentication" msgstr "可以使用公钥认证" -#: users/serializers/user.py:177 +#: users/serializers/user.py:178 msgid "Is org admin" msgstr "组织管理员" -#: users/serializers/user.py:179 +#: users/serializers/user.py:180 msgid "Avatar url" msgstr "头像路径" -#: users/serializers/user.py:183 +#: users/serializers/user.py:184 msgid "MFA level" msgstr "MFA 级别" -#: users/serializers/user.py:305 +#: users/serializers/user.py:310 msgid "Select users" msgstr "选择用户" -#: users/serializers/user.py:306 +#: users/serializers/user.py:311 msgid "For security, only list several users" msgstr "为了安全,仅列出几个用户" -#: users/serializers/user.py:339 +#: users/serializers/user.py:344 msgid "name not unique" msgstr "名称重复" @@ -8649,7 +8655,7 @@ msgstr "私有IP" msgid "Public IP" msgstr "公网IP" -#: xpack/plugins/cloud/const.py:42 xpack/plugins/cloud/models.py:299 +#: xpack/plugins/cloud/const.py:42 xpack/plugins/cloud/models.py:308 msgid "Instance name" msgstr "实例名称" @@ -8694,157 +8700,164 @@ msgstr "账号无效" msgid "Cloud center" msgstr "云管中心" -#: xpack/plugins/cloud/models.py:34 +#: xpack/plugins/cloud/models.py:35 msgid "Provider" msgstr "云服务商" -#: xpack/plugins/cloud/models.py:38 +#: xpack/plugins/cloud/models.py:39 msgid "Validity" msgstr "有效" -#: xpack/plugins/cloud/models.py:43 +#: xpack/plugins/cloud/models.py:44 msgid "Cloud account" msgstr "云账号" -#: xpack/plugins/cloud/models.py:45 +#: xpack/plugins/cloud/models.py:46 msgid "Test cloud account" msgstr "测试云账号" -#: xpack/plugins/cloud/models.py:88 xpack/plugins/cloud/serializers/task.py:159 +#: xpack/plugins/cloud/models.py:89 xpack/plugins/cloud/serializers/task.py:159 msgid "Regions" msgstr "地域" -#: xpack/plugins/cloud/models.py:91 +#: xpack/plugins/cloud/models.py:92 msgid "Hostname strategy" msgstr "主机名策略" -#: xpack/plugins/cloud/models.py:96 xpack/plugins/cloud/serializers/task.py:162 +#: xpack/plugins/cloud/models.py:97 xpack/plugins/cloud/serializers/task.py:162 msgid "IP network segment group" msgstr "IP网段组" -#: xpack/plugins/cloud/models.py:99 xpack/plugins/cloud/serializers/task.py:167 +#: xpack/plugins/cloud/models.py:100 +#: xpack/plugins/cloud/serializers/task.py:167 msgid "Sync IP type" msgstr "同步IP类型" -#: xpack/plugins/cloud/models.py:102 +#: xpack/plugins/cloud/models.py:103 #: xpack/plugins/cloud/serializers/task.py:185 msgid "Always update" msgstr "总是更新" -#: xpack/plugins/cloud/models.py:104 +#: xpack/plugins/cloud/models.py:105 msgid "Fully synchronous" msgstr "完全同步" -#: xpack/plugins/cloud/models.py:109 +#: xpack/plugins/cloud/models.py:106 +#, fuzzy +#| msgid "permed assets" +msgid "Release assets" +msgstr "授权的资产" + +#: xpack/plugins/cloud/models.py:111 msgid "Date last sync" msgstr "最后同步日期" -#: xpack/plugins/cloud/models.py:112 xpack/plugins/cloud/models.py:317 -#: xpack/plugins/cloud/models.py:341 +#: xpack/plugins/cloud/models.py:114 xpack/plugins/cloud/models.py:326 +#: xpack/plugins/cloud/models.py:350 msgid "Strategy" msgstr "策略" -#: xpack/plugins/cloud/models.py:117 xpack/plugins/cloud/models.py:196 +#: xpack/plugins/cloud/models.py:119 xpack/plugins/cloud/models.py:205 msgid "Sync instance task" msgstr "同步实例任务" -#: xpack/plugins/cloud/models.py:207 xpack/plugins/cloud/models.py:259 +#: xpack/plugins/cloud/models.py:216 xpack/plugins/cloud/models.py:268 msgid "Date sync" msgstr "同步日期" -#: xpack/plugins/cloud/models.py:211 +#: xpack/plugins/cloud/models.py:220 msgid "Sync instance snapshot" msgstr "同步实例快照" -#: xpack/plugins/cloud/models.py:215 +#: xpack/plugins/cloud/models.py:224 msgid "Sync instance task execution" msgstr "同步实例任务执行" -#: xpack/plugins/cloud/models.py:239 +#: xpack/plugins/cloud/models.py:248 msgid "Sync task" msgstr "同步任务" -#: xpack/plugins/cloud/models.py:243 +#: xpack/plugins/cloud/models.py:252 msgid "Sync instance task history" msgstr "同步实例任务历史" -#: xpack/plugins/cloud/models.py:246 +#: xpack/plugins/cloud/models.py:255 msgid "Instance" msgstr "实例" -#: xpack/plugins/cloud/models.py:263 +#: xpack/plugins/cloud/models.py:272 msgid "Sync instance detail" msgstr "同步实例详情" -#: xpack/plugins/cloud/models.py:275 xpack/plugins/cloud/serializers/task.py:72 +#: xpack/plugins/cloud/models.py:284 xpack/plugins/cloud/serializers/task.py:72 msgid "Rule relation" msgstr "条件关系" -#: xpack/plugins/cloud/models.py:284 +#: xpack/plugins/cloud/models.py:293 msgid "Task strategy" msgstr "任务策略" -#: xpack/plugins/cloud/models.py:288 +#: xpack/plugins/cloud/models.py:297 msgid "Equal" msgstr "等于" -#: xpack/plugins/cloud/models.py:289 +#: xpack/plugins/cloud/models.py:298 msgid "Not Equal" msgstr "不等于" -#: xpack/plugins/cloud/models.py:290 +#: xpack/plugins/cloud/models.py:299 msgid "In" msgstr "在...中" -#: xpack/plugins/cloud/models.py:291 +#: xpack/plugins/cloud/models.py:300 msgid "Contains" msgstr "包含" -#: xpack/plugins/cloud/models.py:292 +#: xpack/plugins/cloud/models.py:301 msgid "Exclude" msgstr "排除" -#: xpack/plugins/cloud/models.py:293 +#: xpack/plugins/cloud/models.py:302 msgid "Startswith" msgstr "以...开头" -#: xpack/plugins/cloud/models.py:294 +#: xpack/plugins/cloud/models.py:303 msgid "Endswith" msgstr "以...结尾" -#: xpack/plugins/cloud/models.py:300 +#: xpack/plugins/cloud/models.py:309 msgid "Instance platform" msgstr "实例平台" -#: xpack/plugins/cloud/models.py:301 +#: xpack/plugins/cloud/models.py:310 msgid "Instance address" msgstr "实例地址" -#: xpack/plugins/cloud/models.py:308 +#: xpack/plugins/cloud/models.py:317 msgid "Rule attr" msgstr "规则属性" -#: xpack/plugins/cloud/models.py:312 +#: xpack/plugins/cloud/models.py:321 msgid "Rule match" msgstr "规则匹配" -#: xpack/plugins/cloud/models.py:314 +#: xpack/plugins/cloud/models.py:323 msgid "Rule value" msgstr "规则值" -#: xpack/plugins/cloud/models.py:321 xpack/plugins/cloud/serializers/task.py:75 +#: xpack/plugins/cloud/models.py:330 xpack/plugins/cloud/serializers/task.py:75 msgid "Strategy rule" msgstr "条件" -#: xpack/plugins/cloud/models.py:336 +#: xpack/plugins/cloud/models.py:345 msgid "Action attr" msgstr "动作属性" -#: xpack/plugins/cloud/models.py:338 +#: xpack/plugins/cloud/models.py:347 msgid "Action value" msgstr "动作值" -#: xpack/plugins/cloud/models.py:345 xpack/plugins/cloud/serializers/task.py:78 +#: xpack/plugins/cloud/models.py:354 xpack/plugins/cloud/serializers/task.py:78 msgid "Strategy action" msgstr "动作" diff --git a/apps/locale/zh_Hant/LC_MESSAGES/django.mo b/apps/locale/zh_Hant/LC_MESSAGES/django.mo index 487c345f6..3fa25e402 100644 --- a/apps/locale/zh_Hant/LC_MESSAGES/django.mo +++ b/apps/locale/zh_Hant/LC_MESSAGES/django.mo @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:93fed3f6a027f645520852f40c5f7722a5be579a3a8bb7b7029e3d0bc9794056 -size 145341 +oid sha256:9021dd51a99b425416105a1e2a5b7b63f6725dec2de3b124a0520e4e1a09003f +size 145565 diff --git a/apps/locale/zh_Hant/LC_MESSAGES/django.po b/apps/locale/zh_Hant/LC_MESSAGES/django.po index 68e38db59..5529de09f 100644 --- a/apps/locale/zh_Hant/LC_MESSAGES/django.po +++ b/apps/locale/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-08 14:11+0800\n" +"POT-Creation-Date: 2024-06-13 10:24+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -37,7 +37,7 @@ msgstr "成功: %s, 失敗: %s, 總數: %s" #: settings/serializers/auth/ldap.py:25 settings/serializers/auth/ldap.py:47 #: settings/serializers/msg.py:35 terminal/serializers/storage.py:123 #: terminal/serializers/storage.py:142 users/forms/profile.py:21 -#: users/serializers/user.py:110 +#: users/serializers/user.py:111 #: users/templates/users/_msg_user_created.html:13 #: users/templates/users/user_password_verify.html:18 #: xpack/plugins/cloud/serializers/account_attrs.py:28 @@ -85,7 +85,7 @@ msgstr "匿名帳號" msgid "Specified account" msgstr "指定帳號" -#: accounts/const/account.py:26 users/models/user.py:752 +#: accounts/const/account.py:26 users/models/user.py:753 msgid "Local" msgstr "資料庫" @@ -108,7 +108,7 @@ msgid "Update" msgstr "更新" #: accounts/const/account.py:34 accounts/const/automation.py:109 -#: accounts/serializers/automations/change_secret.py:164 audits/const.py:62 +#: accounts/serializers/automations/change_secret.py:164 audits/const.py:65 #: audits/signal_handlers/activity_log.py:33 common/const/choices.py:19 #: ops/const.py:76 terminal/const.py:79 xpack/plugins/cloud/const.py:47 msgid "Failed" @@ -212,7 +212,7 @@ msgstr "僅創建" #: authentication/serializers/password_mfa.py:24 #: notifications/backends/__init__.py:10 settings/serializers/msg.py:22 #: settings/serializers/msg.py:64 users/forms/profile.py:100 -#: users/forms/profile.py:108 users/models/user.py:816 +#: users/forms/profile.py:108 users/models/user.py:817 #: users/templates/users/forgot_password.html:162 #: users/views/profile/reset.py:94 msgid "Email" @@ -223,7 +223,7 @@ msgid "SFTP" msgstr "SFTP" #: accounts/const/automation.py:110 -#: accounts/serializers/automations/change_secret.py:163 audits/const.py:61 +#: accounts/serializers/automations/change_secret.py:163 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:46 #: terminal/const.py:78 terminal/models/session/sharing.py:121 @@ -281,7 +281,7 @@ msgstr "用戶 %s 查看/匯出 了密碼" #: terminal/serializers/session.py:28 #: terminal/templates/terminal/_msg_command_warning.html:4 #: terminal/templates/terminal/_msg_session_sharing.html:4 -#: tickets/models/ticket/apply_asset.py:16 xpack/plugins/cloud/models.py:252 +#: tickets/models/ticket/apply_asset.py:16 xpack/plugins/cloud/models.py:261 msgid "Asset" msgstr "資產" @@ -293,14 +293,14 @@ msgstr "資產" msgid "Su from" msgstr "切換自" -#: accounts/models/account.py:55 assets/const/protocol.py:177 +#: accounts/models/account.py:55 assets/const/protocol.py:178 #: settings/serializers/auth/cas.py:20 terminal/models/applet/applet.py:35 #: terminal/models/virtualapp/virtualapp.py:21 msgid "Version" msgstr "版本" #: accounts/models/account.py:57 accounts/serializers/account/account.py:215 -#: users/models/user.py:859 +#: users/models/user.py:860 msgid "Source" msgstr "來源" @@ -320,7 +320,7 @@ msgstr "來源 ID" #: terminal/backends/command/models.py:18 terminal/models/session/session.py:34 #: 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:85 +#: tickets/models/ticket/command_confirm.py:13 xpack/plugins/cloud/models.py:86 msgid "Account" msgstr "帳號" @@ -415,7 +415,7 @@ msgid "Trigger mode" msgstr "觸發模式" #: accounts/models/automations/backup_account.py:133 audits/models.py:203 -#: terminal/models/session/sharing.py:125 xpack/plugins/cloud/models.py:204 +#: terminal/models/session/sharing.py:125 xpack/plugins/cloud/models.py:213 msgid "Reason" msgstr "原因" @@ -510,8 +510,8 @@ msgstr "結束日期" #: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:136 #: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:281 #: tickets/serializers/super_ticket.py:13 -#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:200 -#: xpack/plugins/cloud/models.py:256 +#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:209 +#: xpack/plugins/cloud/models.py:265 msgid "Status" msgstr "狀態" @@ -547,7 +547,7 @@ msgstr "最後登錄日期" #: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9 #: terminal/serializers/storage.py:136 users/forms/profile.py:31 -#: users/forms/profile.py:114 users/models/user.py:812 +#: users/forms/profile.py:114 users/models/user.py:813 #: users/templates/users/_msg_user_created.html:12 #: xpack/plugins/cloud/serializers/account_attrs.py:26 msgid "Username" @@ -592,7 +592,7 @@ msgid "Verify asset account" msgstr "帳號驗證" #: accounts/models/base.py:37 accounts/models/base.py:67 -#: accounts/serializers/account/account.py:440 +#: accounts/serializers/account/account.py:443 #: accounts/serializers/account/base.py:17 #: accounts/serializers/automations/change_secret.py:47 #: authentication/serializers/connect_token_secret.py:42 @@ -643,8 +643,8 @@ msgstr "密碼規則" #: terminal/models/virtualapp/provider.py:10 #: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87 #: users/forms/profile.py:32 users/models/group.py:13 -#: users/models/preference.py:11 users/models/user.py:814 -#: xpack/plugins/cloud/models.py:32 xpack/plugins/cloud/models.py:272 +#: users/models/preference.py:11 users/models/user.py:815 +#: xpack/plugins/cloud/models.py:33 xpack/plugins/cloud/models.py:281 #: xpack/plugins/cloud/serializers/task.py:70 msgid "Name" msgstr "名稱" @@ -659,7 +659,7 @@ msgstr "特權帳號" #: authentication/serializers/connect_token_secret.py:117 #: terminal/models/applet/applet.py:40 #: terminal/models/component/endpoint.py:120 -#: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:174 +#: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:175 msgid "Is active" msgstr "啟用" @@ -675,7 +675,7 @@ msgstr "系統平台" msgid "Push params" msgstr "帳號推送參數" -#: accounts/models/template.py:26 xpack/plugins/cloud/models.py:329 +#: accounts/models/template.py:26 xpack/plugins/cloud/models.py:338 msgid "Account template" msgstr "帳號模板" @@ -844,18 +844,24 @@ msgstr "資產不支持帳號類型: %s" msgid "Account has exist" msgstr "帳號已存在" -#: accounts/serializers/account/account.py:441 +#: accounts/serializers/account/account.py:438 +#: accounts/serializers/account/template.py:72 +#: assets/serializers/asset/common.py:384 +msgid "Spec info" +msgstr "特殊資訊" + +#: accounts/serializers/account/account.py:444 #: authentication/serializers/connect_token_secret.py:159 #: authentication/templates/authentication/_access_key_modal.html:30 #: perms/models/perm_node.py:21 users/serializers/group.py:33 msgid "ID" msgstr "ID" -#: accounts/serializers/account/account.py:451 acls/serializers/base.py:116 +#: accounts/serializers/account/account.py:454 acls/serializers/base.py:116 #: acls/templates/acls/asset_login_reminder.html:5 #: acls/templates/acls/user_login_reminder.html:5 #: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:54 -#: audits/models.py:90 audits/models.py:172 audits/models.py:269 +#: audits/models.py:90 audits/models.py:172 audits/models.py:271 #: audits/serializers.py:171 authentication/models/connection_token.py:32 #: authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 @@ -867,12 +873,12 @@ msgstr "ID" #: terminal/notifications.py:205 terminal/serializers/command.py:16 #: terminal/templates/terminal/_msg_command_warning.html:6 #: terminal/templates/terminal/_msg_session_sharing.html:6 -#: tickets/models/comment.py:21 users/const.py:14 users/models/user.py:1019 -#: users/models/user.py:1057 users/serializers/group.py:21 +#: tickets/models/comment.py:21 users/const.py:14 users/models/user.py:1020 +#: users/models/user.py:1058 users/serializers/group.py:21 msgid "User" msgstr "用戶" -#: accounts/serializers/account/account.py:452 +#: accounts/serializers/account/account.py:455 #: authentication/templates/authentication/_access_key_modal.html:33 #: terminal/notifications.py:158 terminal/notifications.py:207 msgid "Date" @@ -904,12 +910,7 @@ msgstr "資產類型" msgid "Key password" msgstr "金鑰密碼" -#: accounts/serializers/account/base.py:78 -#: assets/serializers/asset/common.py:384 -msgid "Spec info" -msgstr "特殊資訊" - -#: accounts/serializers/account/base.py:80 +#: accounts/serializers/account/base.py:79 msgid "" "Tip: If no username is required for authentication, fill in `null`, If AD " "account, like `username@domain`" @@ -941,15 +942,15 @@ msgstr "特殊字元" msgid "Exclude symbol" msgstr "排除字元" -#: accounts/serializers/account/template.py:38 +#: accounts/serializers/account/template.py:39 msgid "Secret generation strategy for account creation" msgstr "密碼生成策略,用於帳號創建時,設置密碼" -#: accounts/serializers/account/template.py:39 +#: accounts/serializers/account/template.py:40 msgid "Whether to automatically push the account to the asset" msgstr "是否自動推送帳號到資產" -#: accounts/serializers/account/template.py:42 +#: accounts/serializers/account/template.py:43 msgid "" "Associated platform, you can configure push parameters. If not associated, " "default parameters will be used" @@ -965,8 +966,8 @@ msgstr "關聯平台,可配置推送參數,如果不關聯,將使用默認 #: terminal/models/component/endpoint.py:119 #: terminal/models/session/session.py:47 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 -#: tickets/models/ticket/general.py:295 users/models/user.py:850 -#: xpack/plugins/cloud/models.py:39 xpack/plugins/cloud/models.py:106 +#: tickets/models/ticket/general.py:295 users/models/user.py:851 +#: xpack/plugins/cloud/models.py:40 xpack/plugins/cloud/models.py:108 msgid "Comment" msgstr "備註" @@ -1137,13 +1138,13 @@ msgstr "通知" #: acls/models/base.py:37 assets/models/_user.py:51 #: assets/models/cmd_filter.py:76 terminal/models/component/endpoint.py:112 -#: xpack/plugins/cloud/models.py:278 +#: xpack/plugins/cloud/models.py:287 msgid "Priority" msgstr "優先度" #: acls/models/base.py:38 assets/models/_user.py:51 #: assets/models/cmd_filter.py:76 terminal/models/component/endpoint.py:113 -#: xpack/plugins/cloud/models.py:279 +#: xpack/plugins/cloud/models.py:288 msgid "1-100, the lower the value will be match first" msgstr "優先度可選範圍為 1-100 (數值越小越優先)" @@ -1180,7 +1181,7 @@ msgid "Command" msgstr "命令" #: acls/models/command_acl.py:17 assets/models/cmd_filter.py:59 -#: xpack/plugins/cloud/models.py:295 +#: xpack/plugins/cloud/models.py:304 msgid "Regex" msgstr "正則表達式" @@ -1324,14 +1325,14 @@ msgid "Thank you" msgstr "謝謝" #: acls/templates/acls/user_login_reminder.html:7 audits/models.py:194 -#: audits/models.py:263 +#: audits/models.py:265 #: authentication/templates/authentication/_msg_different_city.html:11 #: tickets/models/ticket/login_confirm.py:11 msgid "Login city" msgstr "登錄城市" #: acls/templates/acls/user_login_reminder.html:8 audits/models.py:197 -#: audits/models.py:264 audits/serializers.py:68 +#: audits/models.py:266 audits/serializers.py:68 msgid "User agent" msgstr "用戶代理" @@ -1348,7 +1349,7 @@ msgstr "" msgid "Applications" msgstr "應用管理" -#: applications/models.py:16 xpack/plugins/cloud/models.py:37 +#: applications/models.py:16 xpack/plugins/cloud/models.py:38 #: xpack/plugins/cloud/serializers/account.py:68 msgid "Attrs" msgstr "屬性" @@ -1412,8 +1413,7 @@ msgid "Unable to connect to port {port} on {address}" msgstr "無法連接到 {port} 上的埠 {address}" #: assets/automations/ping_gateway/manager.py:58 -#: authentication/backends/oauth2/views.py:60 authentication/middleware.py:93 -#: xpack/plugins/cloud/providers/fc.py:47 +#: authentication/middleware.py:93 xpack/plugins/cloud/providers/fc.py:47 msgid "Authentication failed" msgstr "認證失敗" @@ -1422,7 +1422,7 @@ msgstr "認證失敗" msgid "Connect failed" msgstr "連接失敗" -#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:44 +#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:47 #: audits/signal_handlers/activity_log.py:62 common/utils/ip/geoip/utils.py:31 #: common/utils/ip/geoip/utils.py:37 common/utils/ip/utils.py:104 msgid "Unknown" @@ -1444,7 +1444,7 @@ msgstr "測試網關" msgid "Gather facts" msgstr "收集資產資訊" -#: assets/const/base.py:32 audits/const.py:55 +#: assets/const/base.py:32 audits/const.py:58 #: terminal/serializers/applet_host.py:32 msgid "Disabled" msgstr "禁用" @@ -1456,7 +1456,7 @@ msgstr "禁用" msgid "Basic" msgstr "基本" -#: assets/const/base.py:34 assets/const/protocol.py:268 +#: assets/const/base.py:34 assets/const/protocol.py:275 #: assets/models/asset/web.py:13 msgid "Script" msgstr "腳本" @@ -1478,7 +1478,7 @@ msgid "Cloud service" msgstr "雲服務" #: assets/const/category.py:14 assets/models/asset/gpt.py:11 -#: assets/models/asset/web.py:16 audits/const.py:42 +#: assets/models/asset/web.py:16 audits/const.py:45 #: terminal/models/applet/applet.py:27 users/const.py:64 msgid "Web" msgstr "Web" @@ -1524,19 +1524,19 @@ msgstr "ChatGPT" msgid "Other" msgstr "其它" -#: assets/const/protocol.py:45 +#: assets/const/protocol.py:46 msgid "Old SSH version" msgstr "Old SSH version" -#: assets/const/protocol.py:46 +#: assets/const/protocol.py:47 msgid "Old SSH version like openssh 5.x or 6.x" msgstr "舊的 SSH 版本,例如 openssh 5.x 或 6.x" -#: assets/const/protocol.py:57 +#: assets/const/protocol.py:58 msgid "SFTP root" msgstr "SFTP 根路徑" -#: assets/const/protocol.py:59 +#: assets/const/protocol.py:60 #, python-brace-format msgid "" "SFTP root directory, Support variable:
- ${ACCOUNT} The connected " @@ -1546,113 +1546,113 @@ msgstr "" "SFTP根目錄,支持變數:
-${ACCOUNT}已連接帳戶使用者名稱
-${HOME}連接帳戶" "的主目錄
-${USER}用戶的使用者名稱" -#: assets/const/protocol.py:74 +#: assets/const/protocol.py:75 msgid "Console" msgstr "控制台" -#: assets/const/protocol.py:75 +#: assets/const/protocol.py:76 msgid "Connect to console session" msgstr "連接到控制台會話" -#: assets/const/protocol.py:79 +#: assets/const/protocol.py:80 msgid "Any" msgstr "任意" -#: assets/const/protocol.py:81 settings/serializers/security.py:232 +#: assets/const/protocol.py:82 settings/serializers/security.py:232 msgid "Security" msgstr "安全" -#: assets/const/protocol.py:82 +#: assets/const/protocol.py:83 msgid "Security layer to use for the connection" msgstr "連接 RDP 使用的安全層" -#: assets/const/protocol.py:88 +#: assets/const/protocol.py:89 msgid "AD domain" msgstr "AD 網域" -#: assets/const/protocol.py:103 +#: assets/const/protocol.py:104 msgid "Username prompt" msgstr "使用者名稱提示" -#: assets/const/protocol.py:104 +#: assets/const/protocol.py:105 msgid "We will send username when we see this prompt" msgstr "當我們看到這個提示時,我們將發送使用者名稱" -#: assets/const/protocol.py:109 +#: assets/const/protocol.py:110 msgid "Password prompt" msgstr "密碼提示" -#: assets/const/protocol.py:110 +#: assets/const/protocol.py:111 msgid "We will send password when we see this prompt" msgstr "當我們看到這個提示時,我們將發送密碼" -#: assets/const/protocol.py:115 +#: assets/const/protocol.py:116 msgid "Success prompt" msgstr "成功提示" -#: assets/const/protocol.py:116 +#: assets/const/protocol.py:117 msgid "We will consider login success when we see this prompt" msgstr "當我們看到這個提示時,我們將認為登錄成功" -#: assets/const/protocol.py:127 assets/models/asset/database.py:10 +#: assets/const/protocol.py:128 assets/models/asset/database.py:10 #: settings/serializers/msg.py:47 msgid "Use SSL" msgstr "使用 SSL" -#: assets/const/protocol.py:162 +#: assets/const/protocol.py:163 msgid "SYSDBA" msgstr "SYSDBA" -#: assets/const/protocol.py:163 +#: assets/const/protocol.py:164 msgid "Connect as SYSDBA" msgstr "以 SYSDBA 角色連接" -#: assets/const/protocol.py:178 +#: assets/const/protocol.py:179 msgid "" "SQL Server version, Different versions have different connection drivers" msgstr "SQL Server 版本,不同版本有不同的連接驅動" -#: assets/const/protocol.py:202 +#: assets/const/protocol.py:209 msgid "Auth source" msgstr "認證資料庫" -#: assets/const/protocol.py:203 +#: assets/const/protocol.py:210 msgid "The database to authenticate against" msgstr "要進行身份驗證的資料庫" -#: assets/const/protocol.py:215 +#: assets/const/protocol.py:222 msgid "Auth username" msgstr "使用使用者名稱認證" -#: assets/const/protocol.py:238 +#: assets/const/protocol.py:245 msgid "Safe mode" msgstr "安全模式" -#: assets/const/protocol.py:240 +#: assets/const/protocol.py:247 msgid "" "When safe mode is enabled, some operations will be disabled, such as: New " "tab, right click, visit other website, etc." msgstr "" "當安全模式啟用時,一些操作將被禁用,例如:新建標籤頁、右鍵、訪問其它網站 等" -#: assets/const/protocol.py:245 assets/models/asset/web.py:9 +#: assets/const/protocol.py:252 assets/models/asset/web.py:9 #: assets/serializers/asset/info/spec.py:16 msgid "Autofill" msgstr "自動代填" -#: assets/const/protocol.py:253 assets/models/asset/web.py:10 +#: assets/const/protocol.py:260 assets/models/asset/web.py:10 msgid "Username selector" msgstr "使用者名稱選擇器" -#: assets/const/protocol.py:258 assets/models/asset/web.py:11 +#: assets/const/protocol.py:265 assets/models/asset/web.py:11 msgid "Password selector" msgstr "密碼選擇器" -#: assets/const/protocol.py:263 assets/models/asset/web.py:12 +#: assets/const/protocol.py:270 assets/models/asset/web.py:12 msgid "Submit selector" msgstr "確認按鈕選擇器" -#: assets/const/protocol.py:286 +#: assets/const/protocol.py:293 msgid "API mode" msgstr "API 模式" @@ -1680,19 +1680,19 @@ msgstr "SSH公鑰" # msgstr "備註" #: assets/models/_user.py:28 assets/models/automations/base.py:114 #: assets/models/cmd_filter.py:41 assets/models/group.py:19 -#: audits/models.py:267 common/db/models.py:34 ops/models/base.py:54 -#: ops/models/job.py:240 users/models/user.py:1058 +#: audits/models.py:269 common/db/models.py:34 ops/models/base.py:54 +#: ops/models/job.py:240 users/models/user.py:1059 msgid "Date created" msgstr "創建日期" #: assets/models/_user.py:29 assets/models/cmd_filter.py:42 -#: common/db/models.py:35 users/models/user.py:868 +#: common/db/models.py:35 users/models/user.py:869 msgid "Date updated" msgstr "更新日期" #: assets/models/_user.py:30 assets/models/cmd_filter.py:44 #: assets/models/cmd_filter.py:91 assets/models/group.py:18 -#: common/db/models.py:32 users/models/user.py:857 +#: common/db/models.py:32 users/models/user.py:858 #: users/serializers/group.py:32 msgid "Created by" msgstr "創建者" @@ -1784,20 +1784,20 @@ msgstr "地址" #: assets/models/asset/common.py:161 assets/models/platform.py:134 #: authentication/backends/passkey/models.py:12 #: authentication/serializers/connect_token_secret.py:118 -#: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:325 +#: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:334 msgid "Platform" msgstr "系統平台" #: assets/models/asset/common.py:163 assets/models/domain.py:22 #: authentication/serializers/connect_token_secret.py:136 -#: perms/serializers/user_permission.py:28 xpack/plugins/cloud/models.py:327 +#: perms/serializers/user_permission.py:28 xpack/plugins/cloud/models.py:336 msgid "Domain" msgstr "網域" #: assets/models/asset/common.py:165 assets/models/automations/base.py:18 #: assets/models/cmd_filter.py:32 assets/models/node.py:553 #: perms/models/asset_permission.py:72 perms/serializers/permission.py:37 -#: tickets/models/ticket/apply_asset.py:14 xpack/plugins/cloud/models.py:326 +#: tickets/models/ticket/apply_asset.py:14 xpack/plugins/cloud/models.py:335 msgid "Node" msgstr "節點" @@ -1881,7 +1881,7 @@ msgstr "校驗日期" #: assets/models/cmd_filter.py:28 perms/models/asset_permission.py:66 #: perms/serializers/permission.py:34 users/models/group.py:25 -#: users/models/user.py:820 +#: users/models/user.py:821 msgid "User group" msgstr "用戶組" @@ -1931,7 +1931,7 @@ msgstr "默認" msgid "Default asset group" msgstr "默認資產組" -#: assets/models/label.py:15 rbac/const.py:6 users/models/user.py:1043 +#: assets/models/label.py:15 rbac/const.py:6 users/models/user.py:1044 msgid "System" msgstr "系統" @@ -1996,7 +1996,7 @@ msgstr "開放的" msgid "Setting" msgstr "設置" -#: assets/models/platform.py:38 audits/const.py:56 +#: assets/models/platform.py:38 audits/const.py:59 #: authentication/backends/passkey/models.py:11 settings/models.py:37 #: terminal/serializers/applet_host.py:33 msgid "Enabled" @@ -2123,7 +2123,7 @@ msgstr "資產中批次更新平台,不符合平台類型跳過的資產" #: authentication/serializers/connect_token_secret.py:30 #: authentication/serializers/connect_token_secret.py:75 #: perms/models/asset_permission.py:76 perms/serializers/permission.py:42 -#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:328 +#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:337 #: xpack/plugins/cloud/serializers/task.py:33 msgid "Protocols" msgstr "協議組" @@ -2453,31 +2453,36 @@ msgstr "同意" msgid "Close" msgstr "關閉" -#: audits/const.py:43 settings/serializers/terminal.py:6 +#: audits/const.py:41 ops/models/celery.py:84 +#: terminal/models/session/sharing.py:128 tickets/const.py:25 +msgid "Finished" +msgstr "結束" + +#: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:175 #: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 #: terminal/serializers/session.py:69 msgid "Terminal" msgstr "終端" -#: audits/const.py:48 audits/models.py:132 +#: audits/const.py:51 audits/models.py:132 msgid "Operate log" msgstr "操作日誌" -#: audits/const.py:49 +#: audits/const.py:52 msgid "Session log" msgstr "會話日誌" -#: audits/const.py:50 +#: audits/const.py:53 msgid "Login log" msgstr "登錄日誌" -#: audits/const.py:51 terminal/models/applet/host.py:144 +#: audits/const.py:54 terminal/models/applet/host.py:144 #: terminal/models/component/task.py:22 msgid "Task" msgstr "任務" -#: audits/const.py:57 +#: audits/const.py:60 msgid "-" msgstr "-" @@ -2561,18 +2566,18 @@ msgstr "修改者" msgid "Password change log" msgstr "改密日誌" -#: audits/models.py:190 audits/models.py:265 +#: audits/models.py:190 audits/models.py:267 msgid "Login type" msgstr "登錄方式" -#: audits/models.py:192 audits/models.py:261 +#: audits/models.py:192 audits/models.py:263 #: tickets/models/ticket/login_confirm.py:10 msgid "Login IP" msgstr "登錄 IP" #: audits/models.py:200 audits/serializers.py:52 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 -#: users/forms/profile.py:63 users/models/user.py:837 +#: users/forms/profile.py:63 users/models/user.py:838 #: users/serializers/profile.py:102 msgid "MFA" msgstr "MFA" @@ -2581,7 +2586,7 @@ msgstr "MFA" msgid "Date login" msgstr "登錄日期" -#: audits/models.py:212 audits/models.py:266 audits/serializers.py:70 +#: audits/models.py:212 audits/models.py:268 audits/serializers.py:70 #: audits/serializers.py:184 msgid "Authentication backend" msgstr "認證方式" @@ -2590,15 +2595,15 @@ msgstr "認證方式" msgid "User login log" msgstr "用戶登錄日誌" -#: audits/models.py:262 +#: audits/models.py:264 msgid "Session key" msgstr "會話標識" -#: audits/models.py:298 +#: audits/models.py:300 msgid "User session" msgstr "用戶會話" -#: audits/models.py:300 +#: audits/models.py:302 msgid "Offline user session" msgstr "下線用戶會話" @@ -2621,7 +2626,7 @@ msgstr "用戶 %s %s 了當前資源" #: audits/serializers.py:172 authentication/models/connection_token.py:47 #: authentication/models/temp_token.py:13 perms/models/asset_permission.py:80 #: tickets/models/ticket/apply_application.py:31 -#: tickets/models/ticket/apply_asset.py:20 users/models/user.py:855 +#: tickets/models/ticket/apply_asset.py:20 users/models/user.py:856 msgid "Date expired" msgstr "失效日期" @@ -2654,29 +2659,29 @@ msgstr "認證令牌" #: audits/signal_handlers/login_log.py:37 authentication/notifications.py:73 #: authentication/views/login.py:77 notifications/backends/__init__.py:11 -#: settings/serializers/auth/wecom.py:10 users/models/user.py:759 -#: users/models/user.py:869 +#: settings/serializers/auth/wecom.py:10 users/models/user.py:760 +#: users/models/user.py:870 msgid "WeCom" msgstr "企業微信" #: audits/signal_handlers/login_log.py:38 authentication/views/feishu.py:105 #: authentication/views/login.py:89 notifications/backends/__init__.py:14 -#: settings/serializers/auth/feishu.py:10 users/models/user.py:761 -#: users/models/user.py:871 +#: settings/serializers/auth/feishu.py:10 users/models/user.py:762 +#: users/models/user.py:872 msgid "FeiShu" msgstr "飛書" #: audits/signal_handlers/login_log.py:40 authentication/views/login.py:101 #: authentication/views/slack.py:87 notifications/backends/__init__.py:16 -#: settings/serializers/auth/slack.py:10 users/models/user.py:763 -#: users/models/user.py:873 +#: settings/serializers/auth/slack.py:10 users/models/user.py:764 +#: users/models/user.py:874 msgid "Slack" msgstr "" #: audits/signal_handlers/login_log.py:41 authentication/views/dingtalk.py:161 #: authentication/views/login.py:83 notifications/backends/__init__.py:12 -#: settings/serializers/auth/dingtalk.py:10 users/models/user.py:760 -#: users/models/user.py:870 +#: settings/serializers/auth/dingtalk.py:10 users/models/user.py:761 +#: users/models/user.py:871 msgid "DingTalk" msgstr "釘釘" @@ -3260,7 +3265,7 @@ msgstr "動作" #: authentication/serializers/connection_token.py:42 #: perms/serializers/permission.py:40 perms/serializers/permission.py:60 -#: users/serializers/user.py:101 users/serializers/user.py:178 +#: users/serializers/user.py:102 users/serializers/user.py:179 msgid "Is expired" msgstr "已過期" @@ -3274,8 +3279,8 @@ msgid "Access IP" msgstr "IP 白名單" #: authentication/serializers/token.py:92 perms/serializers/permission.py:39 -#: perms/serializers/permission.py:61 users/serializers/user.py:102 -#: users/serializers/user.py:175 +#: perms/serializers/permission.py:61 users/serializers/user.py:103 +#: users/serializers/user.py:176 msgid "Is valid" msgstr "是否有效" @@ -3300,13 +3305,13 @@ msgid "Show" msgstr "顯示" #: authentication/templates/authentication/_access_key_modal.html:66 -#: users/const.py:42 users/models/user.py:654 users/serializers/profile.py:92 +#: users/const.py:42 users/models/user.py:655 users/serializers/profile.py:92 #: users/templates/users/user_verify_mfa.html:36 msgid "Disable" msgstr "禁用" #: authentication/templates/authentication/_access_key_modal.html:67 -#: users/const.py:43 users/models/user.py:655 users/serializers/profile.py:93 +#: users/const.py:43 users/models/user.py:656 users/serializers/profile.py:93 #: users/templates/users/mfa_setting.html:26 #: users/templates/users/mfa_setting.html:68 msgid "Enable" @@ -3608,11 +3613,11 @@ msgstr "正在跳轉到 {} 認證" msgid "Login timeout, please try again." msgstr "登錄超時,請重新登入" -#: authentication/views/login.py:294 +#: authentication/views/login.py:296 msgid "User email already exists ({})" msgstr "用戶信箱已存在 ({})" -#: authentication/views/login.py:372 +#: authentication/views/login.py:374 msgid "" "Wait for {} confirm, You also can copy link to her/him
\n" " Don't close this page" @@ -3620,15 +3625,15 @@ msgstr "" "等待 {} 確認, 你也可以複製連結發給他/她
\n" " 不要關閉本頁面" -#: authentication/views/login.py:377 +#: authentication/views/login.py:379 msgid "No ticket found" msgstr "沒有發現工單" -#: authentication/views/login.py:413 +#: authentication/views/login.py:415 msgid "Logout success" msgstr "退出登錄成功" -#: authentication/views/login.py:414 +#: authentication/views/login.py:416 msgid "Logout success, return login page" msgstr "退出登錄成功,返回到登入頁面" @@ -3772,7 +3777,7 @@ msgstr "忽略的" msgid "discard time" msgstr "忽略時間" -#: common/db/models.py:33 users/models/user.py:858 +#: common/db/models.py:33 users/models/user.py:859 msgid "Updated by" msgstr "最後更新者" @@ -3835,14 +3840,20 @@ msgstr "此操作需要確認當前用戶" msgid "Unexpect error occur" msgstr "發生意外錯誤" -#: common/plugins/es.py:31 +#: common/plugins/es.py:35 msgid "Invalid elasticsearch config" msgstr "無效的 Elasticsearch 配置" -#: common/plugins/es.py:36 +#: common/plugins/es.py:40 msgid "Not Support Elasticsearch8" msgstr "不支持 Elasticsearch8" +#: common/plugins/es.py:46 +msgid "" +"Connection failed: Self-signed certificate used. Please check server " +"certificate configuration" +msgstr "連接失敗:使用了自簽名證書,請檢查伺服器證書配置" + #: common/sdk/im/exceptions.py:23 msgid "Network error, please contact system administrator" msgstr "網路錯誤,請聯絡系統管理員" @@ -3938,7 +3949,7 @@ msgstr "錯誤的數據類型,應該是列表" msgid "Invalid choice: {}" msgstr "無效選項: {}" -#: common/serializers/mixin.py:406 labels/apps.py:8 +#: common/serializers/mixin.py:417 labels/apps.py:8 msgid "Labels" msgstr "標籤管理" @@ -4088,7 +4099,7 @@ msgstr "等待任務開始" msgid "Task {} not found" msgstr "任務 {} 不存在" -#: ops/api/celery.py:267 +#: ops/api/celery.py:269 msgid "Task {} args or kwargs error" msgstr "任務 {} 執行參數錯誤" @@ -4305,7 +4316,7 @@ msgid "Date last run" msgstr "最後運行日期" #: ops/models/base.py:51 ops/models/job.py:237 -#: xpack/plugins/cloud/models.py:198 +#: xpack/plugins/cloud/models.py:207 msgid "Result" msgstr "結果" @@ -4329,11 +4340,6 @@ msgstr "可以查看任務監控" msgid "Kwargs" msgstr "其它參數" -#: ops/models/celery.py:84 terminal/models/session/sharing.py:128 -#: tickets/const.py:25 -msgid "Finished" -msgstr "結束" - #: ops/models/celery.py:87 msgid "Date published" msgstr "發布日期" @@ -4783,7 +4789,7 @@ msgid "Scope" msgstr "範圍" #: rbac/models/role.py:46 rbac/models/rolebinding.py:52 -#: users/models/user.py:824 +#: users/models/user.py:825 msgid "Role" msgstr "角色" @@ -7244,7 +7250,7 @@ msgstr "Access key ID(AK)" msgid "Access key secret" msgstr "Access key secret(SK)" -#: terminal/serializers/storage.py:68 xpack/plugins/cloud/models.py:249 +#: terminal/serializers/storage.py:68 xpack/plugins/cloud/models.py:258 msgid "Region" msgstr "地域" @@ -7264,7 +7270,7 @@ msgstr "端點後綴" msgid "HOST" msgstr "主機" -#: terminal/serializers/storage.py:146 users/models/user.py:844 +#: terminal/serializers/storage.py:146 users/models/user.py:845 #: xpack/plugins/cloud/serializers/account_attrs.py:213 msgid "Private key" msgstr "ssh私鑰" @@ -7973,7 +7979,7 @@ msgstr "不能和原來的金鑰相同" msgid "Not a valid ssh public key" msgstr "SSH金鑰不合法" -#: users/forms/profile.py:172 users/models/user.py:847 +#: users/forms/profile.py:172 users/models/user.py:848 #: xpack/plugins/cloud/serializers/account_attrs.py:210 msgid "Public key" msgstr "SSH公鑰" @@ -7982,78 +7988,78 @@ msgstr "SSH公鑰" msgid "Preference" msgstr "用戶設置" -#: users/models/user.py:656 users/serializers/profile.py:94 +#: users/models/user.py:657 users/serializers/profile.py:94 msgid "Force enable" msgstr "強制啟用" -#: users/models/user.py:762 +#: users/models/user.py:763 msgid "Lark" msgstr "" -#: users/models/user.py:826 users/serializers/user.py:176 +#: users/models/user.py:827 users/serializers/user.py:177 msgid "Is service account" msgstr "服務帳號" -#: users/models/user.py:828 +#: users/models/user.py:829 msgid "Avatar" msgstr "頭像" -#: users/models/user.py:831 +#: users/models/user.py:832 msgid "Wechat" msgstr "微信" -#: users/models/user.py:834 users/serializers/user.py:112 +#: users/models/user.py:835 users/serializers/user.py:113 msgid "Phone" msgstr "手機" -#: users/models/user.py:840 +#: users/models/user.py:841 msgid "OTP secret key" msgstr "OTP 金鑰" # msgid "Private key" # msgstr "ssh私鑰" -#: users/models/user.py:852 users/serializers/profile.py:128 -#: users/serializers/user.py:173 +#: users/models/user.py:853 users/serializers/profile.py:128 +#: users/serializers/user.py:174 msgid "Is first login" msgstr "首次登錄" -#: users/models/user.py:862 +#: users/models/user.py:863 msgid "Date password last updated" msgstr "最後更新密碼日期" -#: users/models/user.py:865 +#: users/models/user.py:866 msgid "Need update password" msgstr "需要更新密碼" -#: users/models/user.py:867 +#: users/models/user.py:868 msgid "Date api key used" msgstr "Api key 最後使用日期" -#: users/models/user.py:1000 +#: users/models/user.py:1001 msgid "Can not delete admin user" msgstr "無法刪除管理員用戶" -#: users/models/user.py:1028 +#: users/models/user.py:1029 msgid "Can invite user" msgstr "可以邀請用戶" -#: users/models/user.py:1029 +#: users/models/user.py:1030 msgid "Can remove user" msgstr "可以移除用戶" -#: users/models/user.py:1030 +#: users/models/user.py:1031 msgid "Can match user" msgstr "可以匹配用戶" -#: users/models/user.py:1039 +#: users/models/user.py:1040 msgid "Administrator" msgstr "管理員" -#: users/models/user.py:1042 +#: users/models/user.py:1043 msgid "Administrator is the super user of system" msgstr "Administrator是初始的超級管理員" -#: users/models/user.py:1067 +#: users/models/user.py:1068 msgid "User password history" msgstr "用戶密碼歷史" @@ -8183,71 +8189,71 @@ msgstr "密碼不滿足安全規則" msgid "The new password cannot be the last {} passwords" msgstr "新密碼不能是最近 {} 次的密碼" -#: users/serializers/user.py:45 +#: users/serializers/user.py:46 msgid "System roles" msgstr "系統角色" -#: users/serializers/user.py:49 +#: users/serializers/user.py:50 msgid "Org roles" msgstr "組織角色" -#: users/serializers/user.py:52 +#: users/serializers/user.py:53 msgid "Organizations and roles" msgstr "組織和角色" -#: users/serializers/user.py:94 +#: users/serializers/user.py:95 msgid "Password strategy" msgstr "密碼策略" -#: users/serializers/user.py:96 +#: users/serializers/user.py:97 msgid "MFA enabled" msgstr "MFA 已啟用" -#: users/serializers/user.py:98 +#: users/serializers/user.py:99 msgid "MFA force enabled" msgstr "強制 MFA" -#: users/serializers/user.py:100 +#: users/serializers/user.py:101 msgid "Login blocked" msgstr "登錄被鎖定" -#: users/serializers/user.py:103 users/serializers/user.py:182 +#: users/serializers/user.py:104 users/serializers/user.py:183 msgid "Is OTP bound" msgstr "是否綁定了虛擬 MFA" -#: users/serializers/user.py:104 +#: users/serializers/user.py:105 msgid "Super Administrator" msgstr "超級管理員" -#: users/serializers/user.py:105 +#: users/serializers/user.py:106 msgid "Organization Administrator" msgstr "組織管理員" -#: users/serializers/user.py:107 +#: users/serializers/user.py:108 msgid "Can public key authentication" msgstr "可以使用公鑰認證" -#: users/serializers/user.py:177 +#: users/serializers/user.py:178 msgid "Is org admin" msgstr "組織管理員" -#: users/serializers/user.py:179 +#: users/serializers/user.py:180 msgid "Avatar url" msgstr "頭像路徑" -#: users/serializers/user.py:183 +#: users/serializers/user.py:184 msgid "MFA level" msgstr "MFA 級別" -#: users/serializers/user.py:305 +#: users/serializers/user.py:310 msgid "Select users" msgstr "選擇用戶" -#: users/serializers/user.py:306 +#: users/serializers/user.py:311 msgid "For security, only list several users" msgstr "為了安全,僅列出幾個用戶" -#: users/serializers/user.py:339 +#: users/serializers/user.py:344 msgid "name not unique" msgstr "名稱重複" @@ -8650,7 +8656,7 @@ msgstr "私有IP" msgid "Public IP" msgstr "公網IP" -#: xpack/plugins/cloud/const.py:42 xpack/plugins/cloud/models.py:299 +#: xpack/plugins/cloud/const.py:42 xpack/plugins/cloud/models.py:308 msgid "Instance name" msgstr "實例名稱" @@ -8695,157 +8701,164 @@ msgstr "帳號無效" msgid "Cloud center" msgstr "雲管中心" -#: xpack/plugins/cloud/models.py:34 +#: xpack/plugins/cloud/models.py:35 msgid "Provider" msgstr "雲服務商" -#: xpack/plugins/cloud/models.py:38 +#: xpack/plugins/cloud/models.py:39 msgid "Validity" msgstr "有效" -#: xpack/plugins/cloud/models.py:43 +#: xpack/plugins/cloud/models.py:44 msgid "Cloud account" msgstr "雲帳號" -#: xpack/plugins/cloud/models.py:45 +#: xpack/plugins/cloud/models.py:46 msgid "Test cloud account" msgstr "測試雲帳號" -#: xpack/plugins/cloud/models.py:88 xpack/plugins/cloud/serializers/task.py:159 +#: xpack/plugins/cloud/models.py:89 xpack/plugins/cloud/serializers/task.py:159 msgid "Regions" msgstr "地域" -#: xpack/plugins/cloud/models.py:91 +#: xpack/plugins/cloud/models.py:92 msgid "Hostname strategy" msgstr "主機名策略" -#: xpack/plugins/cloud/models.py:96 xpack/plugins/cloud/serializers/task.py:162 +#: xpack/plugins/cloud/models.py:97 xpack/plugins/cloud/serializers/task.py:162 msgid "IP network segment group" msgstr "IP網段組" -#: xpack/plugins/cloud/models.py:99 xpack/plugins/cloud/serializers/task.py:167 +#: xpack/plugins/cloud/models.py:100 +#: xpack/plugins/cloud/serializers/task.py:167 msgid "Sync IP type" msgstr "同步IP類型" -#: xpack/plugins/cloud/models.py:102 +#: xpack/plugins/cloud/models.py:103 #: xpack/plugins/cloud/serializers/task.py:185 msgid "Always update" msgstr "總是更新" -#: xpack/plugins/cloud/models.py:104 +#: xpack/plugins/cloud/models.py:105 msgid "Fully synchronous" msgstr "完全同步" -#: xpack/plugins/cloud/models.py:109 +#: xpack/plugins/cloud/models.py:106 +#, fuzzy +#| msgid "permed assets" +msgid "Release assets" +msgstr "授權的資產" + +#: xpack/plugins/cloud/models.py:111 msgid "Date last sync" msgstr "最後同步日期" -#: xpack/plugins/cloud/models.py:112 xpack/plugins/cloud/models.py:317 -#: xpack/plugins/cloud/models.py:341 +#: xpack/plugins/cloud/models.py:114 xpack/plugins/cloud/models.py:326 +#: xpack/plugins/cloud/models.py:350 msgid "Strategy" msgstr "策略" -#: xpack/plugins/cloud/models.py:117 xpack/plugins/cloud/models.py:196 +#: xpack/plugins/cloud/models.py:119 xpack/plugins/cloud/models.py:205 msgid "Sync instance task" msgstr "同步實例任務" -#: xpack/plugins/cloud/models.py:207 xpack/plugins/cloud/models.py:259 +#: xpack/plugins/cloud/models.py:216 xpack/plugins/cloud/models.py:268 msgid "Date sync" msgstr "同步日期" -#: xpack/plugins/cloud/models.py:211 +#: xpack/plugins/cloud/models.py:220 msgid "Sync instance snapshot" msgstr "同步實例快照" -#: xpack/plugins/cloud/models.py:215 +#: xpack/plugins/cloud/models.py:224 msgid "Sync instance task execution" msgstr "同步實例任務執行" -#: xpack/plugins/cloud/models.py:239 +#: xpack/plugins/cloud/models.py:248 msgid "Sync task" msgstr "同步任務" -#: xpack/plugins/cloud/models.py:243 +#: xpack/plugins/cloud/models.py:252 msgid "Sync instance task history" msgstr "同步實例任務歷史" -#: xpack/plugins/cloud/models.py:246 +#: xpack/plugins/cloud/models.py:255 msgid "Instance" msgstr "實例" -#: xpack/plugins/cloud/models.py:263 +#: xpack/plugins/cloud/models.py:272 msgid "Sync instance detail" msgstr "同步實例詳情" -#: xpack/plugins/cloud/models.py:275 xpack/plugins/cloud/serializers/task.py:72 +#: xpack/plugins/cloud/models.py:284 xpack/plugins/cloud/serializers/task.py:72 msgid "Rule relation" msgstr "條件關係" -#: xpack/plugins/cloud/models.py:284 +#: xpack/plugins/cloud/models.py:293 msgid "Task strategy" msgstr "任務策略" -#: xpack/plugins/cloud/models.py:288 +#: xpack/plugins/cloud/models.py:297 msgid "Equal" msgstr "等於" -#: xpack/plugins/cloud/models.py:289 +#: xpack/plugins/cloud/models.py:298 msgid "Not Equal" msgstr "不等於" -#: xpack/plugins/cloud/models.py:290 +#: xpack/plugins/cloud/models.py:299 msgid "In" msgstr "在...中" -#: xpack/plugins/cloud/models.py:291 +#: xpack/plugins/cloud/models.py:300 msgid "Contains" msgstr "包含" -#: xpack/plugins/cloud/models.py:292 +#: xpack/plugins/cloud/models.py:301 msgid "Exclude" msgstr "排除" -#: xpack/plugins/cloud/models.py:293 +#: xpack/plugins/cloud/models.py:302 msgid "Startswith" msgstr "以...開頭" -#: xpack/plugins/cloud/models.py:294 +#: xpack/plugins/cloud/models.py:303 msgid "Endswith" msgstr "以...結尾" -#: xpack/plugins/cloud/models.py:300 +#: xpack/plugins/cloud/models.py:309 msgid "Instance platform" msgstr "實例平台" -#: xpack/plugins/cloud/models.py:301 +#: xpack/plugins/cloud/models.py:310 msgid "Instance address" msgstr "實例地址" -#: xpack/plugins/cloud/models.py:308 +#: xpack/plugins/cloud/models.py:317 msgid "Rule attr" msgstr "規則屬性" -#: xpack/plugins/cloud/models.py:312 +#: xpack/plugins/cloud/models.py:321 msgid "Rule match" msgstr "規則匹配" -#: xpack/plugins/cloud/models.py:314 +#: xpack/plugins/cloud/models.py:323 msgid "Rule value" msgstr "規則值" -#: xpack/plugins/cloud/models.py:321 xpack/plugins/cloud/serializers/task.py:75 +#: xpack/plugins/cloud/models.py:330 xpack/plugins/cloud/serializers/task.py:75 msgid "Strategy rule" msgstr "條件" -#: xpack/plugins/cloud/models.py:336 +#: xpack/plugins/cloud/models.py:345 msgid "Action attr" msgstr "動作屬性" -#: xpack/plugins/cloud/models.py:338 +#: xpack/plugins/cloud/models.py:347 msgid "Action value" msgstr "動作值" -#: xpack/plugins/cloud/models.py:345 xpack/plugins/cloud/serializers/task.py:78 +#: xpack/plugins/cloud/models.py:354 xpack/plugins/cloud/serializers/task.py:78 msgid "Strategy action" msgstr "動作" From 496903dfb2a654eba197c1873e21b3676cabbd72 Mon Sep 17 00:00:00 2001 From: jiangweidong <1053570670@qq.com> Date: Thu, 13 Jun 2024 11:06:20 +0800 Subject: [PATCH 24/32] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=94=A8=E6=88=B7=E7=99=BB=E5=BD=95=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E7=9A=84session=5Fkey=E6=9C=89=E4=B8=A4=E7=A7=8D=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/authentication/signal_handlers.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/authentication/signal_handlers.py b/apps/authentication/signal_handlers.py index e060e3c1f..c74c3c7ed 100644 --- a/apps/authentication/signal_handlers.py +++ b/apps/authentication/signal_handlers.py @@ -1,5 +1,5 @@ from django.conf import settings -from django.contrib.auth import user_logged_in +from django.contrib.auth import user_logged_in, BACKEND_SESSION_KEY from django.core.cache import cache from django.dispatch import receiver from django_cas_ng.signals import cas_user_authenticated @@ -20,8 +20,9 @@ def on_user_auth_login_success(sender, user, request, **kwargs): and user.mfa_enabled \ and not request.session.get('auth_mfa'): request.session['auth_mfa_required'] = 1 + auth_backend = request.session.get('auth_backend', request.session.get(BACKEND_SESSION_KEY)) if not request.session.get("auth_third_party_done") and \ - request.session.get('auth_backend') in AUTHENTICATION_BACKENDS_THIRD_PARTY: + auth_backend in AUTHENTICATION_BACKENDS_THIRD_PARTY: request.session['auth_third_party_required'] = 1 user_session_id = request.session.get('user_session_id') From b28aec527fb54438e1668ae04b239f4f59374c3f Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Fri, 14 Jun 2024 18:17:25 +0800 Subject: [PATCH 25/32] =?UTF-8?q?perf:=20=E9=BB=98=E8=AE=A4=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E4=BD=9C=E4=B8=9A=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/jumpserver/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/jumpserver/conf.py b/apps/jumpserver/conf.py index 691c04ad5..2ceeb683c 100644 --- a/apps/jumpserver/conf.py +++ b/apps/jumpserver/conf.py @@ -489,7 +489,7 @@ class Config(dict): # 安全配置 'SECURITY_MFA_AUTH': 0, # 0 不开启 1 全局开启 2 管理员开启 'SECURITY_MFA_AUTH_ENABLED_FOR_THIRD_PARTY': True, - 'SECURITY_COMMAND_EXECUTION': True, + 'SECURITY_COMMAND_EXECUTION': False, 'SECURITY_COMMAND_BLACKLIST': [ 'reboot', 'shutdown', 'poweroff', 'halt', 'dd', 'half', 'top' ], From 66cd6e95a83a2f898e6641c182b9b29a97cf4919 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Fri, 14 Jun 2024 17:35:08 +0800 Subject: [PATCH 26/32] =?UTF-8?q?fix:=20=E8=8E=B7=E5=8F=96=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E6=94=B9=E5=AF=86=E7=9A=84=E4=BB=BB=E5=8A=A1=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E8=B6=85=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/models/automations/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/assets/models/automations/base.py b/apps/assets/models/automations/base.py index c3e1fa639..da0f73a1e 100644 --- a/apps/assets/models/automations/base.py +++ b/apps/assets/models/automations/base.py @@ -123,7 +123,7 @@ class AutomationExecution(OrgModelMixin): ) class Meta: - ordering = ('-date_start',) + ordering = ('org_id', '-date_start',) verbose_name = _('Automation task execution') @property From ff126f3459a26eea1a02597daced564a16cacf28 Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 18 Jun 2024 10:57:51 +0800 Subject: [PATCH 27/32] fix: delete account error (DoesNotExist) --- apps/audits/signal_handlers/operate_log.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/audits/signal_handlers/operate_log.py b/apps/audits/signal_handlers/operate_log.py index 9f4958ca8..71f9b4f48 100644 --- a/apps/audits/signal_handlers/operate_log.py +++ b/apps/audits/signal_handlers/operate_log.py @@ -187,7 +187,7 @@ def on_django_start_set_operate_log_monitor_models(sender, **kwargs): 'PermedAsset', 'PermedAccount', 'MenuPermission', 'Permission', 'TicketSession', 'ApplyLoginTicket', 'ApplyCommandTicket', 'ApplyLoginAssetTicket', - 'FavoriteAsset', + 'FavoriteAsset', 'ChangeSecretRecord' } include_models = {'UserSession'} for i, app in enumerate(apps.get_models(), 1): From f42113afb9732e55bc967dd1c56eb4ea7d8fd8fb Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:18:02 +0800 Subject: [PATCH 28/32] fix: Fixed the issue of user login statistics (#13440) Co-authored-by: feng <1304903146@qq.com> --- apps/jumpserver/api.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/apps/jumpserver/api.py b/apps/jumpserver/api.py index 6c706430f..f50e52d2e 100644 --- a/apps/jumpserver/api.py +++ b/apps/jumpserver/api.py @@ -74,9 +74,13 @@ class DateTimeMixin: query = {f'{query_field}__gte': t} return qs.filter(**query) + @lazyproperty + def users(self): + return self.org.get_members() + def get_logs_queryset(self, queryset, query_params): query = {} - users = self.org.get_members() + users = self.users if not self.org.is_root(): if query_params == 'username': query = { @@ -100,6 +104,13 @@ class DateTimeMixin: queryset = self.get_logs_queryset(qs, 'username') return queryset + @lazyproperty + def user_login_logs_on_the_system_queryset(self): + qs = UserLoginLog.objects.all() + qs = self.get_logs_queryset_filter(qs, 'datetime') + queryset = qs.filter(username__in=construct_userlogin_usernames(self.users)) + return queryset + @lazyproperty def password_change_logs_queryset(self): qs = PasswordChangeLog.objects.all() @@ -141,6 +152,7 @@ class DatesLoginMetricMixin: ftp_logs_queryset: FTPLog.objects job_logs_queryset: JobLog.objects login_logs_queryset: UserLoginLog.objects + user_login_logs_on_the_system_queryset: UserLoginLog.objects operate_logs_queryset: OperateLog.objects password_change_logs_queryset: PasswordChangeLog.objects @@ -241,7 +253,7 @@ class DatesLoginMetricMixin: @lazyproperty def user_login_amount(self): - return self.login_logs_queryset.values('username').distinct().count() + return self.user_login_logs_on_the_system_queryset.values('username').distinct().count() @lazyproperty def operate_logs_amount(self): From 44f29e166c873736a19da56d605c325cd9422516 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Tue, 18 Jun 2024 16:42:38 +0800 Subject: [PATCH 29/32] =?UTF-8?q?fix:=20=E4=B8=80=E4=BA=9B=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=9F=A5=E6=89=BE=E4=B8=8D=E5=88=B0id=E5=92=8C?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E8=80=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/ops/models/job.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/ops/models/job.py b/apps/ops/models/job.py index 9e7fcd511..141de8dce 100644 --- a/apps/ops/models/job.py +++ b/apps/ops/models/job.py @@ -215,7 +215,8 @@ class Job(JMSOrgBaseModel, PeriodTaskModelMixin): return "{}:{}:{}".format(self.org.name, self.creator.name, self.playbook.name) def create_execution(self): - return self.executions.create(job_version=self.version, material=self.material, job_type=Types[self.type].value) + return self.executions.create(job_version=self.version, material=self.material, job_type=Types[self.type].value, + creator=self.creator) class Meta: verbose_name = _("Job") From 4a520e9e10a50b1bd05b75d63c9497ff79ea1147 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Mon, 17 Jun 2024 17:57:03 +0800 Subject: [PATCH 30/32] =?UTF-8?q?fix:=20=E5=85=A8=E5=B1=80=E7=BB=84?= =?UTF-8?q?=E7=BB=87=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=A0=87=E7=AD=BE=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/locale/ja/LC_MESSAGES/django.mo | 4 ++-- apps/locale/ja/LC_MESSAGES/django.po | 6 +++++- apps/locale/zh/LC_MESSAGES/django.mo | 4 ++-- apps/locale/zh/LC_MESSAGES/django.po | 6 +++++- apps/locale/zh_Hant/LC_MESSAGES/django.mo | 4 ++-- apps/locale/zh_Hant/LC_MESSAGES/django.po | 6 +++++- apps/orgs/mixins/models.py | 7 +++---- 7 files changed, 24 insertions(+), 13 deletions(-) diff --git a/apps/locale/ja/LC_MESSAGES/django.mo b/apps/locale/ja/LC_MESSAGES/django.mo index 514c6d921..6617e6bc6 100644 --- a/apps/locale/ja/LC_MESSAGES/django.mo +++ b/apps/locale/ja/LC_MESSAGES/django.mo @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4c47b806817e09e63c804277a1a2db8bdf959807e482605322be323922c38209 -size 177735 +oid sha256:52990de6b508e55b8b5f4a70f86c567410c5cf217ca312847f65178393d81b19 +size 177824 diff --git a/apps/locale/ja/LC_MESSAGES/django.po b/apps/locale/ja/LC_MESSAGES/django.po index f8e79e1d9..2e40f612e 100644 --- a/apps/locale/ja/LC_MESSAGES/django.po +++ b/apps/locale/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-13 10:19+0800\n" +"POT-Creation-Date: 2024-06-17 17:50+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -4589,6 +4589,10 @@ msgstr "組織のリソース ({}) は削除できません" msgid "App organizations" msgstr "アプリ組織" +#: orgs/mixins/models.py:48 +msgid "Please save in a org" +msgstr "組織を選択してから保存してください" + #: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:91 #: rbac/const.py:7 rbac/models/rolebinding.py:56 #: rbac/serializers/rolebinding.py:44 settings/serializers/auth/ldap.py:63 diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index d9ea633d9..3becbac07 100644 --- a/apps/locale/zh/LC_MESSAGES/django.mo +++ b/apps/locale/zh/LC_MESSAGES/django.mo @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d83f99f39e0052ea2592a3f5bb4be56a94be0963436b45031083891c44a44ba0 -size 145454 +oid sha256:144d439f8f3c96d00b1744de34b8a2a22b891f88ccb4b3c9669ad7273ecd08be +size 145525 diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 8a80c77b6..49f873559 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-13 10:19+0800\n" +"POT-Creation-Date: 2024-06-17 17:52+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -4530,6 +4530,10 @@ msgstr "组织存在资源 ({}) 不能被删除" msgid "App organizations" msgstr "组织管理" +#: orgs/mixins/models.py:48 orgs/mixins/models.py:73 +msgid "Please save in a org" +msgstr "请选择一个组织后再保存" + #: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:91 #: rbac/const.py:7 rbac/models/rolebinding.py:56 #: rbac/serializers/rolebinding.py:44 settings/serializers/auth/ldap.py:63 diff --git a/apps/locale/zh_Hant/LC_MESSAGES/django.mo b/apps/locale/zh_Hant/LC_MESSAGES/django.mo index 3fa25e402..41b29c7d8 100644 --- a/apps/locale/zh_Hant/LC_MESSAGES/django.mo +++ b/apps/locale/zh_Hant/LC_MESSAGES/django.mo @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9021dd51a99b425416105a1e2a5b7b63f6725dec2de3b124a0520e4e1a09003f -size 145565 +oid sha256:17da592df8b280d501a3b579c6a249b080bf07fbee34520a2012d8936d96ca14 +size 145636 diff --git a/apps/locale/zh_Hant/LC_MESSAGES/django.po b/apps/locale/zh_Hant/LC_MESSAGES/django.po index 5529de09f..f76d150b8 100644 --- a/apps/locale/zh_Hant/LC_MESSAGES/django.po +++ b/apps/locale/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-13 10:24+0800\n" +"POT-Creation-Date: 2024-06-17 17:52+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -4531,6 +4531,10 @@ msgstr "組織存在資源 ({}) 不能被刪除" msgid "App organizations" msgstr "組織管理" +#: orgs/mixins/models.py:48 orgs/mixins/models.py:73 +msgid "Please save in a org" +msgstr "請選擇一個組織後再保存" + #: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:91 #: rbac/const.py:7 rbac/models/rolebinding.py:56 #: rbac/serializers/rolebinding.py:44 settings/serializers/auth/ldap.py:63 diff --git a/apps/orgs/mixins/models.py b/apps/orgs/mixins/models.py index f41d4a67b..a678f770d 100644 --- a/apps/orgs/mixins/models.py +++ b/apps/orgs/mixins/models.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # -from django.core.exceptions import ValidationError +from rest_framework.serializers import ValidationError from django.db import models from django.utils.translation import gettext_lazy as _ @@ -45,7 +45,7 @@ class OrgManager(models.Manager): for obj in objs: if org.is_root(): if not obj.org_id: - raise ValidationError('Please save in a org') + raise ValidationError(_('Please save in a org')) else: obj.org_id = org.id return super().bulk_create(objs, batch_size, ignore_conflicts) @@ -70,7 +70,7 @@ class OrgModelMixin(models.Model): # raise ... if org.is_root(): if not self.org_id: - raise ValidationError('Please save in a org') + raise ValidationError(_('Please save in a org')) else: self.org_id = org.id return super().save(*args, **kwargs) @@ -119,4 +119,3 @@ class OrgModelMixin(models.Model): class JMSOrgBaseModel(JMSBaseModel, OrgModelMixin): class Meta: abstract = True - From 2977323800fbe5d259b20ed765077c0bca6c37e8 Mon Sep 17 00:00:00 2001 From: gerry-fit <95400700+gerry-fit@users.noreply.github.com> Date: Wed, 19 Jun 2024 14:29:36 +0800 Subject: [PATCH 31/32] =?UTF-8?q?perf:=20=E7=99=BB=E5=BD=95=E9=87=8D?= =?UTF-8?q?=E7=BD=AE=E5=AF=86=E7=A0=81=E4=BC=A0=E8=BE=93=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E5=8A=A0=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/users/templates/users/reset_password.html | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/users/templates/users/reset_password.html b/apps/users/templates/users/reset_password.html index a8e0360c4..f75e3dae5 100644 --- a/apps/users/templates/users/reset_password.html +++ b/apps/users/templates/users/reset_password.html @@ -33,6 +33,9 @@ {% block custom_foot_js %} + + + From b283d88781cc5d7166894f4d0d18c4be2fe7eae5 Mon Sep 17 00:00:00 2001 From: Bai Date: Wed, 19 Jun 2024 15:53:40 +0800 Subject: [PATCH 32/32] fix: Clone asset with accounts --- apps/assets/serializers/asset/common.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/assets/serializers/asset/common.py b/apps/assets/serializers/asset/common.py index 96371bcd2..98f2066ad 100644 --- a/apps/assets/serializers/asset/common.py +++ b/apps/assets/serializers/asset/common.py @@ -381,6 +381,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa class DetailMixin(serializers.Serializer): + accounts = AssetAccountSerializer(many=True, required=False, label=_('Accounts')) spec_info = MethodSerializer(label=_('Spec info'), read_only=True) gathered_info = MethodSerializer(label=_('Gathered info'), read_only=True) auto_config = serializers.DictField(read_only=True, label=_('Auto info')) @@ -395,7 +396,7 @@ class DetailMixin(serializers.Serializer): def get_field_names(self, declared_fields, info): names = super().get_field_names(declared_fields, info) names.extend([ - 'gathered_info', 'spec_info', 'auto_config', + 'accounts', 'gathered_info', 'spec_info', 'auto_config', ]) return names