diff --git a/.github/workflows/build-image.yml b/.github/workflows/build-image.yml index a8e6c57e..316b50d9 100644 --- a/.github/workflows/build-image.yml +++ b/.github/workflows/build-image.yml @@ -79,17 +79,17 @@ jobs: greper/certd:latest greper/certd:${{steps.get_certd_version.outputs.result}} - - name: Build armv7 - uses: docker/build-push-action@v6 - with: - platforms: linux/arm/v7 - push: true - context: ./packages/ui/ - tags: | - registry.cn-shenzhen.aliyuncs.com/handsfree/certd:armv7 - registry.cn-shenzhen.aliyuncs.com/handsfree/certd:${{steps.get_certd_version.outputs.result}}-armv7 - greper/certd:armv7 - greper/certd:${{steps.get_certd_version.outputs.result}}-armv7 +# - name: Build armv7 +# uses: docker/build-push-action@v6 +# with: +# platforms: linux/arm/v7 +# push: true +# context: ./packages/ui/ +# tags: | +# registry.cn-shenzhen.aliyuncs.com/handsfree/certd:armv7 +# registry.cn-shenzhen.aliyuncs.com/handsfree/certd:${{steps.get_certd_version.outputs.result}}-armv7 +# greper/certd:armv7 +# greper/certd:${{steps.get_certd_version.outputs.result}}-armv7 - name: Build agent uses: docker/build-push-action@v6 diff --git a/.github/workflows/sync-to-gitee-dev.yml b/.github/workflows/sync-to-gitee-dev.yml index 2cc62d7e..d893ac01 100644 --- a/.github/workflows/sync-to-gitee-dev.yml +++ b/.github/workflows/sync-to-gitee-dev.yml @@ -16,6 +16,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + lfs: true - name: Set git user # 2. 给git命令设置用户名和邮箱,↙↙↙ 改成你的name和email run: | git config --global user.name "xiaojunnuo" diff --git a/.github/workflows/sync-to-gitee.yml b/.github/workflows/sync-to-gitee.yml index 9707beaa..f1eca2ab 100644 --- a/.github/workflows/sync-to-gitee.yml +++ b/.github/workflows/sync-to-gitee.yml @@ -16,6 +16,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + lfs: true - name: Set git user # 2. 给git命令设置用户名和邮箱,↙↙↙ 改成你的name和email run: | git config --global user.name "xiaojunnuo" diff --git a/.gitignore b/.gitignore index d38a05a6..bf2258f1 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,5 @@ test/**/*.js /packages/ui/certd-server/data/db.sqlite /packages/ui/certd-server/data/keys.yaml /packages/pro/ + +test.js \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index dea5716e..2c27ae53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,58 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14) + +### Bug Fixes + +* 修复未设置pfx密码,导致jks转换报错的bug ([c3cfbd8](https://github.com/certd/certd/commit/c3cfbd8474155aed4379f91075de37d5d8c73ef0)) + +### Performance Improvements + +* 公共cname服务支持关闭 ([f4ae512](https://github.com/certd/certd/commit/f4ae5125dc4cd97816976779cb3586b5ee78947e)) + +## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13) + +### Bug Fixes + +* 修复偶发性cname一直验证超时的bug ([d2ce72e](https://github.com/certd/certd/commit/d2ce72e4aaacdf726ba8b91fcd71db40a27714ba)) +* 修复邮件配置,忽略证书校验设置不生效的bug ([66a9690](https://github.com/certd/certd/commit/66a9690dc958732e1b3c672d965db502296446f9)) +* 修复ipv6未开启情况下,请求带有ipv6地址域名报ETIMEDOUT的bug ([a9a0967](https://github.com/certd/certd/commit/a9a0967a6f1d0bd27e69f3ec52c31d90d470bc23)) + +### Performance Improvements + +* 修复站点个性化,浏览器标题没有生效的bug ([bcfac02](https://github.com/certd/certd/commit/bcfac02c96ceaf23d1a0b05b48d8047da933beaf)) +* 优化上传到主机插 路径选择,根据证书格式显示 ([8c3f86c](https://github.com/certd/certd/commit/8c3f86c6909ed91f48bb2880e78834e22f6f6a29)) +* 支持jks ([889eaae](https://github.com/certd/certd/commit/889eaaea92818f628b922dae540c026630611707)) +* ipv6支持 ([da6ac16](https://github.com/certd/certd/commit/da6ac1626b3574be2fabeeb18a1f10d60bdcbe49)) + +## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08) + +### Bug Fixes + +* 修复某些容器管理ui无法识别端口列表的bug ([576e60a](https://github.com/certd/certd/commit/576e60a2b52315909e659d2a58cf98b130e69e6f)) +* 修复删除腾讯云过期证书时间判断上的bug,导致已过期仍然没有删除证书 ([1ba1007](https://github.com/certd/certd/commit/1ba10072615015d91b81fc56a3b01dae6a2ae9d1)) + +### Performance Improvements + +* 优化部署到阿里云CDN插件,支持多域名,更易用 ([80c500f](https://github.com/certd/certd/commit/80c500f618b169a1f64c57fe442242a4d0d9d833)) +* 优化流水线页面切换回来不丢失查询条件 ([4dcf6e8](https://github.com/certd/certd/commit/4dcf6e87bc5f7657ce8a56c5331e8723a0fee8ee)) +* 支持公共cname服务 ([3c919ee](https://github.com/certd/certd/commit/3c919ee5d1aef5d26cf3620a7c49d920786bc941)) +* 执行历史支持点击查看流水线详情 ([8968639](https://github.com/certd/certd/commit/89686399f90058835435b92872fc236fac990148)) +* 专业版7天试用 ([c58250e](https://github.com/certd/certd/commit/c58250e1f065a9bd8b4e82acc1df754504c0010c)) + +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +### Bug Fixes + +* 修复头像没有更新的bug ([9b4a31f](https://github.com/certd/certd/commit/9b4a31fa6a32b9cab2e22bd141cf96ca29120445)) + +### Performance Improvements + +* 禁止页面缓存,点击tab页签可以刷新数据 ([7ad4b55](https://github.com/certd/certd/commit/7ad4b55ee000c1dd0747832b11107f32b0ffb889)) +* 优化时间选择器,自动填写分钟和秒钟 ([396dc34](https://github.com/certd/certd/commit/396dc34a841c7d016b033736afdba8366fb2d211)) +* cname 域名映射记录可读性优化 ([b1117ed](https://github.com/certd/certd/commit/b1117ed54a3ef015752999324ff72b821ef5e4b9)) + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) ### Bug Fixes diff --git a/README.md b/README.md index 8abc2c1b..16e7835b 100644 --- a/README.md +++ b/README.md @@ -5,13 +5,12 @@ Certd 是一个免费全自动申请和自动部署更新SSL证书的管理系 关键字:证书自动申请、证书自动更新、证书自动续期、证书自动续签、证书管理工具 - ## 一、特性 本项目不仅支持证书申请过程自动化,还可以自动化部署更新证书,让你的证书永不过期。 * 全自动申请证书(支持所有注册商注册的域名) * 全自动部署更新证书(目前支持部署到主机、部署到阿里云、腾讯云等,目前已支持30+部署插件) -* 支持通配符域名/泛域名,支持多个域名打到一个证书上 +* 支持通配符域名/泛域名,支持多个域名打到一个证书上,支持pem、pfx、der、jks等多种证书格式 * 邮件通知 * 私有化部署,数据保存本地,镜像由Github Actions构建,过程公开透明 * 支持sqlite,postgresql数据库 @@ -23,30 +22,42 @@ Certd 是一个免费全自动申请和自动部署更新SSL证书的管理系 官方Demo地址,自助注册后体验 -https://certd.handsfree.work/ +https://certd.handfree.work/ > 注意数据将不定期清理,不定期停止定时任务,生产使用请自行部署 > 包含敏感信息,务必自己本地部署进行生产使用 +![首页](./docs/images/start/home.png) + ## 三、使用教程 -更多教程请访问文档网站 [certd.docmirror.cn](https://certd.docmirror.cn/) +仅需3步,让你的证书永不过期 +### 1. 创建证书流水线 +![演示](packages/ui/certd-client/public/static/doc/images/1-add.png) -本案例演示,如何配置自动申请证书,并部署到阿里云CDN,然后快要到期前自动更新证书并重新部署 +> 添加成功后,就可以直接运行流水线申请证书了 -![演示](packages/ui/certd-client/public/static/doc/images/5-view.png) -![演示](packages/ui/certd-client/public/static/doc/images/9-start.png) -![演示](packages/ui/certd-client/public/static/doc/images/10-1-log.png) +### 2. 添加部署任务 +当然我们一般需要把证书部署到应用上,certd支持海量的部署插件,您可以根据自身实际情况进行选择,比如部署到Nginx、阿里云、腾讯云、K8S、CDN、宝塔、1Panel等等 + +此处演示部署证书到主机的nginx上 +![演示](packages/ui/certd-client/public/static/doc/images/5-1-add-host.png) + +如果目前的部署插件都无法满足,您也可以手动下载,然后自行部署 ![演示](packages/ui/certd-client/public/static/doc/images/13-3-download.png) -![演示](packages/ui/certd-client/public/static/doc/images/13-1-result.png) + +### 3. 定时运行 +![演示](packages/ui/certd-client/public/static/doc/images/12-1-log-success.png) + ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ -------> [点我查看详细使用步骤演示](./step.md) <-------- ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ -当前支持的部署插件列表 -![演示](./docs/images/plugins/list.png) +更多教程请访问文档网站 [certd.docmirror.cn](https://certd.docmirror.cn/) + + ## 四、私有化部署 @@ -54,10 +65,10 @@ https://certd.handsfree.work/ 您可以根据实际情况从如下方式中选择一种方式进行私有化部署: -1. [宝塔面板方式部署](./install/baota/) -2. [1Panel面板方式部署](./install/1panel/) -2. [Docker方式部署](./install/docker/) -3. [源码方式部署](./install/source/) +1. [宝塔面板方式部署](https://certd.docmirror.cn/guide/install/docker/) +2. [1Panel面板方式部署](https://certd.docmirror.cn/guide/install/1panel/) +3. [Docker方式部署](https://certd.docmirror.cn/guide/install/docker/) +4. [源码方式部署](https://certd.docmirror.cn/guide/install/source/) #### Docker镜像说明: * 国内镜像地址: @@ -155,7 +166,7 @@ https://afdian.com/a/greper ## 十一、贡献代码 -1. 本地开发 [贡献插件教程](https://certd.docmirror.cn/guide/development/) +1. 本地开发 [贡献插件](https://certd.docmirror.cn/guide/development/) 2. 作为贡献者,代表您同意您贡献的代码如下许可: 1. 可以调整开源协议以使其更严格或更宽松。 2. 可以用于商业用途。 @@ -164,7 +175,7 @@ https://afdian.com/a/greper ## 十二、 开源许可 * 本项目遵循 GNU Affero General Public License(AGPL)开源协议。 -* 允许个人和公司使用、复制、修改和分发本项目,禁止任何形式的商业用途 +* 允许个人和公司内部自由使用、复制、修改和分发本项目,未获得商业授权情况下禁止任何形式的商业用途 * 未获得商业授权情况下,禁止任何对logo、版权信息及授权许可相关代码的修改。 * 如需商业授权,请联系作者。 diff --git a/build-dev.trigger b/build-dev.trigger index aed7fe9a..d00491fd 100644 --- a/build-dev.trigger +++ b/build-dev.trigger @@ -1 +1 @@ -21:59 +1 diff --git a/build.trigger b/build.trigger index 0cfbf088..77d7baab 100644 --- a/build.trigger +++ b/build.trigger @@ -1 +1 @@ -2 +21:55 diff --git a/docker/run/docker-compose.yaml b/docker/run/docker-compose.yaml index e73ee584..5520be6b 100644 --- a/docker/run/docker-compose.yaml +++ b/docker/run/docker-compose.yaml @@ -11,32 +11,44 @@ services: ports: # 端口映射 # ↓↓↓↓ ---------------------------------------------------------- 如果端口有冲突,可以修改第一个7001为其他不冲突的端口号 - "7001:7001" - # ↓↓↓↓ ---------------------------------------------------------- https端口,可以根据实际情况,是否暴露相关服务端口 + # ↓↓↓↓ ---------------------------------------------------------- https端口,可以根据实际情况,是否暴露该端口 - "7002:7002" + #↓↓↓↓ -------------------------------------------------------------- 如果出现getaddrinfo ENOTFOUND错误,可以尝试设置dns dns: - # ↓↓↓↓ ---------------------------------------------------------- 如果出现getaddrinfo ENOTFOUND等错误,可以尝试修改或注释dns配置 - - 223.5.5.5 + - 223.5.5.5 # 阿里云公共dns - 223.6.6.6 - # ↓↓↓↓ ---------------------------------------------------------- 如果你服务器部署在国外,可以用8.8.8.8替换上面的dns -# - 8.8.8.8 +# # ↓↓↓↓ --------------------------------------------------------- 如果你服务器在腾讯云,可以用这个替换上面阿里云的公共dns +# - 119.29.29.29 # 腾讯云公共dns +# - 182.254.116.116 +# # ↓↓↓↓ --------------------------------------------------------- 如果你服务器部署在国外,可以用这个替换上面阿里云的公共dns +# - 8.8.8.8 # 谷歌公共dns # - 8.8.4.4 + # extra_hosts: - # ↓↓↓↓ ---------------------------------------------------------- 这里可以配置自定义hosts,外网域名可以指向本地局域网ip地址 +# # ↓↓↓↓ -------------------------------------------------------- 这里可以配置自定义hosts,外网域名可以指向本地局域网ip地址 # - "localdomain.comm:192.168.1.3" + environment: - - TZ=Asia/Shanghai - # 设置环境变量即可自定义certd配置 - # 配置项见: packages/ui/certd-server/src/config/config.default.ts - # 配置规则: certd_ + 配置项, 点号用_代替 - # ↓↓↓↓ ----------------------------- 如果忘记管理员密码,可以设置为true,重启之后,管理员密码将改成123456,然后请及时修改回false +# 设置环境变量即可自定义certd配置 +# 配置项见: packages/ui/certd-server/src/config/config.default.ts +# 配置规则: certd_ + 配置项, 点号用_代替 +# #↓↓↓↓ ----------------------------- 如果忘记管理员密码,可以设置为true,重启之后,管理员密码将改成123456,然后请及时修改回false - certd_system_resetAdminPasswd=false - # ↓↓↓↓ ------------------------------- 使用postgresql数据库 -# - certd_flyway_scriptDir=./db/migration-pg # 升级脚本目录 -# - certd_typeorm_dataSource_default_type=postgres # 数据库类型 -# - certd_typeorm_dataSource_default_host=localhost # 数据库地址 -# - certd_typeorm_dataSource_default_port=5433 # 数据库端口 -# - certd_typeorm_dataSource_default_username=postgres # 用户名 -# - certd_typeorm_dataSource_default_password=yourpasswd # 密码 -# - certd_typeorm_dataSource_default_database=certd # 数据库名 - +# #↓↓↓↓ ----------------------------- 使用postgresql数据库 +# - certd_flyway_scriptDir=./db/migration-pg # 升级脚本目录 +# - certd_typeorm_dataSource_default_type=postgres # 数据库类型 +# - certd_typeorm_dataSource_default_host=localhost # 数据库地址 +# - certd_typeorm_dataSource_default_port=5433 # 数据库端口 +# - certd_typeorm_dataSource_default_username=postgres # 用户名 +# - certd_typeorm_dataSource_default_password=yourpasswd # 密码 +# - certd_typeorm_dataSource_default_database=certd # 数据库名 +# #↓↓↓↓ ------------------------------------------------------------- 启用ipv6网络 +# networks: +# - ip6net +#networks: +# ip6net: +# enable_ipv6: true +# ipam: +# config: +# - subnet: 2001:db8::/64 diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 91185bb2..b8969d2c 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -57,7 +57,7 @@ export default defineConfig({ nav: [ { text: "首页", link: "/" }, { text: "指南", link: "/guide/" }, - { text: "Demo体验", link: "https://certd.handsfree.work" } + { text: "Demo体验", link: "https://certd.handfree.work" } ], sidebar: { "/guide/": [ @@ -98,6 +98,9 @@ export default defineConfig({ { text: "忘记密码", link: "/guide/use/forgotpasswd/" }, { text: "数据备份", link: "/guide/use/backup/" }, { text: "Certd本身的证书更新", link: "/guide/use/https/index.md" }, + { text: "js脚本插件使用", link: "/guide/use/custom-script/index.md" }, + { text: "邮箱配置", link: "/guide/use/email/index.md" }, + { text: "IPv6支持", link: "/guide/use/setting/ipv6.md" }, { text: "如何贡献代码", link: "/guide/development/index.md" }, ] }, diff --git a/docs/guide/changelogs/CHANGELOG.md b/docs/guide/changelogs/CHANGELOG.md index 0c6334bc..2c27ae53 100644 --- a/docs/guide/changelogs/CHANGELOG.md +++ b/docs/guide/changelogs/CHANGELOG.md @@ -3,6 +3,175 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14) + +### Bug Fixes + +* 修复未设置pfx密码,导致jks转换报错的bug ([c3cfbd8](https://github.com/certd/certd/commit/c3cfbd8474155aed4379f91075de37d5d8c73ef0)) + +### Performance Improvements + +* 公共cname服务支持关闭 ([f4ae512](https://github.com/certd/certd/commit/f4ae5125dc4cd97816976779cb3586b5ee78947e)) + +## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13) + +### Bug Fixes + +* 修复偶发性cname一直验证超时的bug ([d2ce72e](https://github.com/certd/certd/commit/d2ce72e4aaacdf726ba8b91fcd71db40a27714ba)) +* 修复邮件配置,忽略证书校验设置不生效的bug ([66a9690](https://github.com/certd/certd/commit/66a9690dc958732e1b3c672d965db502296446f9)) +* 修复ipv6未开启情况下,请求带有ipv6地址域名报ETIMEDOUT的bug ([a9a0967](https://github.com/certd/certd/commit/a9a0967a6f1d0bd27e69f3ec52c31d90d470bc23)) + +### Performance Improvements + +* 修复站点个性化,浏览器标题没有生效的bug ([bcfac02](https://github.com/certd/certd/commit/bcfac02c96ceaf23d1a0b05b48d8047da933beaf)) +* 优化上传到主机插 路径选择,根据证书格式显示 ([8c3f86c](https://github.com/certd/certd/commit/8c3f86c6909ed91f48bb2880e78834e22f6f6a29)) +* 支持jks ([889eaae](https://github.com/certd/certd/commit/889eaaea92818f628b922dae540c026630611707)) +* ipv6支持 ([da6ac16](https://github.com/certd/certd/commit/da6ac1626b3574be2fabeeb18a1f10d60bdcbe49)) + +## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08) + +### Bug Fixes + +* 修复某些容器管理ui无法识别端口列表的bug ([576e60a](https://github.com/certd/certd/commit/576e60a2b52315909e659d2a58cf98b130e69e6f)) +* 修复删除腾讯云过期证书时间判断上的bug,导致已过期仍然没有删除证书 ([1ba1007](https://github.com/certd/certd/commit/1ba10072615015d91b81fc56a3b01dae6a2ae9d1)) + +### Performance Improvements + +* 优化部署到阿里云CDN插件,支持多域名,更易用 ([80c500f](https://github.com/certd/certd/commit/80c500f618b169a1f64c57fe442242a4d0d9d833)) +* 优化流水线页面切换回来不丢失查询条件 ([4dcf6e8](https://github.com/certd/certd/commit/4dcf6e87bc5f7657ce8a56c5331e8723a0fee8ee)) +* 支持公共cname服务 ([3c919ee](https://github.com/certd/certd/commit/3c919ee5d1aef5d26cf3620a7c49d920786bc941)) +* 执行历史支持点击查看流水线详情 ([8968639](https://github.com/certd/certd/commit/89686399f90058835435b92872fc236fac990148)) +* 专业版7天试用 ([c58250e](https://github.com/certd/certd/commit/c58250e1f065a9bd8b4e82acc1df754504c0010c)) + +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +### Bug Fixes + +* 修复头像没有更新的bug ([9b4a31f](https://github.com/certd/certd/commit/9b4a31fa6a32b9cab2e22bd141cf96ca29120445)) + +### Performance Improvements + +* 禁止页面缓存,点击tab页签可以刷新数据 ([7ad4b55](https://github.com/certd/certd/commit/7ad4b55ee000c1dd0747832b11107f32b0ffb889)) +* 优化时间选择器,自动填写分钟和秒钟 ([396dc34](https://github.com/certd/certd/commit/396dc34a841c7d016b033736afdba8366fb2d211)) +* cname 域名映射记录可读性优化 ([b1117ed](https://github.com/certd/certd/commit/b1117ed54a3ef015752999324ff72b821ef5e4b9)) + +# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) + +### Bug Fixes + +* 修复历史记录不能按名称查询的bug ([6113c38](https://github.com/certd/certd/commit/6113c388b7fc58b11ca19ff05cc1286d096c8d28)) +* pfx兼容windows server 2016 ([e5e468a](https://github.com/certd/certd/commit/e5e468a463f66d02f235de54b7c1e09ace5f1cb1)) + +### Features + +* 首页全新改版 ([63ec5b5](https://github.com/certd/certd/commit/63ec5b5519c760a3330569c0da6dac157302a330)) + +### Performance Improvements + +* 管理控制台数据统计 ([babd589](https://github.com/certd/certd/commit/babd5897ae013ff7c04ebfcbfac8a00d84dd627c)) +* 增加向导 ([6d9ef26](https://github.com/certd/certd/commit/6d9ef26ecab71d752c2c55d75aed4fb5f6c05a39)) +* lego 升级到 4.19.2 ([129bf53](https://github.com/certd/certd/commit/129bf53edc9bbb001fe49fbd7e239bd1d09cc128)) + +## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30) + +### Bug Fixes + +* 修复lego No help topic for 错误 ([aaaf8d7](https://github.com/certd/certd/commit/aaaf8d7db34896cf8f2ff8f12eec1ab0cae58f0f)) + +### Performance Improvements + +* 支持白山云cdn部署 ([b1b2cd0](https://github.com/certd/certd/commit/b1b2cd088b684eda764962abd61754c26a204d1c)) +* 支持华为云cdn ([81a3fdb](https://github.com/certd/certd/commit/81a3fdbc29b71f380762008cc151493ec97458f9)) + +## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28) + +### Bug Fixes + +* 顶部菜单变...的bug ([6dabad7](https://github.com/certd/certd/commit/6dabad76baba96be0f8af36a3fbfb9f5182aecf1)) + +### Performance Improvements + +* 默认证书更新时间设置为35天,增加腾讯云删除过期证书插件,可以避免腾讯云过期证书邮件 ([51b6fed](https://github.com/certd/certd/commit/51b6fed468eaa6f28ce4497ce303ace1a52abb96)) +* 授权加密支持解密查看 ([5575c83](https://github.com/certd/certd/commit/5575c839705f6987ad2bdcd33256b0962c6a9c6a)) +* 重置管理员密码同时启用管理员账户,避免之前禁用了,重置密码还是登录不进去 ([f92d918](https://github.com/certd/certd/commit/f92d918a1e28e29b794ad4754661ea760c18af46)) + +## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26) + +### Bug Fixes + +* 修复阿里云部署大杀器报插件_还未注册错误的bug ([abd2dcf](https://github.com/certd/certd/commit/abd2dcf2e85a545321bae6451406d081f773b132)) +* 修复启动时自签证书无法保存的bug ([526c484](https://github.com/certd/certd/commit/526c48450bcd37b3ccded9b448f17de8140bdc6e)) + +### Performance Improvements + +* 顶部菜单自定义 ([54d136c](https://github.com/certd/certd/commit/54d136cc6ae122f7c891b7a5c7232fe5de8e5cb5)) +* 禁用readonly用户 ([d10d42e](https://github.com/certd/certd/commit/d10d42e20619bb55a50d636b8867ff33db4e3b4b)) +* 限制其他用户流水线数量 ([315e437](https://github.com/certd/certd/commit/315e43746baf01682737f82e41579237a48409af)) +* 用户管理优化头像上传 ([661293c](https://github.com/certd/certd/commit/661293c189a3abf3cdc953b5225192372f57930d)) + +## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26) + +### Bug Fixes + +* 修复对话框全屏按钮与关闭按钮重叠的bug ([95df56c](https://github.com/certd/certd/commit/95df56cc5ca5e3eb843cd17cb7078cde47729f1e)) +* deprecated的运行时不要报错,只报警告 ([bcbefaa](https://github.com/certd/certd/commit/bcbefaaa35cf6d0eec085b3a2c5bfc7c6a8de9e1)) + +### Performance Improvements + +* 更新certd本身的证书文档说明 ([0c50ede](https://github.com/certd/certd/commit/0c50ede129337b82df54575cbd2f4c2a783a0732)) +* 支持同时监听https端口,7002 ([d5a17f9](https://github.com/certd/certd/commit/d5a17f9e6afd63fda2df0981118480f25a1fac2e)) + +## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25) + +### Performance Improvements + +* 部署到阿里云任意云资源,阿里云部署大杀器 ([4075be7](https://github.com/certd/certd/commit/4075be7849b140acb92bd8da8a9acbf4eef85180)) +* 文件名特殊字符限制输入 ([c4164c6](https://github.com/certd/certd/commit/c4164c66e29f3ec799f98108a344806ca61e94ff)) +* 新增部署到百度云CDN插件 ([f126f9f](https://github.com/certd/certd/commit/f126f9f932d37fa01fff1accc7bdd17d349f8db5)) +* 新增部署到腾讯云CDN-v2,推荐使用 ([d782655](https://github.com/certd/certd/commit/d782655cb4dfbb74138178afbffeee76fc755115)) +* 优化cron选择器,增加下次触发时间显示 ([5b148b7](https://github.com/certd/certd/commit/5b148b7ed960ca6f7f5b733b2eadd56eeecbd4c2)) +* 支持部署到腾讯云COS ([a8a45d7](https://github.com/certd/certd/commit/a8a45d7f757820990e278533277a3deda5ba48f3)) +* 支持配置公共ZeroSSL授权 ([a90d1e6](https://github.com/certd/certd/commit/a90d1e68ee9cbc3705223457b8a86f071b150968)) + +## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23) + +### Bug Fixes + +* 申请证书没有使用到系统设置的http代理的bug ([3db216f](https://github.com/certd/certd/commit/3db216f515ba404cb4330fdab452971b22a50f08)) +* 修复移动任务后出现空阶段的bug ([4ea3edd](https://github.com/certd/certd/commit/4ea3edd59e93ca4f5b2e43b20dd4ef33909caddb)) +* 修复google证书*.xx.com与xx.com同时申请时报错的bug ([f8b99b8](https://github.com/certd/certd/commit/f8b99b81a23e7e9fd5e05ebd5caf355c41d67a90)) +* 允许七牛云cdn插件输入.号开头的通配符域名 ([18ee87d](https://github.com/certd/certd/commit/18ee87daff6eafc2201b58e28d85aafd3cb7a5b9)) + +### Performance Improvements + +* 申请证书启用新的反代地址 ([a705182](https://github.com/certd/certd/commit/a705182b85e51157883e48f23463263793bf3c12)) +* 优化日志颜色 ([1291e98](https://github.com/certd/certd/commit/1291e98e821c5b1810aab7f0aebe3f5f5cd44a20)) +* 优化证书申请速度和成功率,反代地址优化,google基本可以稳定请求。增加请求重试。 ([41d9c3a](https://github.com/certd/certd/commit/41d9c3ac8398def541e65351cbe920d4a927182d)) +* 优化pfx密码密码输入框,让浏览器不自动填写密码 ([ffeede3](https://github.com/certd/certd/commit/ffeede38afa70c5ff6f2015516bead23d2c4df87)) + +## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20) + +### Bug Fixes + +* 修复cname服务普通用户access访问权限问题 ([c1e3e2e](https://github.com/certd/certd/commit/c1e3e2ee1f923ee5806479dd5f178c3286a01ae0)) + +## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19) + +### Bug Fixes + +* 修复普通用户无法校验cname配置的bug ([6285497](https://github.com/certd/certd/commit/62854978bf0bdbe749b42f8e40ab227ab31ec92f)) +* 修复切换普通用户登录时,左侧菜单没有同步更新的bug ([12116a8](https://github.com/certd/certd/commit/12116a89f43cf8b98f16d2ea6073f6b72a643215)) +* 修正邮箱设置跳转路由 ([17d8890](https://github.com/certd/certd/commit/17d88900a1f0e3af609b74597f5b1978230db32d)) + +### Performance Improvements + +* 触发证书重新申请input变化对比规则优化,减少升级版本后触发申请证书的情况 ([c46a2a9](https://github.com/certd/certd/commit/c46a2a9a399c2a9a8bb59a48b9fb6e93227cce9b)) +* 任务下所有步骤都跳过时,整个任务显示跳过 ([84fd3b2](https://github.com/certd/certd/commit/84fd3b250dd1161ea06c5582fdadece4b29c2e53)) +* 授权配置去除前后空格 ([57d8d48](https://github.com/certd/certd/commit/57d8d48046fbf51c52b041d2dec03d51fb018587)) +* 数据库备份插件,先压缩再备份 ([304ef49](https://github.com/certd/certd/commit/304ef494fd5787c996ad0dcb6edd2f517afce9e2)) +* 优化菜单 ([1f4f157](https://github.com/certd/certd/commit/1f4f15757de1015cf7563f7022599eef58cc93d7)) +* 增加文档站 https://certd.docmirror.cn ([6e2ac1c](https://github.com/certd/certd/commit/6e2ac1c089f6ddccb396f1f2738509c05333e1bb)) + ## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15) ### Bug Fixes diff --git a/docs/guide/development/index.md b/docs/guide/development/index.md index b0216b37..804c9979 100644 --- a/docs/guide/development/index.md +++ b/docs/guide/development/index.md @@ -1,19 +1,21 @@ # 本地开发 欢迎贡献插件 -## 1.本地调试运行 +建议nodejs版本 `20.x` 及以上 + +## 一、本地调试运行 ### 克隆代码 ```shell # 克隆代码 -git clone https://github.com/certd/certd +git clone https://github.com/certd/certd --depth=1 #进入项目目录 cd certd -# 切换到最新版本代码 -git checkout v1.26.7 # 这里换成最新版本号 +# 切换到最新版本代码【如果v2分支无法编译,请尝试切换到最新版tag】 +# git checkout v1.27.0 # 这里换成最新版本号 ``` @@ -55,7 +57,7 @@ npm run dev ``` -## 开发插件 +## 二、开发插件 进入 `packages/ui/certd-server/src/plugins` ### 1.复制`plugin-demo`目录作为你的插件目录 @@ -89,8 +91,22 @@ export * from './plugins/plugin-deploy-to-xx' export * from "./plugin-cloudflare.js" ``` -## 重启服务进行调试 +### 6. 重启服务进行调试 刷新浏览器,检查你的插件是否工作正常, 确保能够正常进行证书申请和部署 -## 提交PR +## 三、提交PR 我们将尽快审核PR + +## 四、 注意事项 +### 1. 如何让任务报错停止 + +```js +// 抛出异常即可使任务停止,否则会判定为成功 +throw new Error("错误信息") +``` + + +## 五、贡献插件送激活码 + +- PR要求,插件功能完整,代码规范 +- PR通过后,联系我们,送您一个专业版激活码 \ No newline at end of file diff --git a/docs/guide/feature/cname/index.md b/docs/guide/feature/cname/index.md index 808b75ed..3721f40f 100644 --- a/docs/guide/feature/cname/index.md +++ b/docs/guide/feature/cname/index.md @@ -11,7 +11,7 @@ ## 2. 原理 * 假设你要申请证书的域名叫:`cert.com` ,它是在`Certd`不支持的服务商注册的 -* 假设你还有另外一个域名叫:`proxy.com`,它是在`Certd`支持的服务商注册的。 +* 假设我们还有另外一个域名叫:`proxy.com`,它是在`Certd`支持的服务商注册的。 * 当我们按照如下进行配置时 ``` CNAME记录(手动、固定) TXT记录(自动、随机) @@ -19,20 +19,17 @@ _acme-challenge.cert.com ---> xxxxx.cname.proxy.com ----> txt-record-abcdefg ``` * 证书颁发机构就可以从`_acme-challenge.cert.com`查到TXT记录 `txt-record-abcdefg`,从而完成域名所有权校验。 -* 以上可以看出 `xxxxx.cname.proxy.com ----> txt-record-abcdefg` 这一段`Certd`可以自动添加的。 +* 以上可以看出 `xxxxx.cname.proxy.com ----> txt-record-abcdefg` 这一段`Certd` 是可以自动添加的。 * 剩下的只需要在你的`cert.com`域名中手动添加一条固定的`CNAME解析`即可 ## 3. Certd CNAME使用步骤 -1. 准备`一个`支持的服务商的注册的域名(`proxy.com`),或者将你众多域名其中`一个`的`DNS服务器`转到这几家服务商。 -2. 然后到`Certd`的 `CNAME服务管理`界面,用`cname.proxy.com`创建一条默认的CNAME服务,提供DNS提供商授权。 - ![](./images/cname1.png) -2. 然后创建证书流水线,输入`cert.com`,选择`CNAME`校验方式 - -3. 此时需要配置验证计划,Certd会生成一个随机的CNAME记录,例如:`_acme-challenge`->`xxxxxx.cname.proxy.com` + +1. 创建证书流水线,输入你要申请证书的域名,假设就是`cert.com`,然后选择`CNAME`校验方式 +2. 此时需要配置验证计划,Certd会生成一个随机的CNAME记录模版,例如:`_acme-challenge`->`xxxxxx.cname.proxy.com` ![](./images/cname2.png) -3. 您需要手动在你的`cert.com`域名中添加CNAME解析,点击校验,校验成功后就可以开始申请证书了 (此操作每个域名只需要做一次,后续可以重复使用,注意不要删除添加的CNAME记录) +3. 您需要手动在你的`cert.com`域名中添加CNAME解析,点击验证,校验成功后就可以开始申请证书了 (此操作每个域名只需要做一次,后续可以重复使用,注意不要删除添加的CNAME记录) ![](./images/cname3.png) ![](./images/cname4.png) 4. 申请过程中,Certd会在`xxxxxx.cname.proxy.com`下自动添加TXT记录。 diff --git a/docs/guide/use/custom-script/index.md b/docs/guide/use/custom-script/index.md new file mode 100644 index 00000000..ea5a3ebe --- /dev/null +++ b/docs/guide/use/custom-script/index.md @@ -0,0 +1,86 @@ +# 自定义脚本插件 + +## 1. 介绍 + +自定义脚本插件是一个通用的插件,可以通过编写脚本来实现各种功能,例如:调用第三方API、执行系统命令、发送邮件等。 + +## 2. 使用示例 +```js +const certPem = ctx.self.cert.crt +const certKey = ctx.self.cert.key + +//axios发起http请求上传证书 +const res = await ctx.http.request({ + url:"your_cert_deploy_url", + method:"post", + data:{ + crt : certPem, + key : certKey + } +}) +if(!res || res.code !== 0){ + //抛异常才能让任务失败 + throw new Error("上传失败") +} +//不能用console.log,需要用ctx.logger 才能把日志打印在ui上 +ctx.logger.info("上传成功",res.data) + + +``` +## 3. API +下面是`ctx`对象的`typescript`类型定义 + +```ts + +type ctx = { + CertReader: typeof CertReader; + self: CustomScriptPlugin; + //流水线定义 + pipeline: Pipeline; + //步骤定义 + step: Step; + //日志 + logger: Logger; + //当前步骤输入参数跟上一次执行比较是否有变化 + inputChanged: boolean; + //授权获取服务 + accessService: IAccessService; + //邮件服务 + emailService: IEmailService; + //cname记录服务 + cnameProxyService: ICnameProxyService; + //插件配置服务 + pluginConfigService: IPluginConfigService; + //流水线上下文 + pipelineContext: IContext; + //用户上下文 + userContext: IContext; + //http请求客户端 + http: HttpClient; // http.request(AxiosConfig) + //文件存储 + fileStore: FileStore; + //上一次执行结果状态 + lastStatus?: Runnable; + //用户取消信号 + signal: AbortSignal; + //工具类 + utils: typeof utils; + //用户信息 + user: UserInfo; +} + +type CertInfo = { + crt:string; //fullchain证书,即 cert.pem, cert.crt + key:string; // 私钥 + ic: string; //中间证书 + pfx: string;//PFX证书,base64编码 + der: string;//DER证书,base64编码 +} + +type CustomScriptPlugin = { + //可以获取证书 + cert: CertInfo +} + +``` + diff --git a/docs/guide/use/email/images/qq-0.png b/docs/guide/use/email/images/qq-0.png new file mode 100644 index 00000000..e65e7d77 Binary files /dev/null and b/docs/guide/use/email/images/qq-0.png differ diff --git a/docs/guide/use/email/images/qq-1.png b/docs/guide/use/email/images/qq-1.png new file mode 100644 index 00000000..25e6531c Binary files /dev/null and b/docs/guide/use/email/images/qq-1.png differ diff --git a/docs/guide/use/email/images/qq-11.png b/docs/guide/use/email/images/qq-11.png new file mode 100644 index 00000000..5a7d0b30 Binary files /dev/null and b/docs/guide/use/email/images/qq-11.png differ diff --git a/docs/guide/use/email/images/qq-2.png b/docs/guide/use/email/images/qq-2.png new file mode 100644 index 00000000..310285ac Binary files /dev/null and b/docs/guide/use/email/images/qq-2.png differ diff --git a/docs/guide/use/email/images/qq-3.png b/docs/guide/use/email/images/qq-3.png new file mode 100644 index 00000000..236e655a Binary files /dev/null and b/docs/guide/use/email/images/qq-3.png differ diff --git a/docs/guide/use/email/index.md b/docs/guide/use/email/index.md new file mode 100644 index 00000000..a1905f3a --- /dev/null +++ b/docs/guide/use/email/index.md @@ -0,0 +1,23 @@ +# 邮箱配置 + + +## 腾讯企业邮箱配置 +1. 开启smtp +![](./images/qq-3.png) +2. 获取授权码作为密码 +![](./images/qq-1.png) +![](./images/qq-2.png) +3. 填写域名、端口和密码 + ![](./images/qq-0.png) + +## QQ邮箱配置 +1. smtp配置 +```yaml +smtp域名: smtp.qq.com +smtp端口: 465 +密码: 授权码,获取方式见下方 +是否SSL: 是 +``` + +2. 获取授权码 + ![](./images/qq-11.png) diff --git a/docs/guide/use/setting/images/ipv6.png b/docs/guide/use/setting/images/ipv6.png new file mode 100644 index 00000000..f6fd1dc3 Binary files /dev/null and b/docs/guide/use/setting/images/ipv6.png differ diff --git a/docs/guide/use/setting/ipv6.md b/docs/guide/use/setting/ipv6.md new file mode 100644 index 00000000..2539bc65 --- /dev/null +++ b/docs/guide/use/setting/ipv6.md @@ -0,0 +1,21 @@ +# IPv6支持 + +## 启用IPv6 +在`docker-compose.yaml`中启用IPv6支持,放开如下注释: +```yaml +# #↓↓↓↓ ------------------------------------------------------------- 启用ipv6网络 + networks: + - ip6net +networks: + ip6net: + enable_ipv6: true + ipam: + config: + - subnet: 2001:db8::/64 + +``` + +## 设置双栈网络优先级 +可根据实际情况设置 + +![img.png](./images/ipv6.png) \ No newline at end of file diff --git a/docs/images/start/home.png b/docs/images/start/home.png new file mode 100644 index 00000000..cbcbb92a Binary files /dev/null and b/docs/images/start/home.png differ diff --git a/docs/index.md b/docs/index.md index f5d42b18..25960a0c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -18,7 +18,7 @@ hero: link: /guide/tutorial.md - theme: alt text: demo体验 - link: https://certd.handsfree.work + link: https://certd.handfree.work features: - title: 全自动申请证书 diff --git a/packages/ui/certd-server/src/plugins/plugin-dynadot/plugins/index.ts b/index.ts similarity index 100% rename from packages/ui/certd-server/src/plugins/plugin-dynadot/plugins/index.ts rename to index.ts diff --git a/lerna.json b/lerna.json index 638b4a7c..1c2afe56 100644 --- a/lerna.json +++ b/lerna.json @@ -9,5 +9,5 @@ } }, "npmClient": "pnpm", - "version": "1.27.0" + "version": "1.27.4" } diff --git a/package.json b/package.json index 48e061ad..b8e8c72e 100644 --- a/package.json +++ b/package.json @@ -14,13 +14,14 @@ }, "scripts": { "start": "lerna bootstrap --hoist", + "devb": "lerna run dev-build", "i-all": "lerna link && lerna exec npm install ", "publish": "npm run prepublishOnly2 && lerna publish --force-publish=pro/plus-core --conventional-commits --create-release github && npm run afterpublishOnly && npm run commitAll", - "afterpublishOnly": "time /t >build.trigger && git add ./build.trigger && git commit -m \"build: trigger build image\" && TIMEOUT /T 10 && git push", + "afterpublishOnly": "npm run copylogs && time /t >build.trigger && git add ./build.trigger && git commit -m \"build: trigger build image\" && TIMEOUT /T 10 && git push", "transform-sql": "cd ./packages/ui/certd-server/db/ && node --experimental-json-modules transform.js", "commitAll": "git add . && git commit -m \"build: publish\" && git push && npm run commitPro", "commitPro": "cd ./packages/core/ && git add . && git commit -m \"build: publish\" && git push", - "copylogs": "copyfiles \"CHANGELOG.md\" ./docs/guide/other/changelogs/", + "copylogs": "copyfiles \"CHANGELOG.md\" ./docs/guide/changelogs/", "prepublishOnly1": "npm run check && lerna run build ", "prepublishOnly2": "npm run check && npm run before-build && lerna run build ", "before-build": "npm run transform-sql && cd ./packages/core/basic && time /t >build.md && git add ./build.md && git commit -m \"build: prepare to build\"", @@ -34,9 +35,11 @@ "license": "AGPL-3.0", "dependencies": { "axios": "^1.7.7", - "lodash-es": "^4.17.21" + "copyfiles": "^2.4.1", + "lodash-es": "^4.17.21", + "typescript": "^5.4.2" }, "workspaces": [ "packages/**" ] -} \ No newline at end of file +} diff --git a/packages/core/acme-client/.eslintrc b/packages/core/acme-client/.eslintrc new file mode 100644 index 00000000..dc2d3f80 --- /dev/null +++ b/packages/core/acme-client/.eslintrc @@ -0,0 +1,28 @@ +{ + "extends": [ + "plugin:prettier/recommended", + "prettier" + ], + "plugins": [ + "eslint-plugin-import" + ], + "env": { + "mocha": true + }, + "rules": { + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/ban-ts-ignore": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-empty-function": "off", + // "no-unused-expressions": "off", + "max-len": [ + 0, + 160, + 2, + { + "ignoreUrls": true + } + ] + } +} diff --git a/packages/core/acme-client/.eslintrc.yml b/packages/core/acme-client/.eslintrc.yml deleted file mode 100644 index 55618a5f..00000000 --- a/packages/core/acme-client/.eslintrc.yml +++ /dev/null @@ -1,16 +0,0 @@ -extends: - - 'airbnb-base' - -env: - browser: false - node: true - mocha: true - -rules: - indent: [2, 4, { SwitchCase: 1, VariableDeclarator: 1 }] - brace-style: [2, 'stroustrup', { allowSingleLine: true }] - func-names: 0 - class-methods-use-this: 0 - no-param-reassign: 0 - max-len: [1, 200, 2, { ignoreUrls: true, ignoreComments: false }] - import/no-useless-path-segments: 0 diff --git a/packages/core/acme-client/CHANGELOG.md b/packages/core/acme-client/CHANGELOG.md index 796247b0..5dba2125 100644 --- a/packages/core/acme-client/CHANGELOG.md +++ b/packages/core/acme-client/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.4](https://github.com/publishlab/node-acme-client/compare/v1.27.3...v1.27.4) (2024-11-14) + +**Note:** Version bump only for package @certd/acme-client + +## [1.27.3](https://github.com/publishlab/node-acme-client/compare/v1.27.2...v1.27.3) (2024-11-13) + +**Note:** Version bump only for package @certd/acme-client + +## [1.27.2](https://github.com/publishlab/node-acme-client/compare/v1.27.1...v1.27.2) (2024-11-08) + +**Note:** Version bump only for package @certd/acme-client + +## [1.27.1](https://github.com/publishlab/node-acme-client/compare/v1.27.0...v1.27.1) (2024-11-04) + +**Note:** Version bump only for package @certd/acme-client + # [1.27.0](https://github.com/publishlab/node-acme-client/compare/v1.26.16...v1.27.0) (2024-10-31) **Note:** Version bump only for package @certd/acme-client diff --git a/packages/core/acme-client/docs/crypto.md b/packages/core/acme-client/docs/crypto.md index 85754ea5..488d60f5 100644 --- a/packages/core/acme-client/docs/crypto.md +++ b/packages/core/acme-client/docs/crypto.md @@ -6,6 +6,38 @@ +## Constants + +
+
createPrivateEcdsaKeyPromise.<buffer>
+

