Compare commits

...

39 Commits

Author SHA1 Message Date
xiaojunnuo
5f9341ad8e v1.39.5 2026-03-19 00:50:53 +08:00
xiaojunnuo
574c0983f5 build: prepare to build 2026-03-19 00:48:08 +08:00
xiaojunnuo
be6c7c7ac8 build: prepare to build 2026-03-19 00:41:29 +08:00
xiaojunnuo
4fd31f276b build: prepare to build 2026-03-19 00:20:00 +08:00
xiaojunnuo
224db7da57 fix: 修复修改分组报错的bug 2026-03-19 00:15:15 +08:00
xiaojunnuo
1413e1aff4 perf: passkey登录放到下方其他登录位置 2026-03-19 00:14:05 +08:00
xiaojunnuo
68b669d3ff perf: 移除passkey的counter递增校验 2026-03-18 23:56:50 +08:00
xiaojunnuo
29f44c67c8 perf: passkey 支持Bitwarden 2026-03-18 23:13:37 +08:00
xiaojunnuo
34702196e1 chore: 优化workflow 2026-03-18 09:22:09 +08:00
xiaojunnuo
d45c8d1e9b build: release 2026-03-18 01:30:28 +08:00
xiaojunnuo
bc19825ada build: publish 2026-03-18 01:14:10 +08:00
xiaojunnuo
72bb640239 build: trigger build image 2026-03-18 01:13:58 +08:00
xiaojunnuo
aacee4a94c v1.39.4 2026-03-18 01:12:39 +08:00
xiaojunnuo
3ab37d5c5d build: prepare to build 2026-03-18 01:09:27 +08:00
xiaojunnuo
3dd3ecf8f1 build: prepare to build 2026-03-18 01:05:23 +08:00
xiaojunnuo
a3831827d0 chore: 1 2026-03-18 01:04:43 +08:00
xiaojunnuo
6aa6c957ee build: prepare to build 2026-03-18 00:43:45 +08:00
xiaojunnuo
9e12412f5f perf: 优化passkey 2026-03-18 00:43:01 +08:00
xiaojunnuo
0f9eb31740 Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2026-03-17 23:33:18 +08:00
xiaojunnuo
6be8ab581d chore: 1 2026-03-17 23:33:13 +08:00
xiaojunnuo
d8425bc9c5 fix: 修复选择插件页面无法滚动的bug 2026-03-17 23:25:45 +08:00
xiaojunnuo
0ddcb9c00a chore: passkey perf 2026-03-17 19:16:11 +08:00
xiaojunnuo
6d43623f45 fix: 修复阿里云证书订单翻页问题 2026-03-17 18:56:52 +08:00
xiaojunnuo
196cd88010 Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2026-03-17 14:53:51 +08:00
xiaojunnuo
7f37df4227 fix: 修复查看证书详情页面错位的bug 2026-03-17 14:53:46 +08:00
xiaojunnuo
985a12a63b build: release 2026-03-17 14:19:59 +08:00
xiaojunnuo
9058c0e9fc build: publish 2026-03-17 14:02:46 +08:00
xiaojunnuo
4b0cd32d12 build: trigger build image 2026-03-17 14:02:34 +08:00
xiaojunnuo
6cb51bc55d v1.39.3 2026-03-17 14:01:18 +08:00
xiaojunnuo
119e3c31c9 build: prepare to build 2026-03-17 13:58:14 +08:00
xiaojunnuo
56164c25d0 build: prepare to build 2026-03-17 13:56:03 +08:00
xiaojunnuo
c66e5f9fcd chore: remote-select mode还原回原来的模式 2026-03-17 13:54:02 +08:00
xiaojunnuo
12700e1754 fix: 修复多选框只能单选的bug 2026-03-17 13:33:12 +08:00
xiaojunnuo
50db6f0765 fix: 修复旧版1panel插件 报sslIds is not iterable的错误 2026-03-17 09:13:29 +08:00
xiaojunnuo
64e8adddfd build: release 2026-03-17 01:15:04 +08:00
xiaojunnuo
729a4d64e9 chore: project mode 2026-03-17 01:14:52 +08:00
xiaojunnuo
6f12504588 chore: docs 2026-03-17 01:12:03 +08:00
xiaojunnuo
271459f820 build: publish 2026-03-17 00:57:40 +08:00
xiaojunnuo
5000c95d01 build: trigger build image 2026-03-17 00:57:27 +08:00
140 changed files with 772 additions and 258 deletions

View File

@@ -4,7 +4,7 @@ on:
branches: ['v2-dev']
paths:
- "trigger/build.trigger"
workflow_dispatch: # 添加手动触发
# schedule:
# - # 国际时间 19:17 执行北京时间3:17 ↙↙↙ 改成你想要每天自动执行的时间
# - cron: '17 19 * * *'
@@ -21,7 +21,7 @@ jobs:
with:
fetch-depth: 0
lfs: true
ref: 'v2-dev'
- name: get_certd_version
id: get_certd_version
uses: actions/github-script@v6

View File

@@ -8,6 +8,8 @@ on:
workflows: [ "build-image" ]
types:
- completed
workflow_dispatch: # 添加手动触发
# schedule:
@@ -26,6 +28,7 @@ jobs:
with:
fetch-depth: 0
ref: v2-dev
- name: get_certd_version
id: get_certd_version
uses: actions/github-script@v6

View File

@@ -8,7 +8,7 @@ on:
workflows: [ "build-image-for-release" ]
types:
- completed
workflow_dispatch: # 添加手动触发
# schedule:
# - # 国际时间 19:17 执行北京时间3:17 ↙↙↙ 改成你想要每天自动执行的时间
# - cron: '17 19 * * *'
@@ -19,13 +19,17 @@ permissions:
jobs:
publish-atomgit:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
if: |
github.event_name == 'workflow_dispatch' ||
(github.event.workflow_run.conclusion == 'success')
steps:
- name: Checkout Code
uses: actions/checkout@v4
with:
fetch-depth: 0
lfs: true
ref: 'v2-dev'
- name: get_certd_version
id: get_certd_version
uses: actions/github-script@v6

View File

@@ -8,7 +8,7 @@ on:
workflows: [ "build-image-for-release" ]
types:
- completed
workflow_dispatch: # 添加手动触发
# schedule:
# - # 国际时间 19:17 执行北京时间3:17 ↙↙↙ 改成你想要每天自动执行的时间
# - cron: '17 19 * * *'
@@ -19,13 +19,16 @@ permissions:
jobs:
publish-gitee:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
if: |
github.event_name == 'workflow_dispatch' ||
(github.event.workflow_run.conclusion == 'success')
steps:
- name: Checkout Code
uses: actions/checkout@v4
with:
fetch-depth: 0
lfs: true
ref: 'v2-dev'
- name: publish_to_gitee
id: publish_to_gitee

View File

@@ -8,7 +8,7 @@ on:
workflows: [ "build-image-for-release" ]
types:
- completed
workflow_dispatch: # 添加手动触发
# schedule:
# - # 国际时间 19:17 执行北京时间3:17 ↙↙↙ 改成你想要每天自动执行的时间
# - cron: '17 19 * * *'
@@ -19,13 +19,16 @@ permissions:
jobs:
publish-github:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
if: |
github.event_name == 'workflow_dispatch' ||
(github.event.workflow_run.conclusion == 'success')
steps:
- name: Checkout Code
uses: actions/checkout@v4
with:
fetch-depth: 0
lfs: true
ref: 'v2-dev'
- name: publish_to_github
id: publish_to_github

View File

@@ -4,6 +4,7 @@ on:
branches: ['v2-dev']
paths:
- "trigger/release.trigger"
workflow_dispatch: # 添加手动触发
# workflow_run:
# workflows: [ "deploy-demo" ]
# types:
@@ -25,6 +26,7 @@ jobs:
with:
fetch-depth: 0
lfs: true
ref: 'v2-dev'
- name: get_certd_version
id: get_certd_version

