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
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 }}
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/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'
]
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()
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/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
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
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..71f9b4f48 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',
@@ -178,13 +187,15 @@ 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):
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/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)
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')
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
diff --git a/apps/common/plugins/es.py b/apps/common/plugins/es.py
index 8e2126f85..0b1bf702b 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, SSLError
+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,82 @@ 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 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):
+ version = get_es_client_version(**kwargs)
+ 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):
+ 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):
+
+ 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', {})
@@ -46,7 +123,8 @@ 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.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))
@@ -83,26 +161,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 +184,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 +193,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:
@@ -175,11 +236,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']:
@@ -367,7 +432,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/apps/jumpserver/api.py b/apps/jumpserver/api.py
index 6b5d162e5..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
@@ -159,31 +171,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") \
@@ -224,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):
@@ -412,11 +441,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'):
diff --git a/apps/jumpserver/conf.py b/apps/jumpserver/conf.py
index 9089454da..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'
],
@@ -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 a17c48bfc..2a915ae4e 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',
@@ -320,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
diff --git a/apps/locale/ja/LC_MESSAGES/django.mo b/apps/locale/ja/LC_MESSAGES/django.mo
index 3505cc8c4..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:e4baadc170ded5134bed55533c4c04e694be6ea7b8e151d80c1092728e26a75b
-size 177500
+oid sha256:52990de6b508e55b8b5f4a70f86c567410c5cf217ca312847f65178393d81b19
+size 177824
diff --git a/apps/locale/ja/LC_MESSAGES/django.po b/apps/locale/ja/LC_MESSAGES/django.po
index 84396439e..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-05-08 14:11+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"
@@ -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 "発売日"
@@ -4581,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
@@ -4839,7 +4851,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 +7362,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 +7382,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 +8097,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 +8106,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 +8311,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 +8791,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 +8836,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..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:08667579241592ecacd1baf330147a720a9e41171444b925f90778613a7e1d9a
-size 145230
+oid sha256:144d439f8f3c96d00b1744de34b8a2a22b891f88ccb4b3c9669ad7273ecd08be
+size 145525
diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po
index 5b7b5cd97..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-05-08 14:11+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"
@@ -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 "发布日期"
@@ -4524,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
@@ -4782,7 +4792,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 +7253,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 +7273,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 +7982,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 +7991,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 +8192,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 +8659,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 +8704,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..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:93fed3f6a027f645520852f40c5f7722a5be579a3a8bb7b7029e3d0bc9794056
-size 145341
+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 68e38db59..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-05-08 14:11+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"
@@ -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 "發布日期"
@@ -4525,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
@@ -4783,7 +4793,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 +7254,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 +7274,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 +7983,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 +7992,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 +8193,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 +8660,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 +8705,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/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/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")
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,
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/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
-
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
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')
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)
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'),
)
diff --git a/apps/terminal/connect_methods.py b/apps/terminal/connect_methods.py
index 0294ccab1..9e815a29a 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:
@@ -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'
},
@@ -253,8 +254,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
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)
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
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 %}
+
+
+
diff --git a/poetry.lock b/poetry.lock
index c59495a67..a7c673f18 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.8.3 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"
@@ -2389,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)"]
@@ -2414,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"
@@ -2836,14 +2862,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"
@@ -3575,12 +3595,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]
@@ -3592,7 +3612,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"
@@ -3915,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"},
@@ -4172,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"},
]
@@ -5791,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"},
@@ -5811,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"},
]
@@ -6306,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"},
@@ -6314,15 +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_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 +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"},
@@ -6347,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"},
@@ -7905,4 +7901,4 @@ reference = "tsinghua"
[metadata]
lock-version = "2.0"
python-versions = "^3.11"
-content-hash = "63da026ae0d9d5e6a62b25d265a50c95666e05f60cdae798c2e0443c93544e3a"
+content-hash = "54280c08e758b0767dbf7dd249a0d68f4a16c6de69a86723f00b2793c6bfd186"
diff --git a/pyproject.toml b/pyproject.toml
index 970bb6c99..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"
@@ -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"
@@ -156,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]