Generate a private ECDSA key

+
+
getPublicKeybuffer
+

Get a public key derived from a RSA or ECDSA key

+
+
getPemBodyAsB64ustring
+

Parse body of PEM encoded object and return a Base64URL string +If multiple objects are chained, the first body will be returned

+
+
readCsrDomainsobject
+

Read domains from a Certificate Signing Request

+
+
readCertificateInfoobject
+

Read information from a certificate +If multiple certificates are chained, the first will be read

+
+
createCsrPromise.<Array.<buffer>>
+

Create a Certificate Signing Request

+
+
createAlpnCertificatePromise.<Array.<buffer>>
+

Create a self-signed ALPN certificate for TLS-ALPN-01 challenges

+

https://datatracker.ietf.org/doc/html/rfc8737

+
+
isAlpnCertificateAuthorizationValidboolean
+

Validate that a ALPN certificate contains the expected key authorization

+
+
+ ## Functions
@@ -15,12 +47,6 @@
createPrivateKey()

Alias of createPrivateRsaKey()

-
createPrivateEcdsaKey([namedCurve])Promise.<buffer>
-

Generate a private ECDSA key

-
-
getPublicKey(keyPem)buffer
-

Get a public key derived from a RSA or ECDSA key

-
getJwk(keyPem)object