View File

@@ -3,6 +3,37 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.5](https://github.com/certd/certd/compare/v1.39.4...v1.39.5) (2026-03-18)
### Bug Fixes
* 修复修改分组报错的bug ([224db7d](https://github.com/certd/certd/commit/224db7da57dbdddf25bcac7faa0a29eb228c5a33))
### Performance Improvements
* 移除passkey的counter递增校验 ([68b669d](https://github.com/certd/certd/commit/68b669d3ff3e13b931939093320ce7237bb02b1b))
* passkey 支持Bitwarden ([29f44c6](https://github.com/certd/certd/commit/29f44c67c808bed9ff1c9d4884d39a1a62d043a7))
* passkey登录放到下方其他登录位置 ([1413e1a](https://github.com/certd/certd/commit/1413e1aff4aabcfd471716338c210fbcfd76c8f9))
## [1.39.4](https://github.com/certd/certd/compare/v1.39.3...v1.39.4) (2026-03-17)
### Bug Fixes
* 修复阿里云证书订单翻页问题 ([6d43623](https://github.com/certd/certd/commit/6d43623f459a7594599e50a7ed89d67fcc775518))
* 修复查看证书详情页面错位的bug ([7f37df4](https://github.com/certd/certd/commit/7f37df42274e657892d92e868ceac67e139f3bf2))
* 修复选择插件页面无法滚动的bug ([d8425bc](https://github.com/certd/certd/commit/d8425bc9c5ee81bb669706c6de6bad69d7c38d8e))
### Performance Improvements
* 优化passkey ([9e12412](https://github.com/certd/certd/commit/9e12412f5fa7800df1d7efaf62cd8fd5d79bb569))
## [1.39.3](https://github.com/certd/certd/compare/v1.39.2...v1.39.3) (2026-03-17)
### Bug Fixes
* 修复多选框只能单选的bug ([12700e1](https://github.com/certd/certd/commit/12700e1754319513ac02822ff1588d63420b964e))
* 修复旧版1panel插件 报sslIds is not iterable的错误 ([50db6f0](https://github.com/certd/certd/commit/50db6f0765e7ec9a5698cd99540d90e188634fb1))
## [1.39.2](https://github.com/certd/certd/compare/v1.39.1...v1.39.2) (2026-03-16)
### Bug Fixes

View File

@@ -3,6 +3,46 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.4](https://github.com/certd/certd/compare/v1.39.3...v1.39.4) (2026-03-17)
### Bug Fixes
* 修复阿里云证书订单翻页问题 ([6d43623](https://github.com/certd/certd/commit/6d43623f459a7594599e50a7ed89d67fcc775518))
* 修复查看证书详情页面错位的bug ([7f37df4](https://github.com/certd/certd/commit/7f37df42274e657892d92e868ceac67e139f3bf2))
* 修复选择插件页面无法滚动的bug ([d8425bc](https://github.com/certd/certd/commit/d8425bc9c5ee81bb669706c6de6bad69d7c38d8e))
### Performance Improvements
* 优化passkey ([9e12412](https://github.com/certd/certd/commit/9e12412f5fa7800df1d7efaf62cd8fd5d79bb569))
## [1.39.3](https://github.com/certd/certd/compare/v1.39.2...v1.39.3) (2026-03-17)
### Bug Fixes
* 修复多选框只能单选的bug ([12700e1](https://github.com/certd/certd/commit/12700e1754319513ac02822ff1588d63420b964e))
* 修复旧版1panel插件 报sslIds is not iterable的错误 ([50db6f0](https://github.com/certd/certd/commit/50db6f0765e7ec9a5698cd99540d90e188634fb1))
## [1.39.2](https://github.com/certd/certd/compare/v1.39.1...v1.39.2) (2026-03-16)
### Bug Fixes
* 修复当证书更新后第一次站点检查会报与主站证书过期时间不一致错误的bug ([dd999b6](https://github.com/certd/certd/commit/dd999b60a4fe3507ff5e0109d637b4e891b28bdd))
* 修复京东云报错不准确的bug ([10dd89a](https://github.com/certd/certd/commit/10dd89ae62e438a211a15e729559af823a096583))
* 修复群晖测试时报addSecret undefine错误 ([5eb4aa3](https://github.com/certd/certd/commit/5eb4aa3a0eab9ffa729c8e813cbf973d9683cc13))
* 修复提示支付失败的bug ([12fed34](https://github.com/certd/certd/commit/12fed34e109f3254de664813954081a52513bd38))
* 修复修改项目名称后没有同步刷新的bug ([3abee72](https://github.com/certd/certd/commit/3abee72fee286864b665033b23b172ef0ea92d83))
* cname provider授权修改为sys级别 ([d01bfbe](https://github.com/certd/certd/commit/d01bfbec96a3a2109ec864953b0c9e8c1f95b97b))
### Performance Improvements
* 查看证书增加证书详情显示,包括域名,过期时间,颁发机构,指纹等 ([0b9933d](https://github.com/certd/certd/commit/0b9933df1e8d1685d14271435a8a7488974cc47b))
* 获取阿里证书订单id组件增加翻页功能突破50的上限 ([d79db3b](https://github.com/certd/certd/commit/d79db3bd3f0d5ad39664bb47ec3814d43ad93304))
* 优化阿里云连接超时时长为10秒支持配置环境变量 ([1588461](https://github.com/certd/certd/commit/1588461633bd275765daa96fc68320abb58d616d))
* 优化个人账户页面 ([e506116](https://github.com/certd/certd/commit/e50611666ef731a903d7bdd8eb62333b97e2cc5b))
* 支持批量转移流水线到其他项目 ([8a3841f](https://github.com/certd/certd/commit/8a3841f6382b53ce2343307fb035e74fa5383fef))
* 支持passkey登录 ([10b7644](https://github.com/certd/certd/commit/10b7644bb7ba5f82776537bc0c4f5eb95d5f8e4e))
* dns-provider 支持bind9 support bind9 ([76d12d6](https://github.com/certd/certd/commit/76d12d60624c0672fd3717a80a2cfef6845b14b8))
## [1.39.1](https://github.com/certd/certd/compare/v1.39.0...v1.39.1) (2026-03-09)
### Bug Fixes

View File

@@ -40,7 +40,7 @@ admin/123456
https://gitee.com/certd/certd/raw/v2/docker/run/docker-compose.yaml
::: tip
默认使用SQLite数据库如果需要使用MySQL、PostgreSQL数据库请参考[多数据库支持](./install/database.md)
默认使用SQLite数据库如果需要使用MySQL、PostgreSQL数据库请参考[多数据库支持](../database.md)
:::
2. 然后到 `1Panel->容器->编排->新建编排`

View File

@@ -31,7 +31,7 @@
![](./images/2.png)
::: tip
默认安装使用SQLite数据库如果需要使用MySQL、PostgreSQL数据库请参考[多数据库支持](./install/database.md)
默认安装使用SQLite数据库如果需要使用MySQL、PostgreSQL数据库请参考[多数据库支持](../database.md)
:::

View File

@@ -43,7 +43,7 @@ docker compose up -d
> https://docs.docker.com/compose/install/linux/
::: tip
默认安装使用SQLite数据库如果需要使用MySQL、PostgreSQL数据库请参考[多数据库支持](./install/database.md)
默认安装使用SQLite数据库如果需要使用MySQL、PostgreSQL数据库请参考[多数据库支持](../database.md)
:::
### 3. 访问测试

View File

@@ -9,5 +9,5 @@
}
},
"npmClient": "pnpm",
"version": "1.39.2"
"version": "1.39.5"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.5](https://github.com/publishlab/node-acme-client/compare/v1.39.4...v1.39.5) (2026-03-18)
**Note:** Version bump only for package @certd/acme-client
## [1.39.4](https://github.com/publishlab/node-acme-client/compare/v1.39.3...v1.39.4) (2026-03-17)
**Note:** Version bump only for package @certd/acme-client
## [1.39.3](https://github.com/publishlab/node-acme-client/compare/v1.39.2...v1.39.3) (2026-03-17)
**Note:** Version bump only for package @certd/acme-client
## [1.39.2](https://github.com/publishlab/node-acme-client/compare/v1.39.1...v1.39.2) (2026-03-16)
### Bug Fixes

View File

@@ -3,7 +3,7 @@
"description": "Simple and unopinionated ACME client",
"private": false,
"author": "nmorsman",
"version": "1.39.2",
"version": "1.39.5",
"type": "module",
"module": "scr/index.js",
"main": "src/index.js",
@@ -18,7 +18,7 @@
"types"
],
"dependencies": {
"@certd/basic": "^1.39.2",
"@certd/basic": "^1.39.5",
"@peculiar/x509": "^1.11.0",
"asn1js": "^3.0.5",
"axios": "^1.9.0",
@@ -70,5 +70,5 @@
"bugs": {
"url": "https://github.com/publishlab/node-acme-client/issues"
},
"gitHead": "590ff67fcb40ff8ba0f7b2a9592b51d9fb54a2ef"
"gitHead": "aacee4a94c2e2481be8a307fb5a6a5d04a09dda7"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.5](https://github.com/certd/certd/compare/v1.39.4...v1.39.5) (2026-03-18)
**Note:** Version bump only for package @certd/basic
## [1.39.4](https://github.com/certd/certd/compare/v1.39.3...v1.39.4) (2026-03-17)
**Note:** Version bump only for package @certd/basic
## [1.39.3](https://github.com/certd/certd/compare/v1.39.2...v1.39.3) (2026-03-17)
**Note:** Version bump only for package @certd/basic
## [1.39.2](https://github.com/certd/certd/compare/v1.39.1...v1.39.2) (2026-03-16)
### Bug Fixes

View File

@@ -1 +1 @@
00:53
00:48

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/basic",
"private": false,
"version": "1.39.2",
"version": "1.39.5",
"type": "module",
"main": "./dist/index.js",
"module": "./dist/index.js",
@@ -47,5 +47,5 @@
"tslib": "^2.8.1",
"typescript": "^5.4.2"
},
"gitHead": "590ff67fcb40ff8ba0f7b2a9592b51d9fb54a2ef"
"gitHead": "aacee4a94c2e2481be8a307fb5a6a5d04a09dda7"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.5](https://github.com/certd/certd/compare/v1.39.4...v1.39.5) (2026-03-18)
**Note:** Version bump only for package @certd/pipeline
## [1.39.4](https://github.com/certd/certd/compare/v1.39.3...v1.39.4) (2026-03-17)
**Note:** Version bump only for package @certd/pipeline
## [1.39.3](https://github.com/certd/certd/compare/v1.39.2...v1.39.3) (2026-03-17)
**Note:** Version bump only for package @certd/pipeline
## [1.39.2](https://github.com/certd/certd/compare/v1.39.1...v1.39.2) (2026-03-16)
### Bug Fixes

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/pipeline",
"private": false,
"version": "1.39.2",
"version": "1.39.5",
"type": "module",
"main": "./dist/index.js",
"module": "./dist/index.js",
@@ -18,8 +18,8 @@
"compile": "tsc --skipLibCheck --watch"
},
"dependencies": {
"@certd/basic": "^1.39.2",
"@certd/plus-core": "^1.39.2",
"@certd/basic": "^1.39.5",
"@certd/plus-core": "^1.39.5",
"dayjs": "^1.11.7",
"lodash-es": "^4.17.21",
"reflect-metadata": "^0.1.13"
@@ -45,5 +45,5 @@
"tslib": "^2.8.1",
"typescript": "^5.4.2"
},
"gitHead": "590ff67fcb40ff8ba0f7b2a9592b51d9fb54a2ef"
"gitHead": "aacee4a94c2e2481be8a307fb5a6a5d04a09dda7"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.5](https://github.com/certd/certd/compare/v1.39.4...v1.39.5) (2026-03-18)
**Note:** Version bump only for package @certd/lib-huawei
## [1.39.4](https://github.com/certd/certd/compare/v1.39.3...v1.39.4) (2026-03-17)
**Note:** Version bump only for package @certd/lib-huawei
## [1.39.3](https://github.com/certd/certd/compare/v1.39.2...v1.39.3) (2026-03-17)
**Note:** Version bump only for package @certd/lib-huawei
## [1.39.2](https://github.com/certd/certd/compare/v1.39.1...v1.39.2) (2026-03-16)
**Note:** Version bump only for package @certd/lib-huawei

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/lib-huawei",
"private": false,
"version": "1.39.2",
"version": "1.39.5",
"main": "./dist/bundle.js",
"module": "./dist/bundle.js",
"types": "./dist/d/index.d.ts",
@@ -24,5 +24,5 @@
"prettier": "^2.8.8",
"tslib": "^2.8.1"
},
"gitHead": "590ff67fcb40ff8ba0f7b2a9592b51d9fb54a2ef"
"gitHead": "aacee4a94c2e2481be8a307fb5a6a5d04a09dda7"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.5](https://github.com/certd/certd/compare/v1.39.4...v1.39.5) (2026-03-18)
**Note:** Version bump only for package @certd/lib-iframe
## [1.39.4](https://github.com/certd/certd/compare/v1.39.3...v1.39.4) (2026-03-17)
**Note:** Version bump only for package @certd/lib-iframe
## [1.39.3](https://github.com/certd/certd/compare/v1.39.2...v1.39.3) (2026-03-17)
**Note:** Version bump only for package @certd/lib-iframe
## [1.39.2](https://github.com/certd/certd/compare/v1.39.1...v1.39.2) (2026-03-16)
**Note:** Version bump only for package @certd/lib-iframe

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/lib-iframe",
"private": false,
"version": "1.39.2",
"version": "1.39.5",
"type": "module",
"main": "./dist/index.js",
"module": "./dist/index.js",
@@ -31,5 +31,5 @@
"tslib": "^2.8.1",
"typescript": "^5.4.2"
},
"gitHead": "590ff67fcb40ff8ba0f7b2a9592b51d9fb54a2ef"
"gitHead": "aacee4a94c2e2481be8a307fb5a6a5d04a09dda7"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.5](https://github.com/certd/certd/compare/v1.39.4...v1.39.5) (2026-03-18)
**Note:** Version bump only for package @certd/jdcloud
## [1.39.4](https://github.com/certd/certd/compare/v1.39.3...v1.39.4) (2026-03-17)
**Note:** Version bump only for package @certd/jdcloud
## [1.39.3](https://github.com/certd/certd/compare/v1.39.2...v1.39.3) (2026-03-17)
**Note:** Version bump only for package @certd/jdcloud
## [1.39.2](https://github.com/certd/certd/compare/v1.39.1...v1.39.2) (2026-03-16)
**Note:** Version bump only for package @certd/jdcloud

View File

@@ -1,6 +1,6 @@
{
"name": "@certd/jdcloud",
"version": "1.39.2",
"version": "1.39.5",
"description": "jdcloud openApi sdk",
"main": "./dist/bundle.js",
"module": "./dist/bundle.js",
@@ -56,5 +56,5 @@
"fetch"
]
},
"gitHead": "590ff67fcb40ff8ba0f7b2a9592b51d9fb54a2ef"
"gitHead": "aacee4a94c2e2481be8a307fb5a6a5d04a09dda7"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.5](https://github.com/certd/certd/compare/v1.39.4...v1.39.5) (2026-03-18)
**Note:** Version bump only for package @certd/lib-k8s
## [1.39.4](https://github.com/certd/certd/compare/v1.39.3...v1.39.4) (2026-03-17)
**Note:** Version bump only for package @certd/lib-k8s
## [1.39.3](https://github.com/certd/certd/compare/v1.39.2...v1.39.3) (2026-03-17)
**Note:** Version bump only for package @certd/lib-k8s
## [1.39.2](https://github.com/certd/certd/compare/v1.39.1...v1.39.2) (2026-03-16)
**Note:** Version bump only for package @certd/lib-k8s

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/lib-k8s",
"private": false,
"version": "1.39.2",
"version": "1.39.5",
"type": "module",
"main": "./dist/index.js",
"module": "./dist/index.js",
@@ -17,7 +17,7 @@
"pub": "npm publish"
},
"dependencies": {
"@certd/basic": "^1.39.2",
"@certd/basic": "^1.39.5",
"@kubernetes/client-node": "0.21.0"
},
"devDependencies": {
@@ -32,5 +32,5 @@
"tslib": "^2.8.1",
"typescript": "^5.4.2"
},
"gitHead": "590ff67fcb40ff8ba0f7b2a9592b51d9fb54a2ef"
"gitHead": "aacee4a94c2e2481be8a307fb5a6a5d04a09dda7"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.5](https://github.com/certd/certd/compare/v1.39.4...v1.39.5) (2026-03-18)
**Note:** Version bump only for package @certd/lib-server
## [1.39.4](https://github.com/certd/certd/compare/v1.39.3...v1.39.4) (2026-03-17)
**Note:** Version bump only for package @certd/lib-server
## [1.39.3](https://github.com/certd/certd/compare/v1.39.2...v1.39.3) (2026-03-17)
**Note:** Version bump only for package @certd/lib-server
## [1.39.2](https://github.com/certd/certd/compare/v1.39.1...v1.39.2) (2026-03-16)
### Bug Fixes

View File

@@ -1,6 +1,6 @@
{
"name": "@certd/lib-server",
"version": "1.39.2",
"version": "1.39.5",
"description": "midway with flyway, sql upgrade way ",
"private": false,
"type": "module",
@@ -28,11 +28,11 @@
],
"license": "AGPL",
"dependencies": {
"@certd/acme-client": "^1.39.2",
"@certd/basic": "^1.39.2",
"@certd/pipeline": "^1.39.2",
"@certd/plugin-lib": "^1.39.2",
"@certd/plus-core": "^1.39.2",
"@certd/acme-client": "^1.39.5",
"@certd/basic": "^1.39.5",
"@certd/pipeline": "^1.39.5",
"@certd/plugin-lib": "^1.39.5",
"@certd/plus-core": "^1.39.5",
"@midwayjs/cache": "3.14.0",
"@midwayjs/core": "3.20.11",
"@midwayjs/i18n": "3.20.13",
@@ -64,5 +64,5 @@
"typeorm": "^0.3.11",
"typescript": "^5.4.2"
},
"gitHead": "590ff67fcb40ff8ba0f7b2a9592b51d9fb54a2ef"
"gitHead": "aacee4a94c2e2481be8a307fb5a6a5d04a09dda7"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.5](https://github.com/certd/certd/compare/v1.39.4...v1.39.5) (2026-03-18)
**Note:** Version bump only for package @certd/midway-flyway-js
## [1.39.4](https://github.com/certd/certd/compare/v1.39.3...v1.39.4) (2026-03-17)
**Note:** Version bump only for package @certd/midway-flyway-js
## [1.39.3](https://github.com/certd/certd/compare/v1.39.2...v1.39.3) (2026-03-17)
**Note:** Version bump only for package @certd/midway-flyway-js
## [1.39.2](https://github.com/certd/certd/compare/v1.39.1...v1.39.2) (2026-03-16)
**Note:** Version bump only for package @certd/midway-flyway-js

View File

@@ -1,6 +1,6 @@
{
"name": "@certd/midway-flyway-js",
"version": "1.39.2",
"version": "1.39.5",
"description": "midway with flyway, sql upgrade way ",
"private": false,
"type": "module",
@@ -46,5 +46,5 @@
"typeorm": "^0.3.11",
"typescript": "^5.4.2"
},
"gitHead": "590ff67fcb40ff8ba0f7b2a9592b51d9fb54a2ef"
"gitHead": "aacee4a94c2e2481be8a307fb5a6a5d04a09dda7"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.5](https://github.com/certd/certd/compare/v1.39.4...v1.39.5) (2026-03-18)
**Note:** Version bump only for package @certd/plugin-cert
## [1.39.4](https://github.com/certd/certd/compare/v1.39.3...v1.39.4) (2026-03-17)
**Note:** Version bump only for package @certd/plugin-cert
## [1.39.3](https://github.com/certd/certd/compare/v1.39.2...v1.39.3) (2026-03-17)
**Note:** Version bump only for package @certd/plugin-cert
## [1.39.2](https://github.com/certd/certd/compare/v1.39.1...v1.39.2) (2026-03-16)
**Note:** Version bump only for package @certd/plugin-cert

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/plugin-cert",
"private": false,
"version": "1.39.2",
"version": "1.39.5",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -17,10 +17,10 @@
"compile": "tsc --skipLibCheck --watch"
},
"dependencies": {
"@certd/acme-client": "^1.39.2",
"@certd/basic": "^1.39.2",
"@certd/pipeline": "^1.39.2",
"@certd/plugin-lib": "^1.39.2",
"@certd/acme-client": "^1.39.5",
"@certd/basic": "^1.39.5",
"@certd/pipeline": "^1.39.5",
"@certd/plugin-lib": "^1.39.5",
"psl": "^1.9.0",
"punycode.js": "^2.3.1"
},
@@ -38,5 +38,5 @@
"tslib": "^2.8.1",
"typescript": "^5.4.2"
},
"gitHead": "590ff67fcb40ff8ba0f7b2a9592b51d9fb54a2ef"
"gitHead": "aacee4a94c2e2481be8a307fb5a6a5d04a09dda7"
}

View File

@@ -3,6 +3,20 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.5](https://github.com/certd/certd/compare/v1.39.4...v1.39.5) (2026-03-18)
**Note:** Version bump only for package @certd/plugin-lib
## [1.39.4](https://github.com/certd/certd/compare/v1.39.3...v1.39.4) (2026-03-17)
### Bug Fixes
* 修复阿里云证书订单翻页问题 ([6d43623](https://github.com/certd/certd/commit/6d43623f459a7594599e50a7ed89d67fcc775518))
## [1.39.3](https://github.com/certd/certd/compare/v1.39.2...v1.39.3) (2026-03-17)
**Note:** Version bump only for package @certd/plugin-lib
## [1.39.2](https://github.com/certd/certd/compare/v1.39.1...v1.39.2) (2026-03-16)
### Performance Improvements

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/plugin-lib",
"private": false,
"version": "1.39.2",
"version": "1.39.5",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -22,10 +22,10 @@
"@alicloud/pop-core": "^1.7.10",
"@alicloud/tea-util": "^1.4.11",
"@aws-sdk/client-s3": "^3.964.0",
"@certd/acme-client": "^1.39.2",
"@certd/basic": "^1.39.2",
"@certd/pipeline": "^1.39.2",
"@certd/plus-core": "^1.39.2",
"@certd/acme-client": "^1.39.5",
"@certd/basic": "^1.39.5",
"@certd/pipeline": "^1.39.5",
"@certd/plus-core": "^1.39.5",
"@kubernetes/client-node": "0.21.0",
"ali-oss": "^6.22.0",
"basic-ftp": "^5.0.5",
@@ -57,5 +57,5 @@
"tslib": "^2.8.1",
"typescript": "^5.4.2"
},
"gitHead": "590ff67fcb40ff8ba0f7b2a9592b51d9fb54a2ef"
"gitHead": "aacee4a94c2e2481be8a307fb5a6a5d04a09dda7"
}

View File

@@ -43,6 +43,7 @@ export function createRemoteSelectInputDefine(opts?: {
pager?: boolean;
component?: any;
value?: any;
pageSize?: number;
}) {
const title = opts?.title || "请选择";
const certDomainsInputKey = opts?.certDomainsInputKey || "certDomains";
@@ -54,13 +55,11 @@ export function createRemoteSelectInputDefine(opts?: {
const helper = opts?.helper || "请选择";
const search = opts?.search ?? false;
const pager = opts?.pager ?? false;
let mode = "tags";
if (opts.multi === false) {
mode = undefined;
} else {
mode = opts?.mode ?? "tags";
let mode = "default";
const multi = opts?.multi ?? true;
if (multi) {
mode = "tags";
}
const item = {
title,
component: {
@@ -72,6 +71,8 @@ export function createRemoteSelectInputDefine(opts?: {
action,
search,
pager,
multi,
pageSize: opts?.pageSize,
watches: [certDomainsInputKey, accessIdInputKey, ...watches],
...opts.component,
},

View File

@@ -3,6 +3,35 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.5](https://github.com/certd/certd/compare/v1.39.4...v1.39.5) (2026-03-18)
### Bug Fixes
* 修复修改分组报错的bug ([224db7d](https://github.com/certd/certd/commit/224db7da57dbdddf25bcac7faa0a29eb228c5a33))
### Performance Improvements
* passkey 支持Bitwarden ([29f44c6](https://github.com/certd/certd/commit/29f44c67c808bed9ff1c9d4884d39a1a62d043a7))
* passkey登录放到下方其他登录位置 ([1413e1a](https://github.com/certd/certd/commit/1413e1aff4aabcfd471716338c210fbcfd76c8f9))
## [1.39.4](https://github.com/certd/certd/compare/v1.39.3...v1.39.4) (2026-03-17)
### Bug Fixes
* 修复阿里云证书订单翻页问题 ([6d43623](https://github.com/certd/certd/commit/6d43623f459a7594599e50a7ed89d67fcc775518))
* 修复查看证书详情页面错位的bug ([7f37df4](https://github.com/certd/certd/commit/7f37df42274e657892d92e868ceac67e139f3bf2))
* 修复选择插件页面无法滚动的bug ([d8425bc](https://github.com/certd/certd/commit/d8425bc9c5ee81bb669706c6de6bad69d7c38d8e))
### Performance Improvements
* 优化passkey ([9e12412](https://github.com/certd/certd/commit/9e12412f5fa7800df1d7efaf62cd8fd5d79bb569))
## [1.39.3](https://github.com/certd/certd/compare/v1.39.2...v1.39.3) (2026-03-17)
### Bug Fixes
* 修复多选框只能单选的bug ([12700e1](https://github.com/certd/certd/commit/12700e1754319513ac02822ff1588d63420b964e))
## [1.39.2](https://github.com/certd/certd/compare/v1.39.1...v1.39.2) (2026-03-16)
### Bug Fixes

View File

@@ -1,6 +1,6 @@
{
"name": "@certd/ui-client",
"version": "1.39.2",
"version": "1.39.5",
"private": true,
"scripts": {
"dev": "vite --open",
@@ -106,8 +106,8 @@
"zod-defaults": "^0.1.3"
},
"devDependencies": {
"@certd/lib-iframe": "^1.39.2",
"@certd/pipeline": "^1.39.2",
"@certd/lib-iframe": "^1.39.5",
"@certd/pipeline": "^1.39.5",
"@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-node-resolve": "^15.2.3",
"@types/chai": "^4.3.12",

View File

@@ -1,7 +1,7 @@
<template>
<div class="remote-select">
<div class="flex flex-row">
<a-select class="remote-select-input" show-search mode="tags" :filter-option="filterOption" :options="optionsRef" :value="value" v-bind="attrs" @click="onClick" @update:value="updateValue($event)">
<a-select ref="selectRef" class="remote-select-input" show-search :filter-option="filterOption" :options="optionsRef" :value="value" v-bind="attrs" @click="onClick" @update:value="updateValue($event)">
<template #dropdownRender="{ menuNode: menu }">
<template v-if="search">
<div class="flex w-full" style="padding: 4px 8px">
@@ -44,6 +44,8 @@ defineOptions({
name: "RemoteSelect",
});
const selectRef = ref(null);
const VNodes = defineComponent({
props: {
vnodes: {
@@ -62,6 +64,7 @@ const props = defineProps<
search?: boolean;
pager?: boolean;
multi?: boolean;
pageSize?: number;
} & ComponentPropsType
>();
@@ -70,12 +73,15 @@ const emit = defineEmits<{
}>();
function updateValue(value: any) {
if (props.multi) {
emit("update:value", value);
} else {
const last = value?.[value.length - 1];
emit("update:value", last);
}
// if (props.multi !== false) {
// emit("update:value", value);
// } else {
// const last = value?.[value.length - 1];
// emit("update:value", last);
// selectRef.value.blur();
// }
emit("update:value", value);
}
const attrs = useAttrs();
@@ -98,7 +104,7 @@ const loading = ref(false);
const pagerRef: Ref = ref({
pageNo: 1,
total: 0,
pageSize: 100,
pageSize: props.pageSize || 100,
});
const getOptions = async () => {
if (loading.value) {

View File

@@ -18,7 +18,8 @@
</template>
<div class="rounded pl-3 pr-3 px-2 py-1 flex-center flex pointer items-center bg-accent h-10 button-text" title="当前项目">
<!-- <fs-icon icon="ion:apps" class="mr-1"></fs-icon> -->
当前项目{{ projectStore.currentProject?.name || "..." }}
<span class="hidden md:flex"> 当前项目</span>
<span class="text-ellipsis">{{ projectStore.currentProject?.name || "..." }}</span>
<fs-icon :icon="currentIcon" class="ml-5"></fs-icon>
</div>
</a-dropdown>
@@ -58,7 +59,7 @@ const currentIcon = computed(() => {
<style lang="less">
.project-selector {
&.button-text {
min-width: 150px;
min-width: 100px;
max-width: 250px;
overflow: hidden;
text-overflow: ellipsis;

View File

@@ -1,6 +1,6 @@
<template>
<a-dropdown>
<div class="fs-user-info">{{ t("user.greeting") }}{{ userStore.getUserInfo?.nickName || userStore.getUserInfo?.username }}</div>
<div class="fs-user-info" @click="goUserProfile">{{ t("user.greeting") }}{{ userStore.getUserInfo?.nickName || userStore.getUserInfo?.username }}</div>
<template #overlay>
<a-menu>
<a-menu-item>

View File

@@ -48,6 +48,9 @@ const avatar = computed(() => {
async function handleLogout() {
await userStore.logout(true);
}
function goUserProfile() {
router.push("/certd/mine/user-profile");
}
const settingStore = useSettingStore();
@@ -90,7 +93,7 @@ const projectStore = useProjectStore();
</div>
</template>
<template #user-dropdown>
<UserDropdown :avatar="avatar" :menus="menus" :text="userStore.userInfo?.nickName || userStore.userInfo?.username" description="" tag-text="" @logout="handleLogout" />
<UserDropdown :avatar="avatar" :menus="menus" :text="userStore.userInfo?.nickName || userStore.userInfo?.username" description="" tag-text="" @logout="handleLogout" @user-profile="goUserProfile" />
</template>
<template #lock-screen>
<LockScreen :avatar @to-login="handleLogout" />

View File

@@ -103,4 +103,6 @@ export default {
deviceNameHelper: "Please enter the device name used to identify the device",
passkeyRegisterHelper: "Site domain change will invalidate passkey",
userInfo: "User Info",
securitySettingTip: "2FA Setting",
securitySetting: "2FA Setting",
};

View File

@@ -105,4 +105,6 @@ export default {
deviceNameHelper: "请输入当前设备名称,绑定多个时好做区分",
passkeyRegisterHelper: "1、站点域名变更会导致passkey失效;\n2、同一设备同一个用户绑定多次只有最后一次的有效之前绑定的会失效需要手动删除",
userInfo: "账号信息",
securitySettingTip: "2FA设置",
securitySetting: "2FA设置",
};

View File

@@ -67,7 +67,7 @@ const props = withDefaults(defineProps<Props>(), {
hoverDelay: 500,
});
const emit = defineEmits<{ logout: [] }>();
const emit = defineEmits<{ logout: []; userProfile: [] }>();
const { globalLockScreenShortcutKey, globalLogoutShortcutKey } = usePreferences();
const lockStore = useLockStore();
@@ -132,6 +132,11 @@ function handleSubmitLogout() {
logoutModalApi.close();
}
function handleUserProfile() {
emit("userProfile");
openPopover.value = false;
}
if (enableShortcutKey.value) {
const keys = useMagicKeys();
whenever(keys["Alt+KeyQ"]!, () => {
@@ -173,7 +178,7 @@ if (enableShortcutKey.value) {
</DropdownMenuTrigger>
<DropdownMenuContent class="mr-2 min-w-[240px] p-0 pb-1">
<div ref="refContent">
<DropdownMenuLabel class="flex items-center p-3">
<DropdownMenuLabel class="flex items-center p-3 pointer" @click="handleUserProfile">
<VbenAvatar :alt="text" :src="avatar" class="size-12" dot dot-class="bottom-0 right-1 border-2 size-4 bg-green-500" />
<div class="ml-2 w-full">
<div v-if="tagText || text || $slots.tagText" class="text-foreground mb-1 flex items-center text-sm font-medium">

View File

@@ -35,11 +35,15 @@
</a-tag>
</div>
</div>
<div class="action-buttons">
<div class="action-buttons gap-2">
<a-button type="primary" class="action-btn" @click="doUpdate">
{{ t("authentication.updateProfile") }}
</a-button>
<change-password-button class="ml-10" :show-button="true" />
<change-password-button :show-button="true" />
<a-button type="primary" class="action-btn" @click="goSecuritySetting">
{{ t("authentication.securitySettingTip") }}
</a-button>
</div>
</div>
</div>
@@ -88,7 +92,7 @@
</div>
<div class="passkey-list">
<div v-for="passkey in passkeys" :key="passkey.id" class="passkey-item">
<div class="passkey-icon">
<div class="passkey-icon hidden md:flex">
<fs-icon icon="ion:finger-print" class="icon" />
</div>
<div class="passkey-info">
@@ -142,6 +146,7 @@ import { useSettingStore } from "/@/store/settings";
import { isEmpty } from "lodash-es";
import { dict } from "@fast-crud/fast-crud";
import dayjs from "dayjs";
import { useRouter } from "vue-router";
const { t } = useI18n();
@@ -175,6 +180,11 @@ function doUpdate() {
});
}
const router = useRouter();
function goSecuritySetting() {
router.push("/certd/mine/security");
}
const oauthBounds = ref([]);
const oauthProviders = ref([]);
@@ -278,20 +288,32 @@ async function doRegisterPasskey(deviceName: string) {
// type: "public-key",
// }));
const credential = await (navigator.credentials as any).create({
publicKey: {
challenge: Uint8Array.from(atob(options.challenge.replace(/-/g, "+").replace(/_/g, "/")), c => c.charCodeAt(0)),
rp: options.rp,
pubKeyCredParams: options.pubKeyCredParams,
timeout: options.timeout || 60000,
attestation: options.attestation,
// excludeCredentials: excludeCredentials,
user: {
id: new TextEncoder().encode(options.userId + ""),
name: userInfo.value.username,
displayName: deviceName,
},
console.log("passkey register options:", options, JSON.stringify(options));
const publicKey = {
challenge: Uint8Array.from(atob(options.challenge.replace(/-/g, "+").replace(/_/g, "/")), c => c.charCodeAt(0)),
rp: options.rp,
pubKeyCredParams: options.pubKeyCredParams,
timeout: options.timeout || 60000,
// attestation: options.attestation,
// excludeCredentials: excludeCredentials,
// extensions: options.extensions,
// authenticatorSelection: options.authenticatorSelection,
// hints: options.hints,
user: {
id: new TextEncoder().encode(options.userId + ""),
name: userInfo.value.username + "@" + deviceName,
displayName: deviceName,
},
// 关键配置在这里 👇
authenticatorSelection: {
residentKey: "required", // 或 "preferred",请求创建可发现凭证
requireResidentKey: true, // 为兼容旧浏览器,设置与 residentKey 相同的值
userVerification: "preferred", // 用户验证策略
},
};
console.log("passkey register publicKey:", publicKey, JSON.stringify(publicKey));
const credential = await (navigator.credentials as any).create({
publicKey,
});
if (!credential) {
@@ -310,6 +332,7 @@ async function doRegisterPasskey(deviceName: string) {
console.log("credential", credential, response);
const verifyRes: any = await api.verifyPasskeyRegistration(response, options.challenge, deviceName);
console.log("verifyRes:", verifyRes, JSON.stringify(verifyRes));
await loadPasskeys();
} catch (e: any) {
console.error("Passkey注册失败:", e);
@@ -721,7 +744,6 @@ onMounted(async () => {
.passkey-icon {
width: 48px;
height: 48px;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%);
@@ -749,8 +771,8 @@ onMounted(async () => {
.passkey-meta {
display: flex;
flex-wrap: wrap;
gap: 12px;
font-size: 13px;
gap: 4px;
font-size: 12px;
}
.meta-item {

View File

@@ -100,7 +100,10 @@ function formatDate(dateStr: string): string {
.cert-detail {
table {
width: 100%;
table-layout: fixed;
table-layout: fixed !important;
}
.ant-descriptions-item-label {
width: 90px;
}
.fingerprint {
.label {

View File

@@ -42,7 +42,7 @@
<change-group v-if="hasActionPermission('write')" :selected-row-keys="selectedRowKeys" @change="batchFinished"></change-group>
<change-notification v-if="hasActionPermission('write')" :selected-row-keys="selectedRowKeys" @change="batchFinished"></change-notification>
<change-trigger v-if="hasActionPermission('write')" :selected-row-keys="selectedRowKeys" @change="batchFinished"></change-trigger>
<change-project v-if="hasActionPermission('write')" :selected-row-keys="selectedRowKeys" @change="batchFinished"></change-project>
<change-project v-if="hasActionPermission('write') && settingStore.isEnterprise" :selected-row-keys="selectedRowKeys" @change="batchFinished"></change-project>
</div>
</div>
<template #form-bottom>

View File

@@ -25,7 +25,7 @@
</a-row>
</template>
<div class="flex-col h-100 overflow-hidden md:ml-5 md:mr-5 step-form-body">
<a-tabs v-model:active-key="pluginGroupActive" tab-position="left" class="flex-1 overflow-hidden">
<a-tabs v-model:active-key="pluginGroupActive" tab-position="left" class="flex-1 overflow-hidden h-full">
<template v-for="group of computedPluginGroups" :key="group.key">
<a-tab-pane v-if="(group.key === 'admin' && userStore.isAdmin) || group.key !== 'admin'" :key="group.key" class="scroll-y">
<template #tab>

View File

@@ -46,21 +46,11 @@
</a-form-item>
</template>
</a-tab-pane>
<a-tab-pane v-if="settingStore.sysPublic.passkeyEnabled && settingStore.isPlus" key="passkey" :tab="t('authentication.passkeyTab')">
<template v-if="formState.loginType === 'passkey'">
<div v-if="!passkeySupported" class="text-red-500 text-sm mt-2 text-center mb-10">
{{ t("authentication.passkeyNotSupported") }}
</div>
</template>
</a-tab-pane>
</a-tabs>
<a-form-item>
<a-button v-if="formState.loginType !== 'passkey'" type="primary" size="large" html-type="button" :loading="loading" class="login-button" @click="handleFinish">
<a-button type="primary" size="large" html-type="button" :loading="loading" class="login-button" @click="handleFinish">
{{ queryBindCode ? t("authentication.bindButton") : t("authentication.loginButton") }}
</a-button>
<a-button v-else type="primary" size="large" html-type="button" :loading="loading" class="login-button" :disabled="!passkeySupported" @click="handlePasskeyLogin">
{{ t("authentication.passkeyLogin") }}
</a-button>
</a-form-item>
<a-form-item>
<div class="mt-2 flex justify-between items-center">
@@ -73,7 +63,6 @@
{{ t("authentication.forgotPassword") }}
</a>
</div>
<router-link v-if="hasRegisterTypeEnabled() && !queryBindCode" class="register" :to="{ name: 'register' }">
{{ t("authentication.registerLink") }}
</router-link>
@@ -81,7 +70,7 @@
</a-form-item>
</template>
<div v-if="!queryBindCode && settingStore.sysPublic.oauthEnabled && settingStore.isPlus" class="w-full">
<div v-if="!queryBindCode && (settingStore.sysPublic.oauthEnabled || settingStore.sysPublic.passkeyEnabled) && settingStore.isPlus" class="w-full">
<oauth-footer :oauth-only="isOauthOnly"></oauth-footer>
</div>
</a-form>
@@ -195,57 +184,6 @@ const twoFactor = reactive({
verifyCode: "",
});
const passkeySupported = ref(false);
const passkeyEnabled = ref(false);
const checkPasskeySupport = () => {
passkeySupported.value = false;
if (typeof window !== "undefined" && "credentials" in navigator && "PublicKeyCredential" in window) {
passkeySupported.value = true;
}
};
const handlePasskeyLogin = async () => {
if (!passkeySupported.value) {
notification.error({ message: t("authentication.passkeyNotSupported") });
return;
}
loading.value = true;
try {
const optionsResponse: any = await request({
url: "/passkey/generateAuthentication",
method: "post",
});
const options = optionsResponse;
const credential = await (navigator.credentials as any).get({
publicKey: {
challenge: Uint8Array.from(atob(options.challenge.replace(/-/g, "+").replace(/_/g, "/")), c => c.charCodeAt(0)),
rpId: options.rpId,
allowCredentials: options.allowCredentials || [],
timeout: options.timeout || 60000,
},
});
if (!credential) {
throw new Error("Passkey认证失败");
}
const loginRes: any = await UserApi.loginByPasskey({
credential,
challenge: options.challenge,
});
await userStore.onLoginSuccess(loginRes);
} catch (e: any) {
console.error("Passkey登录失败:", e);
notification.error({ message: e.message || "Passkey登录失败" });
} finally {
loading.value = false;
}
};
const handleFinish = async () => {
loading.value = true;
try {
@@ -294,9 +232,7 @@ const isOauthOnly = computed(() => {
return sysPublicSettings.oauthOnly && settingStore.isPlus && sysPublicSettings.oauthEnabled;
});
onMounted(() => {
checkPasskeySupport();
});
onMounted(() => {});
</script>
<style lang="less">

View File

@@ -0,0 +1,85 @@
<template>
<div v-if="passkeyEnabled && isPlus" class="oauth-icon-button" :class="{ pointer: passkeySupported }" @click="handlePasskeyLogin">
<div><fs-icon icon="ion:finger-print-outline" :class="{ 'text-blue-600': passkeySupported, 'text-gray-400': !passkeySupported }" class="text-40" /></div>
<div class="ellipsis title" :title="t('authentication.passkeyLogin')" :class="{ 'text-gray-400': !passkeySupported }">{{ t("authentication.passkeyLogin") }}</div>
</div>
</template>
<script lang="ts" setup>
import { ref, computed, onMounted } from "vue";
import { useI18n } from "/@/locales";
import { useSettingStore } from "/@/store/settings";
import { notification } from "ant-design-vue";
import { request } from "/src/api/service";
import * as UserApi from "/src/store/user/api.user";
import { useUserStore } from "/src/store/user";
const { t } = useI18n();
const settingStore = useSettingStore();
const userStore = useUserStore();
const loading = ref(false);
const passkeySupported = ref(false);
const passkeyEnabled = computed(() => settingStore.sysPublic.passkeyEnabled);
const isPlus = computed(() => settingStore.isPlus);
const checkPasskeySupport = () => {
passkeySupported.value = false;
if (typeof window !== "undefined" && "credentials" in navigator && "PublicKeyCredential" in window) {
passkeySupported.value = true;
}
};
const handlePasskeyLogin = async () => {
if (!passkeySupported.value) {
notification.error({ message: t("authentication.passkeyNotSupported") });
return;
}
loading.value = true;
try {
const optionsResponse: any = await request({
url: "/passkey/generateAuthentication",
method: "post",
});
const options = optionsResponse;
console.log("passkey authentication options:", options, JSON.stringify(options));
const credential = await (navigator.credentials as any).get({
publicKey: {
challenge: Uint8Array.from(atob(options.challenge.replace(/-/g, "+").replace(/_/g, "/")), c => c.charCodeAt(0)),
rpId: options.rpId,
allowCredentials: options.allowCredentials || [],
timeout: options.timeout || 60000,
authenticatorSelection: {
residentKey: "required",
requireResidentKey: true,
userVerification: "preferred",
},
},
});
console.log("passkey authentication credential:", credential, JSON.stringify(credential));
if (!credential) {
throw new Error("Passkey认证失败");
}
const loginRes: any = await UserApi.loginByPasskey({
credential,
challenge: options.challenge,
});
await userStore.onLoginSuccess(loginRes);
} catch (e: any) {
console.error("Passkey登录失败:", e);
notification.error({ message: e.message || "Passkey登录失败" });
} finally {
loading.value = false;
}
};
onMounted(() => {
checkPasskeySupport();
});
</script>

View File

@@ -3,7 +3,8 @@
<div class="oauth-title">
<div class="oauth-title-text">{{ computedTitle }}</div>
</div>
<div class="flex justify-center items-center gap-4">
<div class="flex justify-center items-center gap-4 flex-wrap md:flex-nowrap">
<passkey-login></passkey-login>
<template v-for="item in oauthProviderList" :key="item.type">
<div v-if="item.addonId" class="oauth-icon-button pointer" @click="goOauthLogin(item.name)">
<div><fs-icon :icon="item.icon" class="text-blue-600 text-40" /></div>
@@ -19,6 +20,7 @@ import * as api from "./api";
import { useI18n } from "vue-i18n";
import { useSettingStore } from "/@/store/settings";
import { useRoute } from "vue-router";
import PasskeyLogin from "../login/passkey-login.vue";
const oauthProviderList = ref([]);
const props = defineProps<{

View File

@@ -88,7 +88,7 @@ export default (req: any) => {
host: "0.0.0.0",
port: 3008,
fs: devServerFs,
allowedHosts: ["localhost", "127.0.0.1", "yfy.docmirror.cn", "docmirror.top", "*"],
allowedHosts: ["localhost", "127.0.0.1", "yfy.docmirror.cn", "docmirror.top", "*", "local.dev"],
proxy: {
// with options
"/api": {
@@ -100,7 +100,7 @@ export default (req: any) => {
"/certd/api": {
//配套后端 https://github.com/fast-crud/fs-server-js
target: "http://127.0.0.1:7001/api",
rewrite: path => path.replace(/^\/certd\/api/, ""),
rewrite: (path: any) => path.replace(/^\/certd\/api/, ""),
//忽略证书
// agent: new https.Agent({ rejectUnauthorized: false }),
},

View File

@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.5](https://github.com/certd/certd/compare/v1.39.4...v1.39.5) (2026-03-18)
### Performance Improvements
* 移除passkey的counter递增校验 ([68b669d](https://github.com/certd/certd/commit/68b669d3ff3e13b931939093320ce7237bb02b1b))
* passkey 支持Bitwarden ([29f44c6](https://github.com/certd/certd/commit/29f44c67c808bed9ff1c9d4884d39a1a62d043a7))
* passkey登录放到下方其他登录位置 ([1413e1a](https://github.com/certd/certd/commit/1413e1aff4aabcfd471716338c210fbcfd76c8f9))
## [1.39.4](https://github.com/certd/certd/compare/v1.39.3...v1.39.4) (2026-03-17)
### Bug Fixes
* 修复阿里云证书订单翻页问题 ([6d43623](https://github.com/certd/certd/commit/6d43623f459a7594599e50a7ed89d67fcc775518))
### Performance Improvements
* 优化passkey ([9e12412](https://github.com/certd/certd/commit/9e12412f5fa7800df1d7efaf62cd8fd5d79bb569))
## [1.39.3](https://github.com/certd/certd/compare/v1.39.2...v1.39.3) (2026-03-17)
### Bug Fixes
* 修复旧版1panel插件 报sslIds is not iterable的错误 ([50db6f0](https://github.com/certd/certd/commit/50db6f0765e7ec9a5698cd99540d90e188634fb1))
## [1.39.2](https://github.com/certd/certd/compare/v1.39.1...v1.39.2) (2026-03-16)
### Bug Fixes

View File

@@ -54,6 +54,7 @@ input:
action: onGetNodes
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -54,6 +54,7 @@ input:
action: onGetNodes
search: false
pager: false
multi: true
watches:
- certDomains
- accessId
@@ -82,6 +83,7 @@ input:
action: onGetSSLIds
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -51,6 +51,7 @@ input:
action: onGetWebsiteList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -66,11 +66,13 @@ input:
component:
name: remote-select
vModel: value
mode: default
type: plugin
typeName: AliyunDeployCertToALB
action: onGetRegionList
search: false
pager: false
multi: false
watches:
- certDomains
- accessId
@@ -99,6 +101,7 @@ input:
action: onGetLoadBalanceList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId
@@ -127,6 +130,7 @@ input:
action: onGetListenerList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -116,6 +116,7 @@ input:
action: onGetProductList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId
@@ -145,6 +146,7 @@ input:
action: onGetContactList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -80,6 +80,7 @@ input:
action: onGetSiteList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -111,6 +111,7 @@ input:
action: onGetDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -62,10 +62,12 @@ input:
component:
name: remote-select
vModel: value
mode: default
type: plugin
action: onGetAcceleratorList
search: false
pager: false
multi: false
watches:
- certDomains
- accessId
@@ -93,6 +95,7 @@ input:
action: onGetListenerList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId
@@ -134,6 +137,7 @@ input:
action: onGetAdditionalDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -66,11 +66,13 @@ input:
component:
name: remote-select
vModel: value
mode: default
type: plugin
typeName: AliyunDeployCertToNLB
action: onGetRegionList
search: false
pager: false
multi: false
watches:
- certDomains
- accessId
@@ -99,6 +101,7 @@ input:
action: onGetLoadBalanceList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId
@@ -127,6 +130,7 @@ input:
action: onGetListenerList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -66,10 +66,12 @@ input:
component:
name: remote-select
vModel: value
mode: default
type: plugin
action: onGetRegionList
search: false
pager: false
multi: false
watches:
- certDomains
- accessId
@@ -97,6 +99,7 @@ input:
action: onGetLoadBalanceList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId
@@ -124,6 +127,7 @@ input:
action: onGetListenerList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId
@@ -165,6 +169,7 @@ input:
action: onGetExtensionDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -68,6 +68,7 @@ input:
action: onGetDomainList
search: true
pager: true
multi: true
watches:
- certDomains
- accessId

View File

@@ -84,6 +84,7 @@ input:
action: onGetCnameList
search: true
pager: true
multi: true
watches:
- certDomains
- accessId

View File

@@ -51,6 +51,7 @@ input:
action: onGetCertList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -71,6 +71,7 @@ input:
action: onGetDistributions
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -133,6 +133,7 @@ input:
action: onGetDistributions
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -63,6 +63,7 @@ input:
action: onGetCertList
search: true
pager: false
multi: true
watches:
- certDomains
- accessId
@@ -91,6 +92,7 @@ input:
action: onGetSiteList
search: true
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -427,6 +427,7 @@ input:
helper: 兼容Windows Server各个版本
renewDays:
title: 更新天数
value: 20
component:
name: a-input-number
vModel: value

View File

@@ -56,6 +56,18 @@ input:
type: aliyun
required: true
order: 0
orderType:
title: 订单类型
value: CPACK
component:
name: a-select
vModel: value
options:
- label: 资源虚拟订单(一般选这个)
value: CPACK
- label: 售卖订单
value: BUY
order: 0
orderId:
title: 证书订单ID
component:
@@ -67,6 +79,8 @@ input:
action: onGetOrderList
search: false
pager: true
multi: true
pageSize: 50
watches:
- certDomains
- accessId
@@ -112,6 +126,7 @@ input:
helper: 兼容Windows Server各个版本
renewDays:
title: 更新天数
value: 20
component:
name: a-input-number
vModel: value

View File

@@ -148,6 +148,7 @@ input:
helper: 兼容Windows Server各个版本
renewDays:
title: 更新天数
value: 20
component:
name: a-input-number
vModel: value

View File

@@ -51,6 +51,7 @@ input:
action: onGetDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -76,6 +76,7 @@ input:
action: onGetDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -101,6 +101,7 @@ input:
action: onGetSiteList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -56,6 +56,7 @@ input:
action: onGetRegionList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId
@@ -84,6 +85,7 @@ input:
action: onGetGroupList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId
@@ -112,6 +114,7 @@ input:
action: onGetDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -53,6 +53,7 @@ input:
action: onGetRegionList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId
@@ -93,6 +94,7 @@ input:
action: onGetDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -70,6 +70,7 @@ input:
action: onGetDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -57,6 +57,7 @@ input:
action: onGetDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -149,6 +149,7 @@ input:
action: onGetDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -88,6 +88,7 @@ input:
action: onGetDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -53,6 +53,7 @@ input:
action: onGetZoneList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId
@@ -81,6 +82,7 @@ input:
action: onGetDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -53,6 +53,7 @@ input:
action: onGetDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -51,6 +51,7 @@ input:
action: onGetServerList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -51,6 +51,7 @@ input:
action: onGetCertList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -50,6 +50,7 @@ input:
action: onGetCertList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -56,6 +56,7 @@ input:
action: onGetCertList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -61,6 +61,7 @@ input:
action: onGetCertList
search: true
pager: true
multi: true
watches:
- certDomains
- accessId

View File

@@ -63,6 +63,7 @@ input:
action: onGetDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -50,11 +50,13 @@ input:
component:
name: remote-select
vModel: value
mode: default
type: plugin
typeName: HauweiDeployCertToELB
action: onGetProjectList
search: false
pager: false
multi: false
watches:
- certDomains
- accessId
@@ -82,6 +84,7 @@ input:
action: onGetCertList
search: true
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -56,6 +56,7 @@ input:
action: onGetBucketList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId
@@ -82,6 +83,7 @@ input:
action: onGetDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -51,6 +51,7 @@ input:
action: onGetSiteList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -53,6 +53,7 @@ input:
action: onGetDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -53,6 +53,7 @@ input:
action: onGetCertList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -51,6 +51,7 @@ input:
action: onGetCertList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -37,6 +37,7 @@ input:
action: onGetDomainList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -26,6 +26,7 @@ input:
action: onGetCertList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -27,6 +27,7 @@ input:
action: onGetCertList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

View File

@@ -51,6 +51,7 @@ input:
action: onGetCertList
search: false
pager: false
multi: true
watches:
- certDomains
- accessId

Some files were not shown because too many files have changed in this diff Show More