mirror of
https://github.com/certd/certd.git
synced 2026-10-13 15:49:25 +08:00
Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev
This commit is contained in:
@@ -111,8 +111,8 @@ jobs:
|
||||
registry.cn-shenzhen.aliyuncs.com/handsfree/certd:${{steps.get_certd_version.outputs.result}}-slim
|
||||
registry.cn-shenzhen.aliyuncs.com/certd/certd:slim
|
||||
registry.cn-shenzhen.aliyuncs.com/certd/certd:${{steps.get_certd_version.outputs.result}}-slim
|
||||
certd/certd:slim
|
||||
certd/certd:${{steps.get_certd_version.outputs.result}}-slim
|
||||
greper/certd:slim
|
||||
greper/certd:${{steps.get_certd_version.outputs.result}}-slim
|
||||
ghcr.io/${{ github.repository }}:slim
|
||||
ghcr.io/${{ github.repository }}:${{steps.get_certd_version.outputs.result}}-slim
|
||||
|
||||
@@ -129,22 +129,26 @@ jobs:
|
||||
registry.cn-shenzhen.aliyuncs.com/handsfree/certd:${{steps.get_certd_version.outputs.result}}-armv7
|
||||
registry.cn-shenzhen.aliyuncs.com/certd/certd:armv7
|
||||
registry.cn-shenzhen.aliyuncs.com/certd/certd:${{steps.get_certd_version.outputs.result}}-armv7
|
||||
certd/certd:armv7
|
||||
certd/certd:${{steps.get_certd_version.outputs.result}}-armv7
|
||||
greper/certd:armv7
|
||||
greper/certd:${{steps.get_certd_version.outputs.result}}-armv7
|
||||
ghcr.io/${{ github.repository }}:armv7
|
||||
ghcr.io/${{ github.repository }}:${{steps.get_certd_version.outputs.result}}-armv7
|
||||
|
||||
# - name: Build agent
|
||||
# uses: docker/build-push-action@v6
|
||||
# with:
|
||||
# platforms: linux/amd64,linux/arm64
|
||||
# push: true
|
||||
# context: ./packages/ui/agent/
|
||||
# tags: |
|
||||
# registry.cn-shenzhen.aliyuncs.com/handsfree/certd-agent:latest
|
||||
# registry.cn-shenzhen.aliyuncs.com/handsfree/certd-agent:${{steps.get_certd_version.outputs.result}}
|
||||
# greper/certd-agent:latest
|
||||
# greper/certd-agent:${{steps.get_certd_version.outputs.result}}
|
||||
- name: Login to Certd Docker Hub account
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.dockerhub_username2 }}
|
||||
password: ${{ secrets.dockerhub_password2 }}
|
||||
|
||||
- name: Publish to certd Docker Hub repository
|
||||
run: |
|
||||
docker buildx imagetools create --tag certd/certd:latest greper/certd:latest
|
||||
docker buildx imagetools create --tag certd/certd:${{ steps.get_certd_version.outputs.result }} greper/certd:${{ steps.get_certd_version.outputs.result }}
|
||||
docker buildx imagetools create --tag certd/certd:slim greper/certd:slim
|
||||
docker buildx imagetools create --tag certd/certd:${{ steps.get_certd_version.outputs.result }}-slim greper/certd:${{ steps.get_certd_version.outputs.result }}-slim
|
||||
docker buildx imagetools create --tag certd/certd:armv7 greper/certd:armv7
|
||||
docker buildx imagetools create --tag certd/certd:${{ steps.get_certd_version.outputs.result }}-armv7 greper/certd:${{ steps.get_certd_version.outputs.result }}-armv7
|
||||
|
||||
- name: deploy-certd-doc
|
||||
uses: tyrrrz/action-http-request@prime
|
||||
with:
|
||||
|
||||
@@ -40,8 +40,8 @@ jobs:
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.dockerhub_username }}
|
||||
password: ${{ secrets.dockerhub_password }}
|
||||
username: ${{ secrets.dockerhub_username2 }}
|
||||
password: ${{ secrets.dockerhub_password2 }}
|
||||
|
||||
# stable 镜像:叠加 ENV 层
|
||||
- name: Build and push stable images
|
||||
@@ -50,16 +50,14 @@ jobs:
|
||||
ENV certd_release_mode=stable" > Dockerfile.stable
|
||||
docker buildx build \
|
||||
--platform linux/amd64,linux/arm64 \
|
||||
--provenance=false \
|
||||
--sbom=false \
|
||||
--push \
|
||||
-f Dockerfile.stable \
|
||||
-t registry.cn-shenzhen.aliyuncs.com/handsfree/certd:stable \
|
||||
-t registry.cn-shenzhen.aliyuncs.com/handsfree/certd:${{ inputs.version }}-stable \
|
||||
-t registry.cn-shenzhen.aliyuncs.com/certd/certd:stable \
|
||||
-t registry.cn-shenzhen.aliyuncs.com/certd/certd:${{ inputs.version }}-stable \
|
||||
-t certd/certd:stable \
|
||||
-t certd/certd:${{ inputs.version }}-stable \
|
||||
-t ghcr.io/${{ github.repository }}:stable \
|
||||
-t ghcr.io/${{ github.repository }}:${{ inputs.version }}-stable \
|
||||
.
|
||||
|
||||
# slim-stable 镜像
|
||||
@@ -69,20 +67,18 @@ jobs:
|
||||
ENV certd_release_mode=stable" > Dockerfile.slim-stable
|
||||
docker buildx build \
|
||||
--platform linux/amd64,linux/arm64 \
|
||||
--provenance=false \
|
||||
--sbom=false \
|
||||
--push \
|
||||
-f Dockerfile.slim-stable \
|
||||
-t registry.cn-shenzhen.aliyuncs.com/handsfree/certd:slim-stable \
|
||||
-t registry.cn-shenzhen.aliyuncs.com/handsfree/certd:${{ inputs.version }}-slim-stable \
|
||||
-t registry.cn-shenzhen.aliyuncs.com/certd/certd:slim-stable \
|
||||
-t registry.cn-shenzhen.aliyuncs.com/certd/certd:${{ inputs.version }}-slim-stable \
|
||||
-t certd/certd:slim-stable \
|
||||
-t certd/certd:${{ inputs.version }}-slim-stable \
|
||||
-t ghcr.io/${{ github.repository }}:slim-stable \
|
||||
-t ghcr.io/${{ github.repository }}:${{ inputs.version }}-slim-stable \
|
||||
.
|
||||
|
||||
- name: Set AtomGit release as stable
|
||||
run: |
|
||||
export ATOMGIT_TOKEN=${{ secrets.ATOMGIT_TOKEN }}
|
||||
export VERSION=${{ inputs.version }}
|
||||
npm run set-release-stable
|
||||
node ./scripts/set-release-stable-fetch.js
|
||||
|
||||
@@ -11,10 +11,10 @@ input:
|
||||
title: 前置任务证书
|
||||
helper: 请选择前置任务产生的证书
|
||||
component:
|
||||
name: output-selector
|
||||
name: output-selector # 前置任务输出选择组件
|
||||
vModel: modelValue
|
||||
from:
|
||||
- ':cert:'
|
||||
- ':cert:' # 前置任务输出作为输入的筛选条件 , 格式 pluginType:valueType:keyName , 为空表示任意匹配
|
||||
required: true
|
||||
certDomains:
|
||||
title: 当前证书域名
|
||||
@@ -50,10 +50,10 @@ input:
|
||||
- value: '2'
|
||||
label: 选项2
|
||||
required: false
|
||||
showRunStrategy: false
|
||||
showRunStrategy: false # 用户是否可以选择运行策略, 【默认不显示】
|
||||
default:
|
||||
strategy:
|
||||
runStrategy: 1
|
||||
runStrategy: 0 # 运行策略, 0 = 成功后跳过,1 = 正常运行
|
||||
content: >
|
||||
|
||||
// 要用await来import模块
|
||||
@@ -96,5 +96,8 @@ content: >
|
||||
}
|
||||
this.logger.info("执行成功")
|
||||
// this.outputName = xxxx //设置输出参数,可以被其他插件选择使用
|
||||
|
||||
// 此处可以返回 "skip" , 表示本次任务没有做任何操作和改变 , 配合runStrategy=1使用
|
||||
// return "skip"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,15 +14,26 @@ pluginType: task
|
||||
group: other
|
||||
version: 1.0.0
|
||||
input:
|
||||
cert:
|
||||
cert: # 输入字段定义
|
||||
title: 域名证书
|
||||
required: true
|
||||
component:
|
||||
name: cert-select
|
||||
output: {}
|
||||
dependPlugins: []
|
||||
dependPackages: []
|
||||
default: {}
|
||||
required: true # 是否必填
|
||||
component: # 输入字段组件
|
||||
name: cert-select # 前端vue组件名称
|
||||
output: # 【可选】输出字段定义
|
||||
cert:
|
||||
title: 证书 #输出字段标题
|
||||
type: "cert" # 输出字段类型
|
||||
dependPlugins: # 依赖的插件
|
||||
# - access:certd/DemoAccess: *
|
||||
dependPackages: # 依赖的nodejs包
|
||||
# xxx: ^1.0.0
|
||||
vip: "free" # 默认免费,plus 需要专业版
|
||||
showRunStrategy: false # 【默认不显示】
|
||||
default: {
|
||||
strategy: {
|
||||
runStrategy: 0, # 运行策略, 0 = 成功后跳过,1 = 正常运行
|
||||
},
|
||||
}
|
||||
content: |
|
||||
const { AbstractTaskPlugin } = await _ctx.import("@certd/pipeline")
|
||||
const { DemoAccess } = await _ctx.import("/@/plugins/plugin-lib/demo/access/index.js")
|
||||
|
||||
@@ -5,7 +5,7 @@ description: 用于开发 Certd 在线 Access 插件。输出完整 YAML,conte
|
||||
|
||||
# 在线 Access 插件
|
||||
|
||||
读取父 Skill 的 `references/online-yaml-format.md`。不要沿用旧版 `@IsAccess`、`@AccessInput` 装饰器和独立 TypeScript 文件。
|
||||
读取父 Skill 的 `references/online-yaml-format.md`。不要沿用代码版 `@IsAccess`、`@AccessInput` 装饰器和独立 TypeScript 文件。
|
||||
|
||||
## 输出结构
|
||||
|
||||
@@ -57,3 +57,4 @@ return class DemoAccess extends BaseAccess {
|
||||
- `onTestRequest` 应调用实际 API 方法并在失败时抛出异常。
|
||||
- 对外 API 方法应统一处理分页、错误和返回字段。
|
||||
- 使用 `this.logger` 或框架提供的 logger,禁止 `console.log`。
|
||||
- 一般将API接口方法封装到Access中,其他plugin调用access的方法当做client sdk使用
|
||||
@@ -68,3 +68,4 @@ return class DemoDnsProvider extends AbstractDnsProvider {
|
||||
- 只处理业务 API 所需的 TXT 记录参数,不在日志中输出授权密钥。
|
||||
- 网络失败、授权失败和 API 业务失败要有明确日志;创建失败必须抛出异常。
|
||||
- 保持创建和删除幂等,避免清理失败阻断无关流程。
|
||||
- 一般将API接口方法封装到Access中,其他plugin使用access当做client sdk使用
|
||||
|
||||
@@ -14,6 +14,24 @@ description: 用于开发 Certd 在线 Task 插件。输出完整 YAML,脚本
|
||||
- 输入配置放在 YAML 的 `input` 字段。
|
||||
- 执行脚本放在 YAML 顶层 `content` 字段。
|
||||
|
||||
|
||||
## runStrategy
|
||||
|
||||
整个流水线每次运行,会记录每个任务的运行结果状态,如果上次任务执行成功,且 runStrategy 为成功后跳过,那么下次运行时会跳过该任务。
|
||||
|
||||
|
||||
- `showRunStrategy`: false 【默认不显示】
|
||||
- 任务配置时是否显示 runStrategy 字段,用于指定任务的执行策略。
|
||||
- `default.strategy.runStrategy`: 0 【默认成功后跳过】
|
||||
- 0 表示成功后跳过,1 表示正常运行。
|
||||
- 设置任务的默认运行策略runStrategy。
|
||||
|
||||
当证书申请任务,申请证书成功后,会清空后续任务状态。此时后续`runStrategy = 0` 的任务,会重新执行。
|
||||
这样可以保证相同的证书不会重复部署。
|
||||
|
||||
在其他场景的部署任务,可能希望每次运行都检查是否需要部署,如果即将过期就部署,没有过期就跳过。
|
||||
此时可以设置 `default.strategy.runStrategy = 1`,然后在`execute`方法中,如果没有过期,就返回 `"skip"`。
|
||||
|
||||
## `content` 模板
|
||||
|
||||
```javascript
|
||||
@@ -33,9 +51,14 @@ return class DemoTask extends AbstractTaskPlugin {
|
||||
url: "https://api.example.com",
|
||||
})
|
||||
if (res.error) {
|
||||
// 抛异常让任务执行失败
|
||||
throw new Error(`任务执行失败: ${res.message}`)
|
||||
}
|
||||
this.logger.info("执行成功")
|
||||
// 还可以返回 "skip" 表示当前任务没有执行任何操作
|
||||
// 一般与 runStrategy = 1 配合使用。 (1=正常运行,0表示成功后跳过)
|
||||
// 比如检查无需更新,时就 返回 "skip"
|
||||
// return "skip"
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -52,3 +75,4 @@ return class DemoTask extends AbstractTaskPlugin {
|
||||
- 外部 API 返回失败或业务失败时抛出异常。
|
||||
- 对重复执行保持幂等,避免把真实 Token、证书和私钥写入日志。
|
||||
- 修改完成后把整个 YAML 通过 Certd `/scoped/sys/ai/plugin/import` 保存。
|
||||
- 一般将API接口方法封装到Access中,其他plugin使用access当做client sdk使用
|
||||
|
||||
@@ -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.44.0](https://github.com/certd/certd/compare/v1.43.0...v1.44.0) (2026-08-28)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复证书申请时EAB判断逻辑,已选择Acme账号的情况下不需要EAB ([d87821e](https://github.com/certd/certd/commit/d87821ee02b17136fc925df4547223332bf22823))
|
||||
* **pipeline:** 校验定时触发器cron表达式,拦截2月31号等无效日期 ([#785](https://github.com/certd/certd/issues/785)) [@yukaidi1220](https://github.com/yukaidi1220) ([f8e492d](https://github.com/certd/certd/commit/f8e492d6cb49257e56bbd06b28fd6eb32c923c28))
|
||||
* **plugin-ai-dev:** 优化AI插件测试流程并修复日志获取问题 ([faf9828](https://github.com/certd/certd/commit/faf9828168f6ce82adc530a65eaf313d6c9904b5))
|
||||
* **plugin-item-card:** 移除分数格式化时去掉.0的逻辑 ([a91d7c0](https://github.com/certd/certd/commit/a91d7c000a2aa6456a249433ff90a47787ec90f0))
|
||||
* **ssh:** 修复 keyboard-interactive 认证可能抛类型错误的问题 ([5e867c8](https://github.com/certd/certd/commit/5e867c86c30eb43f1e5aeee8c22d47596e173a8c))
|
||||
* **start.sh:** 优化前端zip包下载校验逻辑 ([15ee6ea](https://github.com/certd/certd/commit/15ee6ead49db3620d2ade641aadbfcb13ac3e6dc))
|
||||
* **tencent access:** 修复腾讯云国际站接口endpoint拼接问题 ([f614872](https://github.com/certd/certd/commit/f61487284f79d3f5a72c9f7eee04999a93728326))
|
||||
|
||||
### Features
|
||||
|
||||
* 实现自定义ACME证书颁发机构支持 ([97c417b](https://github.com/certd/certd/commit/97c417b1ad64b9a14bee8bfe98a2e789b9278820))
|
||||
* 新增证书吊销后置任务与证书状态管理 ([1cc9641](https://github.com/certd/certd/commit/1cc9641f5669710d1e5809995ad395c843855a12))
|
||||
* 新增AI插件开发全流程能力 ([6f9dffe](https://github.com/certd/certd/commit/6f9dffe6e59cc125bd394d7db6086d66a9c71e49))
|
||||
* 支持审计日志,操作日志 ([f2855d6](https://github.com/certd/certd/commit/f2855d6dac74c9db71d92f99601e35c360b10666))
|
||||
* 支持在线插件下载安装审核等 ([255960d](https://github.com/certd/certd/commit/255960d434eebb3d567a08f737f1642ab417b5d0))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 统一镜像地址格式 certd/certd ([49007d3](https://github.com/certd/certd/commit/49007d391565099d94dec375eb88e946856506b0))
|
||||
* 新增AI插件开发受限令牌与隔离API ([3a9069f](https://github.com/certd/certd/commit/3a9069f6e6242940229fd63c686f7e445408dbbb))
|
||||
* 优化源码启动脚本,增加快速启动 ([0cfc3b7](https://github.com/certd/certd/commit/0cfc3b7ae90fa031d75f0b395556a04d4efee76c))
|
||||
* 统一将路由前缀从/certd改为/cert ([4db0f83](https://github.com/certd/certd/commit/4db0f83304dc6fd9199673c48b1805421f024601))
|
||||
* 新增官方客户端Certd Client的多语言配置与页面入口 ([fbfe125](https://github.com/certd/certd/commit/fbfe1256a5c8be6dfb2fbae7e6130eb5f6c6d946))
|
||||
* 新增证书吊销功能,添加证书状态字段 ([5074572](https://github.com/certd/certd/commit/5074572694383c8e1bf2880e26827987683dc62c))
|
||||
* 新增自定义ACME管理功能,完善证书颁发机构适配 ([2ab23f5](https://github.com/certd/certd/commit/2ab23f50b216e27495fc823d2269ca0ba6366d15))
|
||||
* 移除全局反向代理配置,迁移到自定义ACME配置 ([c57110e](https://github.com/certd/certd/commit/c57110e42aada31dd0028b56b5baec1b19722525))
|
||||
* 在线插件支持通知类型 ([c0f194f](https://github.com/certd/certd/commit/c0f194f4438bd7ca3f52f63ca088543abde7428c))
|
||||
* 增加稳定版,预览版区分,预览版是最新版,稳定版在预览版验证稳定后,再将预览版转为稳定版 ([1574090](https://github.com/certd/certd/commit/15740904e5e97ee767c39e4401dbc1d645795c38))
|
||||
* 支持AI开发在线插件 ([eae7edb](https://github.com/certd/certd/commit/eae7edbda0fd7357163f33fb4084fcba21396f5f))
|
||||
* **domain:** 域名管理增加remark字段 ([e4041ea](https://github.com/certd/certd/commit/e4041eabece1bab2c1c4b955129cf7a7fe7302d0))
|
||||
* **login,settings:** 仅第三方登录开启后,在重启10分钟后将无法使用密码登录 ([1d12ad7](https://github.com/certd/certd/commit/1d12ad73c6ca827d2eb36bda867f9d9fe62dab48))
|
||||
* **plugin:** 插件安装支持检测依赖 ([e79660c](https://github.com/certd/certd/commit/e79660c5d17ed4049508a00a359950a54470332f))
|
||||
* **plugin:** 新增插件评分展示、排序与个人插件筛选功能 ([7ab5029](https://github.com/certd/certd/commit/7ab502991e0c001777b268b9f159311ef5e000a0))
|
||||
* **server:** response优化为gzip压缩 ([f38522c](https://github.com/certd/certd/commit/f38522ca0b2185f7f35538f53cb51dcf86d0bfc8))
|
||||
* **tencent-clb:** 重构腾讯云CLB部署插件的地域选择组件,改为远程下拉选择器 ([30d4fc8](https://github.com/certd/certd/commit/30d4fc84a9e940d1d07e1f25856eb6fa13da9ba1))
|
||||
|
||||
# [1.43.0](https://github.com/certd/certd/compare/v1.42.6...v1.43.0) (2026-08-14)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -109,7 +109,8 @@ https://certd.handfree.work/
|
||||
|
||||
```
|
||||
registry.cn-shenzhen.aliyuncs.com/certd/certd:[version-][system-][latest/stable]
|
||||
------------ ↑ 镜像地址 ------------- ↑ 镜像名 -- ↑指定版本- ↑基础系统- ↑最新版本类型
|
||||
------------ ↑ 镜像地址 ------------- ↑ 镜像名 -- ↑指定版本- ↑基础系统- ↑最新版本类型 (中括号表示可选)
|
||||
|
||||
```
|
||||
##### 2. 版本标签:
|
||||
|
||||
@@ -124,25 +125,25 @@ registry.cn-shenzhen.aliyuncs.com/certd/certd:[version-][system-][latest/stable]
|
||||
|
||||
> 根据基础镜像不同,分为如下三个分支版本,没有特殊需求选择默认的即可(他们功能是一样的)
|
||||
|
||||
| 系统版本 | 版本标签 | 基础系统 | 说明 | 稳定版标签 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| alpine【默认】 | `certd:latest` | Alpine Linux | 默认版本,镜像体积小 | `certd:stable` |
|
||||
| slim | `certd:slim` | Debian slim | 基于glibc,dns解析兼容性好 | `certd:slim-stable` |
|
||||
| armv7 | `certd:armv7` | Alpine Linux | ARMv7 架构专用版本 | `certd:armv7-stable` |
|
||||
| 系统版本 | 版本标签 | 基础系统 | 说明 | 稳定版标签 | 指定版本 |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| alpine【默认】 | `certd:latest` | Alpine Linux | 默认版本,镜像体积小 | `certd:stable` | `certd:1.43.0` |
|
||||
| slim | `certd:slim` | Debian slim | 基于glibc,dns解析兼容性好 | `certd:slim-stable` | `certd:1.43.0-slim` |
|
||||
| armv7 | `certd:armv7` | Alpine Linux | ARMv7 架构专用版本 | `certd:armv7-stable` | `certd:1.43.0-armv7` |
|
||||
|
||||
##### 2. 镜像地址:
|
||||
##### 3. 镜像地址:
|
||||
|
||||
| 镜像仓库 | 最新预览版 | slim | armv7 |
|
||||
| --- | --- | --- | --- |
|
||||
| 阿里云【默认】 | `registry.cn-shenzhen.aliyuncs.com/certd/certd:latest` | `certd:slim` | `certd:armv7` |
|
||||
| Docker Hub | `greper/certd:latest` | `certd:slim` |
|
||||
| Docker Hub | `certd/certd:latest` | `certd:slim` |
|
||||
| GitHub Packages | `ghcr.io/certd/certd:latest` | `certd:slim` | `certd:armv7` |
|
||||
|
||||
|
||||
> 注意:
|
||||
> 1. 后面的各个版本省略了镜像地址,使用时需要将镜像地址拼接完整。
|
||||
> 2. 稳定版在后面加 `-stable` 即可。
|
||||
> 3. 如需指定具体的版本号,在冒号后面加 `version-`即可,例如 `certd:1.42.1-stable`。
|
||||
> 2. 如果您不确定使用哪个版本,请使用默认的 `certd:latest` 版本。
|
||||
|
||||
最新版本号:
|
||||

|
||||
|
||||
|
||||
##### 3. 镜像构建说明:
|
||||
|
||||
@@ -2,9 +2,9 @@ version: '3.3' # 兼容旧版docker-compose
|
||||
services:
|
||||
certd:
|
||||
# 镜像 # ↓↓↓↓↓ ---- 镜像版本号,建议改成固定版本号,例如:certd:1.29.0
|
||||
image: registry.cn-shenzhen.aliyuncs.com/certd/certd:latest
|
||||
image: registry.cn-shenzhen.aliyuncs.com/certd/certd:latest # 稳定版为 certd/certd:stable
|
||||
# image: ghcr.io/certd/certd:latest # --------- 如果 报镜像not found,可以尝试其他镜像源
|
||||
# image: greper/certd:latest
|
||||
# image: certd/certd:latest
|
||||
# --------- 生产建议使用稳定版, latest改成stable即可
|
||||
# image: registry.cn-shenzhen.aliyuncs.com/certd/certd:stable
|
||||
|
||||
@@ -77,7 +77,13 @@ services:
|
||||
# - certd_typeorm_dataSource_default_password=yourpasswd # 密码
|
||||
# - certd_typeorm_dataSource_default_database=certd # 数据库名
|
||||
|
||||
# ↓↓↓↓ --------------------------------------------------------- 自动升级,上面certd的版本号要保持为latest
|
||||
# #↓↓↓↓ ---------------------------- 如果数据库服务端开启了加密传输 require_secure_transport-ON
|
||||
# - certd_typeorm_dataSource_default_ssl_rejectUnauthorized=false # 忽略证书校验,或者配置下面的三项路径
|
||||
# - certd_typeorm_dataSource_default_ssl_ca # 证书CA路径【如果上面false,无需配置】
|
||||
# - certd_typeorm_dataSource_default_ssl_key # 私钥路径【如果上面false,无需配置】
|
||||
# - certd_typeorm_dataSource_default_ssl_cert # 证书路径【如果上面false,无需配置】
|
||||
|
||||
# ↓↓↓↓ --------------------------------------------------------- 自动升级,上面certd的版本号要保持为latest / stable
|
||||
# certd-updater: # 添加 Watchtower 服务
|
||||
# image: containrrr/watchtower:latest
|
||||
# container_name: certd-updater
|
||||
|
||||
@@ -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.44.0](https://github.com/certd/certd/compare/v1.43.0...v1.44.0) (2026-08-28)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复证书申请时EAB判断逻辑,已选择Acme账号的情况下不需要EAB ([d87821e](https://github.com/certd/certd/commit/d87821ee02b17136fc925df4547223332bf22823))
|
||||
* **pipeline:** 校验定时触发器cron表达式,拦截2月31号等无效日期 ([#785](https://github.com/certd/certd/issues/785)) [@yukaidi1220](https://github.com/yukaidi1220) ([f8e492d](https://github.com/certd/certd/commit/f8e492d6cb49257e56bbd06b28fd6eb32c923c28))
|
||||
* **plugin-ai-dev:** 优化AI插件测试流程并修复日志获取问题 ([faf9828](https://github.com/certd/certd/commit/faf9828168f6ce82adc530a65eaf313d6c9904b5))
|
||||
* **plugin-item-card:** 移除分数格式化时去掉.0的逻辑 ([a91d7c0](https://github.com/certd/certd/commit/a91d7c000a2aa6456a249433ff90a47787ec90f0))
|
||||
* **ssh:** 修复 keyboard-interactive 认证可能抛类型错误的问题 ([5e867c8](https://github.com/certd/certd/commit/5e867c86c30eb43f1e5aeee8c22d47596e173a8c))
|
||||
* **start.sh:** 优化前端zip包下载校验逻辑 ([15ee6ea](https://github.com/certd/certd/commit/15ee6ead49db3620d2ade641aadbfcb13ac3e6dc))
|
||||
* **tencent access:** 修复腾讯云国际站接口endpoint拼接问题 ([f614872](https://github.com/certd/certd/commit/f61487284f79d3f5a72c9f7eee04999a93728326))
|
||||
|
||||
### Features
|
||||
|
||||
* 实现自定义ACME证书颁发机构支持 ([97c417b](https://github.com/certd/certd/commit/97c417b1ad64b9a14bee8bfe98a2e789b9278820))
|
||||
* 新增证书吊销后置任务与证书状态管理 ([1cc9641](https://github.com/certd/certd/commit/1cc9641f5669710d1e5809995ad395c843855a12))
|
||||
* 新增AI插件开发全流程能力 ([6f9dffe](https://github.com/certd/certd/commit/6f9dffe6e59cc125bd394d7db6086d66a9c71e49))
|
||||
* 支持审计日志,操作日志 ([f2855d6](https://github.com/certd/certd/commit/f2855d6dac74c9db71d92f99601e35c360b10666))
|
||||
* 支持在线插件下载安装审核等 ([255960d](https://github.com/certd/certd/commit/255960d434eebb3d567a08f737f1642ab417b5d0))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 统一镜像地址格式 certd/certd ([49007d3](https://github.com/certd/certd/commit/49007d391565099d94dec375eb88e946856506b0))
|
||||
* 新增AI插件开发受限令牌与隔离API ([3a9069f](https://github.com/certd/certd/commit/3a9069f6e6242940229fd63c686f7e445408dbbb))
|
||||
* 优化源码启动脚本,增加快速启动 ([0cfc3b7](https://github.com/certd/certd/commit/0cfc3b7ae90fa031d75f0b395556a04d4efee76c))
|
||||
* 统一将路由前缀从/certd改为/cert ([4db0f83](https://github.com/certd/certd/commit/4db0f83304dc6fd9199673c48b1805421f024601))
|
||||
* 新增官方客户端Certd Client的多语言配置与页面入口 ([fbfe125](https://github.com/certd/certd/commit/fbfe1256a5c8be6dfb2fbae7e6130eb5f6c6d946))
|
||||
* 新增证书吊销功能,添加证书状态字段 ([5074572](https://github.com/certd/certd/commit/5074572694383c8e1bf2880e26827987683dc62c))
|
||||
* 新增自定义ACME管理功能,完善证书颁发机构适配 ([2ab23f5](https://github.com/certd/certd/commit/2ab23f50b216e27495fc823d2269ca0ba6366d15))
|
||||
* 移除全局反向代理配置,迁移到自定义ACME配置 ([c57110e](https://github.com/certd/certd/commit/c57110e42aada31dd0028b56b5baec1b19722525))
|
||||
* 在线插件支持通知类型 ([c0f194f](https://github.com/certd/certd/commit/c0f194f4438bd7ca3f52f63ca088543abde7428c))
|
||||
* 增加稳定版,预览版区分,预览版是最新版,稳定版在预览版验证稳定后,再将预览版转为稳定版 ([1574090](https://github.com/certd/certd/commit/15740904e5e97ee767c39e4401dbc1d645795c38))
|
||||
* 支持AI开发在线插件 ([eae7edb](https://github.com/certd/certd/commit/eae7edbda0fd7357163f33fb4084fcba21396f5f))
|
||||
* **domain:** 域名管理增加remark字段 ([e4041ea](https://github.com/certd/certd/commit/e4041eabece1bab2c1c4b955129cf7a7fe7302d0))
|
||||
* **login,settings:** 仅第三方登录开启后,在重启10分钟后将无法使用密码登录 ([1d12ad7](https://github.com/certd/certd/commit/1d12ad73c6ca827d2eb36bda867f9d9fe62dab48))
|
||||
* **plugin:** 插件安装支持检测依赖 ([e79660c](https://github.com/certd/certd/commit/e79660c5d17ed4049508a00a359950a54470332f))
|
||||
* **plugin:** 新增插件评分展示、排序与个人插件筛选功能 ([7ab5029](https://github.com/certd/certd/commit/7ab502991e0c001777b268b9f159311ef5e000a0))
|
||||
* **server:** response优化为gzip压缩 ([f38522c](https://github.com/certd/certd/commit/f38522ca0b2185f7f35538f53cb51dcf86d0bfc8))
|
||||
* **tencent-clb:** 重构腾讯云CLB部署插件的地域选择组件,改为远程下拉选择器 ([30d4fc8](https://github.com/certd/certd/commit/30d4fc84a9e940d1d07e1f25856eb6fa13da9ba1))
|
||||
|
||||
# [1.43.0](https://github.com/certd/certd/compare/v1.42.6...v1.43.0) (2026-08-14)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -125,9 +125,9 @@ docker-compose up -d
|
||||
|
||||
## 三、问题
|
||||
|
||||
### 1. 迁移到PG之后,所有表的Sequence会从1开始
|
||||
### 1. 迁移到PostgreSQL之后,所有表的Sequence会从1开始
|
||||
|
||||
执行如下sql 语句,批量将所有表的id自增设置到当前数据的最大值
|
||||
执行如下sql 语句,批量将所有表的id自增设置到当前数据的最大值【仅迁移到postgresql需要执行】
|
||||
```sql
|
||||
DO $$
|
||||
DECLARE
|
||||
|
||||
@@ -6,22 +6,45 @@
|
||||
|
||||
Certd 提供多种 Docker 镜像版本,您可以根据需要选择:
|
||||
|
||||
**最新版本:**
|
||||
#### 1. 镜像地址格式:
|
||||
|
||||
```
|
||||
registry.cn-shenzhen.aliyuncs.com/certd/certd:[version-][system-][latest/stable]
|
||||
------------ ↑ 镜像地址 ------------- ↑ 镜像名 -- ↑指定版本- ↑基础系统- ↑最新版本类型
|
||||
```
|
||||
#### 2. 版本标签:
|
||||
|
||||
**最新版本标签:**
|
||||
|
||||
| 版本 | 标签 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 预览版【默认】 | `certd:latest` | 指向最新开发版本,包含最新功能,但稳定性不如稳定版 |
|
||||
| 稳定版 | `certd:stable` | 指向经过充分测试的生产就绪版本,推荐生产环境使用 |
|
||||
| 最新预览版【默认】 | `certd:latest` | 指向最新开发版本,包含最新功能,但稳定性不如稳定版 |
|
||||
| 最新稳定版 | `certd:stable` | 指向经过充分测试的生产就绪版本,推荐生产环境使用 |
|
||||
|
||||
**系统版本分支:**
|
||||
**系统分支版本:**
|
||||
|
||||
| 分支版本标签 | 基础系统 | 说明 | 指定版本 | 稳定版 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| `certd:latest` 【默认】 | Alpine Linux | 默认版本,镜像体积小 | `certd:[version]` | `certd:[version-]stable` |
|
||||
| `certd:slim` | Debian slim | glibc版本,dns解析兼容性更好(可能需要配置security_opt -seccomp=unconfined)| `certd:[version-]slim` | `certd:[version-]slim-stable` |
|
||||
| `certd:armv7` | Alpine Linux | ARMv7 架构专用版本 | `certd:[version]-armv7` | `certd:[version-]armv7-ststable` |
|
||||
> 根据基础镜像不同,分为如下三个分支版本,没有特殊需求选择默认的即可(他们功能是一样的)
|
||||
|
||||
| 系统版本 | 版本标签 | 基础系统 | 说明 | 稳定版标签 | 指定版本 |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| alpine【默认】 | `certd:latest` | Alpine Linux | 默认版本,镜像体积小,支持x86、ARM架构 | `certd:stable` | `certd:1.43.0` |
|
||||
| slim | `certd:slim` | Debian slim | 基于glibc,dns解析兼容性好 | `certd:slim-stable` | `certd:1.43.0-slim` |
|
||||
| armv7 | `certd:armv7` | Alpine Linux | ARMv7 架构专用版本 | `certd:armv7-stable` | `certd:1.43.0-armv7` |
|
||||
|
||||
#### 3. 镜像地址:
|
||||
|
||||
| 镜像仓库 | 最新预览版 | slim版 | armv7版 |
|
||||
| --- | --- | --- |
|
||||
| 阿里云【默认】 | `registry.cn-shenzhen.aliyuncs.com/certd/certd:latest` | `certd:slim` | `certd:armv7` |
|
||||
| Docker Hub | `certd/certd:latest` | `certd:slim` | `certd:armv7` |
|
||||
| GitHub Packages | `ghcr.io/certd/certd:latest` | `certd:slim` | `certd:armv7` |
|
||||
|
||||
> 1. 后面的各个版本省略了镜像地址,使用时需要将镜像地址拼接完整。
|
||||
> 2. 如果您不确定使用哪个版本,请使用默认的 `certd:latest` 版本。
|
||||
|
||||
最新版本号:
|
||||

|
||||
|
||||
> 如果您不确定使用哪个版本,请使用默认的 `certd:latest` 版本。
|
||||
|
||||
### 一键脚本安装(推荐)
|
||||
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
# 任务插件
|
||||
共 `134` 款任务插件
|
||||
共 `135` 款任务插件
|
||||
## 1. 证书申请
|
||||
|
||||
| 序号 | 名称 | 说明 |
|
||||
|-----|-----|-----|
|
||||
| 1.| **证书申请(JS版)** | 免费通配符域名证书申请,支持多个域名打到同一个证书上 |
|
||||
| 2.| **已有证书托管** | 手动上传自定义证书后,自动部署(每次证书有更新,都需要手动上传一次) |
|
||||
| 3.| **获取阿里云订阅证书** | 从阿里云拉取订阅模式的商用证书(支持 API 1.0 和 2.0) |
|
||||
| 4.| **证书申请(Lego)** | 支持海量DNS解析提供商,推荐使用,一样的免费通配符域名证书申请,支持多个域名打到同一个证书上 |
|
||||
| 1.| **吊销旧证书** | 新证书申请成功,并全部部署成功后,吊销本流水线产生的旧证书。(注意 如果本流水线证书还在别处有使用或手动部署,请慎重添加此吊销任务) |
|
||||
| 2.| **证书申请(JS版)** | 免费通配符域名证书申请,支持多个域名打到同一个证书上 |
|
||||
| 3.| **已有证书托管** | 手动上传自定义证书后,自动部署(每次证书有更新,都需要手动上传一次) |
|
||||
| 4.| **获取阿里云订阅证书** | 从阿里云拉取订阅模式的商用证书(支持 API 1.0 和 2.0) |
|
||||
| 5.| **证书申请(Lego)** | 支持海量DNS解析提供商,推荐使用,一样的免费通配符域名证书申请,支持多个域名打到同一个证书上 |
|
||||
## 2. 主机
|
||||
|
||||
| 序号 | 名称 | 说明 |
|
||||
|
||||
@@ -4,26 +4,26 @@
|
||||
|-----|-----|-----|
|
||||
| 1.| **阿里ESA** | 阿里ESA DNS解析 |
|
||||
| 2.| **阿里云** | 阿里云DNS解析提供商 |
|
||||
| 3.| **AWS Route53** | AWS Route53 DNS解析提供商 |
|
||||
| 4.| **腾讯云** | 腾讯云域名DNS解析提供者 |
|
||||
| 5.| **腾讯云EO DNS** | 腾讯云EO DNS解析提供者 |
|
||||
| 3.| **腾讯云** | 腾讯云域名DNS解析提供者 |
|
||||
| 4.| **腾讯云EO DNS** | 腾讯云EO DNS解析提供者 |
|
||||
| 5.| **AWS Route53** | AWS Route53 DNS解析提供商 |
|
||||
| 6.| **Azure DNS** | Azure DNS 解析提供商 |
|
||||
| 7.| **火山引擎** | 火山引擎DNS解析提供商 |
|
||||
| 8.| **京东云** | 京东云DNS解析提供商 |
|
||||
| 9.| **新网(代理方式)** | 新网域名解析(代理方式) |
|
||||
| 10.| **新网** | 新网域名解析 |
|
||||
| 11.| **BIND9 DNS** | 通过 SSH 连接到 BIND9 服务器,使用 nsupdate 命令管理 DNS 记录 |
|
||||
| 12.| **cloudflare** | cloudflare dns provider |
|
||||
| 13.| **dns.la** | dns.la |
|
||||
| 14.| **Dynadot** | Dynadot DNS提供商 |
|
||||
| 15.| **godaddy** | GoDaddy |
|
||||
| 16.| **HiPM DNSMgr** | HiPM DNSMgr DNS 解析提供商 |
|
||||
| 17.| **华为云** | 华为云DNS解析提供商 |
|
||||
| 18.| **namesilo** | namesilo dns provider |
|
||||
| 19.| **雨云** | 雨云DNS解析提供商 |
|
||||
| 20.| **Technitium DNS Server** | Technitium DNS Server 自建DNS服务器 |
|
||||
| 21.| **西部数码** | west dns provider |
|
||||
| 22.| **Google Cloud DNS** | Google Cloud DNS提供商 |
|
||||
| 7.| **cloudflare** | cloudflare dns provider |
|
||||
| 8.| **华为云** | 华为云DNS解析提供商 |
|
||||
| 9.| **火山引擎** | 火山引擎DNS解析提供商 |
|
||||
| 10.| **Google Cloud DNS** | Google Cloud DNS提供商 |
|
||||
| 11.| **京东云** | 京东云DNS解析提供商 |
|
||||
| 12.| **新网(代理方式)** | 新网域名解析(代理方式) |
|
||||
| 13.| **新网** | 新网域名解析 |
|
||||
| 14.| **BIND9 DNS** | 通过 SSH 连接到 BIND9 服务器,使用 nsupdate 命令管理 DNS 记录 |
|
||||
| 15.| **dns.la** | dns.la |
|
||||
| 16.| **Dynadot** | Dynadot DNS提供商 |
|
||||
| 17.| **godaddy** | GoDaddy |
|
||||
| 18.| **HiPM DNSMgr** | HiPM DNSMgr DNS 解析提供商 |
|
||||
| 19.| **namesilo** | namesilo dns provider |
|
||||
| 20.| **雨云** | 雨云DNS解析提供商 |
|
||||
| 21.| **Technitium DNS Server** | Technitium DNS Server 自建DNS服务器 |
|
||||
| 22.| **西部数码** | west dns provider |
|
||||
| 23.| **Dns提供商Demo** | dns provider示例 |
|
||||
| 24.| **彩虹DNS** | 彩虹DNS管理系统 |
|
||||
| 25.| **Spaceship** | Spaceship 域名解析 |
|
||||
|
||||
@@ -49,5 +49,6 @@ docker compose up -d
|
||||
## 二、仅有第三方登录,没有登录窗口 / 自动跳到第三方登录等
|
||||
|
||||
当开启仅使用第三方登录模式时,如果第三方登录未配置或已失效,则会导致无法登录
|
||||
服务重启后的前10分钟内,可以访问 `http://你的certd地址/#/login?oauthOnly=false` 显示密码登录入口。
|
||||
|
||||
您可以通过访问 `http://你的certd地址/#/login?oauthOnly=false` 来临时关闭仅使用第三方登录模式,以使用密码登录。
|
||||
> 注意:仅使用第三方登录开启后,仅限于服务重启后的前10分钟内可使用密码登录;超过窗口期即使`oauthOnly=false`,也无法使用密码登录。
|
||||
|
||||
+1
-1
@@ -9,5 +9,5 @@
|
||||
}
|
||||
},
|
||||
"npmClient": "pnpm",
|
||||
"version": "1.43.0"
|
||||
"version": "1.44.0"
|
||||
}
|
||||
|
||||
+1
-2
@@ -27,7 +27,7 @@
|
||||
"commitPro": "cd ./packages/pro/ && git add . && git commit -m \"build: publish\" && git push",
|
||||
"copylogs": "copyfiles \"CHANGELOG.md\" ./docs/guide/changelogs/",
|
||||
"prepublishOnly1": "pnpm run test:unit && pnpm run check && lerna run build ",
|
||||
"prepublishOnly2": "pnpm run test:unit && pnpm run check && pnpm run before-build && lerna run build && pnpm run plugin-doc-gen",
|
||||
"prepublishOnly2": "pnpm run before-build && lerna run build && pnpm run test:unit && pnpm run check && pnpm run plugin-doc-gen",
|
||||
"before-build": "pnpm run transform-sql && cd ./packages/core/basic && time /t >build.md && git add ./build.md && git commit -m \"build: prepare to build\"",
|
||||
"deploy1": "node --experimental-json-modules ./scripts/deploy.js ",
|
||||
"check": "node --experimental-json-modules ./scripts/publish-check.js",
|
||||
@@ -53,7 +53,6 @@
|
||||
"dependencies": {
|
||||
"copyfiles": "^2.4.1",
|
||||
"lodash-es": "^4.17.21",
|
||||
"root": "link:",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"workspaces": [
|
||||
|
||||
@@ -3,6 +3,17 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
# [1.44.0](https://github.com/publishlab/node-acme-client/compare/v1.43.0...v1.44.0) (2026-08-28)
|
||||
|
||||
### Features
|
||||
|
||||
* 新增证书吊销后置任务与证书状态管理 ([1cc9641](https://github.com/publishlab/node-acme-client/commit/1cc9641f5669710d1e5809995ad395c843855a12))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 新增证书吊销功能,添加证书状态字段 ([5074572](https://github.com/publishlab/node-acme-client/commit/5074572694383c8e1bf2880e26827987683dc62c))
|
||||
* 移除全局反向代理配置,迁移到自定义ACME配置 ([c57110e](https://github.com/publishlab/node-acme-client/commit/c57110e42aada31dd0028b56b5baec1b19722525))
|
||||
|
||||
# [1.43.0](https://github.com/publishlab/node-acme-client/compare/v1.42.6...v1.43.0) (2026-08-14)
|
||||
|
||||
**Note:** Version bump only for package @certd/acme-client
|
||||
|
||||
@@ -147,21 +147,6 @@ const autoOpts = {
|
||||
const certificate = await client.auto(autoOpts);
|
||||
```
|
||||
|
||||
### Challenge priority
|
||||
|
||||
When ordering a certificate using auto mode, `acme-client` uses a priority list when selecting challenges to respond to. Its default value is `['http-01', 'dns-01']` which translates to "use `http-01` if any challenges exist, otherwise fall back to `dns-01`".
|
||||
|
||||
While most challenges can be validated using the method of your choosing, please note that **wildcard certificates can only be validated through `dns-01`**. More information regarding Let's Encrypt challenge types [can be found here](https://letsencrypt.org/docs/challenge-types/).
|
||||
|
||||
To modify challenge priority, provide a list of challenge types in `challengePriority`:
|
||||
|
||||
```js
|
||||
await client.auto({
|
||||
...,
|
||||
challengePriority: ['http-01', 'dns-01'],
|
||||
});
|
||||
```
|
||||
|
||||
### Internal challenge verification
|
||||
|
||||
When using auto mode, `acme-client` will first validate that challenges are satisfied internally before completing the challenge at the ACME provider. In some cases (firewalls, etc) this internal challenge verification might not be possible to complete.
|
||||
|
||||
@@ -49,7 +49,6 @@ function log(m) {
|
||||
csr,
|
||||
email: 'test@example.com',
|
||||
termsOfServiceAgreed: true,
|
||||
challengePriority: ['dns-01'],
|
||||
challengeCreateFn: (authz, challenge, keyAuthorization) => {
|
||||
/* TODO: Implement this */
|
||||
log(`[TODO] Add TXT record key=_acme-challenge.${authz.identifier.value} value=${keyAuthorization}`);
|
||||
|
||||
@@ -60,7 +60,6 @@ async function getCertOnDemand(client, servername, attempt = 0) {
|
||||
csr,
|
||||
email: 'test@example.com',
|
||||
termsOfServiceAgreed: true,
|
||||
challengePriority: ['http-01'],
|
||||
challengeCreateFn: (authz, challenge, keyAuthorization) => {
|
||||
challengeResponses[challenge.token] = keyAuthorization;
|
||||
},
|
||||
|
||||
@@ -59,7 +59,6 @@ async function getCertOnDemand(client, servername, attempt = 0) {
|
||||
csr,
|
||||
email: 'test@example.com',
|
||||
termsOfServiceAgreed: true,
|
||||
challengePriority: ['tls-alpn-01'],
|
||||
challengeCreateFn: async (authz, challenge, keyAuthorization) => {
|
||||
alpnResponses[authz.identifier.value] = await acme.crypto.createAlpnCertificate(authz, keyAuthorization);
|
||||
},
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"description": "Simple and unopinionated ACME client",
|
||||
"private": false,
|
||||
"author": "nmorsman",
|
||||
"version": "1.43.0",
|
||||
"version": "1.44.0",
|
||||
"type": "module",
|
||||
"module": "./dist/index.js",
|
||||
"main": "./dist/index.js",
|
||||
@@ -18,7 +18,7 @@
|
||||
"types"
|
||||
],
|
||||
"dependencies": {
|
||||
"@certd/basic": "^1.43.0",
|
||||
"@certd/basic": "^1.44.0",
|
||||
"@peculiar/x509": "^1.11.0",
|
||||
"asn1js": "^3.0.5",
|
||||
"axios": "^1.9.0",
|
||||
@@ -44,21 +44,21 @@
|
||||
"mocha": "^10.6.0",
|
||||
"nock": "^13.5.4",
|
||||
"prettier": "3.3.3",
|
||||
"rimraf": "^5.0.5",
|
||||
"ts-node": "^10.9.2",
|
||||
"tsd": "^0.31.1",
|
||||
"typescript": "^5.4.2",
|
||||
"rimraf": "^5.0.5"
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"scripts": {
|
||||
"before-build": "node -e \"const fs=require('fs');fs.rmSync('dist',{recursive:true,force:true});fs.rmSync('tsconfig.tsbuildinfo',{force:true});\"",
|
||||
"before-build": "rimraf dist && rimraf dist-test && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache",
|
||||
"build": "npm run before-build && tsc -p tsconfig.build.json --skipLibCheck",
|
||||
"lint": "eslint --fix \"src/**/*.ts\" \"types/**/*.ts\"",
|
||||
"lint-types": "tsd --files \"types/index.test-d.ts\"",
|
||||
"prepublishOnly": "npm run build",
|
||||
"test": "mocha -t 60000 \"test/setup.js\" \"test/**/*.spec.js\"",
|
||||
"before-test:unit": "node -e \"const fs=require('fs');fs.rmSync('dist-test',{recursive:true,force:true});fs.rmSync('tsconfig.test.tsbuildinfo',{force:true});\"",
|
||||
"test:unit": "cross-env NODE_ENV=unittest npm run before-test:unit && cross-env NODE_ENV=unittest tsc -p tsconfig.test.json --skipLibCheck && cross-env NODE_ENV=unittest mocha -t 60000 \"dist-test/**/*.test.js\"",
|
||||
"test:unit": "cross-env NODE_ENV=unittest mocha --node-option no-warnings --node-option loader=ts-node/esm \"src/**/*.test.ts\"",
|
||||
"pub": "npm publish",
|
||||
"compile": "rimraf dist &&tsc --skipLibCheck --watch",
|
||||
"compile": " tsc --skipLibCheck --watch",
|
||||
"format": "prettier --write src"
|
||||
},
|
||||
"repository": {
|
||||
@@ -76,5 +76,5 @@
|
||||
"bugs": {
|
||||
"url": "https://github.com/publishlab/node-acme-client/issues"
|
||||
},
|
||||
"gitHead": "5558376baee9e3568b00a8355a23898427efadf8"
|
||||
"gitHead": "b40bc1b4876711f89bd05f197c88f110964d9d07"
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ class AcmeApi {
|
||||
getLocationFromHeader(resp) {
|
||||
let locationUrl = resp.headers.location;
|
||||
const mapping = this.http.urlMapping;
|
||||
// 服务器返回的是反代地址,这里还原为 ACME 原始资源 URL,供后续 JWS url 使用。
|
||||
if (mapping.mappings) {
|
||||
// eslint-disable-next-line guard-for-in,no-restricted-syntax
|
||||
for (const key in mapping.mappings) {
|
||||
|
||||
@@ -16,7 +16,6 @@ const defaultOpts = {
|
||||
preferredChain: null,
|
||||
termsOfServiceAgreed: false,
|
||||
skipChallengeVerification: false,
|
||||
challengePriority: ["http-01", "dns-01"],
|
||||
challengeCreateFn: async () => {
|
||||
throw new Error("Missing challengeCreateFn()");
|
||||
},
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
* Axios instance
|
||||
*/
|
||||
import axios from 'axios';
|
||||
import { parseRetryAfterHeader } from './util.js';
|
||||
const { AxiosError } = axios;
|
||||
import {getGlobalAgents, HttpError} from '@certd/basic'
|
||||
import { log } from './logger.js';
|
||||
@@ -113,12 +112,9 @@ instance.interceptors.response.use(null, async (error) => {
|
||||
log(`Caught ${code}, retry attempt ${config.retryAttempt}/${retryMaxAttempts} to URL ${config.url}`);
|
||||
|
||||
const retryAfter = (retryDefaultDelay * config.retryAttempt);
|
||||
/* Attempt to parse Retry-After header, fallback to default delay */
|
||||
const headerRetryAfter = response ? parseRetryAfterHeader(response.headers['retry-after']) : 0;
|
||||
|
||||
if (headerRetryAfter > 0) {
|
||||
const waitMinutes = (headerRetryAfter / 60).toFixed(1);
|
||||
log(`Found retry-after response header with value: ${response.headers['retry-after']}, waiting ${waitMinutes} minutes`);
|
||||
if (response?.status === 429) {
|
||||
// CA 限流按产品策略立即失败,不能依据 Retry-After 自动重试,避免继续消耗配额。
|
||||
log(`CA rate limit encountered (HTTP 429), failing immediately; Retry-After=${response.headers['retry-after']}`);
|
||||
log(JSON.stringify(response.data));
|
||||
return Promise.reject(new HttpError(error));
|
||||
}
|
||||
|
||||
@@ -263,7 +263,14 @@ class AcmeClient {
|
||||
const accountUrl = this.api.getAccountUrl();
|
||||
|
||||
/* Create new HTTP and API clients using new key */
|
||||
const newHttpClient = new HttpClient(this.opts.directoryUrl, newAccountKey, this.opts.externalAccountBinding);
|
||||
const newHttpClient = new HttpClient(
|
||||
this.opts.directoryUrl,
|
||||
newAccountKey,
|
||||
this.opts.externalAccountBinding,
|
||||
this.opts.urlMapping,
|
||||
this.logger,
|
||||
true,
|
||||
);
|
||||
const newApiClient = new AcmeApi(newHttpClient, accountUrl);
|
||||
|
||||
/* Get old JWK */
|
||||
@@ -280,6 +287,8 @@ class AcmeClient {
|
||||
/* Replace existing HTTP and API client */
|
||||
this.http = newHttpClient;
|
||||
this.api = newApiClient;
|
||||
// 更新本地配置,避免后续重建客户端时又使用旧账号密钥。
|
||||
this.opts.accountKey = newAccountKey;
|
||||
|
||||
return resp.data;
|
||||
}
|
||||
@@ -709,7 +718,6 @@ class AcmeClient {
|
||||
* @param {string} [opts.email] Account email address
|
||||
* @param {boolean} [opts.termsOfServiceAgreed] Agree to Terms of Service, default: `false`
|
||||
* @param {boolean} [opts.skipChallengeVerification] Skip internal challenge verification before notifying ACME provider, default: `false`
|
||||
* @param {string[]} [opts.challengePriority] Array defining challenge type priority, default: `['http-01', 'dns-01']`
|
||||
* @param {string} [opts.preferredChain] Indicate which certificate chain is preferred if a CA offers multiple, by exact issuer common name, default: `null`
|
||||
* @returns {Promise<string>} Certificate
|
||||
*
|
||||
|
||||
@@ -527,6 +527,8 @@ export const createAlpnCertificate = async (authz, keyAuthorization, keyPem = nu
|
||||
}
|
||||
|
||||
const now = new Date();
|
||||
// TLS-ALPN-01 只需要一张短期挑战证书;有效期不能为零,否则部分 TLS 实现会直接拒绝。
|
||||
const notAfter = new Date(now.getTime() + 24 * 60 * 60 * 1000);
|
||||
const commonName = authz.identifier.value;
|
||||
|
||||
/* Pseudo-random serial - max 20 bytes, 11 for epoch (year 5138), 9 random */
|
||||
@@ -537,14 +539,8 @@ export const createAlpnCertificate = async (authz, keyAuthorization, keyPem = nu
|
||||
const [keys, signingAlgorithm] = await getWebCryptoKeyPair(keyPem);
|
||||
|
||||
const extensions = [
|
||||
/* https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.3 */
|
||||
new x509.KeyUsagesExtension(x509.KeyUsageFlags.keyCertSign | x509.KeyUsageFlags.cRLSign, true), // eslint-disable-line no-bitwise
|
||||
|
||||
/* https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.9 */
|
||||
new x509.BasicConstraintsExtension(true, 2, true),
|
||||
|
||||
/* https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.2 */
|
||||
await x509.SubjectKeyIdentifierExtension.create(keys.publicKey),
|
||||
/* TLS 服务端挑战证书只用于签名,不是 CA 证书。 */
|
||||
new x509.KeyUsagesExtension(x509.KeyUsageFlags.digitalSignature, true),
|
||||
|
||||
/* https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.6 */
|
||||
createSubjectAltNameExtension([commonName]),
|
||||
@@ -562,7 +558,7 @@ export const createAlpnCertificate = async (authz, keyAuthorization, keyPem = nu
|
||||
extensions,
|
||||
serialNumber,
|
||||
notBefore: now,
|
||||
notAfter: now,
|
||||
notAfter,
|
||||
name: createCsrSubject({
|
||||
CN: commonName,
|
||||
}),
|
||||
|
||||
@@ -72,6 +72,7 @@ class HttpClient {
|
||||
*/
|
||||
|
||||
async request(url, method, opts = {}) {
|
||||
// 仅替换实际传输地址;signedRequest 已在映射前用 ACME 原始 URL 生成 JWS,协议要求两者保持一致。
|
||||
if (this.urlMapping && this.urlMapping.enabled && this.urlMapping.mappings) {
|
||||
// eslint-disable-next-line no-restricted-syntax
|
||||
for (const key in this.urlMapping.mappings) {
|
||||
|
||||
@@ -55,7 +55,6 @@ export interface ClientAutoOptions {
|
||||
email?: string;
|
||||
termsOfServiceAgreed?: boolean;
|
||||
skipChallengeVerification?: boolean;
|
||||
challengePriority?: string[];
|
||||
preferredChain?: string;
|
||||
signal?: AbortSignal;
|
||||
profile?: string;
|
||||
|
||||
@@ -13,8 +13,10 @@ import { utils } from '@certd/basic'
|
||||
|
||||
const dns = dnsSdk.promises
|
||||
|
||||
// 管理员可按当前部署环境全局开关权威 DNS 查询(例如内网环境可能无法访问权威服务器)。
|
||||
let walkFromAuthoritative = true
|
||||
export function setWalkFromAuthoritative(value = true) {
|
||||
// 这是进程级配置,修改后影响后续所有 ACME DNS-01 本地校验。
|
||||
walkFromAuthoritative = value
|
||||
}
|
||||
|
||||
|
||||
@@ -81,26 +81,17 @@ describe('http', () => {
|
||||
* Retry on HTTP errors
|
||||
*/
|
||||
|
||||
it('should retry on 429 rate limit', async () => {
|
||||
it('should fail immediately on 429 rate limit', async () => {
|
||||
let rateLimitCount = 0;
|
||||
|
||||
nock(endpoint).persist().get('/').reply(() => {
|
||||
rateLimitCount += 1;
|
||||
|
||||
if (rateLimitCount < 3) {
|
||||
return [429, 'Rate Limit Exceeded', { 'Retry-After': 1 }];
|
||||
}
|
||||
|
||||
return [200, 'ok'];
|
||||
return [429, 'Rate Limit Exceeded', { 'Retry-After': 1 }];
|
||||
});
|
||||
|
||||
assert.strictEqual(rateLimitCount, 0);
|
||||
const resp = await testClient.request(endpoint, 'get');
|
||||
|
||||
assert.isObject(resp);
|
||||
assert.strictEqual(resp.status, 200);
|
||||
assert.strictEqual(resp.data, 'ok');
|
||||
assert.strictEqual(rateLimitCount, 3);
|
||||
await assert.isRejected(testClient.request(endpoint, 'get'));
|
||||
assert.strictEqual(rateLimitCount, 1);
|
||||
});
|
||||
|
||||
it('should retry on 5xx server error', async () => {
|
||||
|
||||
@@ -251,6 +251,13 @@ describe('crypto', () => {
|
||||
testAlpnCertificate = cert;
|
||||
});
|
||||
|
||||
it(`${n}/should generate alpn certificate with a non-zero validity period`, () => {
|
||||
const info = crypto.readCertificateInfo(testAlpnCertificate);
|
||||
|
||||
assert.isBelow(info.notBefore.getTime(), info.notAfter.getTime());
|
||||
assert.isAtMost(info.notAfter.getTime() - info.notBefore.getTime(), 24 * 60 * 60 * 1000);
|
||||
});
|
||||
|
||||
it(`${n}/should generate alpn certificate with key as string`, async () => {
|
||||
const k = await createFn();
|
||||
const authz = { identifier: { value: 'test.example.com' } };
|
||||
|
||||
@@ -235,7 +235,6 @@ describe('client.auto', () => {
|
||||
termsOfServiceAgreed: true,
|
||||
challengeCreateFn: cts.assertHttpChallengeCreateFn,
|
||||
challengeRemoveFn: cts.challengeRemoveFn,
|
||||
challengePriority: ['http-01'],
|
||||
});
|
||||
|
||||
assert.isString(cert);
|
||||
@@ -251,7 +250,6 @@ describe('client.auto', () => {
|
||||
termsOfServiceAgreed: true,
|
||||
challengeCreateFn: cts.assertHttpsChallengeCreateFn,
|
||||
challengeRemoveFn: cts.challengeRemoveFn,
|
||||
challengePriority: ['http-01'],
|
||||
});
|
||||
|
||||
assert.isString(cert);
|
||||
@@ -267,7 +265,6 @@ describe('client.auto', () => {
|
||||
termsOfServiceAgreed: true,
|
||||
challengeCreateFn: cts.assertDnsChallengeCreateFn,
|
||||
challengeRemoveFn: cts.challengeRemoveFn,
|
||||
challengePriority: ['dns-01'],
|
||||
});
|
||||
|
||||
assert.isString(cert);
|
||||
@@ -283,7 +280,6 @@ describe('client.auto', () => {
|
||||
termsOfServiceAgreed: true,
|
||||
challengeCreateFn: cts.assertTlsAlpnChallengeCreateFn,
|
||||
challengeRemoveFn: cts.challengeRemoveFn,
|
||||
challengePriority: ['tls-alpn-01'],
|
||||
});
|
||||
|
||||
assert.isString(cert);
|
||||
|
||||
-1
@@ -62,7 +62,6 @@ export interface ClientAutoOptions {
|
||||
email?: string;
|
||||
termsOfServiceAgreed?: boolean;
|
||||
skipChallengeVerification?: boolean;
|
||||
challengePriority?: string[];
|
||||
preferredChain?: string;
|
||||
signal?: AbortSignal;
|
||||
profile?:string;
|
||||
|
||||
@@ -65,7 +65,6 @@ import * as acme from '..';
|
||||
email: 'test@example.com',
|
||||
termsOfServiceAgreed: false,
|
||||
skipChallengeVerification: false,
|
||||
challengePriority: ['http-01', 'dns-01'],
|
||||
preferredChain: 'DST Root CA X3',
|
||||
challengeCreateFn: async (authz, keyAuthorization) => ({
|
||||
challenge: authz.challenges[0],
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
# [1.44.0](https://github.com/certd/certd/compare/v1.43.0...v1.44.0) (2026-08-28)
|
||||
|
||||
### Features
|
||||
|
||||
* 新增证书吊销后置任务与证书状态管理 ([1cc9641](https://github.com/certd/certd/commit/1cc9641f5669710d1e5809995ad395c843855a12))
|
||||
|
||||
# [1.43.0](https://github.com/certd/certd/compare/v1.42.6...v1.43.0) (2026-08-14)
|
||||
|
||||
**Note:** Version bump only for package @certd/basic
|
||||
|
||||
@@ -1 +1 @@
|
||||
23:03
|
||||
00:39
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/basic",
|
||||
"private": false,
|
||||
"version": "1.43.0",
|
||||
"version": "1.44.0",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"module": "./dist/index.js",
|
||||
@@ -15,7 +15,7 @@
|
||||
"test": "mocha --loader=ts-node/esm",
|
||||
"test:unit": "cross-env NODE_ENV=unittest mocha --node-option no-warnings --node-option loader=ts-node/esm \"src/**/*.test.ts\"",
|
||||
"pub": "npm publish",
|
||||
"compile": "rimraf dist && tsc --skipLibCheck --watch",
|
||||
"compile": " tsc --skipLibCheck --watch",
|
||||
"format": "prettier --write src",
|
||||
"lint": "eslint --fix --ext .ts src"
|
||||
},
|
||||
@@ -54,5 +54,5 @@
|
||||
"tslib": "^2.8.1",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"gitHead": "5558376baee9e3568b00a8355a23898427efadf8"
|
||||
"gitHead": "b40bc1b4876711f89bd05f197c88f110964d9d07"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,13 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
# [1.44.0](https://github.com/certd/certd/compare/v1.43.0...v1.44.0) (2026-08-28)
|
||||
|
||||
### Features
|
||||
|
||||
* 新增证书吊销后置任务与证书状态管理 ([1cc9641](https://github.com/certd/certd/commit/1cc9641f5669710d1e5809995ad395c843855a12))
|
||||
* 支持在线插件下载安装审核等 ([255960d](https://github.com/certd/certd/commit/255960d434eebb3d567a08f737f1642ab417b5d0))
|
||||
|
||||
# [1.43.0](https://github.com/certd/certd/compare/v1.42.6...v1.43.0) (2026-08-14)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/pipeline",
|
||||
"private": false,
|
||||
"version": "1.43.0",
|
||||
"version": "1.44.0",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"module": "./dist/index.js",
|
||||
@@ -14,15 +14,15 @@
|
||||
"build3": "rollup -c",
|
||||
"preview": "vite preview",
|
||||
"test": "mocha --loader=ts-node/esm",
|
||||
"test:unit": "cross-env NODE_ENV=unittest mocha --no-config --node-option no-warnings --node-option loader=ts-node/esm \"src/**/*.test.ts\"",
|
||||
"test:unit": "cross-env NODE_ENV=unittest mocha --node-option no-warnings --node-option loader=ts-node/esm \"src/**/*.test.ts\"",
|
||||
"pub": "npm publish",
|
||||
"compile": "rimraf dist && tsc --skipLibCheck --watch",
|
||||
"compile": "tsc --skipLibCheck --watch",
|
||||
"format": "prettier --write src",
|
||||
"lint": "eslint --fix --ext .ts src"
|
||||
},
|
||||
},
|
||||
"dependencies": {
|
||||
"@certd/basic": "^1.43.0",
|
||||
"@certd/plus-core": "^1.43.0",
|
||||
"@certd/basic": "^1.44.0",
|
||||
"@certd/plus-core": "^1.44.0",
|
||||
"dayjs": "^1.11.7",
|
||||
"lodash-es": "^4.17.21",
|
||||
"reflect-metadata": "^0.2.2"
|
||||
@@ -51,5 +51,5 @@
|
||||
"tslib": "^2.8.1",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"gitHead": "5558376baee9e3568b00a8355a23898427efadf8"
|
||||
"gitHead": "b40bc1b4876711f89bd05f197c88f110964d9d07"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
# [1.44.0](https://github.com/certd/certd/compare/v1.43.0...v1.44.0) (2026-08-28)
|
||||
|
||||
### Features
|
||||
|
||||
* 新增证书吊销后置任务与证书状态管理 ([1cc9641](https://github.com/certd/certd/commit/1cc9641f5669710d1e5809995ad395c843855a12))
|
||||
|
||||
# [1.43.0](https://github.com/certd/certd/compare/v1.42.6...v1.43.0) (2026-08-14)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-huawei
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/lib-huawei",
|
||||
"private": false,
|
||||
"version": "1.43.0",
|
||||
"version": "1.44.0",
|
||||
"main": "./dist/bundle.js",
|
||||
"module": "./dist/bundle.js",
|
||||
"types": "./dist/d/index.d.ts",
|
||||
@@ -13,7 +13,7 @@
|
||||
"preview": "vite preview",
|
||||
"test:unit": "cross-env NODE_ENV=unittest echo no unit tests",
|
||||
"pub": "npm publish",
|
||||
"compile": "rimraf dist && npm run build",
|
||||
"compile": " npm run build",
|
||||
"format": "prettier --write src",
|
||||
"lint": "eslint --fix --ext .ts src"
|
||||
},
|
||||
@@ -31,5 +31,5 @@
|
||||
"prettier": "3.3.3",
|
||||
"tslib": "^2.8.1"
|
||||
},
|
||||
"gitHead": "5558376baee9e3568b00a8355a23898427efadf8"
|
||||
"gitHead": "b40bc1b4876711f89bd05f197c88f110964d9d07"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,17 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
# [1.44.0](https://github.com/certd/certd/compare/v1.43.0...v1.44.0) (2026-08-28)
|
||||
|
||||
### Features
|
||||
|
||||
* 新增证书吊销后置任务与证书状态管理 ([1cc9641](https://github.com/certd/certd/commit/1cc9641f5669710d1e5809995ad395c843855a12))
|
||||
* 支持在线插件下载安装审核等 ([255960d](https://github.com/certd/certd/commit/255960d434eebb3d567a08f737f1642ab417b5d0))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* **plugin:** 新增插件评分展示、排序与个人插件筛选功能 ([7ab5029](https://github.com/certd/certd/commit/7ab502991e0c001777b268b9f159311ef5e000a0))
|
||||
|
||||
# [1.43.0](https://github.com/certd/certd/compare/v1.42.6...v1.43.0) (2026-08-14)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-iframe
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/lib-iframe",
|
||||
"private": false,
|
||||
"version": "1.43.0",
|
||||
"version": "1.44.0",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"module": "./dist/index.js",
|
||||
@@ -16,7 +16,7 @@
|
||||
"preview": "vite preview",
|
||||
"test:unit": "cross-env NODE_ENV=unittest echo no unit tests",
|
||||
"pub": "npm publish",
|
||||
"compile": "rimraf dist && npm run build",
|
||||
"compile": " npm run build",
|
||||
"format": "prettier --write src",
|
||||
"lint": "eslint --fix --ext .ts src"
|
||||
},
|
||||
@@ -37,5 +37,5 @@
|
||||
"tslib": "^2.8.1",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"gitHead": "5558376baee9e3568b00a8355a23898427efadf8"
|
||||
"gitHead": "b40bc1b4876711f89bd05f197c88f110964d9d07"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
# [1.44.0](https://github.com/certd/certd/compare/v1.43.0...v1.44.0) (2026-08-28)
|
||||
|
||||
**Note:** Version bump only for package @certd/jdcloud
|
||||
|
||||
# [1.43.0](https://github.com/certd/certd/compare/v1.42.6...v1.43.0) (2026-08-14)
|
||||
|
||||
**Note:** Version bump only for package @certd/jdcloud
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@certd/jdcloud",
|
||||
"version": "1.43.0",
|
||||
"version": "1.44.0",
|
||||
"description": "jdcloud openApi sdk",
|
||||
"main": "./dist/bundle.js",
|
||||
"module": "./dist/bundle.js",
|
||||
@@ -63,5 +63,5 @@
|
||||
"fetch"
|
||||
]
|
||||
},
|
||||
"gitHead": "5558376baee9e3568b00a8355a23898427efadf8"
|
||||
"gitHead": "b40bc1b4876711f89bd05f197c88f110964d9d07"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
# [1.44.0](https://github.com/certd/certd/compare/v1.43.0...v1.44.0) (2026-08-28)
|
||||
|
||||
### Features
|
||||
|
||||
* 新增证书吊销后置任务与证书状态管理 ([1cc9641](https://github.com/certd/certd/commit/1cc9641f5669710d1e5809995ad395c843855a12))
|
||||
|
||||
# [1.43.0](https://github.com/certd/certd/compare/v1.42.6...v1.43.0) (2026-08-14)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-k8s
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/lib-k8s",
|
||||
"private": false,
|
||||
"version": "1.43.0",
|
||||
"version": "1.44.0",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"module": "./dist/index.js",
|
||||
@@ -16,12 +16,12 @@
|
||||
"preview": "vite preview",
|
||||
"test:unit": "cross-env NODE_ENV=unittest echo no unit tests",
|
||||
"pub": "npm publish",
|
||||
"compile": "rimraf dist && tsc --skipLibCheck --watch",
|
||||
"compile": " tsc --skipLibCheck --watch",
|
||||
"format": "prettier --write src",
|
||||
"lint": "eslint --fix --ext .ts src"
|
||||
},
|
||||
"dependencies": {
|
||||
"@certd/basic": "^1.43.0",
|
||||
"@certd/basic": "^1.44.0",
|
||||
"@kubernetes/client-node": "0.21.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -38,5 +38,5 @@
|
||||
"tslib": "^2.8.1",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"gitHead": "5558376baee9e3568b00a8355a23898427efadf8"
|
||||
"gitHead": "b40bc1b4876711f89bd05f197c88f110964d9d07"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,21 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
# [1.44.0](https://github.com/certd/certd/compare/v1.43.0...v1.44.0) (2026-08-28)
|
||||
|
||||
### Features
|
||||
|
||||
* 实现自定义ACME证书颁发机构支持 ([97c417b](https://github.com/certd/certd/commit/97c417b1ad64b9a14bee8bfe98a2e789b9278820))
|
||||
* 新增证书吊销后置任务与证书状态管理 ([1cc9641](https://github.com/certd/certd/commit/1cc9641f5669710d1e5809995ad395c843855a12))
|
||||
* 支持审计日志,操作日志 ([f2855d6](https://github.com/certd/certd/commit/f2855d6dac74c9db71d92f99601e35c360b10666))
|
||||
* 支持在线插件下载安装审核等 ([255960d](https://github.com/certd/certd/commit/255960d434eebb3d567a08f737f1642ab417b5d0))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 新增自定义ACME管理功能,完善证书颁发机构适配 ([2ab23f5](https://github.com/certd/certd/commit/2ab23f50b216e27495fc823d2269ca0ba6366d15))
|
||||
* 移除全局反向代理配置,迁移到自定义ACME配置 ([c57110e](https://github.com/certd/certd/commit/c57110e42aada31dd0028b56b5baec1b19722525))
|
||||
* **login,settings:** 仅第三方登录开启后,在重启10分钟后将无法使用密码登录 ([1d12ad7](https://github.com/certd/certd/commit/1d12ad73c6ca827d2eb36bda867f9d9fe62dab48))
|
||||
|
||||
# [1.43.0](https://github.com/certd/certd/compare/v1.42.6...v1.43.0) (2026-08-14)
|
||||
|
||||
### Features
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@certd/lib-server",
|
||||
"version": "1.43.0",
|
||||
"version": "1.44.0",
|
||||
"description": "midway with flyway, sql upgrade way ",
|
||||
"private": false,
|
||||
"type": "module",
|
||||
@@ -17,7 +17,7 @@
|
||||
"cov": "midway-bin cov --ts",
|
||||
"prepublish": "npm run build",
|
||||
"pub": "npm publish",
|
||||
"compile": "rimraf dist && tsc --skipLibCheck --watch",
|
||||
"compile": " tsc --skipLibCheck --watch",
|
||||
"format": "prettier --write src",
|
||||
"lint": "eslint --fix --ext .ts src"
|
||||
},
|
||||
@@ -29,11 +29,11 @@
|
||||
],
|
||||
"license": "AGPL",
|
||||
"dependencies": {
|
||||
"@certd/acme-client": "^1.43.0",
|
||||
"@certd/basic": "^1.43.0",
|
||||
"@certd/pipeline": "^1.43.0",
|
||||
"@certd/plugin-lib": "^1.43.0",
|
||||
"@certd/plus-core": "^1.43.0",
|
||||
"@certd/acme-client": "^1.44.0",
|
||||
"@certd/basic": "^1.44.0",
|
||||
"@certd/pipeline": "^1.44.0",
|
||||
"@certd/plugin-lib": "^1.44.0",
|
||||
"@certd/plus-core": "^1.44.0",
|
||||
"@midwayjs/cache": "3.14.0",
|
||||
"@midwayjs/core": "3.20.11",
|
||||
"@midwayjs/i18n": "3.20.13",
|
||||
@@ -69,5 +69,5 @@
|
||||
"typeorm": "^0.3.20",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"gitHead": "5558376baee9e3568b00a8355a23898427efadf8"
|
||||
"gitHead": "b40bc1b4876711f89bd05f197c88f110964d9d07"
|
||||
}
|
||||
|
||||
@@ -163,6 +163,7 @@ export abstract class BaseService<T> {
|
||||
const now = new Date();
|
||||
param.createTime = now;
|
||||
param.updateTime = now;
|
||||
delete param.id;
|
||||
await this.addOrUpdate(param);
|
||||
await this.modifyAfter(param);
|
||||
return {
|
||||
@@ -175,7 +176,9 @@ export abstract class BaseService<T> {
|
||||
* @param param 数据
|
||||
*/
|
||||
async update(param: any) {
|
||||
if (!param.id) throw new ValidateException("id 不能为空");
|
||||
if (!param.id) {
|
||||
throw new ValidateException("id 不能为空");
|
||||
}
|
||||
param.updateTime = new Date();
|
||||
await this.addOrUpdate(param);
|
||||
await this.modifyAfter(param);
|
||||
|
||||
@@ -56,6 +56,10 @@ export class SysPublicSettings extends BaseSettings {
|
||||
|
||||
// 第三方OAuth配置
|
||||
oauthEnabled?: boolean = false;
|
||||
oauthOnly?: boolean = false;
|
||||
passkeyEnabled?: boolean = false;
|
||||
oauthAutoRedirect?: boolean = false;
|
||||
oauthAutoRegister?: boolean = false;
|
||||
oauthProviders: Record<
|
||||
string,
|
||||
{
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
# [1.44.0](https://github.com/certd/certd/compare/v1.43.0...v1.44.0) (2026-08-28)
|
||||
|
||||
### Features
|
||||
|
||||
* 新增证书吊销后置任务与证书状态管理 ([1cc9641](https://github.com/certd/certd/commit/1cc9641f5669710d1e5809995ad395c843855a12))
|
||||
|
||||
# [1.43.0](https://github.com/certd/certd/compare/v1.42.6...v1.43.0) (2026-08-14)
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@certd/midway-flyway-js",
|
||||
"version": "1.43.0",
|
||||
"version": "1.44.0",
|
||||
"description": "midway with flyway, sql upgrade way ",
|
||||
"private": false,
|
||||
"type": "module",
|
||||
@@ -17,7 +17,7 @@
|
||||
"cov": "midway-bin cov --ts",
|
||||
"prepublish": "npm run build",
|
||||
"pub": "npm publish",
|
||||
"compile": "rimraf dist && npm run build",
|
||||
"compile": " npm run build",
|
||||
"format": "prettier --write src",
|
||||
"lint": "eslint --fix --ext .ts src"
|
||||
},
|
||||
@@ -52,5 +52,5 @@
|
||||
"typeorm": "^0.3.20",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"gitHead": "5558376baee9e3568b00a8355a23898427efadf8"
|
||||
"gitHead": "b40bc1b4876711f89bd05f197c88f110964d9d07"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
# [1.44.0](https://github.com/certd/certd/compare/v1.43.0...v1.44.0) (2026-08-28)
|
||||
|
||||
**Note:** Version bump only for package @certd/plugin-cert
|
||||
|
||||
# [1.43.0](https://github.com/certd/certd/compare/v1.42.6...v1.43.0) (2026-08-14)
|
||||
|
||||
**Note:** Version bump only for package @certd/plugin-cert
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/plugin-cert",
|
||||
"private": false,
|
||||
"version": "1.43.0",
|
||||
"version": "1.44.0",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -20,7 +20,7 @@
|
||||
"lint": "eslint --fix --ext .ts src"
|
||||
},
|
||||
"dependencies": {
|
||||
"@certd/plugin-lib": "^1.43.0"
|
||||
"@certd/plugin-lib": "^1.44.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/chai": "^4.3.12",
|
||||
@@ -38,5 +38,5 @@
|
||||
"tslib": "^2.8.1",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"gitHead": "5558376baee9e3568b00a8355a23898427efadf8"
|
||||
"gitHead": "b40bc1b4876711f89bd05f197c88f110964d9d07"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,16 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
# [1.44.0](https://github.com/certd/certd/compare/v1.43.0...v1.44.0) (2026-08-28)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复证书申请时EAB判断逻辑,已选择Acme账号的情况下不需要EAB ([d87821e](https://github.com/certd/certd/commit/d87821ee02b17136fc925df4547223332bf22823))
|
||||
|
||||
### Features
|
||||
|
||||
* 新增证书吊销后置任务与证书状态管理 ([1cc9641](https://github.com/certd/certd/commit/1cc9641f5669710d1e5809995ad395c843855a12))
|
||||
|
||||
# [1.43.0](https://github.com/certd/certd/compare/v1.42.6...v1.43.0) (2026-08-14)
|
||||
|
||||
**Note:** Version bump only for package @certd/plugin-lib
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/plugin-lib",
|
||||
"private": false,
|
||||
"version": "1.43.0",
|
||||
"version": "1.44.0",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -12,14 +12,14 @@
|
||||
"dev-build": "npm run build",
|
||||
"test:unit": "cross-env NODE_ENV=unittest mocha",
|
||||
"pub": "npm publish",
|
||||
"compile": "rimraf dist && tsc --skipLibCheck --watch",
|
||||
"compile": " tsc --skipLibCheck --watch",
|
||||
"format": "prettier --write src",
|
||||
"lint": "eslint --fix --ext .ts src"
|
||||
},
|
||||
"dependencies": {
|
||||
"@certd/acme-client": "^1.43.0",
|
||||
"@certd/basic": "^1.43.0",
|
||||
"@certd/pipeline": "^1.43.0",
|
||||
"@certd/acme-client": "^1.44.0",
|
||||
"@certd/basic": "^1.44.0",
|
||||
"@certd/pipeline": "^1.44.0",
|
||||
"dayjs": "^1.11.7",
|
||||
"jszip": "^3.10.1",
|
||||
"lodash-es": "^4.17.21",
|
||||
@@ -45,5 +45,5 @@
|
||||
"tslib": "^2.8.1",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"gitHead": "5558376baee9e3568b00a8355a23898427efadf8"
|
||||
"gitHead": "b40bc1b4876711f89bd05f197c88f110964d9d07"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,36 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
# [1.44.0](https://github.com/certd/certd/compare/v1.43.0...v1.44.0) (2026-08-28)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **plugin-ai-dev:** 优化AI插件测试流程并修复日志获取问题 ([faf9828](https://github.com/certd/certd/commit/faf9828168f6ce82adc530a65eaf313d6c9904b5))
|
||||
* **plugin-item-card:** 移除分数格式化时去掉.0的逻辑 ([a91d7c0](https://github.com/certd/certd/commit/a91d7c000a2aa6456a249433ff90a47787ec90f0))
|
||||
|
||||
### Features
|
||||
|
||||
* 实现自定义ACME证书颁发机构支持 ([97c417b](https://github.com/certd/certd/commit/97c417b1ad64b9a14bee8bfe98a2e789b9278820))
|
||||
* 新增证书吊销后置任务与证书状态管理 ([1cc9641](https://github.com/certd/certd/commit/1cc9641f5669710d1e5809995ad395c843855a12))
|
||||
* 新增AI插件开发全流程能力 ([6f9dffe](https://github.com/certd/certd/commit/6f9dffe6e59cc125bd394d7db6086d66a9c71e49))
|
||||
* 支持审计日志,操作日志 ([f2855d6](https://github.com/certd/certd/commit/f2855d6dac74c9db71d92f99601e35c360b10666))
|
||||
* 支持在线插件下载安装审核等 ([255960d](https://github.com/certd/certd/commit/255960d434eebb3d567a08f737f1642ab417b5d0))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 新增AI插件开发受限令牌与隔离API ([3a9069f](https://github.com/certd/certd/commit/3a9069f6e6242940229fd63c686f7e445408dbbb))
|
||||
* 统一将路由前缀从/certd改为/cert ([4db0f83](https://github.com/certd/certd/commit/4db0f83304dc6fd9199673c48b1805421f024601))
|
||||
* 新增官方客户端Certd Client的多语言配置与页面入口 ([fbfe125](https://github.com/certd/certd/commit/fbfe1256a5c8be6dfb2fbae7e6130eb5f6c6d946))
|
||||
* 新增证书吊销功能,添加证书状态字段 ([5074572](https://github.com/certd/certd/commit/5074572694383c8e1bf2880e26827987683dc62c))
|
||||
* 新增自定义ACME管理功能,完善证书颁发机构适配 ([2ab23f5](https://github.com/certd/certd/commit/2ab23f50b216e27495fc823d2269ca0ba6366d15))
|
||||
* 移除全局反向代理配置,迁移到自定义ACME配置 ([c57110e](https://github.com/certd/certd/commit/c57110e42aada31dd0028b56b5baec1b19722525))
|
||||
* 增加稳定版,预览版区分,预览版是最新版,稳定版在预览版验证稳定后,再将预览版转为稳定版 ([1574090](https://github.com/certd/certd/commit/15740904e5e97ee767c39e4401dbc1d645795c38))
|
||||
* 支持AI开发在线插件 ([eae7edb](https://github.com/certd/certd/commit/eae7edbda0fd7357163f33fb4084fcba21396f5f))
|
||||
* **domain:** 域名管理增加remark字段 ([e4041ea](https://github.com/certd/certd/commit/e4041eabece1bab2c1c4b955129cf7a7fe7302d0))
|
||||
* **login,settings:** 仅第三方登录开启后,在重启10分钟后将无法使用密码登录 ([1d12ad7](https://github.com/certd/certd/commit/1d12ad73c6ca827d2eb36bda867f9d9fe62dab48))
|
||||
* **plugin:** 插件安装支持检测依赖 ([e79660c](https://github.com/certd/certd/commit/e79660c5d17ed4049508a00a359950a54470332f))
|
||||
* **plugin:** 新增插件评分展示、排序与个人插件筛选功能 ([7ab5029](https://github.com/certd/certd/commit/7ab502991e0c001777b268b9f159311ef5e000a0))
|
||||
|
||||
# [1.43.0](https://github.com/certd/certd/compare/v1.42.6...v1.43.0) (2026-08-14)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@certd/ui-client",
|
||||
"version": "1.43.0",
|
||||
"version": "1.44.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vite --open",
|
||||
@@ -104,8 +104,8 @@
|
||||
"zod-defaults": "^0.1.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@certd/lib-iframe": "^1.43.0",
|
||||
"@certd/pipeline": "^1.43.0",
|
||||
"@certd/lib-iframe": "^1.44.0",
|
||||
"@certd/pipeline": "^1.44.0",
|
||||
"@rollup/plugin-commonjs": "^25.0.7",
|
||||
"@rollup/plugin-node-resolve": "^15.2.3",
|
||||
"@types/chai": "^4.3.12",
|
||||
|
||||
+1
-1
@@ -399,7 +399,7 @@ watch(
|
||||
width: 80px;
|
||||
}
|
||||
.input {
|
||||
width: 150px;
|
||||
width: 180px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import { useUserStore } from "/@/store/user";
|
||||
import { env } from "/@/utils/util.env";
|
||||
import { mitter } from "/@/utils/util.mitt";
|
||||
import VipModalContent from "./vip-modal-content.vue";
|
||||
import { registerOnceVipModal } from "./once";
|
||||
const { t } = useI18n();
|
||||
|
||||
defineOptions({
|
||||
@@ -258,7 +259,7 @@ function openUpgrade() {
|
||||
});
|
||||
}
|
||||
onMounted(() => {
|
||||
mitter.on("openVipModal", () => {
|
||||
registerOnceVipModal(() => {
|
||||
if (props.mode === "nav" && !settingStore.isPlus) {
|
||||
openUpgrade();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
import { mitter } from "/@/utils/util.mitt";
|
||||
|
||||
let registed = false;
|
||||
export function registerOnceVipModal(callback: () => void) {
|
||||
if (registed) {
|
||||
return;
|
||||
}
|
||||
registed = true;
|
||||
mitter.on("openVipModal", () => {
|
||||
callback();
|
||||
});
|
||||
}
|
||||
@@ -14,6 +14,15 @@ export default {
|
||||
certCount: "Number of Certificates",
|
||||
noCert: "You have no certificates yet",
|
||||
manageCert: "View Certificates",
|
||||
siteMonitorCount: "Number of Monitored Sites",
|
||||
siteAbnormalCount: "Abnormal",
|
||||
siteNormalCount: "Normal",
|
||||
manageSiteMonitor: "Manage Monitored Sites",
|
||||
domainCount: "Number of Domains",
|
||||
domainExpiringCount: "Expiring",
|
||||
domainExpiredCount: "Expired",
|
||||
domainNotExpiredCount: "Not Expired",
|
||||
manageDomain: "Manage Domains",
|
||||
certExpiringCount: "Soon-to-Expire",
|
||||
certExpiredCount: "Expired",
|
||||
certNoExpireCount: "Not Expired",
|
||||
|
||||
@@ -49,7 +49,7 @@ export default {
|
||||
customAcmeSslProviderHelper: "Unique identifier, e.g. myca; used to distinguish providers in pipeline and ACME account",
|
||||
customAcmeReverseProxy: "Reverse Proxy",
|
||||
customAcmeReverseProxyHelper:
|
||||
"For example, for Let's Encrypt, configure the reverse proxy on your overseas server: proxy_pass https://acme-v02.api.letsencrypt.org/; then fill in your reverse proxy server domain here, without http://",
|
||||
"For example, for Let's Encrypt, configure the reverse proxy on your overseas server: \nproxy_pass https://acme-v02.api.letsencrypt.org/; \nthen fill in your reverse proxy server domain here, without http://",
|
||||
customAcmeAdd: "Add Custom ACME",
|
||||
customAcmeEdit: "Edit Custom ACME",
|
||||
customAcmeNeedEab: "Need EAB",
|
||||
@@ -80,7 +80,7 @@ export default {
|
||||
oauthAutoRedirect: "Auto Redirect to OAuth2 Login",
|
||||
oauthAutoRedirectHelper: "Whether to auto redirect to OAuth2 login when login (using the first enabled OAuth2 login type)",
|
||||
oauthOnly: "OAuth2 Login Only",
|
||||
oauthOnlyHelper: "Whether to only allow OAuth2 login, disable password login",
|
||||
oauthOnlyHelper: "Only allow OAuth2 login. Password login remains available for 10 minutes after server startup as an emergency window.",
|
||||
enablePasskey: "Enable Passkey Login",
|
||||
passkeyHostnameNotSame: "Passkey hostname must be the same as the main domain",
|
||||
passkeyEnabledHelper:
|
||||
|
||||
@@ -17,6 +17,15 @@ export default {
|
||||
certNoExpireCount: "未过期",
|
||||
noCert: "还没有证书",
|
||||
manageCert: "查看证书",
|
||||
siteMonitorCount: "监控站点数量",
|
||||
siteAbnormalCount: "异常",
|
||||
siteNormalCount: "正常",
|
||||
manageSiteMonitor: "管理监控站点",
|
||||
domainCount: "域名数量",
|
||||
domainExpiringCount: "即将到期",
|
||||
domainExpiredCount: "已过期",
|
||||
domainNotExpiredCount: "未到期",
|
||||
manageDomain: "管理域名",
|
||||
|
||||
createNow: "立即创建",
|
||||
managePipeline: "管理流水线",
|
||||
|
||||
@@ -47,7 +47,7 @@ export default {
|
||||
customAcmeSslProvider: "颁发机构标识",
|
||||
customAcmeSslProviderHelper: "唯一标识,如 myca;创建流水线和ACME账号时用它来区分颁发机构,不能重复,创建后不能修改",
|
||||
customAcmeReverseProxy: "反向代理地址",
|
||||
customAcmeReverseProxyHelper: "例如:对于letsencrypt 你在海外服务器配置反代: proxy_pass https://acme-v02.api.letsencrypt.org/; 然后在这里填写你的反代服务器的域名,不要带http://",
|
||||
customAcmeReverseProxyHelper: "例如:对于letsencrypt 你在海外服务器配置反代:\nproxy_pass https://acme-v02.api.letsencrypt.org/; \n然后在这里填写你的反代服务器的域名,不要带http://",
|
||||
customAcmeAdd: "添加自定义ACME",
|
||||
customAcmeEdit: "编辑自定义ACME",
|
||||
customAcmeNeedEab: "需要EAB",
|
||||
@@ -76,10 +76,9 @@ export default {
|
||||
oauthAutoRegisterCheckedText: "自动注册",
|
||||
oauthAutoRegisterUnCheckedText: "用户选择",
|
||||
oauthAutoRedirect: "自动跳转第三方登录",
|
||||
oauthAutoRedirectHelper:
|
||||
"是否自动跳转第三方登录(使用第一个已启用的第三方登录类型)\n 注意:请务必先测试第三方登录功能正常后再开启,否则会导致无法登录\n 如果无法登录,请访问 http://你的certd地址/#/login?oauthOnly=false 来临时关闭此模式",
|
||||
oauthAutoRedirectHelper: "是否自动跳转第三方登录(使用第一个已启用的第三方登录类型)\n注意:请务必先测试第三方登录功能正常后再开启。",
|
||||
oauthOnly: "仅使用第三方登录",
|
||||
oauthOnlyHelper: "是否仅使用第三方登录,关闭密码登录\n 注意:请务必在测试第三方登录功能正常后再开启,否则会导致无法登录\n 如果无法登录,请访问 http://你的certd地址/#/login?oauthOnly=false 来临时关闭此模式",
|
||||
oauthOnlyHelper: "是否仅使用第三方登录,关闭密码登录\n注意:请务必先测试第三方登录功能正常后再开启\n无法登录急救方法:服务重启后前10分钟内可通过 http://你的certd地址/#/login?oauthOnly=false, 使用密码登录处理配置问题",
|
||||
enablePasskey: "启用Passkey登录",
|
||||
passkeyHostnameNotSame: "当前域名与主绑定域名不同",
|
||||
passkeyEnabledHelper: "1、站点必须启用https \n2、passkey的rpId以主绑定域名为准,当前主域名:{0} \n3、站点域名不能变,否则会导致已注册的passkey失效。",
|
||||
|
||||
@@ -231,9 +231,13 @@ span.fs-icon-svg {
|
||||
}
|
||||
}
|
||||
|
||||
button.ant-btn.ant-btn-default.isPlus {
|
||||
color: #c5913f;
|
||||
button.ant-btn.isPlus {
|
||||
color: #ffffff;
|
||||
border: 1px solid #c5913f;
|
||||
background-color: #c5913f;
|
||||
&:hover {
|
||||
background-color: #cfa439;
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
cursor: not-allowed;
|
||||
@@ -245,8 +249,8 @@ button.ant-btn.ant-btn-default.isPlus {
|
||||
}
|
||||
|
||||
.dark {
|
||||
button.ant-btn.ant-btn-default.isPlus {
|
||||
color: #c5913f;
|
||||
button.ant-btn.isPlus {
|
||||
color: #ffffff;
|
||||
border: 1px solid #c5913f;
|
||||
|
||||
&:disabled {
|
||||
|
||||
@@ -126,8 +126,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
||||
title: t("certd.domain.importFromProvider"),
|
||||
type: "primary",
|
||||
text: t("certd.domain.importFromProvider"),
|
||||
needPlus: true,
|
||||
color: "gold",
|
||||
// needPlus: true,
|
||||
icon: "mingcute:vip-1-line",
|
||||
click: async () => {
|
||||
await openDomainImportManageDialog({
|
||||
|
||||
@@ -60,7 +60,7 @@ const doSave = async () => {
|
||||
<style lang="less">
|
||||
.page-user-settings {
|
||||
.user-settings-form {
|
||||
width: 600px;
|
||||
width: 700px;
|
||||
margin: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,7 +179,7 @@ function onAuthenticatorEnabledChanged(value: any) {
|
||||
<style lang="less">
|
||||
.page-user-settings {
|
||||
.user-settings-form {
|
||||
width: 600px;
|
||||
width: 700px;
|
||||
margin: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -254,7 +254,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
||||
title: t("certd.domain.importFromResolveRecords"),
|
||||
text: t("certd.domain.importFromResolveRecords"),
|
||||
type: "primary",
|
||||
needPlus: true,
|
||||
// needPlus: true,
|
||||
color: "gold",
|
||||
icon: "mingcute:vip-1-line",
|
||||
click: async () => {
|
||||
|
||||
@@ -101,6 +101,20 @@
|
||||
</template>
|
||||
</statistic-card>
|
||||
</a-col>
|
||||
<a-col :md="6" :xs="24">
|
||||
<statistic-card icon="fluent-color:link-multiple-24" :title="t('certd.dashboard.siteMonitorCount')" :count="count.siteCount" link="/cert/monitor/site" :sub-counts="count.siteStatusCount">
|
||||
<template #footer>
|
||||
<router-link to="/cert/monitor/site" class="flex"> <fs-icon icon="ion:settings-outline" class="mr-5 fs-16" /> {{ t("certd.dashboard.manageSiteMonitor") }} </router-link>
|
||||
</template>
|
||||
</statistic-card>
|
||||
</a-col>
|
||||
<a-col :md="6" :xs="24">
|
||||
<statistic-card icon="fluent-color:globe-24" :title="t('certd.dashboard.domainCount')" :count="count.domainCount" link="/cert/cert/domain" :sub-counts="count.domainStatusCount">
|
||||
<template #footer>
|
||||
<router-link to="/cert/cert/domain" class="flex"> <fs-icon icon="ion:settings-outline" class="mr-5 fs-16" /> {{ t("certd.dashboard.manageDomain") }} </router-link>
|
||||
</template>
|
||||
</statistic-card>
|
||||
</a-col>
|
||||
<a-col :md="6" :xs="24">
|
||||
<statistic-card icon="fluent-color:data-trending-24" :title="t('certd.dashboard.recentRun')" :footer="false">
|
||||
<day-count v-if="count.historyCountPerDay" :data="count.historyCountPerDay" :title="t('certd.dashboard.runCount')"></day-count>
|
||||
@@ -121,6 +135,7 @@
|
||||
<fs-icon icon="fluent-color:puzzle-piece-24" class="mr-5 fs-28" />
|
||||
<div class="mr-5">{{ t("certd.dashboard.supportedTasks") }}</div>
|
||||
<a-tag color="green">{{ pluginGroups.groups.all.plugins.length }}</a-tag>
|
||||
<div class="helper">列表仅做展示,请创建流水线来使用它们</div>
|
||||
</div>
|
||||
</template>
|
||||
<a-row :gutter="10">
|
||||
@@ -300,6 +315,21 @@ function transformStatusCount() {
|
||||
{ name: t("certd.dashboard.certNoExpireCount"), value: certCount.notExpired, color: "green", link: { path: "/cert/monitor/cert", query: { expireStatus: "noExpired" } } },
|
||||
];
|
||||
count.value.certCount = certCount.total;
|
||||
|
||||
const siteCount = count.value.siteCount;
|
||||
count.value.siteStatusCount = [
|
||||
{ name: t("certd.dashboard.siteAbnormalCount"), value: siteCount.abnormal, color: "red", checkIcon: "mingcute:warning-fill:#f44336", link: { path: "/cert/monitor/site", query: { checkStatus: "error" } } },
|
||||
{ name: t("certd.dashboard.siteNormalCount"), value: siteCount.normal, color: "green" },
|
||||
];
|
||||
count.value.siteCount = siteCount.total;
|
||||
|
||||
const domainCount = count.value.domainCount;
|
||||
count.value.domainStatusCount = [
|
||||
{ name: t("certd.dashboard.domainExpiredCount"), value: domainCount.expired, color: "red", checkIcon: "mingcute:warning-fill:#f44336", link: { path: "/cert/cert/domain", query: { expirationStatus: "expired" } } },
|
||||
{ name: t("certd.dashboard.domainExpiringCount"), value: domainCount.expiring, color: "yellow", checkIcon: "mingcute:alert-fill:#ff9800" },
|
||||
{ name: t("certd.dashboard.domainNotExpiredCount"), value: domainCount.notExpired, color: "green" },
|
||||
];
|
||||
count.value.domainCount = domainCount.total;
|
||||
}
|
||||
async function loadCount() {
|
||||
count.value = await GetStatisticCount();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="statistic-card">
|
||||
<a-card>
|
||||
<a-card :class="cardTone">
|
||||
<div class="data-item">
|
||||
<div class="header">
|
||||
<div class="title">
|
||||
@@ -11,9 +11,9 @@
|
||||
</div>
|
||||
<div class="content">
|
||||
<div v-if="!slots.default" class="statistic">
|
||||
<div v-if="count !== 0" class="value flex items-center w-full">
|
||||
<div class="value flex items-center w-full">
|
||||
<div class="total flex-center flex-1 flex-col pointer" @click="goDetail(link)">
|
||||
<span>{{ count }}</span>
|
||||
<span>{{ count ?? 0 }}</span>
|
||||
<span class="sub-title">{{ title }}</span>
|
||||
</div>
|
||||
<a-divider type="vertical h-10"></a-divider>
|
||||
@@ -32,7 +32,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<a-empty v-else></a-empty>
|
||||
</div>
|
||||
<slot></slot>
|
||||
</div>
|
||||
@@ -45,6 +44,7 @@
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { FsIcon } from "@fast-crud/fast-crud";
|
||||
import { computed } from "vue";
|
||||
import { useRouter } from "vue-router";
|
||||
const props = defineProps<{
|
||||
icon: string;
|
||||
@@ -62,6 +62,15 @@ const props = defineProps<{
|
||||
}>();
|
||||
const slots = defineSlots();
|
||||
const router = useRouter();
|
||||
const cardTone = computed(() => {
|
||||
if (props.subCounts?.some(item => item.color === "red" && item.value > 0)) {
|
||||
return "has-danger";
|
||||
}
|
||||
if (props.subCounts?.some(item => item.color === "yellow" && item.value > 0)) {
|
||||
return "has-warning";
|
||||
}
|
||||
return "";
|
||||
});
|
||||
function goDetail(link: any) {
|
||||
if (!link) {
|
||||
return;
|
||||
@@ -80,9 +89,27 @@ function goDetail(link: any) {
|
||||
color: rgba(242, 242, 242, 0.85) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.statistic-card {
|
||||
.ant-card.has-danger {
|
||||
background: linear-gradient(135deg, rgba(92, 35, 35, 0.72), rgba(28, 28, 28, 0.96) 62%);
|
||||
}
|
||||
|
||||
.ant-card.has-warning {
|
||||
background: linear-gradient(135deg, rgba(91, 72, 25, 0.68), rgba(28, 28, 28, 0.96) 62%);
|
||||
}
|
||||
}
|
||||
}
|
||||
.statistic-card {
|
||||
margin-bottom: 10px;
|
||||
|
||||
.ant-card.has-danger {
|
||||
background: linear-gradient(135deg, rgba(255, 241, 240, 0.9), #fff 58%);
|
||||
}
|
||||
|
||||
.ant-card.has-warning {
|
||||
background: linear-gradient(135deg, rgba(255, 251, 230, 0.9), #fff 58%);
|
||||
}
|
||||
.icon-text {
|
||||
display: inline-flex;
|
||||
justify-content: left;
|
||||
|
||||
@@ -223,7 +223,6 @@ const handleTwoFactorSubmit = async () => {
|
||||
};
|
||||
|
||||
const sysPublicSettings = settingStore.getSysPublic;
|
||||
|
||||
const hasRegisterTypeEnabled = () => {
|
||||
return sysPublicSettings.registerEnabled && (sysPublicSettings.usernameRegisterEnabled || sysPublicSettings.emailRegisterEnabled || sysPublicSettings.mobileRegisterEnabled || sysPublicSettings.smsLoginEnabled);
|
||||
};
|
||||
|
||||
@@ -108,6 +108,7 @@ export type OnlinePluginBean = {
|
||||
desc?: string;
|
||||
latest?: string;
|
||||
status?: string;
|
||||
email?: string;
|
||||
downloadCount?: number;
|
||||
score?: number;
|
||||
aiCheckStatus?: string;
|
||||
@@ -218,14 +219,8 @@ export async function OnlinePluginPublishInfo(body: { id: number }): Promise<{
|
||||
|
||||
export type OnlinePluginAuthorBean = {
|
||||
id?: number;
|
||||
appId?: number;
|
||||
appOwnerId?: number;
|
||||
developerId?: number;
|
||||
name?: string;
|
||||
displayName?: string;
|
||||
avatar?: string;
|
||||
desc?: string;
|
||||
status?: string;
|
||||
email?: string;
|
||||
};
|
||||
|
||||
export async function OnlinePluginAuthorGet(options?: { showErrorNotify?: boolean }): Promise<{ registered?: boolean; author?: OnlinePluginAuthorBean }> {
|
||||
@@ -236,13 +231,16 @@ export async function OnlinePluginAuthorGet(options?: { showErrorNotify?: boolea
|
||||
});
|
||||
}
|
||||
|
||||
export async function OnlinePluginAuthorAdd(body: { name: string; displayName?: string; avatar?: string; desc?: string }): Promise<OnlinePluginAuthorBean> {
|
||||
export async function OnlinePluginAuthorAdd(body: { name: string; email: string }): Promise<OnlinePluginAuthorBean> {
|
||||
return await request({
|
||||
url: apiPrefix + "/online/author/add",
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
}
|
||||
export async function OnlinePluginAuthorUpdate(body: { email: string }): Promise<OnlinePluginAuthorBean> {
|
||||
return await request({ url: apiPrefix + "/online/author/update", method: "post", data: body });
|
||||
}
|
||||
|
||||
export type PluginConfigBean = {
|
||||
name: string;
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="plugin-card__actions">
|
||||
<div v-if="pluginCardState.showEditButton || pluginCardState.showConfigButton" class="plugin-card__tools">
|
||||
<div v-if="pluginCardState.showEditButton || pluginCardState.showConfigButton || pluginCardState.canExportPlugin" class="plugin-card__tools">
|
||||
<a-tooltip v-if="pluginCardState.showEditButton" title="编辑">
|
||||
<a-button class="plugin-card__tool" type="text" size="small" @click.stop="editPlugin">
|
||||
<template #icon>
|
||||
@@ -37,10 +37,10 @@
|
||||
</template>
|
||||
</a-button>
|
||||
</a-tooltip>
|
||||
<a-tooltip v-if="copyHandler && pluginCardState.canCopyPlugin" title="复制">
|
||||
<a-button class="plugin-card__tool" type="text" size="small" @click.stop="copyPlugin">
|
||||
<a-tooltip v-if="pluginCardState.canExportPlugin" :title="t('certd.export')">
|
||||
<a-button class="plugin-card__tool" type="text" size="small" :loading="isActionLoading('export')" @click.stop="exportPlugin">
|
||||
<template #icon>
|
||||
<fs-icon icon="ion:copy-outline" />
|
||||
<fs-icon icon="ion:cloud-download-outline" />
|
||||
</template>
|
||||
</a-button>
|
||||
</a-tooltip>
|
||||
@@ -160,11 +160,9 @@ const props = withDefaults(
|
||||
simple?: boolean;
|
||||
showConfig?: boolean;
|
||||
editable?: boolean;
|
||||
copyHandler?: (plugin: any) => void | Promise<void>;
|
||||
}>(),
|
||||
{
|
||||
source: "market",
|
||||
copyHandler: undefined,
|
||||
}
|
||||
);
|
||||
|
||||
@@ -183,7 +181,7 @@ const { resolveOnlinePluginDependencies, installOnlinePluginChain, openDependenc
|
||||
const actionLoading = ref<PluginCardAction | "">("");
|
||||
const editDialogBodyRef = ref();
|
||||
|
||||
type PluginCardAction = "edit" | "copy" | "publish" | "config" | "install" | "uninstall" | "remove" | "toggle";
|
||||
type PluginCardAction = "edit" | "export" | "publish" | "config" | "install" | "uninstall" | "remove" | "toggle";
|
||||
|
||||
const pluginCardState = computed(() => {
|
||||
const isLocal = props.source === "local";
|
||||
@@ -200,7 +198,7 @@ const pluginCardState = computed(() => {
|
||||
canEditPlugin,
|
||||
isAvailableLocally,
|
||||
canManagePlugin,
|
||||
canCopyPlugin: canManagePlugin,
|
||||
canExportPlugin: canManagePlugin,
|
||||
showEditButton: canManagePlugin,
|
||||
showConfigButton: !!props.showConfig,
|
||||
isInstalled: isCloudPlugin && !!props.plugin.installed,
|
||||
@@ -354,16 +352,26 @@ async function editPlugin() {
|
||||
});
|
||||
}
|
||||
|
||||
async function copyPlugin() {
|
||||
if (!props.copyHandler) {
|
||||
async function exportPlugin() {
|
||||
if (!pluginCardState.value.canExportPlugin || !props.plugin.id) {
|
||||
return;
|
||||
}
|
||||
await runAction(
|
||||
"copy",
|
||||
"export",
|
||||
async () => {
|
||||
await props.copyHandler?.(props.plugin);
|
||||
const content = await api.ExportPlugin(props.plugin.id);
|
||||
if (!content) {
|
||||
return;
|
||||
}
|
||||
const blob = new Blob([content], { type: "text/yaml;charset=utf-8" });
|
||||
const url = URL.createObjectURL(blob);
|
||||
const link = document.createElement("a");
|
||||
link.href = url;
|
||||
link.download = `${props.plugin.name || props.plugin.fullName || "plugin"}.yaml`;
|
||||
link.click();
|
||||
URL.revokeObjectURL(url);
|
||||
},
|
||||
{ emitChanged: true }
|
||||
{ emitChanged: false }
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1052,5 +1060,4 @@ function handleVersionClick() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@@ -349,6 +349,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
||||
form: {
|
||||
onSuccess(opts: any) {
|
||||
crudExpose.doRefresh();
|
||||
pluginStore.clear();
|
||||
},
|
||||
},
|
||||
columns: {
|
||||
|
||||
@@ -9,17 +9,7 @@
|
||||
<fs-crud ref="crudRef" class="plugin-card-crud" v-bind="crudBinding">
|
||||
<a-empty v-if="pluginList.length === 0" class="plugin-card-empty" />
|
||||
<div v-else class="plugin-card-grid">
|
||||
<PluginItemCard
|
||||
v-for="item of pluginList"
|
||||
:key="item.fullName"
|
||||
:source="getPluginCardSource(item)"
|
||||
:plugin="item"
|
||||
show-config
|
||||
:editable="item.editable"
|
||||
:copy-handler="copyPlugin"
|
||||
@changed="handlePluginChanged"
|
||||
@click="openPluginDetail"
|
||||
/>
|
||||
<PluginItemCard v-for="item of pluginList" :key="item.fullName" :source="getPluginCardSource(item)" :plugin="item" show-config :editable="item.editable" @changed="handlePluginChanged" @click="openPluginDetail" />
|
||||
</div>
|
||||
</fs-crud>
|
||||
</fs-page>
|
||||
@@ -80,30 +70,8 @@ async function handleDetailInstalled() {
|
||||
crudExpose.doRefresh();
|
||||
}
|
||||
|
||||
async function copyPlugin(row: any) {
|
||||
const copyRow = { ...row };
|
||||
delete copyRow.fullName;
|
||||
delete copyRow.id;
|
||||
delete copyRow.developerId;
|
||||
delete copyRow.appId;
|
||||
delete copyRow.latest;
|
||||
delete copyRow.status;
|
||||
delete copyRow.downloadCount;
|
||||
delete copyRow.score;
|
||||
await crudExpose.openCopy(
|
||||
{
|
||||
row: copyRow,
|
||||
},
|
||||
{
|
||||
async onSuccess() {
|
||||
crudExpose.doRefresh();
|
||||
},
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
async function handlePluginChanged(payload: { action: string }) {
|
||||
if (payload.action === "install" || payload.action === "uninstall" || payload.action === "remove" || payload.action === "copy") {
|
||||
if (payload.action === "install" || payload.action === "uninstall" || payload.action === "remove") {
|
||||
await pluginStore.reload();
|
||||
}
|
||||
crudExpose.doRefresh();
|
||||
|
||||
@@ -2,10 +2,12 @@ import * as api from "/@/views/sys/plugin/api";
|
||||
import { dict, useFormWrapper } from "@fast-crud/fast-crud";
|
||||
import { useI18n } from "/@/locales";
|
||||
import { notification } from "ant-design-vue";
|
||||
import { usePluginStore } from "/@/store/plugin";
|
||||
|
||||
export function usePluginImport() {
|
||||
const { openCrudFormDialog } = useFormWrapper();
|
||||
const { t } = useI18n();
|
||||
const pluginStore = usePluginStore();
|
||||
|
||||
async function openImportDialog(opts: any) {
|
||||
const { crudExpose } = opts;
|
||||
@@ -62,6 +64,7 @@ export function usePluginImport() {
|
||||
afterSubmit() {
|
||||
notification.success({ message: t("certd.operationSuccess") });
|
||||
crudExpose.doRefresh();
|
||||
pluginStore.clear();
|
||||
},
|
||||
async doSubmit({ form }: any) {
|
||||
return await api.ImportPlugin({
|
||||
|
||||
@@ -14,6 +14,9 @@ type PublishManagerResult =
|
||||
| {
|
||||
action: "registered";
|
||||
}
|
||||
| {
|
||||
action: "updated";
|
||||
}
|
||||
| {
|
||||
action: "cancel";
|
||||
};
|
||||
@@ -61,7 +64,7 @@ export function usePluginPublish() {
|
||||
initialForm: {
|
||||
name: "",
|
||||
nameConfirm: "",
|
||||
desc: "",
|
||||
email: "",
|
||||
},
|
||||
async onSubmit(form: any) {
|
||||
if (form.name?.trim() !== form.nameConfirm?.trim()) {
|
||||
@@ -72,8 +75,7 @@ export function usePluginPublish() {
|
||||
}
|
||||
const author = await api.OnlinePluginAuthorAdd({
|
||||
name: form.name,
|
||||
displayName: form.displayName,
|
||||
desc: form.desc,
|
||||
email: form.email,
|
||||
});
|
||||
resolveAuthor(author);
|
||||
},
|
||||
@@ -111,6 +113,51 @@ export function usePluginPublish() {
|
||||
],
|
||||
},
|
||||
},
|
||||
email: {
|
||||
title: "作者邮箱",
|
||||
type: "text",
|
||||
form: {
|
||||
col: { span: 24 },
|
||||
rules: [
|
||||
{ required: true, message: "请输入作者邮箱" },
|
||||
{ type: "email", message: "请输入有效的作者邮箱" },
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function updatePluginAuthorEmail(author?: api.OnlinePluginAuthorBean) {
|
||||
return new Promise<api.OnlinePluginAuthorBean | undefined>(async resolve => {
|
||||
let resolved = false;
|
||||
const resolveAuthor = (result?: api.OnlinePluginAuthorBean) => {
|
||||
if (!resolved) {
|
||||
resolved = true;
|
||||
resolve(result);
|
||||
}
|
||||
};
|
||||
await openFormDialog({
|
||||
title: "修改作者邮箱",
|
||||
wrapper: { width: 560, onClosed: () => resolveAuthor() },
|
||||
initialForm: { email: author?.email || "" },
|
||||
async onSubmit(form: any) {
|
||||
const result = await api.OnlinePluginAuthorUpdate({ email: form.email });
|
||||
resolveAuthor(result);
|
||||
},
|
||||
columns: {
|
||||
email: {
|
||||
title: "作者邮箱",
|
||||
type: "text",
|
||||
form: {
|
||||
col: { span: 24 },
|
||||
rules: [
|
||||
{ required: true, message: "请输入作者邮箱" },
|
||||
{ type: "email", message: "请输入有效的作者邮箱" },
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
});
|
||||
@@ -326,7 +373,26 @@ export function usePluginPublish() {
|
||||
|
||||
function renderAuthor() {
|
||||
if (info.authorRegistered) {
|
||||
return author?.displayName || author?.name || "-";
|
||||
return (
|
||||
<span class="sys-plugin-publish__author-register">
|
||||
<span>{author?.name || "-"}</span>
|
||||
<a-button
|
||||
size="small"
|
||||
type="link"
|
||||
onClick={async (event: any) => {
|
||||
event.stopPropagation();
|
||||
const updatedAuthor = await updatePluginAuthorEmail(author);
|
||||
if (!updatedAuthor?.id) {
|
||||
return;
|
||||
}
|
||||
resolveResult({ action: "updated" });
|
||||
formWrapper?.close?.();
|
||||
}}
|
||||
>
|
||||
修改邮箱
|
||||
</a-button>
|
||||
</span>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<span class="sys-plugin-publish__author-register">
|
||||
@@ -490,6 +556,10 @@ export function usePluginPublish() {
|
||||
await publishLocalPlugin(row, options);
|
||||
return;
|
||||
}
|
||||
if (action.action === "updated") {
|
||||
await publishLocalPlugin(row, options);
|
||||
return;
|
||||
}
|
||||
if (action.action !== "publish") {
|
||||
return;
|
||||
}
|
||||
|
||||
+1
-1
@@ -80,7 +80,7 @@ function buildColumns(editing: CustomAcmeProviderForm | null) {
|
||||
show: hideForBuiltIn,
|
||||
rules: [{ required: true, message: t("certd.sys.setting.customAcmeSaveCheck") }],
|
||||
placeholder: "https://your-ca.example.com/directory",
|
||||
helper: "Directory URL of the ACME server",
|
||||
helper: "Directory URL of the ACME server (e.g., https://acme-v02.api.letsencrypt.org/directory)",
|
||||
},
|
||||
},
|
||||
reverseProxy: {
|
||||
|
||||
@@ -3,6 +3,40 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
# [1.44.0](https://github.com/certd/certd/compare/v1.43.0...v1.44.0) (2026-08-28)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复证书申请时EAB判断逻辑,已选择Acme账号的情况下不需要EAB ([d87821e](https://github.com/certd/certd/commit/d87821ee02b17136fc925df4547223332bf22823))
|
||||
* **pipeline:** 校验定时触发器cron表达式,拦截2月31号等无效日期 ([#785](https://github.com/certd/certd/issues/785)) [@yukaidi1220](https://github.com/yukaidi1220) ([f8e492d](https://github.com/certd/certd/commit/f8e492d6cb49257e56bbd06b28fd6eb32c923c28))
|
||||
* **ssh:** 修复 keyboard-interactive 认证可能抛类型错误的问题 ([5e867c8](https://github.com/certd/certd/commit/5e867c86c30eb43f1e5aeee8c22d47596e173a8c))
|
||||
* **tencent access:** 修复腾讯云国际站接口endpoint拼接问题 ([f614872](https://github.com/certd/certd/commit/f61487284f79d3f5a72c9f7eee04999a93728326))
|
||||
|
||||
### Features
|
||||
|
||||
* 实现自定义ACME证书颁发机构支持 ([97c417b](https://github.com/certd/certd/commit/97c417b1ad64b9a14bee8bfe98a2e789b9278820))
|
||||
* 新增证书吊销后置任务与证书状态管理 ([1cc9641](https://github.com/certd/certd/commit/1cc9641f5669710d1e5809995ad395c843855a12))
|
||||
* 新增AI插件开发全流程能力 ([6f9dffe](https://github.com/certd/certd/commit/6f9dffe6e59cc125bd394d7db6086d66a9c71e49))
|
||||
* 支持审计日志,操作日志 ([f2855d6](https://github.com/certd/certd/commit/f2855d6dac74c9db71d92f99601e35c360b10666))
|
||||
* 支持在线插件下载安装审核等 ([255960d](https://github.com/certd/certd/commit/255960d434eebb3d567a08f737f1642ab417b5d0))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 新增AI插件开发受限令牌与隔离API ([3a9069f](https://github.com/certd/certd/commit/3a9069f6e6242940229fd63c686f7e445408dbbb))
|
||||
* 新增官方客户端Certd Client的多语言配置与页面入口 ([fbfe125](https://github.com/certd/certd/commit/fbfe1256a5c8be6dfb2fbae7e6130eb5f6c6d946))
|
||||
* 新增证书吊销功能,添加证书状态字段 ([5074572](https://github.com/certd/certd/commit/5074572694383c8e1bf2880e26827987683dc62c))
|
||||
* 新增自定义ACME管理功能,完善证书颁发机构适配 ([2ab23f5](https://github.com/certd/certd/commit/2ab23f50b216e27495fc823d2269ca0ba6366d15))
|
||||
* 移除全局反向代理配置,迁移到自定义ACME配置 ([c57110e](https://github.com/certd/certd/commit/c57110e42aada31dd0028b56b5baec1b19722525))
|
||||
* 在线插件支持通知类型 ([c0f194f](https://github.com/certd/certd/commit/c0f194f4438bd7ca3f52f63ca088543abde7428c))
|
||||
* 增加稳定版,预览版区分,预览版是最新版,稳定版在预览版验证稳定后,再将预览版转为稳定版 ([1574090](https://github.com/certd/certd/commit/15740904e5e97ee767c39e4401dbc1d645795c38))
|
||||
* 支持AI开发在线插件 ([eae7edb](https://github.com/certd/certd/commit/eae7edbda0fd7357163f33fb4084fcba21396f5f))
|
||||
* **domain:** 域名管理增加remark字段 ([e4041ea](https://github.com/certd/certd/commit/e4041eabece1bab2c1c4b955129cf7a7fe7302d0))
|
||||
* **login,settings:** 仅第三方登录开启后,在重启10分钟后将无法使用密码登录 ([1d12ad7](https://github.com/certd/certd/commit/1d12ad73c6ca827d2eb36bda867f9d9fe62dab48))
|
||||
* **plugin:** 插件安装支持检测依赖 ([e79660c](https://github.com/certd/certd/commit/e79660c5d17ed4049508a00a359950a54470332f))
|
||||
* **plugin:** 新增插件评分展示、排序与个人插件筛选功能 ([7ab5029](https://github.com/certd/certd/commit/7ab502991e0c001777b268b9f159311ef5e000a0))
|
||||
* **server:** response优化为gzip压缩 ([f38522c](https://github.com/certd/certd/commit/f38522ca0b2185f7f35538f53cb51dcf86d0bfc8))
|
||||
* **tencent-clb:** 重构腾讯云CLB部署插件的地域选择组件,改为远程下拉选择器 ([30d4fc8](https://github.com/certd/certd/commit/30d4fc84a9e940d1d07e1f25856eb6fa13da9ba1))
|
||||
|
||||
# [1.43.0](https://github.com/certd/certd/compare/v1.42.6...v1.43.0) (2026-08-14)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -2,6 +2,8 @@ ALTER TABLE `cd_audit_log` ADD COLUMN `scope` varchar(32) NOT NULL DEFAULT 'user
|
||||
CREATE INDEX `index_audit_log_scope` ON `cd_audit_log` (`scope`);
|
||||
|
||||
ALTER TABLE `cd_audit_log` ADD COLUMN `success` tinyint(1) NOT NULL DEFAULT 1;
|
||||
-- 删除project_name字段
|
||||
ALTER TABLE cd_audit_log DROP COLUMN project_name;
|
||||
|
||||
-- 审计日志表索引
|
||||
CREATE INDEX `index_audit_log_type` ON `cd_audit_log` (`type`);
|
||||
|
||||
@@ -3,6 +3,8 @@ CREATE INDEX "index_audit_log_scope" ON "cd_audit_log" ("scope");
|
||||
|
||||
ALTER TABLE "cd_audit_log" ADD COLUMN "success" boolean NOT NULL DEFAULT true;
|
||||
|
||||
ALTER TABLE "cd_audit_log" DROP COLUMN "project_name";
|
||||
|
||||
-- 审计日志表索引
|
||||
CREATE INDEX "index_audit_log_type" ON "cd_audit_log" ("type");
|
||||
CREATE INDEX "index_audit_log_create_time" ON "cd_audit_log" ("create_time");
|
||||
@@ -7,27 +7,27 @@ input:
|
||||
caType:
|
||||
title: 颁发机构
|
||||
component:
|
||||
name: a-select
|
||||
options:
|
||||
- value: letsencrypt
|
||||
label: Let's Encrypt
|
||||
- value: letsencrypt_staging
|
||||
label: Let's Encrypt测试环境
|
||||
- value: google
|
||||
label: Google
|
||||
- value: zerossl
|
||||
label: ZeroSSL
|
||||
- value: litessl
|
||||
label: litessl
|
||||
- value: sslcom
|
||||
label: SSL.com
|
||||
name: remote-select
|
||||
vModel: value
|
||||
type: access
|
||||
typeName: acmeAccount
|
||||
action: onCaTypeList
|
||||
single: true
|
||||
mode: tags
|
||||
required: true
|
||||
mergeScript: |2-
|
||||
|
||||
return {
|
||||
component: {
|
||||
disabled: ctx.compute(({form})=> !!form.access?.account)
|
||||
}
|
||||
disabled: ctx.compute(({form})=> !!form.access?.account),
|
||||
on: {
|
||||
"selected-change": (scope)=>{
|
||||
// 把选中颁发机构的 needEAB 同步到表单隐藏字段,用于控制 EAB 输入框显隐
|
||||
let form = scope.form || {};
|
||||
form.access._needEAB = scope.$event?.needEAB
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
email:
|
||||
@@ -49,8 +49,8 @@ input:
|
||||
directoryUrl:
|
||||
title: ACME Directory URL
|
||||
component:
|
||||
placeholder: 自定义ACME服务端点
|
||||
helper: 自定义ACME时必填,其他颁发机构默认自动使用内置端点
|
||||
placeholder: https://your-ca.example.com/directory
|
||||
helper: 旧版自定义ACME使用,现已由系统「流水线设置」中的自定义ACME配置管理
|
||||
required: false
|
||||
mergeScript: |2-
|
||||
|
||||
@@ -68,7 +68,7 @@ input:
|
||||
ZeroSSL:请前往[zerossl开发者中心](https://app.zerossl.com/developer),生成 'EAB
|
||||
Credentials'
|
||||
|
||||
Google:请查看[google获取eab帮助文档](https://certd.docmirror.cn/guide/use/google/),用过一次后会绑定邮箱,后续复用EAB要用同一个邮箱
|
||||
Google:请查看[google获取eab帮助文档](https://certd.docmirror.cn/guide/use/google/),需要你去翻墙得到EAB填到这里
|
||||
|
||||
SSL.com:[SSL.com账号页面](https://secure.ssl.com/account),然后点击api
|
||||
credentials链接,然后点击编辑按钮,查看Secret key和HMAC key
|
||||
@@ -80,8 +80,8 @@ input:
|
||||
|
||||
return {
|
||||
show: ctx.compute(({form})=>{
|
||||
const caType = form.access?.caType;
|
||||
return ['google','zerossl','sslcom','litessl'].includes(caType);
|
||||
// 按所选颁发机构的 needEAB 配置显隐(由 caType 的 onSelectedChange 同步到 _needEAB)
|
||||
return form.access?._needEAB === true;
|
||||
}),
|
||||
component: {
|
||||
disabled: ctx.compute(({form})=> !!form.access?.account)
|
||||
@@ -98,8 +98,8 @@ input:
|
||||
|
||||
return {
|
||||
show: ctx.compute(({form})=>{
|
||||
const caType = form.access?.caType;
|
||||
return ['google','zerossl','sslcom','litessl'].includes(caType);
|
||||
// 按所选颁发机构的 needEAB 配置显隐(由 caType 的 onSelectedChange 同步到 _needEAB)
|
||||
return form.access?._needEAB === true;
|
||||
}),
|
||||
component: {
|
||||
disabled: ctx.compute(({form})=> !!form.access?.account)
|
||||
|
||||
@@ -188,45 +188,40 @@ input:
|
||||
order: 0
|
||||
sslProvider:
|
||||
title: 证书颁发机构
|
||||
value: letsencrypt
|
||||
component:
|
||||
name: icon-select
|
||||
name: remote-select
|
||||
vModel: value
|
||||
options:
|
||||
- value: letsencrypt
|
||||
label: Let's Encrypt(免费,新手推荐,支持IP证书)
|
||||
icon: simple-icons:letsencrypt
|
||||
- value: google
|
||||
label: Google(免费)
|
||||
icon: flat-color-icons:google
|
||||
- value: zerossl
|
||||
label: ZeroSSL(免费)
|
||||
icon: emojione:digit-zero
|
||||
- value: litessl
|
||||
label: litessl(免费)
|
||||
icon: roentgen:free
|
||||
- value: sslcom
|
||||
label: SSL.com(仅主域名和www免费)
|
||||
icon: la:expeditedssl
|
||||
- value: letsencrypt_staging
|
||||
label: Let's Encrypt测试环境(仅供测试)
|
||||
icon: simple-icons:letsencrypt
|
||||
mode: tags
|
||||
type: plugin
|
||||
typeName: CertApply
|
||||
action: onSslProviderList
|
||||
search: false
|
||||
pager: false
|
||||
single: true
|
||||
watches:
|
||||
- certDomains
|
||||
- accessId
|
||||
value: letsencrypt
|
||||
required: true
|
||||
mergeScript: |-
|
||||
return {
|
||||
component:{
|
||||
onSelectedChange: ctx.compute(({form})=>{
|
||||
return ($event)=>{
|
||||
form.acmeAccountAccessId = null
|
||||
component:{
|
||||
on: {
|
||||
"selected-change": (scope)=>{
|
||||
// 切换颁发机构后,清空已选择的ACME账号,避免账号与颁发机构不匹配
|
||||
let form = scope.form || {};
|
||||
form = form.input || form.body || form;
|
||||
form.acmeAccountAccessId = null
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
helper: |-
|
||||
Let's Encrypt:申请最简单
|
||||
Google:大厂光环,兼容性好,仅首次需要翻墙获取EAB授权,无需翻墙
|
||||
Google:大厂光环,兼容性好,无需配置翻墙代理
|
||||
SSL.com:仅主域名和www免费,必须设置CAA记录
|
||||
required: true
|
||||
自定义ACME:管理员可在「系统设置-流水线设置」中配置
|
||||
order: 0
|
||||
googleCommonEabAccessId:
|
||||
title: Google公共EAB授权
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
showRunStrategy: false
|
||||
default:
|
||||
strategy:
|
||||
runStrategy: 1
|
||||
name: CertRevokeOld
|
||||
title: 吊销旧证书
|
||||
group: cert
|
||||
icon: tabler:certificate-off
|
||||
desc: 新证书申请成功,并全部部署成功后,吊销本流水线产生的旧证书。(注意 如果本流水线证书还在别处有使用或手动部署,请慎重添加此吊销任务)
|
||||
supportAfterTask: true
|
||||
input:
|
||||
revokeOld:
|
||||
title: 吊销未激活的旧证书
|
||||
value: true
|
||||
component:
|
||||
name: a-switch
|
||||
vModel: checked
|
||||
order: 0
|
||||
helper: 勾选后,将真实调用证书颁发机构吊销该流水线已被替换的旧证书
|
||||
delay:
|
||||
title: 等待时长(秒)
|
||||
value: 50
|
||||
component:
|
||||
name: a-input-number
|
||||
vModel: value
|
||||
min: 0
|
||||
order: 1
|
||||
helper: 执行吊销前等待的秒数,确保新证书生效后再吊销旧证书
|
||||
output: {}
|
||||
pluginType: deploy
|
||||
type: builtIn
|
||||
scriptFilePath: /plugins/plugin-cert/plugin/after-task/cert-revoke-old.js
|
||||
@@ -31,31 +31,29 @@ input:
|
||||
region:
|
||||
title: 大区
|
||||
component:
|
||||
name: a-auto-complete
|
||||
name: remote-select
|
||||
vModel: value
|
||||
options:
|
||||
- value: ap-guangzhou
|
||||
- value: ap-beijing
|
||||
- value: ap-chengdu
|
||||
- value: ap-chongqing
|
||||
- value: ap-hongkong
|
||||
- value: ap-jakarta
|
||||
- value: ap-mumbai
|
||||
- value: ap-nanjing
|
||||
- value: ap-seoul
|
||||
- value: ap-shanghai
|
||||
- value: ap-shanghai-fsi
|
||||
- value: ap-shenzhen-fsi
|
||||
- value: ap-singapore
|
||||
- value: ap-tokyo
|
||||
- value: eu-frankfurt
|
||||
- value: na-ashburn
|
||||
- value: na-siliconvalley
|
||||
- value: na-toronto
|
||||
- value: sa-saopaulo
|
||||
- value: ap-taipei
|
||||
helper: 如果列表中没有,您可以手动输入
|
||||
mode: tags
|
||||
type: plugin
|
||||
action: onGetRegionList
|
||||
search: false
|
||||
pager: false
|
||||
single: true
|
||||
watches:
|
||||
- certDomains
|
||||
- accessId
|
||||
required: true
|
||||
mergeScript: |2-
|
||||
|
||||
return {
|
||||
component:{
|
||||
form: ctx.compute(({form})=>{
|
||||
return form
|
||||
})
|
||||
},
|
||||
}
|
||||
|
||||
helper: 请选择CLB地域
|
||||
order: 0
|
||||
loadBalancerId:
|
||||
title: 负载均衡ID
|
||||
|
||||
@@ -3,7 +3,7 @@ title: AWS Route53
|
||||
desc: AWS Route53 DNS解析提供商
|
||||
accessType: aws
|
||||
icon: svg:icon-aws
|
||||
order: 0
|
||||
order: 1
|
||||
pluginType: dnsProvider
|
||||
type: builtIn
|
||||
scriptFilePath: /plugins/plugin-aws/aws-route53-provider.js
|
||||
|
||||
@@ -3,6 +3,7 @@ title: cloudflare
|
||||
desc: cloudflare dns provider
|
||||
icon: simple-icons:cloudflare
|
||||
accessType: cloudflare
|
||||
order: 1
|
||||
pluginType: dnsProvider
|
||||
type: builtIn
|
||||
scriptFilePath: /plugins/plugin-cloudflare/dns-provider.js
|
||||
|
||||
@@ -3,7 +3,7 @@ title: Google Cloud DNS
|
||||
desc: Google Cloud DNS提供商
|
||||
icon: flat-color-icons:google
|
||||
accessType: google
|
||||
order: 50
|
||||
order: 2
|
||||
pluginType: dnsProvider
|
||||
type: builtIn
|
||||
scriptFilePath: /plugins/plugin-google/dns-provider.js
|
||||
|
||||
@@ -3,6 +3,7 @@ title: 华为云
|
||||
desc: 华为云DNS解析提供商
|
||||
accessType: huawei
|
||||
icon: svg:icon-huawei
|
||||
order: 1
|
||||
pluginType: dnsProvider
|
||||
type: builtIn
|
||||
scriptFilePath: /plugins/plugin-huawei/dns-provider/huawei-dns-provider.js
|
||||
|
||||
@@ -3,7 +3,7 @@ title: 火山引擎
|
||||
desc: 火山引擎DNS解析提供商
|
||||
accessType: volcengine
|
||||
icon: svg:icon-volcengine
|
||||
order: 2
|
||||
order: 1
|
||||
pluginType: dnsProvider
|
||||
type: builtIn
|
||||
scriptFilePath: /plugins/plugin-volcengine/volcengine-dns-provider.js
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@certd/ui-server",
|
||||
"version": "1.43.0",
|
||||
"version": "1.44.0",
|
||||
"description": "fast-server base midway",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
@@ -43,20 +43,20 @@
|
||||
"lint1": "eslint --fix --ext .ts src"
|
||||
},
|
||||
"dependencies": {
|
||||
"@certd/acme-client": "^1.43.0",
|
||||
"@certd/basic": "^1.43.0",
|
||||
"@certd/commercial-core": "^1.43.0",
|
||||
"@certd/acme-client": "^1.44.0",
|
||||
"@certd/basic": "^1.44.0",
|
||||
"@certd/commercial-core": "^1.44.0",
|
||||
"@certd/cv4pve-api-javascript": "^8.4.2",
|
||||
"@certd/jdcloud": "^1.43.0",
|
||||
"@certd/lib-huawei": "^1.43.0",
|
||||
"@certd/lib-k8s": "^1.43.0",
|
||||
"@certd/lib-server": "^1.43.0",
|
||||
"@certd/midway-flyway-js": "^1.43.0",
|
||||
"@certd/pipeline": "^1.43.0",
|
||||
"@certd/plugin-cert": "^1.43.0",
|
||||
"@certd/plugin-lib": "^1.43.0",
|
||||
"@certd/plugin-plus": "^1.43.0",
|
||||
"@certd/plus-core": "^1.43.0",
|
||||
"@certd/jdcloud": "^1.44.0",
|
||||
"@certd/lib-huawei": "^1.44.0",
|
||||
"@certd/lib-k8s": "^1.44.0",
|
||||
"@certd/lib-server": "^1.44.0",
|
||||
"@certd/midway-flyway-js": "^1.44.0",
|
||||
"@certd/pipeline": "^1.44.0",
|
||||
"@certd/plugin-cert": "^1.44.0",
|
||||
"@certd/plugin-lib": "^1.44.0",
|
||||
"@certd/plugin-plus": "^1.44.0",
|
||||
"@certd/plus-core": "^1.44.0",
|
||||
"@koa/cors": "^5.0.0",
|
||||
"@midwayjs/bootstrap": "3.20.11",
|
||||
"@midwayjs/cache": "3.14.0",
|
||||
|
||||
@@ -22,6 +22,7 @@ import * as upload from "@midwayjs/upload";
|
||||
import { setLogger } from "@certd/acme-client";
|
||||
import { HiddenMiddleware } from "./middleware/hidden.js";
|
||||
import { shouldSetDefaultNoCache } from "./configuration-cache.js";
|
||||
import { compressResponse } from "./middleware/compression.js";
|
||||
// import * as swagger from '@midwayjs/swagger';
|
||||
//@ts-ignore
|
||||
// process.env.UV_THREADPOOL_SIZE = 2
|
||||
@@ -45,6 +46,7 @@ process.on("uncaughtException", error => {
|
||||
// log()
|
||||
// }
|
||||
// startHeapLog();
|
||||
|
||||
@Configuration({
|
||||
detectorOptions: {
|
||||
ignore: ["**/plugins/**"],
|
||||
@@ -90,6 +92,7 @@ export class MainConfiguration {
|
||||
origin: "*",
|
||||
})
|
||||
);
|
||||
this.app.use(compressResponse);
|
||||
//
|
||||
// this.app.use(async (ctx, next) => {
|
||||
// // 只在返回 'index.html' 的时候设置 maxAge
|
||||
|
||||
@@ -51,7 +51,6 @@ export class LoginController extends BaseController {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
private writeTokenCookie(token: { expire: any; token: any }) {
|
||||
// this.loginService.writeTokenCookie(this.ctx,token);
|
||||
}
|
||||
@@ -130,10 +129,10 @@ export class LoginController extends BaseController {
|
||||
);
|
||||
|
||||
this.writeTokenCookie(token);
|
||||
this.auditLog({ userId: token.userId, username: token.username, content: "用户Passkey登录成功" });
|
||||
this.auditLog({ userId: token.userId, username: token.username, content: `用户「${token.username}」Passkey登录成功` });
|
||||
return this.ok(token);
|
||||
} catch (err: any) {
|
||||
this.auditLog({ userId: err.userId, username: body.credential, content: `用户Passkey登录失败:${err.message}` });
|
||||
this.auditLog({ userId: err.userId, username: body.credential, content: `用户「${body.credential}」Passkey登录失败:${err.message}` });
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ import { merge } from "lodash-es";
|
||||
import { CrudController } from "@certd/lib-server";
|
||||
import {
|
||||
OnlinePluginAuthorAddReq,
|
||||
OnlinePluginAuthorUpdateReq,
|
||||
OnlinePluginDependenciesReq,
|
||||
OnlinePluginInstallReq,
|
||||
OnlinePluginListReq,
|
||||
@@ -192,6 +193,11 @@ export class PluginController extends CrudController<PluginService> {
|
||||
return this.ok(res);
|
||||
}
|
||||
|
||||
@Post("/online/author/update", { description: "sys:settings:edit", summary: "修改在线插件作者邮箱" })
|
||||
async onlineAuthorUpdate(@Body(ALL) body: OnlinePluginAuthorUpdateReq) {
|
||||
return this.ok(await this.service.updateOnlinePluginAuthor(body));
|
||||
}
|
||||
|
||||
@Post("/online/publish/info", { description: "sys:settings:view", summary: "查询本地插件发布信息" })
|
||||
async onlinePublishInfo(@Body(ALL) body: OnlinePluginPublishInfoReq) {
|
||||
const res = await this.service.getOnlinePluginPublishInfo(body);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user