Get a JSON Web Key derived from a RSA or ECDSA key

https://datatracker.ietf.org/doc/html/rfc7517

@@ -28,27 +54,6 @@
splitPemChain(chainPem)Array.<string>

Split chain of PEM encoded objects from string into array

-
getPemBodyAsB64u(pem)string
-

Parse body of PEM encoded object and return a Base64URL string -If multiple objects are chained, the first body will be returned

-
-
readCsrDomains(csrPem)object
-

Read domains from a Certificate Signing Request

-
-
readCertificateInfo(certPem)object
-

Read information from a certificate -If multiple certificates are chained, the first will be read

-
-
createCsr(data, [keyPem])Promise.<Array.<buffer>>
-

Create a Certificate Signing Request

-
-
createAlpnCertificate(authz, keyAuthorization, [keyPem])Promise.<Array.<buffer>>
-

Create a self-signed ALPN certificate for TLS-ALPN-01 challenges

-

https://datatracker.ietf.org/doc/html/rfc8737

-
-
isAlpnCertificateAuthorizationValid(certPem, keyAuthorization)boolean
-

Validate that a ALPN certificate contains the expected key authorization

-
@@ -57,40 +62,12 @@ If multiple certificates are chained, the first will be read

Native Node.js crypto interface **Kind**: global namespace - - -## createPrivateRsaKey([modulusLength]) ⇒ Promise.<buffer> -Generate a private RSA key - -**Kind**: global function -**Returns**: Promise.<buffer> - PEM encoded private RSA key - -| Param | Type | Default | Description | -| --- | --- | --- | --- | -| [modulusLength] | number | 2048 | Size of the keys modulus in bits, default: `2048` | - -**Example** -Generate private RSA key -```js -const privateKey = await acme.crypto.createPrivateRsaKey(); -``` -**Example** -Private RSA key with modulus size 4096 -```js -const privateKey = await acme.crypto.createPrivateRsaKey(4096); -``` - - -## createPrivateKey() -Alias of `createPrivateRsaKey()` - -**Kind**: global function -## createPrivateEcdsaKey([namedCurve]) ⇒ Promise.<buffer> +## createPrivateEcdsaKey ⇒ Promise.<buffer> Generate a private ECDSA key -**Kind**: global function +**Kind**: global constant **Returns**: Promise.<buffer> - PEM encoded private ECDSA key | Param | Type | Description | @@ -109,10 +86,10 @@ const privateKey = await acme.crypto.createPrivateEcdsaKey('P-384'); ``` -## getPublicKey(keyPem) ⇒ buffer +## getPublicKey ⇒ buffer Get a public key derived from a RSA or ECDSA key -**Kind**: global function +**Kind**: global constant **Returns**: buffer - PEM encoded public key | Param | Type | Description | @@ -124,44 +101,13 @@ Get public key ```js const publicKey = acme.crypto.getPublicKey(privateKey); ``` - - -## getJwk(keyPem) ⇒ object -Get a JSON Web Key derived from a RSA or ECDSA key - -https://datatracker.ietf.org/doc/html/rfc7517 - -**Kind**: global function -**Returns**: object - JSON Web Key - -| Param | Type | Description | -| --- | --- | --- | -| keyPem | buffer \| string | PEM encoded private or public key | - -**Example** -Get JWK -```js -const jwk = acme.crypto.getJwk(privateKey); -``` - - -## splitPemChain(chainPem) ⇒ Array.<string> -Split chain of PEM encoded objects from string into array - -**Kind**: global function -**Returns**: Array.<string> - Array of PEM objects including headers - -| Param | Type | Description | -| --- | --- | --- | -| chainPem | buffer \| string | PEM encoded object chain | - -## getPemBodyAsB64u(pem) ⇒ string +## getPemBodyAsB64u ⇒ string Parse body of PEM encoded object and return a Base64URL string If multiple objects are chained, the first body will be returned -**Kind**: global function +**Kind**: global constant **Returns**: string - Base64URL-encoded body | Param | Type | Description | @@ -170,10 +116,10 @@ If multiple objects are chained, the first body will be returned -## readCsrDomains(csrPem) ⇒ object +## readCsrDomains ⇒ object Read domains from a Certificate Signing Request -**Kind**: global function +**Kind**: global constant **Returns**: object - {commonName, altNames} | Param | Type | Description | @@ -190,11 +136,11 @@ console.log(`Alt names: ${altNames.join(', ')}`); ``` -## readCertificateInfo(certPem) ⇒ object +## readCertificateInfo ⇒ object Read information from a certificate If multiple certificates are chained, the first will be read -**Kind**: global function +**Kind**: global constant **Returns**: object - Certificate info | Param | Type | Description | @@ -215,10 +161,10 @@ console.log(`Alt names: ${altNames.join(', ')}`); ``` -## createCsr(data, [keyPem]) ⇒ Promise.<Array.<buffer>> +## createCsr ⇒ Promise.<Array.<buffer>> Create a Certificate Signing Request -**Kind**: global function +**Kind**: global constant **Returns**: Promise.<Array.<buffer>> - [privateKey, certificateSigningRequest] | Param | Type | Description | @@ -276,12 +222,12 @@ const [, certificateRequest] = await acme.crypto.createCsr({ ``` -## createAlpnCertificate(authz, keyAuthorization, [keyPem]) ⇒ Promise.<Array.<buffer>> +## createAlpnCertificate ⇒ Promise.<Array.<buffer>> Create a self-signed ALPN certificate for TLS-ALPN-01 challenges https://datatracker.ietf.org/doc/html/rfc8737 -**Kind**: global function +**Kind**: global constant **Returns**: Promise.<Array.<buffer>> - [privateKey, certificate] | Param | Type | Description | @@ -303,10 +249,10 @@ const [, alpnCertificate] = await acme.crypto.createAlpnCertificate(authz, keyAu ``` -## isAlpnCertificateAuthorizationValid(certPem, keyAuthorization) ⇒ boolean +## isAlpnCertificateAuthorizationValid ⇒ boolean Validate that a ALPN certificate contains the expected key authorization -**Kind**: global function +**Kind**: global constant **Returns**: boolean - True when valid | Param | Type | Description | @@ -314,3 +260,62 @@ Validate that a ALPN certificate contains the expected key authorization | certPem | buffer \| string | PEM encoded certificate | | keyAuthorization | string | Expected challenge key authorization | + + +## createPrivateRsaKey([modulusLength]) ⇒ Promise.<buffer> +Generate a private RSA key + +**Kind**: global function +**Returns**: Promise.<buffer> - PEM encoded private RSA key + +| Param | Type | Description | +| --- | --- | --- | +| [modulusLength] | number | Size of the keys modulus in bits, default: `2048` | + +**Example** +Generate private RSA key +```js +const privateKey = await acme.crypto.createPrivateRsaKey(); +``` +**Example** +Private RSA key with modulus size 4096 +```js +const privateKey = await acme.crypto.createPrivateRsaKey(4096); +``` + + +## createPrivateKey() +Alias of `createPrivateRsaKey()` + +**Kind**: global function + + +## getJwk(keyPem) ⇒ object +Get a JSON Web Key derived from a RSA or ECDSA key + +https://datatracker.ietf.org/doc/html/rfc7517 + +**Kind**: global function +**Returns**: object - JSON Web Key + +| Param | Type | Description | +| --- | --- | --- | +| keyPem | buffer \| string | PEM encoded private or public key | + +**Example** +Get JWK +```js +const jwk = acme.crypto.getJwk(privateKey); +``` + + +## splitPemChain(chainPem) ⇒ Array.<string> +Split chain of PEM encoded objects from string into array + +**Kind**: global function +**Returns**: Array.<string> - Array of PEM objects including headers + +| Param | Type | Description | +| --- | --- | --- | +| chainPem | buffer \| string | PEM encoded object chain | + diff --git a/packages/core/acme-client/docs/forge.md b/packages/core/acme-client/docs/forge.md index 65dcab8f..799cc0e1 100644 --- a/packages/core/acme-client/docs/forge.md +++ b/packages/core/acme-client/docs/forge.md @@ -8,37 +8,42 @@ major release. Please migrate to the new acme.crypto interface at y +## Constants + +
+
createPublicKeyPromise.<buffer>
+

Create public key from a private RSA key

+
+
getPemBodystring
+

Parse body of PEM encoded object from buffer or string +If multiple objects are chained, the first body will be returned

+
+
splitPemChainArray.<string>
+

Split chain of PEM encoded objects from buffer or string into array

+
+
getModulusPromise.<buffer>
+

Get modulus

+
+
getPublicExponentPromise.<buffer>
+

Get public exponent

+
+
readCsrDomainsPromise.<object>
+

Read domains from a Certificate Signing Request

+
+
readCertificateInfoPromise.<object>
+

Read information from a certificate

+
+
createCsrPromise.<Array.<buffer>>
+

Create a Certificate Signing Request

+
+
+ ## Functions
createPrivateKey([size])Promise.<buffer>

Generate a private RSA key

-
createPublicKey(key)Promise.<buffer>
-

Create public key from a private RSA key

-
-
getPemBody(str)string
-

Parse body of PEM encoded object from buffer or string -If multiple objects are chained, the first body will be returned

-
-
splitPemChain(str)Array.<string>
-

Split chain of PEM encoded objects from buffer or string into array

-
-
getModulus(input)Promise.<buffer>
-

Get modulus

-
-
getPublicExponent(input)Promise.<buffer>
-

Get public exponent

-
-
readCsrDomains(csr)Promise.<object>
-

Read domains from a Certificate Signing Request

-
-
readCertificateInfo(cert)Promise.<object>
-

Read information from a certificate

-
-
createCsr(data, [key])Promise.<Array.<buffer>>
-

Create a Certificate Signing Request

-
@@ -50,34 +55,12 @@ DEPRECATION WARNING: This crypto interface is deprecated and will be removed fro major release. Please migrate to the new `acme.crypto` interface at your earliest convenience. **Kind**: global namespace - - -## createPrivateKey([size]) ⇒ Promise.<buffer> -Generate a private RSA key - -**Kind**: global function -**Returns**: Promise.<buffer> - PEM encoded private RSA key - -| Param | Type | Default | Description | -| --- | --- | --- | --- | -| [size] | number | 2048 | Size of the key, default: `2048` | - -**Example** -Generate private RSA key -```js -const privateKey = await acme.forge.createPrivateKey(); -``` -**Example** -Private RSA key with defined size -```js -const privateKey = await acme.forge.createPrivateKey(4096); -``` -## createPublicKey(key) ⇒ Promise.<buffer> +## createPublicKey ⇒ Promise.<buffer> Create public key from a private RSA key -**Kind**: global function +**Kind**: global constant **Returns**: Promise.<buffer> - PEM encoded public RSA key | Param | Type | Description | @@ -91,11 +74,11 @@ const publicKey = await acme.forge.createPublicKey(privateKey); ``` -## getPemBody(str) ⇒ string +## getPemBody ⇒ string Parse body of PEM encoded object from buffer or string If multiple objects are chained, the first body will be returned -**Kind**: global function +**Kind**: global constant **Returns**: string - PEM body | Param | Type | Description | @@ -104,10 +87,10 @@ If multiple objects are chained, the first body will be returned -## splitPemChain(str) ⇒ Array.<string> +## splitPemChain ⇒ Array.<string> Split chain of PEM encoded objects from buffer or string into array -**Kind**: global function +**Kind**: global constant **Returns**: Array.<string> - Array of PEM bodies | Param | Type | Description | @@ -116,10 +99,10 @@ Split chain of PEM encoded objects from buffer or string into array -## getModulus(input) ⇒ Promise.<buffer> +## getModulus ⇒ Promise.<buffer> Get modulus -**Kind**: global function +**Kind**: global constant **Returns**: Promise.<buffer> - Modulus | Param | Type | Description | @@ -135,10 +118,10 @@ const m3 = await acme.forge.getModulus(certificateRequest); ``` -## getPublicExponent(input) ⇒ Promise.<buffer> +## getPublicExponent ⇒ Promise.<buffer> Get public exponent -**Kind**: global function +**Kind**: global constant **Returns**: Promise.<buffer> - Exponent | Param | Type | Description | @@ -154,10 +137,10 @@ const e3 = await acme.forge.getPublicExponent(certificateRequest); ``` -## readCsrDomains(csr) ⇒ Promise.<object> +## readCsrDomains ⇒ Promise.<object> Read domains from a Certificate Signing Request -**Kind**: global function +**Kind**: global constant **Returns**: Promise.<object> - {commonName, altNames} | Param | Type | Description | @@ -174,10 +157,10 @@ console.log(`Alt names: ${altNames.join(', ')}`); ``` -## readCertificateInfo(cert) ⇒ Promise.<object> +## readCertificateInfo ⇒ Promise.<object> Read information from a certificate -**Kind**: global function +**Kind**: global constant **Returns**: Promise.<object> - Certificate info | Param | Type | Description | @@ -198,10 +181,10 @@ console.log(`Alt names: ${altNames.join(', ')}`); ``` -## createCsr(data, [key]) ⇒ Promise.<Array.<buffer>> +## createCsr ⇒ Promise.<Array.<buffer>> Create a Certificate Signing Request -**Kind**: global function +**Kind**: global constant **Returns**: Promise.<Array.<buffer>> - [privateKey, certificateSigningRequest] | Param | Type | Description | @@ -256,3 +239,25 @@ const certificateKey = await acme.forge.createPrivateKey(); const [, certificateRequest] = await acme.forge.createCsr({ altNames: ['test.example.com'], }, certificateKey); + + +## createPrivateKey([size]) ⇒ Promise.<buffer> +Generate a private RSA key + +**Kind**: global function +**Returns**: Promise.<buffer> - PEM encoded private RSA key + +| Param | Type | Description | +| --- | --- | --- | +| [size] | number | Size of the key, default: `2048` | + +**Example** +Generate private RSA key +```js +const privateKey = await acme.forge.createPrivateKey(); +``` +**Example** +Private RSA key with defined size +```js +const privateKey = await acme.forge.createPrivateKey(4096); +``` diff --git a/packages/core/acme-client/package.json b/packages/core/acme-client/package.json index 51a93b73..b7b17aff 100644 --- a/packages/core/acme-client/package.json +++ b/packages/core/acme-client/package.json @@ -3,7 +3,9 @@ "description": "Simple and unopinionated ACME client", "private": false, "author": "nmorsman", - "version": "1.27.0", + "version": "1.27.4", + "type": "module", + "module": "scr/index.js", "main": "src/index.js", "types": "types/index.d.ts", "license": "MIT", @@ -16,12 +18,14 @@ "types" ], "dependencies": { + "@certd/basic": "^1.27.4", "@peculiar/x509": "^1.11.0", "asn1js": "^3.0.5", "axios": "^1.7.2", "debug": "^4.3.5", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.5", + "lodash-es": "^4.17.21", "node-forge": "^1.3.1" }, "devDependencies": { @@ -29,14 +33,15 @@ "chai": "^4.4.1", "chai-as-promised": "^7.1.2", "eslint": "^8.57.0", - "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^8.5.0", "eslint-plugin-import": "^2.29.1", + "eslint-plugin-prettier": "^4.2.1", "jsdoc-to-markdown": "^8.0.1", "mocha": "^10.6.0", "nock": "^13.5.4", + "prettier": "^2.8.8", "tsd": "^0.31.1", - "typescript": "^5.4.2", - "uuid": "^8.3.2" + "typescript": "^5.4.2" }, "scripts": { "build-docs": "jsdoc2md src/client.js > docs/client.md && jsdoc2md src/crypto/index.js > docs/crypto.md && jsdoc2md src/crypto/forge.js > docs/forge.md", @@ -60,5 +65,5 @@ "bugs": { "url": "https://github.com/publishlab/node-acme-client/issues" }, - "gitHead": "c643d7edc3721a6d2ac701a35ef600f6b6ff4b34" + "gitHead": "339554bdbf61c4784614747734a420e744e13bfb" } diff --git a/packages/core/acme-client/src/agents.js b/packages/core/acme-client/src/agents.js deleted file mode 100644 index ab220dff..00000000 --- a/packages/core/acme-client/src/agents.js +++ /dev/null @@ -1,104 +0,0 @@ -const nodeHttp = require('node:http'); -const https = require('node:https'); -const { HttpProxyAgent } = require('http-proxy-agent'); -const { HttpsProxyAgent } = require('https-proxy-agent'); -const { log } = require('./logger'); - -function createAgent(opts = {}) { - let httpAgent; - let - httpsAgent; - const httpProxy = opts.httpProxy || process.env.HTTP_PROXY || process.env.http_proxy; - if (httpProxy) { - log(`acme use httpProxy:${httpProxy}`); - httpAgent = new HttpProxyAgent(httpProxy, opts); - } - else { - httpAgent = new nodeHttp.Agent(opts); - } - const httpsProxy = opts.httpsProxy || process.env.HTTPS_PROXY || process.env.https_proxy; - if (httpsProxy) { - log(`acme use httpsProxy:${httpsProxy}`); - httpsAgent = new HttpsProxyAgent(httpsProxy, opts); - } - else { - httpsAgent = new https.Agent(opts); - } - return { - httpAgent, - httpsAgent, - }; -} - -let defaultAgents = createAgent(); - -function getGlobalAgents() { - return defaultAgents; -} - -function setGlobalProxy(opts) { - log('acme setGlobalProxy:', opts); - defaultAgents = createAgent(opts); -} - -class HttpError extends Error { - // eslint-disable-next-line constructor-super - constructor(error) { - if (!error) { - return; - } - super(error.message); - - this.message = error.message; - if (this.message && this.message.indexOf('ssl3_get_record:wrong version number') >= 0) { - this.message = 'http协议错误,服务端要求http协议,请检查是否使用了https请求'; - } - - this.name = error.name; - this.code = error.code; - - if (error.response) { - this.status = error.response.status; - this.statusText = error.response.statusText; - this.response = { - data: error.response.data, - }; - if (!this.message) { - this.message = this.statusText; - } - } - - let url = ''; - if (error.config) { - this.request = { - baseURL: error.config.baseURL, - url: error.config.url, - method: error.config.method, - params: error.config.params, - data: error.config.data, - }; - url = (error.config.baseURL || '') + error.config.url; - } - if (url) { - this.message = `${this.message}:${url}`; - } - // const { stack, cause } = error; - delete this.cause; - delete this.stack; - // this.cause = cause; - // this.stack = stack; - delete error.stack; - delete error.cause; - delete error.response; - delete error.config; - delete error.request; - // logger.error(error); - } -} - -module.exports = { - setGlobalProxy, - createAgent, - getGlobalAgents, - HttpError, -}; diff --git a/packages/core/acme-client/src/api.js b/packages/core/acme-client/src/api.js index 70e21b5b..f3035de6 100644 --- a/packages/core/acme-client/src/api.js +++ b/packages/core/acme-client/src/api.js @@ -1,9 +1,7 @@ /** * ACME API client */ - -const util = require('./util'); -const { log } = require('./logger'); +import * as util from './util.js'; /** * AcmeApi @@ -248,4 +246,4 @@ class AcmeApi { } /* Export API */ -module.exports = AcmeApi; +export default AcmeApi; diff --git a/packages/core/acme-client/src/auto.js b/packages/core/acme-client/src/auto.js index 7e192616..06b49277 100644 --- a/packages/core/acme-client/src/auto.js +++ b/packages/core/acme-client/src/auto.js @@ -1,11 +1,11 @@ /** * ACME auto helper */ +import { readCsrDomains } from './crypto/index.js'; +import { log } from './logger.js'; +import { wait } from './wait.js'; +import { CancelError } from './error.js'; -const { readCsrDomains } = require('./crypto'); -const { log } = require('./logger'); -const { wait } = require('./wait'); -const { CancelError } = require('./error'); const defaultOpts = { csr: null, @@ -30,7 +30,7 @@ const defaultOpts = { * @returns {Promise} Certificate */ -module.exports = async (client, userOpts) => { +export default async (client, userOpts) => { const opts = { ...defaultOpts, ...userOpts }; const accountPayload = { termsOfServiceAgreed: opts.termsOfServiceAgreed }; diff --git a/packages/core/acme-client/src/axios.js b/packages/core/acme-client/src/axios.js index ed3313a2..0c5491ea 100644 --- a/packages/core/acme-client/src/axios.js +++ b/packages/core/acme-client/src/axios.js @@ -1,14 +1,11 @@ /** * Axios instance */ -const axios = require('axios'); -const { parseRetryAfterHeader } = require('./util'); -const { log } = require('./logger'); -const pkg = require('./../package.json'); -const Agents = require('./agents'); - +import axios from 'axios'; +import { parseRetryAfterHeader } from './util.js'; +import { log } from './logger.js'; const { AxiosError } = axios; - +import {getGlobalAgents, HttpError} from '@certd/basic' /** * Defaults */ @@ -16,7 +13,7 @@ const { AxiosError } = axios; const instance = axios.create(); /* Default User-Agent */ -instance.defaults.headers.common['User-Agent'] = `node-${pkg.name}/${pkg.version}`; +instance.defaults.headers.common['User-Agent'] = `@certd/acme-client`; /* Default ACME settings */ instance.defaults.acmeSettings = { @@ -75,7 +72,7 @@ function validateStatus(response) { response, ); - throw new Agents.HttpError(err); + throw new HttpError(err); } /* Pass all responses through the error interceptor */ @@ -85,7 +82,7 @@ instance.interceptors.request.use((config) => { } config.validateStatus = () => false; - const agents = Agents.getGlobalAgents(); + const agents = getGlobalAgents(); // if (config.skipSslVerify) { // logger.info('跳过SSL验证'); // agents = createAgent({ rejectUnauthorized: false } as any); @@ -102,7 +99,7 @@ instance.interceptors.response.use(null, async (error) => { const { config, response } = error; if (!config) { - return Promise.reject(new Agents.HttpError(error)); + return Promise.reject(new HttpError(error)); } /* Pick up errors we want to retry */ @@ -122,7 +119,7 @@ instance.interceptors.response.use(null, async (error) => { const waitMinutes = (headerRetryAfter / 60).toFixed(1); log(`Found retry-after response header with value: ${response.headers['retry-after']}, waiting ${waitMinutes} minutes`); log(JSON.stringify(response.data)); - return Promise.reject(new Agents.HttpError(error)); + return Promise.reject(new HttpError(error)); } log(`waiting ${retryAfter} seconds`); @@ -134,7 +131,7 @@ instance.interceptors.response.use(null, async (error) => { } if (!response) { - return Promise.reject(new Agents.HttpError(error)); + return Promise.reject(new HttpError(error)); } /* Validate and return response */ return validateStatus(response); @@ -144,4 +141,4 @@ instance.interceptors.response.use(null, async (error) => { * Export instance */ -module.exports = instance; +export default instance; diff --git a/packages/core/acme-client/src/client.js b/packages/core/acme-client/src/client.js index d5b9b807..998e682a 100644 --- a/packages/core/acme-client/src/client.js +++ b/packages/core/acme-client/src/client.js @@ -3,16 +3,17 @@ * * @namespace Client */ +import { createHash } from 'crypto'; +import { getPemBodyAsB64u } from './crypto/index.js'; +import { log } from './logger.js'; +import HttpClient from './http.js'; +import AcmeApi from './api.js'; +import verify from './verify.js'; +import * as util from './util.js'; +import auto from './auto.js'; +import { CancelError } from './error.js'; + -const { createHash } = require('crypto'); -const { getPemBodyAsB64u } = require('./crypto'); -const { log } = require('./logger'); -const HttpClient = require('./http'); -const AcmeApi = require('./api'); -const verify = require('./verify'); -const util = require('./util'); -const auto = require('./auto'); -const { CancelError } = require('./error'); /** * ACME states @@ -719,4 +720,4 @@ class AcmeClient { } /* Export client */ -module.exports = AcmeClient; +export default AcmeClient; diff --git a/packages/core/acme-client/src/crypto/forge.js b/packages/core/acme-client/src/crypto/forge.js index b13f4b1a..2203ebc8 100644 --- a/packages/core/acme-client/src/crypto/forge.js +++ b/packages/core/acme-client/src/crypto/forge.js @@ -6,11 +6,10 @@ * * @namespace forge */ - -const net = require('net'); -const { promisify } = require('util'); -const forge = require('node-forge'); -const { createPrivateEcdsaKey, getPublicKey } = require('./index'); +import net from 'net'; +import { promisify } from 'util'; +import forge from 'node-forge'; +import { createPrivateEcdsaKey } from './index.js'; const generateKeyPair = promisify(forge.pki.rsa.generateKeyPair); @@ -113,13 +112,12 @@ function parseDomains(obj) { * ``` */ -async function createPrivateKey(size = 2048) { +export async function createPrivateKey(size = 2048) { const keyPair = await generateKeyPair({ bits: size }); const pemKey = forge.pki.privateKeyToPem(keyPair.privateKey); return Buffer.from(pemKey); } -exports.createPrivateKey = createPrivateKey; /** * Create public key from a private RSA key @@ -133,7 +131,7 @@ exports.createPrivateKey = createPrivateKey; * ``` */ -exports.createPublicKey = async (key) => { +export const createPublicKey = async (key) => { const privateKey = forge.pki.privateKeyFromPem(key); const publicKey = forge.pki.rsa.setPublicKey(privateKey.n, privateKey.e); const pemKey = forge.pki.publicKeyToPem(publicKey); @@ -148,7 +146,7 @@ exports.createPublicKey = async (key) => { * @returns {string} PEM body */ -exports.getPemBody = (str) => { +export const getPemBody = (str) => { const msg = forge.pem.decode(str)[0]; return forge.util.encode64(msg.body); }; @@ -160,7 +158,7 @@ exports.getPemBody = (str) => { * @returns {string[]} Array of PEM bodies */ -exports.splitPemChain = (str) => forge.pem.decode(str).map(forge.pem.encode); +export const splitPemChain = (str) => forge.pem.decode(str).map(forge.pem.encode); /** * Get modulus @@ -176,7 +174,7 @@ exports.splitPemChain = (str) => forge.pem.decode(str).map(forge.pem.encode); * ``` */ -exports.getModulus = async (input) => { +export const getModulus = async (input) => { if (!Buffer.isBuffer(input)) { input = Buffer.from(input); } @@ -199,7 +197,7 @@ exports.getModulus = async (input) => { * ``` */ -exports.getPublicExponent = async (input) => { +export const getPublicExponent = async (input) => { if (!Buffer.isBuffer(input)) { input = Buffer.from(input); } @@ -223,7 +221,7 @@ exports.getPublicExponent = async (input) => { * ``` */ -exports.readCsrDomains = async (csr) => { +export const readCsrDomains = async (csr) => { if (!Buffer.isBuffer(csr)) { csr = Buffer.from(csr); } @@ -251,7 +249,7 @@ exports.readCsrDomains = async (csr) => { * ``` */ -exports.readCertificateInfo = async (cert) => { +export const readCertificateInfo = async (cert) => { if (!Buffer.isBuffer(cert)) { cert = Buffer.from(cert); } @@ -379,7 +377,7 @@ function formatCsrAltNames(altNames) { * }, certificateKey); */ -exports.createCsr = async (data, keyType = null) => { +export const createCsr = async (data, keyType = null) => { let key = null; if (keyType === 'ec') { key = await createPrivateEcdsaKey(); diff --git a/packages/core/acme-client/src/crypto/index.js b/packages/core/acme-client/src/crypto/index.js index 79c59859..a8b208b5 100644 --- a/packages/core/acme-client/src/crypto/index.js +++ b/packages/core/acme-client/src/crypto/index.js @@ -3,12 +3,12 @@ * * @namespace crypto */ +import net from 'net'; +import { promisify } from 'util'; +import crypto from 'crypto'; +import asn1js from 'asn1js'; +import x509 from '@peculiar/x509'; -const net = require('net'); -const { promisify } = require('util'); -const crypto = require('crypto'); -const asn1js = require('asn1js'); -const x509 = require('@peculiar/x509'); const randomInt = promisify(crypto.randomInt); const generateKeyPair = promisify(crypto.generateKeyPair); @@ -67,7 +67,7 @@ function getKeyInfo(keyPem) { * ``` */ -async function createPrivateRsaKey(modulusLength = 2048, encodingType = 'pkcs8') { +export async function createPrivateRsaKey(modulusLength = 2048, encodingType = 'pkcs8') { const pair = await generateKeyPair('rsa', { modulusLength, privateKeyEncoding: { @@ -79,7 +79,6 @@ async function createPrivateRsaKey(modulusLength = 2048, encodingType = 'pkcs8') return Buffer.from(pair.privateKey); } -exports.createPrivateRsaKey = createPrivateRsaKey; /** * Alias of `createPrivateRsaKey()` @@ -87,7 +86,7 @@ exports.createPrivateRsaKey = createPrivateRsaKey; * @function */ -exports.createPrivateKey = createPrivateRsaKey; +export const createPrivateKey = createPrivateRsaKey; /** * Generate a private ECDSA key @@ -106,7 +105,7 @@ exports.createPrivateKey = createPrivateRsaKey; * ``` */ -exports.createPrivateEcdsaKey = async (namedCurve = 'P-256', encodingType = 'pkcs8') => { +export const createPrivateEcdsaKey = async (namedCurve = 'P-256', encodingType = 'pkcs8') => { const pair = await generateKeyPair('ec', { namedCurve, privateKeyEncoding: { @@ -130,7 +129,7 @@ exports.createPrivateEcdsaKey = async (namedCurve = 'P-256', encodingType = 'pkc * ``` */ -exports.getPublicKey = (keyPem) => { +export const getPublicKey = (keyPem) => { const info = getKeyInfo(keyPem); const publicKey = info.publicKey.export({ @@ -155,7 +154,7 @@ exports.getPublicKey = (keyPem) => { * ``` */ -function getJwk(keyPem) { +export function getJwk(keyPem) { const jwk = crypto.createPublicKey(keyPem).export({ format: 'jwk', }); @@ -167,7 +166,6 @@ function getJwk(keyPem) { }, {}); } -exports.getJwk = getJwk; /** * Produce CryptoKeyPair and signing algorithm from a PEM encoded private key @@ -215,7 +213,7 @@ async function getWebCryptoKeyPair(keyPem) { * @returns {string[]} Array of PEM objects including headers */ -function splitPemChain(chainPem) { +export function splitPemChain(chainPem) { if (Buffer.isBuffer(chainPem)) { chainPem = chainPem.toString(); } @@ -225,7 +223,6 @@ function splitPemChain(chainPem) { .map((params) => x509.PemConverter.encode([params])); } -exports.splitPemChain = splitPemChain; /** * Parse body of PEM encoded object and return a Base64URL string @@ -235,7 +232,7 @@ exports.splitPemChain = splitPemChain; * @returns {string} Base64URL-encoded body */ -exports.getPemBodyAsB64u = (pem) => { +export const getPemBodyAsB64u = (pem) => { const chain = splitPemChain(pem); if (!chain.length) { @@ -286,7 +283,7 @@ function parseDomains(input) { * ``` */ -exports.readCsrDomains = (csrPem) => { +export const readCsrDomains = (csrPem) => { if (Buffer.isBuffer(csrPem)) { csrPem = csrPem.toString(); } @@ -315,7 +312,7 @@ exports.readCsrDomains = (csrPem) => { * ``` */ -exports.readCertificateInfo = (certPem) => { +export const readCertificateInfo = (certPem) => { if (Buffer.isBuffer(certPem)) { certPem = certPem.toString(); } @@ -449,7 +446,7 @@ function createSubjectAltNameExtension(altNames) { * ``` */ -exports.createCsr = async (data, keyPem = null) => { +export const createCsr = async (data, keyPem = null) => { if (!keyPem) { keyPem = await createPrivateRsaKey(data.keySize); } @@ -520,7 +517,7 @@ exports.createCsr = async (data, keyPem = null) => { * ``` */ -exports.createAlpnCertificate = async (authz, keyAuthorization, keyPem = null) => { +export const createAlpnCertificate = async (authz, keyAuthorization, keyPem = null) => { if (!keyPem) { keyPem = await createPrivateRsaKey(); } @@ -583,7 +580,7 @@ exports.createAlpnCertificate = async (authz, keyAuthorization, keyPem = null) = * @returns {boolean} True when valid */ -exports.isAlpnCertificateAuthorizationValid = (certPem, keyAuthorization) => { +export const isAlpnCertificateAuthorizationValid = (certPem, keyAuthorization) => { const expected = crypto.createHash('sha256').update(keyAuthorization).digest('hex'); /* Attempt to locate ALPN extension */ diff --git a/packages/core/acme-client/src/error.js b/packages/core/acme-client/src/error.js index cc23f49a..4539457e 100644 --- a/packages/core/acme-client/src/error.js +++ b/packages/core/acme-client/src/error.js @@ -1,10 +1,7 @@ -class CancelError extends Error { +export class CancelError extends Error { constructor(message) { super(message); this.name = 'CancelError'; } } -module.exports = { - CancelError, -}; diff --git a/packages/core/acme-client/src/http.js b/packages/core/acme-client/src/http.js index 2e2915f6..85bd6482 100644 --- a/packages/core/acme-client/src/http.js +++ b/packages/core/acme-client/src/http.js @@ -1,11 +1,11 @@ /** * ACME HTTP client */ - -const { createHmac, createSign, constants: { RSA_PKCS1_PADDING } } = require('crypto'); -const { getJwk } = require('./crypto'); -const { log } = require('./logger'); -const axios = require('./axios'); +import { createHmac, createSign, constants } from 'crypto'; +const { RSA_PKCS1_PADDING } = constants; +import axios from './axios.js'; +import { log } from './logger.js'; +import { getJwk } from './crypto/index.js'; /** * ACME HTTP client @@ -324,4 +324,4 @@ class HttpClient { } /* Export client */ -module.exports = HttpClient; +export default HttpClient; diff --git a/packages/core/acme-client/src/index.js b/packages/core/acme-client/src/index.js index 63019f2d..acc95e48 100644 --- a/packages/core/acme-client/src/index.js +++ b/packages/core/acme-client/src/index.js @@ -1,14 +1,14 @@ /** * acme-client */ - -exports.Client = require('./client'); +import AcmeClinet from './client.js' +export const Client = AcmeClinet /** * Directory URLs */ -exports.directory = { +export const directory = { buypass: { staging: 'https://api.test4.buypass.no/acme/directory', production: 'https://api.buypass.com/acme/directory', @@ -31,21 +31,18 @@ exports.directory = { * Crypto */ -exports.crypto = require('./crypto'); -exports.forge = require('./crypto/forge'); +export * as crypto from './crypto/index.js' +export * as forge from './crypto/forge.js' /** * Axios */ -exports.axios = require('./axios'); -exports.agents = require('./agents'); - +export * from './axios.js' /** * Logger */ -exports.setLogger = require('./logger').setLogger; - -exports.walkTxtRecord = require('./verify').walkTxtRecord; -exports.CancelError = require('./error').CancelError; +export * from './logger.js' +export * from './verify.js' +export * from './error.js' diff --git a/packages/core/acme-client/src/logger.js b/packages/core/acme-client/src/logger.js index 166a7a9c..c85e667c 100644 --- a/packages/core/acme-client/src/logger.js +++ b/packages/core/acme-client/src/logger.js @@ -2,7 +2,8 @@ * ACME logger */ -const debug = require('debug')('acme-client'); +import debugg from 'debug' +const debug = debugg('acme-client'); let logger = () => {}; @@ -12,7 +13,7 @@ let logger = () => {}; * @param {function} fn Logger function */ -exports.setLogger = (fn) => { +export const setLogger = (fn) => { logger = fn; }; @@ -22,7 +23,7 @@ exports.setLogger = (fn) => { * @param {string} msg Message */ -exports.log = (...msg) => { +export const log = (...msg) => { debug(...msg); logger(...msg); }; diff --git a/packages/core/acme-client/src/util.js b/packages/core/acme-client/src/util.js index 242b47eb..0ccbce49 100644 --- a/packages/core/acme-client/src/util.js +++ b/packages/core/acme-client/src/util.js @@ -2,11 +2,12 @@ * Utility methods */ -const tls = require('tls'); -const dns = require('dns').promises; -const { readCertificateInfo, splitPemChain } = require('./crypto'); -const { log } = require('./logger'); +import tls from 'tls'; +import dnsSdk from 'dns'; +import { readCertificateInfo, splitPemChain }from './crypto/index.js' +import { log } from './logger.js' +const dns = dnsSdk.promises; /** * Exponential backoff * @@ -329,7 +330,7 @@ async function retrieveTlsAlpnCertificate(host, port, timeout = 30000) { * Export utils */ -module.exports = { +export { retry, parseLinkHeader, parseRetryAfterHeader, @@ -338,3 +339,4 @@ module.exports = { getAuthoritativeDnsResolver, retrieveTlsAlpnCertificate, }; + diff --git a/packages/core/acme-client/src/verify.js b/packages/core/acme-client/src/verify.js index 875252a1..53214532 100644 --- a/packages/core/acme-client/src/verify.js +++ b/packages/core/acme-client/src/verify.js @@ -2,13 +2,15 @@ * ACME challenge verification */ -const dns = require('dns').promises; -const https = require('https'); -const { log } = require('./logger'); -const axios = require('./axios'); -const util = require('./util'); -const { isAlpnCertificateAuthorizationValid } = require('./crypto'); +import dnsSdk from "dns" +import https from 'https' +import {log} from './logger.js' +import axios from './axios.js' +import * as util from './util.js' +import {isAlpnCertificateAuthorizationValid} from './crypto/index.js' + +const dns = dnsSdk.promises /** * Verify ACME HTTP challenge * @@ -79,7 +81,7 @@ async function walkDnsChallengeRecord(recordName, resolver = dns) { } } -async function walkTxtRecord(recordName) { +export async function walkTxtRecord(recordName) { try { /* Default DNS resolver first */ log('Attempting to resolve TXT with default DNS resolver first'); @@ -153,9 +155,8 @@ async function verifyTlsAlpnChallenge(authz, challenge, keyAuthorization) { * Export API */ -module.exports = { +export default { 'http-01': verifyHttpChallenge, 'dns-01': verifyDnsChallenge, 'tls-alpn-01': verifyTlsAlpnChallenge, - walkTxtRecord, }; diff --git a/packages/core/acme-client/src/wait.js b/packages/core/acme-client/src/wait.js index f39e53c3..48f2898a 100644 --- a/packages/core/acme-client/src/wait.js +++ b/packages/core/acme-client/src/wait.js @@ -1,9 +1,5 @@ -async function wait(ms) { +export async function wait(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); }); } - -module.exports = { - wait, -}; diff --git a/packages/core/acme-client/tsconfig.json b/packages/core/acme-client/tsconfig.json deleted file mode 100644 index 4b084b3c..00000000 --- a/packages/core/acme-client/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compileOnSave": false, - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "strict": true, - "noEmit": false, - "esModuleInterop": true, - "baseUrl": ".", - "composite": true, - "paths": { "acme-client": ["."] } - } -} diff --git a/packages/core/basic/CHANGELOG.md b/packages/core/basic/CHANGELOG.md index 8b10f1d8..8b563851 100644 --- a/packages/core/basic/CHANGELOG.md +++ b/packages/core/basic/CHANGELOG.md @@ -3,6 +3,28 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14) + +**Note:** Version bump only for package @certd/basic + +## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13) + +### Bug Fixes + +* 修复ipv6未开启情况下,请求带有ipv6地址域名报ETIMEDOUT的bug ([a9a0967](https://github.com/certd/certd/commit/a9a0967a6f1d0bd27e69f3ec52c31d90d470bc23)) + +## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08) + +### Performance Improvements + +* 支持公共cname服务 ([3c919ee](https://github.com/certd/certd/commit/3c919ee5d1aef5d26cf3620a7c49d920786bc941)) + +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +### Performance Improvements + +* cname 域名映射记录可读性优化 ([b1117ed](https://github.com/certd/certd/commit/b1117ed54a3ef015752999324ff72b821ef5e4b9)) + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) **Note:** Version bump only for package @certd/basic diff --git a/packages/core/basic/build.md b/packages/core/basic/build.md index 2a38d7b2..ebfeee18 100644 --- a/packages/core/basic/build.md +++ b/packages/core/basic/build.md @@ -1 +1 @@ -02:21 +21:51 diff --git a/packages/core/basic/package.json b/packages/core/basic/package.json index 720aaba0..120dbf3f 100644 --- a/packages/core/basic/package.json +++ b/packages/core/basic/package.json @@ -1,7 +1,7 @@ { "name": "@certd/basic", "private": false, - "version": "1.27.0", + "version": "1.27.4", "type": "module", "main": "./dist/index.js", "module": "./dist/index.js", @@ -17,52 +17,31 @@ "dependencies": { "axios": "^1.7.2", "dayjs": "^1.11.7", - "fix-path": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.5", + "iconv-lite": "^0.6.3", "lodash-es": "^4.17.21", + "log4js": "^6.9.1", "lru-cache": "^10.0.0", "nanoid": "^5.0.7", "node-forge": "^1.3.1", - "nodemailer": "^6.9.3", - "proxy-agent": "^6.4.0", - "qs": "^6.11.2" + "nodemailer": "^6.9.3" }, "devDependencies": { - "@rollup/plugin-commonjs": "^23.0.4", - "@rollup/plugin-json": "^6.0.0", - "@rollup/plugin-node-resolve": "^15.0.1", - "@rollup/plugin-terser": "^0.4.3", - "@rollup/plugin-typescript": "^11.0.0", "@types/chai": "^4.3.10", "@types/lodash-es": "^4.17.12", "@types/mocha": "^10.0.1", "@types/node-forge": "^1.3.2", - "@types/uuid": "^9.0.2", "@typescript-eslint/eslint-plugin": "^5.59.7", "@typescript-eslint/parser": "^5.59.7", "chai": "4.3.10", - "dayjs": "^1.11.7", "eslint": "^8.41.0", "eslint-config-prettier": "^8.8.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^4.2.1", - "iconv-lite": "^0.6.3", - "log4js": "^6.9.1", - "mocha": "^10.2.0", "prettier": "^2.8.8", - "reflect-metadata": "^0.1.13", "rimraf": "^5.0.5", - "rollup": "^3.7.4", - "rollup-plugin-typescript2": "^0.34.1", - "rollup-plugin-visualizer": "^5.8.2", - "ts-node": "^10.9.1", - "tsc-esm-fix": "^3.0.0", - "tslib": "^2.5.2", - "typescript": "^5.4.2", - "vite": "^4.3.8", - "vue-tsc": "^1.6.5" + "tslib": "^2.8.1", + "typescript": "^5.4.2" }, - "gitHead": "c643d7edc3721a6d2ac701a35ef600f6b6ff4b34" + "gitHead": "339554bdbf61c4784614747734a420e744e13bfb" } diff --git a/packages/core/basic/src/index.ts b/packages/core/basic/src/index.ts index 3ac870a7..25cc7a63 100644 --- a/packages/core/basic/src/index.ts +++ b/packages/core/basic/src/index.ts @@ -1 +1,2 @@ export * from './utils/index.js'; +export * from './utils/util.id.js'; diff --git a/packages/core/basic/src/utils/index.ts b/packages/core/basic/src/utils/index.ts index ba12f73a..43a0d321 100644 --- a/packages/core/basic/src/utils/index.ts +++ b/packages/core/basic/src/utils/index.ts @@ -7,9 +7,11 @@ export * from './util.promise.js'; export * from './util.hash.js'; export * from './util.merge.js'; export * from './util.cache.js'; +export * from './util.string.js'; +import { stringUtils } from './util.string.js'; import sleep from './util.sleep.js'; -import { http } from './util.request.js'; -import { nanoid } from 'nanoid'; +import { http, download } from './util.request.js'; + import { mergeUtils } from './util.merge.js'; import { sp } from './util.sp.js'; import { hashUtils } from './util.hash.js'; @@ -20,10 +22,12 @@ import { cache } from './util.cache.js'; import dayjs from 'dayjs'; import { domainUtils } from './util.domain.js'; import { optionsUtils } from './util.options.js'; - +import { nanoid } from 'nanoid'; +import * as id from './util.id.js'; export const utils = { sleep, http, + download, sp, hash: hashUtils, promises, @@ -32,7 +36,9 @@ export const utils = { mergeUtils, cache, nanoid, + id, dayjs, domain: domainUtils, options: optionsUtils, + string: stringUtils, }; diff --git a/packages/core/basic/src/utils/util.cache.ts b/packages/core/basic/src/utils/util.cache.ts index 132a5532..a9788758 100644 --- a/packages/core/basic/src/utils/util.cache.ts +++ b/packages/core/basic/src/utils/util.cache.ts @@ -1,6 +1,6 @@ // LRUCache -import { LRUCache } from "lru-cache"; +import { LRUCache } from 'lru-cache'; export const cache = new LRUCache({ max: 1000, diff --git a/packages/core/basic/src/utils/util.env.ts b/packages/core/basic/src/utils/util.env.ts index 1427b882..65983bca 100644 --- a/packages/core/basic/src/utils/util.env.ts +++ b/packages/core/basic/src/utils/util.env.ts @@ -1,3 +1,4 @@ export function isDev() { - return process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'local'; + const nodeEnv = process.env.NODE_ENV || ''; + return nodeEnv === 'development' || nodeEnv.indexOf('local') >= 0; } diff --git a/packages/core/basic/src/utils/util.id.ts b/packages/core/basic/src/utils/util.id.ts new file mode 100644 index 00000000..ca00030c --- /dev/null +++ b/packages/core/basic/src/utils/util.id.ts @@ -0,0 +1,3 @@ +import { customAlphabet } from 'nanoid'; + +export const simpleNanoId = customAlphabet('1234567890abcdefghijklmopqrstuvwxyz', 12); diff --git a/packages/core/basic/src/utils/util.merge.ts b/packages/core/basic/src/utils/util.merge.ts index 72d5fc40..dae9d49d 100644 --- a/packages/core/basic/src/utils/util.merge.ts +++ b/packages/core/basic/src/utils/util.merge.ts @@ -1,4 +1,4 @@ -import _ from "lodash-es"; +import * as _ from 'lodash-es'; function isUnMergeable(srcValue: any) { return srcValue != null && srcValue instanceof UnMergeable; } diff --git a/packages/core/basic/src/utils/util.options.ts b/packages/core/basic/src/utils/util.options.ts index f5a0097e..96180e60 100644 --- a/packages/core/basic/src/utils/util.options.ts +++ b/packages/core/basic/src/utils/util.options.ts @@ -19,7 +19,7 @@ function groupByDomain(options: any[], inDomains: string[]) { function buildGroupOptions(options: any[], inDomains: string[]) { const grouped = groupByDomain(options, inDomains); const groupOptions = []; - groupOptions.push({ value: '', disabled: true, label: '----已匹配----' }); + groupOptions.push({ value: 'matched', disabled: true, label: '----已匹配----' }); if (grouped.matched.length === 0) { options.push({ value: '', disabled: true, label: '没有可以匹配的域名' }); } else { @@ -28,7 +28,7 @@ function buildGroupOptions(options: any[], inDomains: string[]) { } } if (grouped.notMatched.length > 0) { - groupOptions.push({ value: '', disabled: true, label: '----未匹配----' }); + groupOptions.push({ value: 'unmatched', disabled: true, label: '----未匹配----' }); for (const notMatched of grouped.notMatched) { groupOptions.push(notMatched); } diff --git a/packages/core/basic/src/utils/util.request.ts b/packages/core/basic/src/utils/util.request.ts index 10b8b16c..73867523 100644 --- a/packages/core/basic/src/utils/util.request.ts +++ b/packages/core/basic/src/utils/util.request.ts @@ -1,11 +1,13 @@ import axios, { AxiosRequestConfig } from 'axios'; -import { logger } from './util.log.js'; +import { ILogger, logger } from './util.log.js'; import { Logger } from 'log4js'; import { HttpProxyAgent } from 'http-proxy-agent'; import { HttpsProxyAgent } from 'https-proxy-agent'; import nodeHttp from 'http'; import * as https from 'node:https'; import { merge } from 'lodash-es'; +import { safePromise } from './util.promise.js'; +import fs from 'fs'; export class HttpError extends Error { status?: number; statusText?: string; @@ -19,15 +21,23 @@ export class HttpError extends Error { } super(error.message || error.response?.statusText); - if (error?.message?.indexOf && error?.message?.indexOf('ssl3_get_record:wrong version number') >= 0) { - this.message = 'http协议错误,服务端要求http协议,请检查是否使用了https请求'; + const message = error?.message; + if (message && typeof message === 'string') { + if (message.indexOf && message.indexOf('ssl3_get_record:wrong version number') >= 0) { + this.message = `${message}(http协议错误,服务端要求http协议,请检查是否使用了https请求)`; + } else if (message.indexOf('getaddrinfo EAI_AGAIN') >= 0) { + this.message = `${message}(无法解析域名,请检查网络连接或dns配置,更换docker-compose.yaml中dns配置)`; + } } this.name = error.name; this.code = error.code; this.status = error.response?.status; - this.statusText = error.response?.statusText; + this.statusText = error.response?.statusText || error.code; + if (!this.message) { + this.message = error.code; + } this.request = { baseURL: error.config?.baseURL, url: error.config?.url, @@ -40,16 +50,16 @@ export class HttpError extends Error { url = (error.config?.baseURL || '') + url; } if (url) { - this.message = `${this.message} : url=${url}`; + this.message = `${this.message} 【${url}】`; } this.response = { data: error.response?.data, }; - // const { stack, cause } = error; - // this.cause = cause; - // this.stack = stack; + const { stack, cause } = error; + this.cause = cause; + this.stack = stack; delete error.response; delete error.config; delete error.request; @@ -113,7 +123,12 @@ export function createAxiosService({ logger }: { logger: Logger }) { service.interceptors.response.use( (response: any) => { if (response?.config?.logRes !== false) { - logger.info(`http response : status=${response?.status},data=${JSON.stringify(response?.data)}`); + let resData = response?.data; + try { + resData = JSON.stringify(response?.data); + } catch (e) {} + + logger.info(`http response : status=${response?.status},data=${resData}`); } else { logger.info('http response status:', response?.status); } @@ -187,26 +202,45 @@ export type HttpClient = { request(config: HttpRequestConfig): Promise>; }; +// const http_proxy_backup = process.env.HTTP_PROXY || process.env.http_proxy; +// const https_proxy_backup = process.env.HTTPS_PROXY || process.env.https_proxy; + export type CreateAgentOptions = { httpProxy?: string; httpsProxy?: string; } & nodeHttp.AgentOptions; export function createAgent(opts: CreateAgentOptions = {}) { + opts = merge( + { + autoSelectFamily: true, + autoSelectFamilyAttemptTimeout: 1000, + }, + opts + ); + let httpAgent, httpsAgent; - const httpProxy = opts.httpProxy || process.env.HTTP_PROXY || process.env.http_proxy; + const httpProxy = opts.httpProxy; if (httpProxy) { + process.env.HTTP_PROXY = httpProxy; + process.env.http_proxy = httpProxy; logger.info('use httpProxy:', httpProxy); httpAgent = new HttpProxyAgent(httpProxy, opts as any); merge(httpAgent.options, opts); } else { + process.env.HTTP_PROXY = ''; + process.env.http_proxy = ''; httpAgent = new nodeHttp.Agent(opts); } - const httpsProxy = opts.httpsProxy || process.env.HTTPS_PROXY || process.env.https_proxy; + const httpsProxy = opts.httpsProxy; if (httpsProxy) { + process.env.HTTPS_PROXY = httpProxy; + process.env.https_proxy = httpProxy; logger.info('use httpsProxy:', httpsProxy); httpsAgent = new HttpsProxyAgent(httpsProxy, opts as any); merge(httpsAgent.options, opts); } else { + process.env.HTTPS_PROXY = ''; + process.env.https_proxy = ''; httpsAgent = new https.Agent(opts); } return { @@ -214,3 +248,44 @@ export function createAgent(opts: CreateAgentOptions = {}) { httpsAgent, }; } + +export async function download(req: { http: HttpClient; config: HttpRequestConfig; savePath: string; logger: ILogger }) { + const { http, config, savePath, logger } = req; + return safePromise((resolve, reject) => { + http + .request({ + logRes: false, + responseType: 'stream', + ...config, + }) + .then(res => { + const writer = fs.createWriteStream(savePath); + res.pipe(writer); + writer.on('close', () => { + logger.info('文件下载成功'); + resolve(true); + }); + //error + writer.on('error', err => { + logger.error('下载失败', err); + reject(err); + }); + //进度条打印 + const totalLength = res.headers['content-length']; + let currentLength = 0; + // 每5%打印一次 + const step = (totalLength / 100) * 5; + res.on('data', (chunk: any) => { + currentLength += chunk.length; + if (currentLength % step < chunk.length) { + const percent = ((currentLength / totalLength) * 100).toFixed(2); + logger.info(`下载进度:${percent}%`); + } + }); + }) + .catch(err => { + logger.info('下载失败', err); + reject(err); + }); + }); +} diff --git a/packages/core/basic/src/utils/util.string.ts b/packages/core/basic/src/utils/util.string.ts new file mode 100644 index 00000000..591cc99d --- /dev/null +++ b/packages/core/basic/src/utils/util.string.ts @@ -0,0 +1,8 @@ +export const stringUtils = { + maxLength(str?: string, length = 100) { + if (str) { + return str.length > length ? str.slice(0, length) + '...' : str; + } + return ''; + }, +}; diff --git a/packages/core/basic/tsconfig.json b/packages/core/basic/tsconfig.json index 42bad159..b85a9997 100644 --- a/packages/core/basic/tsconfig.json +++ b/packages/core/basic/tsconfig.json @@ -7,28 +7,27 @@ "esModuleInterop": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, - "inlineSourceMap":true, "noImplicitThis": true, "noUnusedLocals": true, "stripInternal": true, + "importHelpers": true, "skipLibCheck": true, "pretty": true, "declaration": true, "forceConsistentCasingInFileNames": true, - "typeRoots": [ "./typings", "./node_modules/@types"], "outDir": "dist", "rootDir": "src", - "composite": true, + "composite": false, "useDefineForClassFields": true, "strict": true, -// "sourceMap": true, + "typeRoots": [ "./typings", "./node_modules/@types"], + "inlineSourceMap": true, "resolveJsonModule": true, "isolatedModules": false, "lib": ["ESNext", "DOM"], }, "include": [ "src/**/*.ts", - "src/**/*.d.ts", "src/**/*.json" ], "exclude": [ diff --git a/packages/core/pipeline/CHANGELOG.md b/packages/core/pipeline/CHANGELOG.md index bad4d177..b7d7d8d4 100644 --- a/packages/core/pipeline/CHANGELOG.md +++ b/packages/core/pipeline/CHANGELOG.md @@ -3,6 +3,26 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14) + +**Note:** Version bump only for package @certd/pipeline + +## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13) + +**Note:** Version bump only for package @certd/pipeline + +## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08) + +### Performance Improvements + +* 支持公共cname服务 ([3c919ee](https://github.com/certd/certd/commit/3c919ee5d1aef5d26cf3620a7c49d920786bc941)) + +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +### Performance Improvements + +* 优化时间选择器,自动填写分钟和秒钟 ([396dc34](https://github.com/certd/certd/commit/396dc34a841c7d016b033736afdba8366fb2d211)) + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) **Note:** Version bump only for package @certd/pipeline diff --git a/packages/core/pipeline/package.json b/packages/core/pipeline/package.json index 6ebb2c50..9788e867 100644 --- a/packages/core/pipeline/package.json +++ b/packages/core/pipeline/package.json @@ -1,9 +1,10 @@ { "name": "@certd/pipeline", "private": false, - "version": "1.27.0", + "version": "1.27.4", "type": "module", "main": "./dist/index.js", + "module": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { "dev": "vite", @@ -15,20 +16,11 @@ "test": "mocha --loader=ts-node/esm" }, "dependencies": { - "@certd/basic": "^1.27.0", - "@certd/plus-core": "^1.27.0", - "axios": "^1.7.2", + "@certd/basic": "^1.27.4", + "@certd/plus-core": "^1.27.4", "dayjs": "^1.11.7", - "fix-path": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", "lodash-es": "^4.17.21", - "lru-cache": "^10.0.0", - "nanoid": "^5.0.7", - "node-forge": "^1.3.1", - "nodemailer": "^6.9.3", - "proxy-agent": "^6.4.0", - "qs": "^6.11.2" + "reflect-metadata": "^0.1.13" }, "devDependencies": { "@rollup/plugin-commonjs": "^23.0.4", @@ -39,32 +31,17 @@ "@types/chai": "^4.3.10", "@types/lodash-es": "^4.17.12", "@types/mocha": "^10.0.1", - "@types/node-forge": "^1.3.2", - "@types/uuid": "^9.0.2", "@typescript-eslint/eslint-plugin": "^5.59.7", "@typescript-eslint/parser": "^5.59.7", "chai": "4.3.10", - "dayjs": "^1.11.7", "eslint": "^8.41.0", "eslint-config-prettier": "^8.8.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^4.2.1", - "iconv-lite": "^0.6.3", - "log4js": "^6.9.1", "mocha": "^10.2.0", "prettier": "^2.8.8", - "reflect-metadata": "^0.1.13", "rimraf": "^5.0.5", - "rollup": "^3.7.4", - "rollup-plugin-typescript2": "^0.34.1", - "rollup-plugin-visualizer": "^5.8.2", - "ts-node": "^10.9.1", - "tsc-esm-fix": "^3.0.0", - "tslib": "^2.5.2", - "typescript": "^5.4.2", - "vite": "^4.3.8", - "vue-tsc": "^1.6.5" + "tslib": "^2.8.1", + "typescript": "^5.4.2" }, - "gitHead": "c643d7edc3721a6d2ac701a35ef600f6b6ff4b34" + "gitHead": "339554bdbf61c4784614747734a420e744e13bfb" } diff --git a/packages/core/pipeline/src/access/api.ts b/packages/core/pipeline/src/access/api.ts index b9ada9f5..ed8b225c 100644 --- a/packages/core/pipeline/src/access/api.ts +++ b/packages/core/pipeline/src/access/api.ts @@ -1,7 +1,7 @@ import { Registrable } from "../registry/index.js"; import { FormItemProps } from "../dt/index.js"; -import { HttpClient, ILogger, utils } from "../utils/index.js"; -import _ from "lodash-es"; +import { HttpClient, ILogger, utils } from "@certd/basic"; +import * as _ from "lodash-es"; import { AccessRequestHandleReq } from "../core"; export type AccessInputDefine = FormItemProps & { diff --git a/packages/core/pipeline/src/access/decorator.ts b/packages/core/pipeline/src/access/decorator.ts index 445364a6..2abcd904 100644 --- a/packages/core/pipeline/src/access/decorator.ts +++ b/packages/core/pipeline/src/access/decorator.ts @@ -1,9 +1,9 @@ // src/decorator/memoryCache.decorator.ts import { AccessContext, AccessDefine, AccessInputDefine } from "./api.js"; import { Decorator } from "../decorator/index.js"; -import _ from "lodash-es"; +import * as _ from "lodash-es"; import { accessRegistry } from "./registry.js"; -import { http, logger, utils } from "../utils/index.js"; +import { http, logger, utils } from "@certd/basic"; // 提供一个唯一 key export const ACCESS_CLASS_KEY = "pipeline:access"; diff --git a/packages/core/pipeline/src/core/executor.ts b/packages/core/pipeline/src/core/executor.ts index b0c77d6f..7a64ad85 100644 --- a/packages/core/pipeline/src/core/executor.ts +++ b/packages/core/pipeline/src/core/executor.ts @@ -3,8 +3,7 @@ import { RunHistory, RunnableCollection } from "./run-history.js"; import { AbstractTaskPlugin, PluginDefine, pluginRegistry, TaskInstanceContext, UserInfo } from "../plugin/index.js"; import { ContextFactory, IContext } from "./context.js"; import { IStorage } from "./storage.js"; -import { createAxiosService, hashUtils, logger, utils } from "../utils/index.js"; -import { Logger } from "log4js"; +import { createAxiosService, hashUtils, HttpRequestConfig, ILogger, logger, utils } from "@certd/basic"; import { IAccessService } from "../access/index.js"; import { RegistryItem } from "../registry/index.js"; import { Decorator } from "../decorator/index.js"; @@ -28,7 +27,7 @@ export class Executor { pipeline: Pipeline; runtime!: RunHistory; contextFactory: ContextFactory; - logger: Logger; + logger: ILogger; pipelineContext!: IContext; currentStatusMap!: RunnableCollection; lastStatusMap!: RunnableCollection; @@ -290,11 +289,20 @@ export class Executor { } const http = createAxiosService({ logger: currentLogger }); + const download = async (config: HttpRequestConfig, savePath: string) => { + await utils.download({ + http, + logger: currentLogger, + config, + savePath, + }); + }; const taskCtx: TaskInstanceContext = { pipeline: this.pipeline, step, lastStatus, http, + download, logger: currentLogger, inputChanged, accessService: this.options.accessService, diff --git a/packages/core/pipeline/src/core/file-store.ts b/packages/core/pipeline/src/core/file-store.ts index 040752cf..ccc61956 100644 --- a/packages/core/pipeline/src/core/file-store.ts +++ b/packages/core/pipeline/src/core/file-store.ts @@ -1,8 +1,8 @@ -import { fileUtils } from "../utils/index.js"; +import { fileUtils } from "@certd/basic"; import dayjs from "dayjs"; import path from "path"; import fs from "fs"; -import { logger } from "../utils/index.js"; +import { logger } from "@certd/basic"; export type FileStoreOptions = { rootDir?: string; diff --git a/packages/core/pipeline/src/core/handler.ts b/packages/core/pipeline/src/core/handler.ts index 83c0b17f..7d409f5f 100644 --- a/packages/core/pipeline/src/core/handler.ts +++ b/packages/core/pipeline/src/core/handler.ts @@ -1,4 +1,4 @@ -import { HttpClient, ILogger, utils } from "../utils/index.js"; +import { HttpClient, ILogger, utils } from "@certd/basic"; export type PluginRequestHandleReq = { typeName: string; diff --git a/packages/core/pipeline/src/core/index.ts b/packages/core/pipeline/src/core/index.ts index a5ad2a39..f273c8eb 100644 --- a/packages/core/pipeline/src/core/index.ts +++ b/packages/core/pipeline/src/core/index.ts @@ -3,6 +3,5 @@ export * from "./run-history.js"; export * from "./context.js"; export * from "./storage.js"; export * from "./file-store.js"; -export * from "./license.js"; export * from "./handler.js"; export * from "./exceptions.js"; diff --git a/packages/core/pipeline/src/core/license.ts b/packages/core/pipeline/src/core/license.ts deleted file mode 100644 index 7914a28e..00000000 --- a/packages/core/pipeline/src/core/license.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { logger } from "../utils/index.js"; -import { setLogger, isPlus, isComm } from "@certd/plus-core"; -setLogger(logger); -export * from "@certd/plus-core"; - -export function checkPlus() { - if (!isPlus()) { - throw new Error("此为专业版功能,请升级到专业版"); - } -} - -export function checkComm() { - if (!isComm()) { - throw new Error("此为商业版功能,请升级到商业版"); - } -} diff --git a/packages/core/pipeline/src/core/run-history.ts b/packages/core/pipeline/src/core/run-history.ts index fe27f8ea..977aa2c3 100644 --- a/packages/core/pipeline/src/core/run-history.ts +++ b/packages/core/pipeline/src/core/run-history.ts @@ -1,7 +1,6 @@ import { HistoryResult, Pipeline, ResultType, Runnable, RunnableMap, Stage, Step, Task } from "../dt/index.js"; -import _ from "lodash-es"; -import { buildLogger } from "../utils/index.js"; -import { Logger } from "log4js"; +import * as _ from "lodash-es"; +import { buildLogger, ILogger } from "@certd/basic"; export type HistoryStatus = { result: HistoryResult; @@ -25,7 +24,7 @@ export class RunHistory { [runnableId: string]: string[]; } = {}; _loggers: { - [runnableId: string]: Logger; + [runnableId: string]: ILogger; } = {}; trigger!: RunTrigger; @@ -117,10 +116,14 @@ export class RunHistory { } logError(runnable: Runnable, e: Error) { + const { cause, stack } = e; delete e.stack; delete e.cause; - const errorInfo = runnable.runnableType === "step" ? e : e.message; - this._loggers[runnable.id].error(`[${runnable.runnableType}] [${runnable.title}] :`, errorInfo); + if (runnable.runnableType === "step") { + this._loggers[runnable.id].error(`[${runnable.runnableType}] [${runnable.title}] :`, e, stack, cause); + } else { + this._loggers[runnable.id].error(`[${runnable.runnableType}] [${runnable.title}] :`, e.message); + } } finally(runnable: Runnable) { diff --git a/packages/core/pipeline/src/core/storage.ts b/packages/core/pipeline/src/core/storage.ts index f24775ba..5dae52db 100644 --- a/packages/core/pipeline/src/core/storage.ts +++ b/packages/core/pipeline/src/core/storage.ts @@ -1,6 +1,6 @@ import fs from "fs"; import path from "path"; -import { fileUtils } from "../utils/index.js"; +import { fileUtils } from "@certd/basic"; export interface IStorage { get(scope: string, namespace: string, version: string, key: string): Promise; diff --git a/packages/core/pipeline/src/decorator/utils.ts b/packages/core/pipeline/src/decorator/utils.ts index b008f000..38498845 100644 --- a/packages/core/pipeline/src/decorator/utils.ts +++ b/packages/core/pipeline/src/decorator/utils.ts @@ -1,4 +1,4 @@ -import _ from "lodash-es"; +import * as _ from "lodash-es"; const propertyMap: any = {}; function attachProperty(target: any, propertyKey: string | symbol) { diff --git a/packages/core/pipeline/src/index.ts b/packages/core/pipeline/src/index.ts index e1fa81a7..98b000dc 100644 --- a/packages/core/pipeline/src/index.ts +++ b/packages/core/pipeline/src/index.ts @@ -3,7 +3,6 @@ export * from "./dt/index.js"; export * from "./access/index.js"; export * from "./registry/index.js"; export * from "./plugin/index.js"; -export * from "./utils/index.js"; export * from "./context/index.js"; export * from "./decorator/index.js"; export * from "./service/index.js"; diff --git a/packages/core/pipeline/src/plugin/api.ts b/packages/core/pipeline/src/plugin/api.ts index 21f8fd9f..1a2349b7 100644 --- a/packages/core/pipeline/src/plugin/api.ts +++ b/packages/core/pipeline/src/plugin/api.ts @@ -1,12 +1,11 @@ import { Registrable } from "../registry/index.js"; import { FileItem, FormItemProps, Pipeline, Runnable, Step } from "../dt/index.js"; import { FileStore } from "../core/file-store.js"; -import { Logger } from "log4js"; import { IAccessService } from "../access/index.js"; import { ICnameProxyService, IEmailService } from "../service/index.js"; import { CancelError, IContext, PluginRequestHandleReq, RunnableCollection } from "../core/index.js"; -import { ILogger, logger, utils } from "../utils/index.js"; -import { HttpClient } from "../utils/index.js"; +import { HttpRequestConfig, ILogger, logger, utils } from "@certd/basic"; +import { HttpClient } from "@certd/basic"; import dayjs from "dayjs"; import { IPluginConfigService } from "../service/config"; import { upperFirst } from "lodash-es"; @@ -68,7 +67,7 @@ export type TaskInstanceContext = { //步骤定义 step: Step; //日志 - logger: Logger; + logger: ILogger; //当前步骤输入参数跟上一次执行比较是否有变化 inputChanged: boolean; //授权获取服务 @@ -85,6 +84,8 @@ export type TaskInstanceContext = { userContext: IContext; //http请求客户端 http: HttpClient; + //下载文件方法 + download: (config: HttpRequestConfig, savePath: string) => Promise; //文件存储 fileStore: FileStore; //上一次执行结果状态 diff --git a/packages/core/pipeline/src/registry/registry.ts b/packages/core/pipeline/src/registry/registry.ts index 36780c31..cf49899a 100644 --- a/packages/core/pipeline/src/registry/registry.ts +++ b/packages/core/pipeline/src/registry/registry.ts @@ -1,4 +1,4 @@ -import { isDev, logger } from "../utils/index.js"; +import { isDev, logger } from "@certd/basic"; export type Registrable = { name: string; diff --git a/packages/core/pipeline/src/service/cname.ts b/packages/core/pipeline/src/service/cname.ts index 5f1fbee3..3fa63e75 100644 --- a/packages/core/pipeline/src/service/cname.ts +++ b/packages/core/pipeline/src/service/cname.ts @@ -3,9 +3,10 @@ import { IAccess } from "../access"; export type CnameProvider = { id: any; domain: string; - dnsProviderType: string; + title?: string; + dnsProviderType?: string; access?: IAccess; - accessId: any; + accessId?: any; }; export type CnameRecord = { @@ -15,6 +16,7 @@ export type CnameRecord = { recordValue: string; cnameProvider: CnameProvider; status: string; + commonDnsProvider?: any; }; export type ICnameProxyService = { getByDomain: (domain: string) => Promise; diff --git a/packages/core/pipeline/src/utils/index.ts b/packages/core/pipeline/src/utils/index.ts deleted file mode 100644 index 5a595f40..00000000 --- a/packages/core/pipeline/src/utils/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "@certd/basic"; diff --git a/packages/core/pipeline/tsconfig.json b/packages/core/pipeline/tsconfig.json index 42bad159..09eb3466 100644 --- a/packages/core/pipeline/tsconfig.json +++ b/packages/core/pipeline/tsconfig.json @@ -10,15 +10,15 @@ "inlineSourceMap":true, "noImplicitThis": true, "noUnusedLocals": true, + "importHelpers": true, "stripInternal": true, "skipLibCheck": true, "pretty": true, "declaration": true, "forceConsistentCasingInFileNames": true, - "typeRoots": [ "./typings", "./node_modules/@types"], "outDir": "dist", "rootDir": "src", - "composite": true, + "composite": false, "useDefineForClassFields": true, "strict": true, // "sourceMap": true, diff --git a/packages/libs/lib-huawei/CHANGELOG.md b/packages/libs/lib-huawei/CHANGELOG.md index 99fbb131..b7120137 100644 --- a/packages/libs/lib-huawei/CHANGELOG.md +++ b/packages/libs/lib-huawei/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14) + +**Note:** Version bump only for package @certd/lib-huawei + +## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13) + +**Note:** Version bump only for package @certd/lib-huawei + +## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08) + +**Note:** Version bump only for package @certd/lib-huawei + +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +**Note:** Version bump only for package @certd/lib-huawei + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) **Note:** Version bump only for package @certd/lib-huawei diff --git a/packages/libs/lib-huawei/package.json b/packages/libs/lib-huawei/package.json index 815831d1..f80b750f 100644 --- a/packages/libs/lib-huawei/package.json +++ b/packages/libs/lib-huawei/package.json @@ -1,7 +1,7 @@ { "name": "@certd/lib-huawei", "private": false, - "version": "1.27.0", + "version": "1.27.4", "main": "./dist/bundle.js", "module": "./dist/bundle.js", "types": "./dist/d/index.d.ts", @@ -17,5 +17,9 @@ "rimraf": "^5.0.5", "rollup": "^3.7.4" }, - "gitHead": "c643d7edc3721a6d2ac701a35ef600f6b6ff4b34" + "devDependencies": { + "prettier": "^2.8.8", + "tslib": "^2.8.1" + }, + "gitHead": "339554bdbf61c4784614747734a420e744e13bfb" } diff --git a/packages/libs/lib-huawei/tsconfig.json b/packages/libs/lib-huawei/tsconfig.json index 112a3377..d72a2eea 100644 --- a/packages/libs/lib-huawei/tsconfig.json +++ b/packages/libs/lib-huawei/tsconfig.json @@ -1,5 +1,5 @@ { - "compileOnSave": false, + "compileOnSave": true, "compilerOptions": { "target": "ESNext", "module": "ESNext", @@ -7,10 +7,10 @@ "esModuleInterop": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, - "inlineSourceMap":true, "noImplicitThis": true, "noUnusedLocals": true, "stripInternal": true, + "importHelpers": true, "skipLibCheck": true, "pretty": true, "declaration": true, @@ -18,7 +18,7 @@ "typeRoots": [ "./typings", "./node_modules/@types"], "outDir": "dist", "rootDir": "src", - "composite": true, + "composite": false, "useDefineForClassFields": true, "strict": false, "sourceMap": true, diff --git a/packages/libs/lib-iframe/CHANGELOG.md b/packages/libs/lib-iframe/CHANGELOG.md index 63acedba..9f7d16cf 100644 --- a/packages/libs/lib-iframe/CHANGELOG.md +++ b/packages/libs/lib-iframe/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14) + +**Note:** Version bump only for package @certd/lib-iframe + +## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13) + +**Note:** Version bump only for package @certd/lib-iframe + +## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08) + +**Note:** Version bump only for package @certd/lib-iframe + +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +**Note:** Version bump only for package @certd/lib-iframe + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) **Note:** Version bump only for package @certd/lib-iframe diff --git a/packages/libs/lib-iframe/package.json b/packages/libs/lib-iframe/package.json index b1278eeb..c4ac119a 100644 --- a/packages/libs/lib-iframe/package.json +++ b/packages/libs/lib-iframe/package.json @@ -1,9 +1,10 @@ { "name": "@certd/lib-iframe", "private": false, - "version": "1.27.0", + "version": "1.27.4", "type": "module", "main": "./dist/index.js", + "module": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { "dev": "vite", @@ -18,26 +19,16 @@ "nanoid": "^4.0.0" }, "devDependencies": { - "@rollup/plugin-commonjs": "^23.0.4", - "@rollup/plugin-json": "^6.0.0", - "@rollup/plugin-node-resolve": "^15.0.1", - "@rollup/plugin-terser": "^0.4.3", - "@rollup/plugin-typescript": "^11.0.0", "@types/chai": "^4.3.3", "@typescript-eslint/eslint-plugin": "^5.38.1", "@typescript-eslint/parser": "^5.38.1", "eslint": "^8.24.0", "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^4.2.1", "prettier": "^2.8.8", "rimraf": "^5.0.5", - "rollup": "^3.7.4", - "rollup-plugin-visualizer": "^5.8.2", - "ts-node": "^10.9.1", - "tslib": "^2.5.2", + "tslib": "^2.8.1", "typescript": "^5.4.2" }, - "gitHead": "c643d7edc3721a6d2ac701a35ef600f6b6ff4b34" + "gitHead": "339554bdbf61c4784614747734a420e744e13bfb" } diff --git a/packages/libs/lib-iframe/tsconfig.json b/packages/libs/lib-iframe/tsconfig.json index d97da42d..5f466c53 100644 --- a/packages/libs/lib-iframe/tsconfig.json +++ b/packages/libs/lib-iframe/tsconfig.json @@ -12,13 +12,14 @@ "noUnusedLocals": true, "stripInternal": true, "skipLibCheck": true, + "importHelpers": true, "pretty": true, "declaration": true, "forceConsistentCasingInFileNames": true, "typeRoots": [ "./typings", "./node_modules/@types"], "outDir": "dist", "rootDir": "src", - "composite": true, + "composite": false, "useDefineForClassFields": true, "strict": false, // "sourceMap": true, diff --git a/packages/libs/lib-jdcloud/.gitignore b/packages/libs/lib-jdcloud/.gitignore deleted file mode 100644 index b59eedaa..00000000 --- a/packages/libs/lib-jdcloud/.gitignore +++ /dev/null @@ -1,28 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? - -test/user.secret.ts - -.rollup.cache diff --git a/packages/libs/lib-jdcloud/.npmignore b/packages/libs/lib-jdcloud/.npmignore deleted file mode 100644 index ec6e82b7..00000000 --- a/packages/libs/lib-jdcloud/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -src -.rollup.cache diff --git a/packages/libs/lib-jdcloud/.prettierrc b/packages/libs/lib-jdcloud/.prettierrc deleted file mode 100644 index 1d96ee86..00000000 --- a/packages/libs/lib-jdcloud/.prettierrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "printWidth": 160 -} \ No newline at end of file diff --git a/packages/libs/lib-jdcloud/CHANGELOG.md b/packages/libs/lib-jdcloud/CHANGELOG.md deleted file mode 100644 index f58ad32a..00000000 --- a/packages/libs/lib-jdcloud/CHANGELOG.md +++ /dev/null @@ -1,139 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.7](https://github.com/certd/certd/compare/v1.26.6...v1.26.7) (2024-10-14) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.6](https://github.com/certd/certd/compare/v1.26.5...v1.26.6) (2024-10-14) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.5](https://github.com/certd/certd/compare/v1.26.4...v1.26.5) (2024-10-14) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.4](https://github.com/certd/certd/compare/v1.26.3...v1.26.4) (2024-10-14) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10) - -**Note:** Version bump only for package @certd/lib-jdcloud - -# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24) - -**Note:** Version bump only for package @certd/lib-jdcloud - -# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06) - -**Note:** Version bump only for package @certd/lib-huawei - -## [1.24.2](https://github.com/certd/certd/compare/v1.24.1...v1.24.2) (2024-09-06) - -**Note:** Version bump only for package @certd/lib-huawei - -## [1.24.1](https://github.com/certd/certd/compare/v1.24.0...v1.24.1) (2024-09-02) - -**Note:** Version bump only for package @certd/lib-huawei - -## [1.22.1](https://github.com/certd/certd/compare/v1.22.0...v1.22.1) (2024-07-20) - -**Note:** Version bump only for package @certd/lib-huawei - -# [1.22.0](https://github.com/certd/certd/compare/v1.21.2...v1.22.0) (2024-07-19) - -### Features - -* 升级midway,支持esm ([485e603](https://github.com/certd/certd/commit/485e603b5165c28bc08694997726eaf2a585ebe7)) -* 支持postgresql ([3b19bfb](https://github.com/certd/certd/commit/3b19bfb4291e89064b3b407a80dae092d54747d5)) diff --git a/packages/libs/lib-jdcloud/LICENSE b/packages/libs/lib-jdcloud/LICENSE deleted file mode 100644 index 0ad25db4..00000000 --- a/packages/libs/lib-jdcloud/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/packages/libs/lib-jdcloud/README.md b/packages/libs/lib-jdcloud/README.md deleted file mode 100644 index 30b15e21..00000000 --- a/packages/libs/lib-jdcloud/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Vue 3 + TypeScript + Vite - -This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` diff --git a/packages/ui/certd-client/src/components/tutorial/tutorial-steps.vue b/packages/ui/certd-client/src/components/tutorial/tutorial-steps.vue index 81ef87f3..4f881079 100644 --- a/packages/ui/certd-client/src/components/tutorial/tutorial-steps.vue +++ b/packages/ui/certd-client/src/components/tutorial/tutorial-steps.vue @@ -64,18 +64,22 @@ const steps = ref([ { image: "/static/doc/images/3-add-success.png", title: "流水线创建成功", - descriptions: ["此时证书申请任务已经建好", "点击手动触发即可测试证书申请", "接下来演示如何添加部署任务"] + descriptions: ["点击手动触发即可申请证书"] + }, + { + title: "接下来演示如何自动部署证书", + descriptions: ["如果您只需要申请证书,那么到这一步就可以了"] } ] }, { title: "添加部署证书任务", - description: "演示部署到主机上的Nginx", + description: "这里演示部署证书到Nginx", items: [ { image: "/static/doc/images/5-1-add-host.png", - title: "添加nginx部署任务", - descriptions: ["演示第一个部署任务,部署到nginx"] + title: "添加证书部署任务", + descriptions: ["这里演示自动部署证书到nginx", "Certd提供茫茫多的部署插件,满足您的各种部署需求"] }, { image: "/static/doc/images/5-2-add-host.png", @@ -94,8 +98,8 @@ const steps = ref([ }, { image: "/static/doc/images/5-5-plugin-list.png", - title: "还可以添加其他更多部署任务", - descriptions: ["插件列表"] + title: "本系统提供茫茫多的部署插件", + descriptions: ["您可以根据自身需求将证书部署到各种应用和平台"] } ] }, diff --git a/packages/ui/certd-client/src/components/vip-button/index.vue b/packages/ui/certd-client/src/components/vip-button/index.vue index fbf10423..7e57c4ca 100644 --- a/packages/ui/certd-client/src/components/vip-button/index.vue +++ b/packages/ui/certd-client/src/components/vip-button/index.vue @@ -12,7 +12,7 @@ diff --git a/packages/ui/certd-client/src/views/certd/pipeline/api.plugin.ts b/packages/ui/certd-client/src/views/certd/pipeline/api.plugin.ts index 3ea26a0e..74013136 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/api.plugin.ts +++ b/packages/ui/certd-client/src/views/certd/pipeline/api.plugin.ts @@ -1,5 +1,5 @@ import { request } from "/src/api/service"; -import _ from "lodash-es"; +import * as _ from "lodash-es"; import { PluginConfigBean, PluginSysSetting } from "/@/views/sys/plugin/api"; const apiPrefix = "/pi/plugin"; diff --git a/packages/ui/certd-client/src/views/certd/pipeline/certd-form/crud.tsx b/packages/ui/certd-client/src/views/certd/pipeline/certd-form/crud.tsx index ca686f96..ca78cf67 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/certd-form/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/pipeline/certd-form/crud.tsx @@ -98,7 +98,7 @@ export default function (certPluginGroup: PluginGroup, formWrapperRef: any): Cre vModel: "modelValue", placeholder: "0 0 4 * * *" }, - helper: "点击上面的按钮,选择每天几点几分定时执行,后面的分秒都要选择0。\n建议设置为每天触发一次,证书未到期之前任务会跳过,不会重复执行", + helper: "点击上面的按钮,选择每天几点定时执行。\n建议设置为每天触发一次,证书未到期之前任务会跳过,不会重复执行", order: 100 } }, diff --git a/packages/ui/certd-client/src/views/certd/pipeline/certd-form/index.vue b/packages/ui/certd-client/src/views/certd/pipeline/certd-form/index.vue index 270ade33..c60a8e77 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/certd-form/index.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/certd-form/index.vue @@ -6,7 +6,7 @@ import { useColumns, useExpose } from "@fast-crud/fast-crud"; import createCrudOptions from "./crud.jsx"; import { ref } from "vue"; -import _ from "lodash-es"; +import * as _ from "lodash-es"; import * as api from "../api.plugin"; import { PluginGroup, PluginGroups } from "/@/views/certd/pipeline/pipeline/type"; export default { diff --git a/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx b/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx index afae5185..33952bde 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx @@ -10,7 +10,7 @@ import { env } from "/@/utils/util.env"; import { useUserStore } from "/@/store/modules/user"; import dayjs from "dayjs"; import { useSettingStore } from "/@/store/modules/settings"; -import _ from "lodash-es"; +import * as _ from "lodash-es"; import { useModal } from "/@/use/use-modal"; import CertView from "./cert-view.vue"; import { eachStages } from "./utils"; @@ -348,6 +348,7 @@ export default function ({ crudExpose, context: { certdFormRef } }: CreateCrudOp type: "link", search: { show: true, + title: "关键字", component: { name: "a-input" } diff --git a/packages/ui/certd-client/src/views/certd/pipeline/detail.vue b/packages/ui/certd-client/src/views/certd/pipeline/detail.vue index 563ea67a..a8d346e3 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/detail.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/detail.vue @@ -15,6 +15,7 @@ import { useRoute } from "vue-router"; import { PipelineDetail, PipelineOptions, PluginGroups, RunHistory } from "./pipeline/type"; import { TourProps } from "ant-design-vue"; import { LocalStorage } from "/@/utils/util.storage"; +import { useUserStore } from "/@/store/modules/user"; defineOptions({ name: "PipelineDetail" @@ -124,7 +125,11 @@ function useTour() { const { tour, tourHandleOpen } = useTour(); +const userStore = useUserStore(); async function onLoaded(pipeline: PipelineDetail) { + if (pipeline.pipeline?.userId !== userStore.getUserInfo?.id) { + return; + } const count = LocalStorage.get("pipeline-count") ?? 0; if (count > 1) { return; diff --git a/packages/ui/certd-client/src/views/certd/pipeline/index.vue b/packages/ui/certd-client/src/views/certd/pipeline/index.vue index 341ddf6a..df0da548 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/index.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/index.vue @@ -14,13 +14,13 @@