Compare commits

...

38 Commits

Author SHA1 Message Date
xiaojunnuo
2acaa66635 v1.31.8 2025-03-26 22:01:03 +08:00
xiaojunnuo
ee5eecbec1 build: prepare to build 2025-03-26 21:57:43 +08:00
xiaojunnuo
687bb8a237 fix: 修复lego模式无法创建流水线的bug 2025-03-26 21:54:34 +08:00
xiaojunnuo
e51123a951 perf: 优化scp上传 2025-03-26 21:48:51 +08:00
xiaojunnuo
92bb12e2e3 chore: 2025-03-26 20:54:33 +08:00
xiaojunnuo
fd0536bd4b perf: 支持又拍云cdn 2025-03-26 20:48:26 +08:00
xiaojunnuo
57389a79a1 perf: 支持又拍云cdn 2025-03-26 20:47:50 +08:00
xiaojunnuo
6cd7bddc37 fix: 修复编辑通知勾选默认,导致出现多个默认通知的bug 2025-03-26 12:06:20 +08:00
xiaojunnuo
c3c5006daa perf: 优化通知格式 2025-03-26 12:05:28 +08:00
xiaojunnuo
27a8a57cf5 fix: 修复网站监控无法设置端口的bug 2025-03-26 09:21:13 +08:00
xiaojunnuo
3bded6fdcc chore: 2025-03-25 11:14:28 +08:00
xiaojunnuo
c7f31337ce chore: 2025-03-25 11:12:24 +08:00
xiaojunnuo
fd507f2692 perf: 优化txt本地校验效率 2025-03-25 11:08:25 +08:00
xiaojunnuo
96a39ef9c3 chore: 2025-03-25 09:19:32 +08:00
xiaojunnuo
81a8d6c3bf chore: 2025-03-25 00:18:52 +08:00
xiaojunnuo
d4719208f0 chore: 2025-03-25 00:18:36 +08:00
xiaojunnuo
c36dce6464 chore: 2025-03-25 00:17:38 +08:00
xiaojunnuo
2da4474bb1 chore: 2025-03-25 00:17:08 +08:00
xiaojunnuo
cab11202c7 build: publish 2025-03-25 00:05:26 +08:00
xiaojunnuo
21d7d35bb1 build: trigger build image 2025-03-25 00:05:04 +08:00
xiaojunnuo
0725c663c4 v1.31.7 2025-03-25 00:03:50 +08:00
xiaojunnuo
ce82239c8b build: prepare to build 2025-03-25 00:01:49 +08:00
xiaojunnuo
2523008cb6 Merge remote-tracking branch 'origin/v2-dev' into v2-dev 2025-03-24 23:59:24 +08:00
xiaojunnuo
69212b9ad1 build: publish 2025-03-24 23:52:43 +08:00
xiaojunnuo
636cb3399b build: trigger build image 2025-03-24 23:52:22 +08:00
xiaojunnuo
86ca35ce33 v1.31.6 2025-03-24 23:51:00 +08:00
xiaojunnuo
675ab31305 build: prepare to build 2025-03-24 23:48:42 +08:00
xiaojunnuo
83c2d743bc chore: 2025-03-24 23:48:34 +08:00
xiaojunnuo
2c87b3d906 build: prepare to build 2025-03-24 23:47:10 +08:00
xiaojunnuo
05b6159802 perf: 上传到主机支持scp方式 2025-03-24 23:45:45 +08:00
xiaojunnuo
c56f48c1e3 perf: 优化图标 2025-03-24 21:27:31 +08:00
xiaojunnuo
e18e399ce6 perf: 支持部署到lucky 2025-03-24 18:39:22 +08:00
xiaojunnuo
d66ade4e47 perf: 增加服务器时间警告 2025-03-24 18:39:08 +08:00
xiaojunnuo
90b045af6d fix: 修复dns.la无法申请证书的bug 2025-03-24 09:38:18 +08:00
xiaojunnuo
5cccb21175 chore: 2025-03-24 00:10:01 +08:00
xiaojunnuo
1a71969403 chore: 2025-03-24 00:05:19 +08:00
xiaojunnuo
389a1fbd04 build: publish 2025-03-22 15:05:31 +08:00
xiaojunnuo
ca02ae6183 build: trigger build image 2025-03-22 15:05:11 +08:00
85 changed files with 1414 additions and 290 deletions

View File

@@ -3,6 +3,40 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
### Bug Fixes
* 修复编辑通知勾选默认导致出现多个默认通知的bug ([6cd7bdd](https://github.com/certd/certd/commit/6cd7bddc37da8b0d7b9860fd9a26ddfe84c869a7))
* 修复网站监控无法设置端口的bug ([27a8a57](https://github.com/certd/certd/commit/27a8a57cf52b4bf83d628aa3049be1efaa74f29c))
* 修复lego模式无法创建流水线的bug ([687bb8a](https://github.com/certd/certd/commit/687bb8a2376d0de7b72739a174e4a9560581f866))
### Performance Improvements
* 优化通知格式 ([c3c5006](https://github.com/certd/certd/commit/c3c5006daa39c20624cb58864f2b92b230a38a7a))
* 优化scp上传 ([e51123a](https://github.com/certd/certd/commit/e51123a95131cc76d655937488caf08956a67020))
* 优化txt本地校验效率 ([fd507f2](https://github.com/certd/certd/commit/fd507f269253607e68c5c099c99e0de11636f229))
* 支持又拍云cdn ([fd0536b](https://github.com/certd/certd/commit/fd0536bd4b41f15b6b5d42e0b447f0dcbf73b8a8))
* 支持又拍云cdn ([57389a7](https://github.com/certd/certd/commit/57389a79a1a61c45d081712562f8b33c9633158e))
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
### Performance Improvements
* 增加服务器时间警告 ([d66ade4](https://github.com/certd/certd/commit/d66ade4e4783850b6c7625c6f164a5a0fc0aa509))
* 支持部署到lucky ([e18e399](https://github.com/certd/certd/commit/e18e399ce6529e8c7e36b56c5f674cfdbbd3d3d1))
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
### Bug Fixes
* 修复dns.la无法申请证书的bug ([90b045a](https://github.com/certd/certd/commit/90b045af6d1a4f46986e4b118885c1f050df067c))
### Performance Improvements
* 上传到主机支持scp方式 ([05b6159](https://github.com/certd/certd/commit/05b6159802b9e85b6a410361b60b5c28875b48e7))
* 优化图标 ([c56f48c](https://github.com/certd/certd/commit/c56f48c1e3c54c4e203fafb380d9091d75681b7e))
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
### Bug Fixes

View File

@@ -1 +1 @@
02:10
00:05

View File

@@ -5,6 +5,7 @@ import lightbox from "vitepress-plugin-lightbox";
// https://vitepress.dev/reference/site-config
export default defineConfig({
title: "Certd",
titleTemplate: "开源SSL证书管理工具证书自动化申请部署让你的网站证书永不过期",
description: "Certd帮助文档,Certd是一款开源免费的全自动SSL证书管理工具证书自动化申请部署流水线自动证书申请、更新、续期通配符证书泛域名证书申请证书自动化部署到阿里云、腾讯云、主机、群晖、宝塔。",
markdown: {
config: (md) => {

View File

@@ -3,6 +3,31 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
### Performance Improvements
* 增加服务器时间警告 ([d66ade4](https://github.com/certd/certd/commit/d66ade4e4783850b6c7625c6f164a5a0fc0aa509))
* 支持部署到lucky ([e18e399](https://github.com/certd/certd/commit/e18e399ce6529e8c7e36b56c5f674cfdbbd3d3d1))
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
### Bug Fixes
* 修复dns.la无法申请证书的bug ([90b045a](https://github.com/certd/certd/commit/90b045af6d1a4f46986e4b118885c1f050df067c))
### Performance Improvements
* 上传到主机支持scp方式 ([05b6159](https://github.com/certd/certd/commit/05b6159802b9e85b6a410361b60b5c28875b48e7))
* 优化图标 ([c56f48c](https://github.com/certd/certd/commit/c56f48c1e3c54c4e203fafb380d9091d75681b7e))
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
### Bug Fixes
* 修复通知选择器无法选择的bug ([f7b88f9](https://github.com/certd/certd/commit/f7b88f9e3b7d9d9122e4fd2003a20c555bd50c7d))
* 修复证书流水线创建失败的bug ([736fe03](https://github.com/certd/certd/commit/736fe038ebda56648bcc4c12884a700341d2c049))
## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)
### Bug Fixes

View File

@@ -9,5 +9,5 @@
}
},
"npmClient": "pnpm",
"version": "1.31.5"
"version": "1.31.8"
}

View File

@@ -3,6 +3,20 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.31.8](https://github.com/publishlab/node-acme-client/compare/v1.31.7...v1.31.8) (2025-03-26)
### Performance Improvements
* 优化txt本地校验效率 ([fd507f2](https://github.com/publishlab/node-acme-client/commit/fd507f269253607e68c5c099c99e0de11636f229))
## [1.31.7](https://github.com/publishlab/node-acme-client/compare/v1.31.6...v1.31.7) (2025-03-24)
**Note:** Version bump only for package @certd/acme-client
## [1.31.6](https://github.com/publishlab/node-acme-client/compare/v1.31.5...v1.31.6) (2025-03-24)
**Note:** Version bump only for package @certd/acme-client
## [1.31.5](https://github.com/publishlab/node-acme-client/compare/v1.31.4...v1.31.5) (2025-03-22)
**Note:** Version bump only for package @certd/acme-client

View File

@@ -3,7 +3,7 @@
"description": "Simple and unopinionated ACME client",
"private": false,
"author": "nmorsman",
"version": "1.31.5",
"version": "1.31.8",
"type": "module",
"module": "scr/index.js",
"main": "src/index.js",
@@ -18,7 +18,7 @@
"types"
],
"dependencies": {
"@certd/basic": "^1.31.5",
"@certd/basic": "^1.31.8",
"@peculiar/x509": "^1.11.0",
"asn1js": "^3.0.5",
"axios": "^1.7.2",
@@ -67,5 +67,5 @@
"bugs": {
"url": "https://github.com/publishlab/node-acme-client/issues"
},
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
}

View File

@@ -53,10 +53,10 @@ export default async (client, userOpts) => {
try {
client.getAccountUrl();
log('[auto] Account URL already exists, skipping account registration');
log('[auto] Account URL already exists, skipping account registration 证书申请账户已存在,跳过注册 ');
}
catch (e) {
log('[auto] Registering account');
log('[auto] Registering account (注册证书申请账户)');
await client.createAccount(accountPayload);
}
@@ -64,7 +64,7 @@ export default async (client, userOpts) => {
* Parse domains from CSR
*/
log('[auto] Parsing domains from Certificate Signing Request');
log('[auto] Parsing domains from Certificate Signing Request ');
const { commonName, altNames } = readCsrDomains(opts.csr);
const uniqueDomains = Array.from(new Set([commonName].concat(altNames).filter((d) => d)));
@@ -120,20 +120,20 @@ export default async (client, userOpts) => {
// throw new Error('测试异常');
/* Challenge verification */
if (opts.skipChallengeVerification === true) {
log(`[auto] [${d}] Skipping challenge verification since skipChallengeVerification=truewait 60s`);
log(`[auto] [${d}] 跳过本地验证(skipChallengeVerification=true),等待 60s`);
await wait(60 * 1000);
}
else {
log(`[auto] [${d}] Running challenge verification, type = ${challenge.type}`);
log(`[auto] [${d}] 开始本地验证, type = ${challenge.type}`);
try {
await client.verifyChallenge(authz, challenge);
}
catch (e) {
log(`[auto] [${d}] challenge verification threw error: ${e.message}`);
log(`[auto] [${d}] 本地验证失败尝试请求ACME提供商获取状态: ${e.message}`);
}
}
/* Complete challenge and wait for valid status */
log(`[auto] [${d}] Completing challenge with ACME provider and waiting for valid status`);
log(`[auto] [${d}] 请求ACME提供商完成验证等待返回valid状态`);
await client.completeChallenge(challenge);
challengeCompleted = true;

View File

@@ -500,7 +500,7 @@ class AcmeClient {
await verify[challenge.type](authz, challenge, keyAuthorization);
};
log('Waiting for ACME challenge verification', this.backoffOpts);
log('Waiting for ACME challenge verification等待ACME挑战验证', this.backoffOpts);
return util.retry(verifyFn, this.backoffOpts);
}
@@ -568,14 +568,14 @@ class AcmeClient {
const resp = await this.api.apiRequest(item.url, null, [200]);
/* Verify status */
log(`Item has status: ${resp.data.status}`);
log(`Item has status(挑战状态): ${resp.data.status}`);
if (invalidStates.includes(resp.data.status)) {
abort();
throw new Error(util.formatResponseError(resp));
}
else if (pendingStates.includes(resp.data.status)) {
throw new Error('Operation is pending or processing');
throw new Error('Operation is pending or processing(当前仍然在等待状态)');
}
else if (validStates.includes(resp.data.status)) {
return resp.data;
@@ -584,7 +584,7 @@ class AcmeClient {
throw new Error(`Unexpected item status: ${resp.data.status}`);
};
log(`Waiting for valid status from: ${item.url}`, this.backoffOpts);
log(`Waiting for valid status 等待valid状态: ${item.url}`, this.backoffOpts);
return util.retry(verifyFn, this.backoffOpts);
}

View File

@@ -60,8 +60,9 @@ async function retryPromise(fn, attempts, backoff) {
throw e;
}
log(`Promise rejected: ${e.message}`);
const duration = backoff.duration();
log(`Promise rejected attempt #${backoff.attempts}, retrying in ${duration}ms: ${e.message}`);
log(`Promise rejected attempt #${backoff.attempts}, ${duration}ms 后重试: ${e.message}`);
await new Promise((resolve) => { setTimeout(resolve, duration); });
return retryPromise(fn, attempts, backoff);
@@ -241,7 +242,7 @@ async function resolveDomainBySoaRecord(recordName) {
*/
async function getAuthoritativeDnsResolver(recordName) {
log(`Locating authoritative NS records for name: ${recordName}`);
log(`Locating authoritative NS records for name: ${recordName} 获取域名的权威NS服务器`);
const resolver = new dns.Resolver();
try {
@@ -249,13 +250,14 @@ async function getAuthoritativeDnsResolver(recordName) {
const domain = await resolveDomainBySoaRecord(recordName);
/* Resolve authoritative NS addresses */
log(`Looking up authoritative NS records for domain: ${domain}`);
log(`Looking up authoritative NS records for domain获取域名的权威NS服务器: ${domain}`);
const nsRecords = await dns.resolveNs(domain);
log(`域名权威NS服务器${nsRecords}`);
const nsAddrArray = await Promise.all(nsRecords.map(async (r) => dns.resolve4(r)));
const nsAddresses = [].concat(...nsAddrArray).filter((a) => a);
if (!nsAddresses.length) {
throw new Error(`Unable to locate any valid authoritative NS addresses for domain: ${domain}`);
throw new Error(`Unable to locate any valid authoritative NS addresses for domain获取权威服务器IP失败: ${domain}`);
}
/* Authoritative NS success */
@@ -263,12 +265,12 @@ async function getAuthoritativeDnsResolver(recordName) {
resolver.setServers(nsAddresses);
}
catch (e) {
log(`Authoritative NS lookup error: ${e.message}`);
log(`Authoritative NS lookup error获取权威NS服务器地址失败: ${e.message}`);
}
/* Return resolver */
const addresses = resolver.getServers();
log(`DNS resolver addresses: ${addresses.join(', ')}`);
log(`DNS resolver addresses域名的权威NS服务器地址: ${addresses.join(', ')}`);
return resolver;
}

View File

@@ -82,21 +82,40 @@ async function walkDnsChallengeRecord(recordName, resolver = dns) {
}
export async function walkTxtRecord(recordName) {
const txtRecords = []
try {
/* Default DNS resolver first */
log('Attempting to resolve TXT with default DNS resolver first');
log('从本地DNS服务器获取TXT解析记录');
const res = await walkDnsChallengeRecord(recordName);
if (res && res.length > 0) {
return res;
for (const item of res) {
txtRecords.push(item)
}
}
throw new Error('No TXT records found');
} catch (e) {
log(`本地获取TXT解析记录失败:${e.message}`)
}
catch (e) {
try{
/* Authoritative DNS resolver */
log(`Error using default resolver, attempting to resolve TXT with authoritative NS: ${e.message}`);
log(`从域名权威服务器获取TXT解析记录`);
const authoritativeResolver = await util.getAuthoritativeDnsResolver(recordName);
return await walkDnsChallengeRecord(recordName, authoritativeResolver);
const res = await walkDnsChallengeRecord(recordName, authoritativeResolver);
if (res && res.length > 0) {
for (const item of res) {
txtRecords.push(item)
}
}
}catch (e) {
log(`权威服务器获取TXT解析记录失败:${e.message}`)
}
if (txtRecords.length === 0) {
throw new Error(`没有找到TXT解析记录${recordName}`);
}
return txtRecords;
}
/**
@@ -113,14 +132,14 @@ export async function walkTxtRecord(recordName) {
async function verifyDnsChallenge(authz, challenge, keyAuthorization, prefix = '_acme-challenge.') {
const recordName = `${prefix}${authz.identifier.value}`;
log(`Resolving DNS TXT from record: ${recordName}`);
log(`本地校验TXT记录: ${recordName}`);
const recordValues = await walkTxtRecord(recordName);
log(`DNS query finished successfully, found ${recordValues.length} TXT records`);
log(`DNS查询成功, 找到 ${recordValues.length} TXT记录`);
if (!recordValues.length || !recordValues.includes(keyAuthorization)) {
throw new Error(`Authorization not found in DNS TXT record: ${recordName}need:${keyAuthorization},found:${recordValues}`);
throw new Error(`没有找到需要的DNS TXT记录: ${recordName}期望:${keyAuthorization},结果:${recordValues}`);
}
log(`Key authorization match for ${challenge.type}/${recordName}, ACME challenge verified`);
log(`关键授权匹配成功(${challenge.type}/${recordName},校验成功, ACME challenge verified`);
return true;
}

View File

@@ -3,6 +3,20 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
### Performance Improvements
* 支持又拍云cdn ([fd0536b](https://github.com/certd/certd/commit/fd0536bd4b41f15b6b5d42e0b447f0dcbf73b8a8))
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
**Note:** Version bump only for package @certd/basic
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
**Note:** Version bump only for package @certd/basic
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
**Note:** Version bump only for package @certd/basic

View File

@@ -1 +1 @@
15:01
21:57

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/basic",
"private": false,
"version": "1.31.5",
"version": "1.31.8",
"type": "module",
"main": "./dist/index.js",
"module": "./dist/index.js",
@@ -44,5 +44,5 @@
"tslib": "^2.8.1",
"typescript": "^5.4.2"
},
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
}

View File

@@ -1,4 +1,4 @@
import { customAlphabet } from 'nanoid';
import { customAlphabet } from "nanoid";
export const randomNumber = customAlphabet('1234567890', 4);
export const simpleNanoId = customAlphabet('1234567890abcdefghijklmopqrstuvwxyz', 12);
export const randomNumber = customAlphabet("1234567890", 4);
export const simpleNanoId = customAlphabet("1234567890abcdefghijklmopqrstuvwxyz", 12);

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
**Note:** Version bump only for package @certd/pipeline
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
**Note:** Version bump only for package @certd/pipeline
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
**Note:** Version bump only for package @certd/pipeline
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
**Note:** Version bump only for package @certd/pipeline

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/pipeline",
"private": false,
"version": "1.31.5",
"version": "1.31.8",
"type": "module",
"main": "./dist/index.js",
"module": "./dist/index.js",
@@ -16,8 +16,8 @@
"test": "mocha --loader=ts-node/esm"
},
"dependencies": {
"@certd/basic": "^1.31.5",
"@certd/plus-core": "^1.31.5",
"@certd/basic": "^1.31.8",
"@certd/plus-core": "^1.31.8",
"dayjs": "^1.11.7",
"lodash-es": "^4.17.21",
"reflect-metadata": "^0.1.13"
@@ -43,5 +43,5 @@
"tslib": "^2.8.1",
"typescript": "^5.4.2"
},
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
**Note:** Version bump only for package @certd/lib-huawei
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
**Note:** Version bump only for package @certd/lib-huawei
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
**Note:** Version bump only for package @certd/lib-huawei
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
**Note:** Version bump only for package @certd/lib-huawei

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/lib-huawei",
"private": false,
"version": "1.31.5",
"version": "1.31.8",
"main": "./dist/bundle.js",
"module": "./dist/bundle.js",
"types": "./dist/d/index.d.ts",
@@ -23,5 +23,5 @@
"prettier": "^2.8.8",
"tslib": "^2.8.1"
},
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
**Note:** Version bump only for package @certd/lib-iframe
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
**Note:** Version bump only for package @certd/lib-iframe
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
**Note:** Version bump only for package @certd/lib-iframe
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
**Note:** Version bump only for package @certd/lib-iframe

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/lib-iframe",
"private": false,
"version": "1.31.5",
"version": "1.31.8",
"type": "module",
"main": "./dist/index.js",
"module": "./dist/index.js",
@@ -30,5 +30,5 @@
"tslib": "^2.8.1",
"typescript": "^5.4.2"
},
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
**Note:** Version bump only for package @certd/lib-k8s
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
**Note:** Version bump only for package @certd/lib-k8s
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
**Note:** Version bump only for package @certd/lib-k8s
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
**Note:** Version bump only for package @certd/lib-k8s

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/lib-k8s",
"private": false,
"version": "1.31.5",
"version": "1.31.8",
"type": "module",
"main": "./dist/index.js",
"module": "./dist/index.js",
@@ -16,7 +16,7 @@
"preview": "vite preview"
},
"dependencies": {
"@certd/basic": "^1.31.5",
"@certd/basic": "^1.31.8",
"@kubernetes/client-node": "0.21.0"
},
"devDependencies": {
@@ -31,5 +31,5 @@
"tslib": "^2.8.1",
"typescript": "^5.4.2"
},
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
**Note:** Version bump only for package @certd/lib-server
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
**Note:** Version bump only for package @certd/lib-server
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
**Note:** Version bump only for package @certd/lib-server
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
**Note:** Version bump only for package @certd/lib-server

View File

@@ -1,6 +1,6 @@
{
"name": "@certd/lib-server",
"version": "1.31.5",
"version": "1.31.8",
"description": "midway with flyway, sql upgrade way ",
"private": false,
"type": "module",
@@ -27,10 +27,10 @@
],
"license": "AGPL",
"dependencies": {
"@certd/acme-client": "^1.31.5",
"@certd/basic": "^1.31.5",
"@certd/pipeline": "^1.31.5",
"@certd/plus-core": "^1.31.5",
"@certd/acme-client": "^1.31.8",
"@certd/basic": "^1.31.8",
"@certd/pipeline": "^1.31.8",
"@certd/plus-core": "^1.31.8",
"@midwayjs/cache": "~3.14.0",
"@midwayjs/core": "~3.20.3",
"@midwayjs/i18n": "~3.20.3",
@@ -61,5 +61,5 @@
"typeorm": "^0.3.11",
"typescript": "^5.4.2"
},
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
**Note:** Version bump only for package @certd/midway-flyway-js
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
**Note:** Version bump only for package @certd/midway-flyway-js
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
**Note:** Version bump only for package @certd/midway-flyway-js
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
**Note:** Version bump only for package @certd/midway-flyway-js

View File

@@ -1,6 +1,6 @@
{
"name": "@certd/midway-flyway-js",
"version": "1.31.5",
"version": "1.31.8",
"description": "midway with flyway, sql upgrade way ",
"private": false,
"type": "module",
@@ -46,5 +46,5 @@
"typeorm": "^0.3.11",
"typescript": "^5.4.2"
},
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
}

View File

@@ -3,6 +3,20 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
### Bug Fixes
* 修复lego模式无法创建流水线的bug ([687bb8a](https://github.com/certd/certd/commit/687bb8a2376d0de7b72739a174e4a9560581f866))
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
**Note:** Version bump only for package @certd/plugin-cert
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
**Note:** Version bump only for package @certd/plugin-cert
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
**Note:** Version bump only for package @certd/plugin-cert

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/plugin-cert",
"private": false,
"version": "1.31.5",
"version": "1.31.8",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -15,10 +15,10 @@
"preview": "vite preview"
},
"dependencies": {
"@certd/acme-client": "^1.31.5",
"@certd/basic": "^1.31.5",
"@certd/pipeline": "^1.31.5",
"@certd/plugin-lib": "^1.31.5",
"@certd/acme-client": "^1.31.8",
"@certd/basic": "^1.31.8",
"@certd/pipeline": "^1.31.8",
"@certd/plugin-lib": "^1.31.8",
"@google-cloud/publicca": "^1.3.0",
"dayjs": "^1.11.7",
"jszip": "^3.10.1",
@@ -41,5 +41,5 @@
"tslib": "^2.8.1",
"typescript": "^5.4.2"
},
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
}

View File

@@ -269,14 +269,14 @@ HTTP文件验证不支持泛域名需要配置网站文件上传`,
@TaskInput({
title: "检查解析重试次数",
value: 35,
value: 20,
component: {
name: "a-input-number",
vModel: "value",
},
helper: "检查域名验证解析记录重试次数,如果你的域名服务商解析生效速度慢,可以适当增加此值",
})
maxCheckRetryCount = 35;
maxCheckRetryCount = 20;
acme!: AcmeService;

View File

@@ -179,11 +179,7 @@ export class CertApplyLegoPlugin extends CertApplyBasePlugin {
if (this.acmeServer) {
serverArgs = ` --server ${this.acmeServer}`;
}
const cmds = [
`${legoPath} -a --email "${this.email}" --dns ${this.dnsType} ${keyType} ${domainArgs} ${serverArgs} ${eabArgs} ${savePathArgs} ${
this.customArgs || ""
} run`,
];
const cmds = [`${legoPath} -a --email "${this.email}" --dns ${this.dnsType} ${keyType} ${domainArgs} ${serverArgs} ${eabArgs} ${savePathArgs} ${this.customArgs || ""} run`];
await this.ctx.utils.sp.spawn({
cmd: cmds,

View File

@@ -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.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
### Performance Improvements
* 优化scp上传 ([e51123a](https://github.com/certd/certd/commit/e51123a95131cc76d655937488caf08956a67020))
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
**Note:** Version bump only for package @certd/plugin-lib
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
### Performance Improvements
* 上传到主机支持scp方式 ([05b6159](https://github.com/certd/certd/commit/05b6159802b9e85b6a410361b60b5c28875b48e7))
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
**Note:** Version bump only for package @certd/plugin-lib

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/plugin-lib",
"private": false,
"version": "1.31.5",
"version": "1.31.8",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -16,8 +16,8 @@
},
"dependencies": {
"@alicloud/pop-core": "^1.7.10",
"@certd/basic": "^1.31.5",
"@certd/pipeline": "^1.31.5",
"@certd/basic": "^1.31.8",
"@certd/pipeline": "^1.31.8",
"@kubernetes/client-node": "0.21.0",
"ali-oss": "^6.21.0",
"basic-ftp": "^5.0.5",
@@ -48,5 +48,5 @@
"tslib": "^2.8.1",
"typescript": "^5.4.2"
},
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
}

View File

@@ -7,6 +7,8 @@ import { SshAccess } from "./ssh-access.js";
import stripAnsi from "strip-ansi";
import { SocksClient } from "socks";
import { SocksProxy, SocksProxyType } from "socks/typings/common/constants.js";
import fs from "fs";
export type TransportItem = { localPath: string; remotePath: string };
export class AsyncSsh2Client {
@@ -265,15 +267,15 @@ export class SshClient {
}
* @param options
*/
async uploadFiles(options: { connectConf: SshAccess; transports: TransportItem[]; mkdirs: boolean; opts?: { mode?: string } }) {
async uploadFiles(options: { connectConf: SshAccess; transports: TransportItem[]; mkdirs: boolean; opts?: { mode?: string }; uploadType?: string }) {
const { connectConf, transports, mkdirs, opts } = options;
await this._call({
connectConf,
callable: async (conn: AsyncSsh2Client) => {
const sftp = await conn.getSftp();
this.logger.info("开始上传");
for (const transport of transports) {
if (mkdirs !== false) {
if (mkdirs !== false) {
this.logger.info("初始化父目录");
for (const transport of transports) {
const filePath = path.dirname(transport.remotePath);
let mkdirCmd = `mkdir -p ${filePath} `;
if (conn.windows) {
@@ -291,13 +293,65 @@ export class SshClient {
}
await conn.exec(mkdirCmd);
}
await conn.fastPut({ sftp, ...transport, opts });
}
if (options.uploadType === "sftp") {
const sftp = await conn.getSftp();
for (const transport of transports) {
await conn.fastPut({ sftp, ...transport, opts });
}
} else {
//scp
for (const transport of transports) {
await this.scpUpload({ conn, ...transport, opts });
await new Promise(resolve => setTimeout(resolve, 1000));
}
}
this.logger.info("文件全部上传成功");
},
});
}
async scpUpload(options: { conn: any; localPath: string; remotePath: string; opts?: { mode?: string } }) {
const { conn, localPath, remotePath } = options;
return new Promise((resolve, reject) => {
// 关键步骤:构造 SCP 命令
try {
this.logger.info(`开始上传:${localPath} => ${remotePath}`);
conn.conn.exec(
`scp -t ${remotePath}`, // -t 表示目标模式
(err, stream) => {
if (err) {
return reject(err);
}
// 准备 SCP 协议头
const fileStats = fs.statSync(localPath);
const fileName = path.basename(localPath);
// SCP 协议格式C[权限] [文件大小] [文件名]\n
stream.write(`C0644 ${fileStats.size} ${fileName}\n`);
// 通过管道传输文件
fs.createReadStream(localPath)
.on("error", e => {
this.logger.info("read stream error", e);
reject(e);
})
.pipe(stream)
.on("finish", async () => {
this.logger.info(`上传完成:${localPath} => ${remotePath}`);
resolve(true);
})
.on("error", reject);
}
);
} catch (e) {
reject(e);
}
});
}
async removeFiles(opts: { connectConf: SshAccess; files: string[] }) {
const { connectConf, files } = opts;
await this._call({

View File

@@ -3,6 +3,31 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
### Bug Fixes
* 修复网站监控无法设置端口的bug ([27a8a57](https://github.com/certd/certd/commit/27a8a57cf52b4bf83d628aa3049be1efaa74f29c))
* 修复lego模式无法创建流水线的bug ([687bb8a](https://github.com/certd/certd/commit/687bb8a2376d0de7b72739a174e4a9560581f866))
### Performance Improvements
* 优化通知格式 ([c3c5006](https://github.com/certd/certd/commit/c3c5006daa39c20624cb58864f2b92b230a38a7a))
* 支持又拍云cdn ([fd0536b](https://github.com/certd/certd/commit/fd0536bd4b41f15b6b5d42e0b447f0dcbf73b8a8))
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
### Performance Improvements
* 增加服务器时间警告 ([d66ade4](https://github.com/certd/certd/commit/d66ade4e4783850b6c7625c6f164a5a0fc0aa509))
* 支持部署到lucky ([e18e399](https://github.com/certd/certd/commit/e18e399ce6529e8c7e36b56c5f674cfdbbd3d3d1))
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
### Performance Improvements
* 优化图标 ([c56f48c](https://github.com/certd/certd/commit/c56f48c1e3c54c4e203fafb380d9091d75681b7e))
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
### Bug Fixes

View File

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

View File

@@ -55,9 +55,63 @@
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont">&#xe61d;</span>
<div class="name">WAF-长亭-雷池</div>
<div class="code-name">&amp;#xe61d;</div>
<span class="icon iconfont">&#xe62f;</span>
<div class="name">upyun</div>
<div class="code-name">&amp;#xe62f;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xecc0;</span>
<div class="name">plesk_</div>
<div class="code-name">&amp;#xecc0;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe741;</span>
<div class="name">易支付-01</div>
<div class="code-name">&amp;#xe741;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe606;</span>
<div class="name">1Panel</div>
<div class="code-name">&amp;#xe606;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe73c;</span>
<div class="name">西部数码</div>
<div class="code-name">&amp;#xe73c;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe607;</span>
<div class="name">qnap</div>
<div class="code-name">&amp;#xe607;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe9cc;</span>
<div class="name">proxmox</div>
<div class="code-name">&amp;#xe9cc;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe604;</span>
<div class="name">aws</div>
<div class="code-name">&amp;#xe604;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe602;</span>
<div class="name">uni-app</div>
<div class="code-name">&amp;#xe602;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe752;</span>
<div class="name">lucky</div>
<div class="code-name">&amp;#xe752;</div>
</li>
<li class="dib">
@@ -66,6 +120,12 @@
<div class="code-name">&amp;#xe719;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe748;</span>
<div class="name">雷池</div>
<div class="code-name">&amp;#xe748;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe610;</span>
<div class="name">华为</div>
@@ -120,7 +180,7 @@
<pre><code class="language-css"
>@font-face {
font-family: 'iconfont';
src: url('iconfont.svg?t=1741879397012#iconfont') format('svg');
src: url('iconfont.svg?t=1742952318857#iconfont') format('svg');
}
</code></pre>
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -147,11 +207,92 @@
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont icon-WAF-changting-leichi"></span>
<span class="icon iconfont icon-upyun"></span>
<div class="name">
WAF-长亭-雷池
upyun
</div>
<div class="code-name">.icon-WAF-changting-leichi
<div class="code-name">.icon-upyun
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-plesk"></span>
<div class="name">
plesk_
</div>
<div class="code-name">.icon-plesk
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-yizhifu"></span>
<div class="name">
易支付-01
</div>
<div class="code-name">.icon-yizhifu
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-onepanel"></span>
<div class="name">
1Panel
</div>
<div class="code-name">.icon-onepanel
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-xibushuma"></span>
<div class="name">
西部数码
</div>
<div class="code-name">.icon-xibushuma
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-qnap"></span>
<div class="name">
qnap
</div>
<div class="code-name">.icon-qnap
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-proxmox"></span>
<div class="name">
proxmox
</div>
<div class="code-name">.icon-proxmox
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-aws"></span>
<div class="name">
aws
</div>
<div class="code-name">.icon-aws
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-uniapp"></span>
<div class="name">
uni-app
</div>
<div class="code-name">.icon-uniapp
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-lucky"></span>
<div class="name">
lucky
</div>
<div class="code-name">.icon-lucky
</div>
</li>
@@ -164,6 +305,15 @@
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-safeline"></span>
<div class="name">
雷池
</div>
<div class="code-name">.icon-safeline
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-huawei"></span>
<div class="name">
@@ -247,10 +397,82 @@
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-WAF-changting-leichi"></use>
<use xlink:href="#icon-upyun"></use>
</svg>
<div class="name">WAF-长亭-雷池</div>
<div class="code-name">#icon-WAF-changting-leichi</div>
<div class="name">upyun</div>
<div class="code-name">#icon-upyun</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-plesk"></use>
</svg>
<div class="name">plesk_</div>
<div class="code-name">#icon-plesk</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-yizhifu"></use>
</svg>
<div class="name">易支付-01</div>
<div class="code-name">#icon-yizhifu</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-onepanel"></use>
</svg>
<div class="name">1Panel</div>
<div class="code-name">#icon-onepanel</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-xibushuma"></use>
</svg>
<div class="name">西部数码</div>
<div class="code-name">#icon-xibushuma</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-qnap"></use>
</svg>
<div class="name">qnap</div>
<div class="code-name">#icon-qnap</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-proxmox"></use>
</svg>
<div class="name">proxmox</div>
<div class="code-name">#icon-proxmox</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-aws"></use>
</svg>
<div class="name">aws</div>
<div class="code-name">#icon-aws</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-uniapp"></use>
</svg>
<div class="name">uni-app</div>
<div class="code-name">#icon-uniapp</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-lucky"></use>
</svg>
<div class="name">lucky</div>
<div class="code-name">#icon-lucky</div>
</li>
<li class="dib">
@@ -261,6 +483,14 @@
<div class="code-name">#icon-ctyun</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-safeline"></use>
</svg>
<div class="name">雷池</div>
<div class="code-name">#icon-safeline</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-huawei"></use>

View File

@@ -1,6 +1,6 @@
@font-face {
font-family: "iconfont"; /* Project id 4688792 */
src: url('iconfont.svg?t=1741879397012#iconfont') format('svg');
src: url('iconfont.svg?t=1742952318857#iconfont') format('svg');
}
.iconfont {
@@ -11,14 +11,54 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-WAF-changting-leichi:before {
content: "\e61d";
.icon-upyun:before {
content: "\e62f";
}
.icon-plesk:before {
content: "\ecc0";
}
.icon-yizhifu:before {
content: "\e741";
}
.icon-onepanel:before {
content: "\e606";
}
.icon-xibushuma:before {
content: "\e73c";
}
.icon-qnap:before {
content: "\e607";
}
.icon-proxmox:before {
content: "\e9cc";
}
.icon-aws:before {
content: "\e604";
}
.icon-uniapp:before {
content: "\e602";
}
.icon-lucky:before {
content: "\e752";
}
.icon-ctyun:before {
content: "\e719";
}
.icon-safeline:before {
content: "\e748";
}
.icon-huawei:before {
content: "\e610";
}

File diff suppressed because one or more lines are too long

View File

@@ -6,11 +6,74 @@
"description": "",
"glyphs": [
{
"icon_id": "35327761",
"name": "WAF-长亭-雷池",
"font_class": "WAF-changting-leichi",
"unicode": "e61d",
"unicode_decimal": 58909
"icon_id": "5771134",
"name": "upyun",
"font_class": "upyun",
"unicode": "e62f",
"unicode_decimal": 58927
},
{
"icon_id": "27272666",
"name": "plesk_",
"font_class": "plesk",
"unicode": "ecc0",
"unicode_decimal": 60608
},
{
"icon_id": "23930871",
"name": "易支付-01",
"font_class": "yizhifu",
"unicode": "e741",
"unicode_decimal": 59201
},
{
"icon_id": "40476533",
"name": "1Panel",
"font_class": "onepanel",
"unicode": "e606",
"unicode_decimal": 58886
},
{
"icon_id": "26435508",
"name": "西部数码",
"font_class": "xibushuma",
"unicode": "e73c",
"unicode_decimal": 59196
},
{
"icon_id": "27487624",
"name": "qnap",
"font_class": "qnap",
"unicode": "e607",
"unicode_decimal": 58887
},
{
"icon_id": "27268231",
"name": "proxmox",
"font_class": "proxmox",
"unicode": "e9cc",
"unicode_decimal": 59852
},
{
"icon_id": "31636255",
"name": "aws",
"font_class": "aws",
"unicode": "e604",
"unicode_decimal": 58884
},
{
"icon_id": "34071209",
"name": "uni-app",
"font_class": "uniapp",
"unicode": "e602",
"unicode_decimal": 58882
},
{
"icon_id": "3467975",
"name": "lucky",
"font_class": "lucky",
"unicode": "e752",
"unicode_decimal": 59218
},
{
"icon_id": "41854563",
@@ -19,6 +82,13 @@
"unicode": "e719",
"unicode_decimal": 59161
},
{
"icon_id": "43757703",
"name": "雷池",
"font_class": "safeline",
"unicode": "e748",
"unicode_decimal": 59208
},
{
"icon_id": "24164616",
"name": "华为",

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

@@ -7,6 +7,11 @@ export type SiteEnv = {
contactLink?: string;
};
};
export type AppInfo = {
version?: string;
time?: number;
deltaTime?: number;
};
export type SiteInfo = {
title?: string;
slogan?: string;
@@ -71,12 +76,13 @@ export type AllSettings = {
siteEnv: SiteEnv;
headerMenus: HeaderMenus;
suiteSetting: SuiteSetting;
app: AppInfo;
};
export async function loadAllSettings(): Promise<AllSettings> {
return await request({
url: "/basic/settings/all",
method: "get"
method: "get",
});
}
@@ -84,7 +90,7 @@ export async function bindUrl(data: any): Promise<any> {
return await request({
url: "/sys/plus/bindUrl",
method: "post",
data
data,
});
}
@@ -92,7 +98,7 @@ export async function sendSmsCode(data: any): Promise<any> {
return await request({
url: "/basic/code/sendSmsCode",
method: "post",
data
data,
});
}
@@ -100,6 +106,6 @@ export async function sendEmailCode(data: any): Promise<any> {
return await request({
url: "/basic/code/sendEmailCode",
method: "post",
data
data,
});
}

View File

@@ -0,0 +1,99 @@
<template>
<div class="remote-input">
<a-input v-bind="attrs" :value="modelValue" @update:value="onInputChange"></a-input>
<fs-button class="ml-1" v-bind="button" :text="button?.text || title" @click="openDialog"></fs-button>
</div>
</template>
<script setup lang="ts">
import { doRequest } from "/@/components/plugins/lib";
import { inject, ref, useAttrs } from "vue";
import { useFormWrapper } from "@fast-crud/fast-crud";
import { notification } from "ant-design-vue";
defineOptions({
name: "RemoteInput",
});
const { openCrudFormDialog } = useFormWrapper();
const props = defineProps<{
modelValue: string;
title: string;
action: string;
form: any;
button?: any;
}>();
const emit = defineEmits<{
"update:modelValue": any;
}>();
const getScope: any = inject("get:scope");
const getPluginType: any = inject("get:plugin:type");
const attrs = useAttrs();
const loading = ref(false);
function onInputChange(value: string) {
emit("update:modelValue", value);
}
async function openDialog() {
function createCrudOptions() {
return {
crudOptions: {
columns: {
...props.form.columns,
},
form: {
wrapper: {
title: props.title,
saveRemind: false,
},
afterSubmit() {
notification.success({ message: "操作成功" });
},
async doSubmit({ form }: any) {
return await doPluginFormSubmit(form);
},
},
},
};
}
const { crudOptions } = createCrudOptions();
await openCrudFormDialog({ crudOptions });
}
const doPluginFormSubmit = async (data: any) => {
if (loading.value) {
return;
}
loading.value = true;
try {
const pluginType = getPluginType();
const { form } = getScope();
const res = await doRequest({
type: pluginType,
typeName: form.type,
action: props.action,
input: pluginType === "plugin" ? form.input : form,
data: data,
});
//获取返回值 填入到input中
emit("update:modelValue", res);
return res;
} finally {
loading.value = false;
}
};
</script>
<style lang="less">
.remote-input {
width: 100%;
display: flex;
align-items: center;
.a-input {
flex: 1;
}
}
</style>

View File

@@ -1,16 +1,7 @@
<template>
<div class="remote-select">
<div class="flex flex-row">
<a-select
class="remote-select-input"
show-search
:filter-option="filterOption"
:options="optionsRef"
:value="value"
v-bind="attrs"
@click="onClick"
@update:value="emit('update:value', $event)"
/>
<a-select class="remote-select-input" show-search :filter-option="filterOption" :options="optionsRef" :value="value" v-bind="attrs" @click="onClick" @update:value="emit('update:value', $event)" />
<div class="ml-5">
<fs-button :loading="loading" title="刷新选项" icon="ion:refresh-outline" @click="refreshOptions"></fs-button>
</div>
@@ -26,7 +17,7 @@ import { inject, ref, useAttrs, watch } from "vue";
import { PluginDefine } from "@certd/pipeline";
defineOptions({
name: "RemoteSelect"
name: "RemoteSelect",
});
const props = defineProps<
@@ -87,14 +78,14 @@ const getOptions = async () => {
type: pluginType,
typeName: form.type,
action: props.action,
input: pluginType === "plugin" ? form.input : form
input: pluginType === "plugin" ? form.input : form,
},
{
onError(err: any) {
hasError.value = true;
message.value = `获取选项出错:${err.message}`;
},
showErrorNotify: false
showErrorNotify: false,
}
);
if (res && res.length > 0) {
@@ -129,14 +120,14 @@ watch(
}
return {
form: props.form,
watched: values
watched: values,
};
},
async () => {
await getOptions();
},
{
immediate: true
immediate: true,
}
);
</script>

View File

@@ -1,5 +1,6 @@
import SynologyIdDeviceGetter from "./synology/device-id-getter.vue";
import RemoteSelect from "./common/remote-select.vue";
import RemoteInput from "./common/remote-input.vue";
import CertDomainsGetter from "./common/cert-domains-getter.vue";
import OutputSelector from "/@/components/plugins/common/output-selector/index.vue";
import DnsProviderSelector from "/@/components/plugins/cert/dns-provider-selector/index.vue";
@@ -21,6 +22,7 @@ export default {
app.component("SynologyDeviceIdGetter", SynologyIdDeviceGetter);
app.component("RemoteSelect", RemoteSelect);
app.component("RemoteInput", RemoteInput);
app.component("CertDomainsGetter", CertDomainsGetter);
app.component("InputPassword", InputPassword);
},

View File

@@ -15,7 +15,7 @@ import { Modal } from "ant-design-vue";
import { ComponentPropsType, doRequest } from "/@/components/plugins/lib";
defineOptions({
name: "DeviceIdGetter"
name: "DeviceIdGetter",
});
const props = defineProps<ComponentPropsType>();
@@ -38,9 +38,9 @@ async function loginWithOTPCode(otpCode: string) {
typeName: form.type,
action: "LoginWithOPTCode",
data: {
otpCode
otpCode,
},
input: form
input: form,
});
}
@@ -61,7 +61,7 @@ async function getDeviceId() {
const res = await loginWithOTPCode(otpCodeRef.value);
console.log("did返回", res);
emit("update:value", res.did);
}
},
});
}
</script>

View File

@@ -1,11 +1,8 @@
import { defineStore } from "pinia";
import { Modal, notification } from "ant-design-vue";
import * as _ from "lodash-es";
// @ts-ignore
import { LocalStorage } from "/src/utils/util.storage";
import * as basicApi from "/@/api/modules/api.basic";
import { HeaderMenus, PlusInfo, SiteEnv, SiteInfo, SuiteSetting, SysInstallInfo, SysPublicSetting } from "/@/api/modules/api.basic";
import { AppInfo, HeaderMenus, PlusInfo, SiteEnv, SiteInfo, SuiteSetting, SysInstallInfo, SysPublicSetting } from "/@/api/modules/api.basic";
import { useUserStore } from "/@/store/modules/user";
import { mitter } from "/@/utils/util.mitt";
import { env } from "/@/utils/util.env";
@@ -29,6 +26,11 @@ export interface SettingState {
headerMenus?: HeaderMenus;
inited?: boolean;
suiteSetting?: SuiteSetting;
app: {
version?: string;
time?: number;
deltaTime?: number;
};
}
const defaultSiteInfo: SiteInfo = {
@@ -37,7 +39,7 @@ const defaultSiteInfo: SiteInfo = {
logo: env.LOGO || "/static/images/logo/logo.svg",
loginLogo: env.LOGIN_LOGO || "/static/images/logo/rect-block.svg",
licenseTo: "",
licenseToUrl: ""
licenseToUrl: "",
};
export const useSettingStore = defineStore({
id: "app.setting",
@@ -45,33 +47,38 @@ export const useSettingStore = defineStore({
plusInfo: {
isPlus: false,
vipType: "free",
isComm: false
isComm: false,
},
sysPublic: {
registerEnabled: false,
managerOtherUserPipeline: false,
icpNo: env.ICP_NO || ""
icpNo: env.ICP_NO || "",
},
installInfo: {
siteId: "",
bindUserId: null,
bindUrl: "",
accountServerBaseUrl: "",
appKey: ""
appKey: "",
},
siteInfo: defaultSiteInfo,
siteEnv: {
agent: {
enabled: undefined,
contactText: "",
contactLink: ""
}
contactLink: "",
},
},
headerMenus: {
menus: []
menus: [],
},
suiteSetting: { enabled: false },
inited: false
inited: false,
app: {
version: "",
time: 0,
deltaTime: 0,
},
}),
getters: {
getSysPublic(): SysPublicSetting {
@@ -96,7 +103,7 @@ export const useSettingStore = defineStore({
const vipLabelMap: any = {
free: "基础版",
plus: "专业版",
comm: "商业版"
comm: "商业版",
};
return vipLabelMap[this.plusInfo?.vipType || "free"];
},
@@ -113,21 +120,21 @@ export const useSettingStore = defineStore({
title: menu.title,
icon: menu.icon,
link: menu.path,
order: 99999
}
order: 99999,
},
};
});
},
isSuiteEnabled(): boolean {
// @ts-ignore
return this.suiteSetting?.enabled === true;
}
},
},
actions: {
checkPlus() {
if (!this.isPlus) {
notification.warn({
message: "此为专业版功能,请先升级到专业版"
message: "此为专业版功能,请先升级到专业版",
});
throw new Error("此为专业版功能,请升级到专业版");
}
@@ -142,6 +149,12 @@ export const useSettingStore = defineStore({
_.merge(this.suiteSetting, allSettings.suiteSetting || {});
//@ts-ignore
this.initSiteInfo(allSettings.siteInfo || {});
this.initAppInfo(allSettings.app || {});
},
initAppInfo(appInfo: AppInfo) {
this.app.time = appInfo.time;
this.app.version = appInfo.version;
this.app.deltaTime = new Date().getTime() - this.app.time;
},
initSiteInfo(siteInfo: SiteInfo) {
//@ts-ignore
@@ -158,15 +171,15 @@ export const useSettingStore = defineStore({
if (this.siteInfo.logo) {
updatePreferences({
logo: {
source: this.siteInfo.logo
}
source: this.siteInfo.logo,
},
});
}
if (this.siteInfo.title) {
updatePreferences({
app: {
name: this.siteInfo.title
}
name: this.siteInfo.title,
},
});
useTitle(this.siteInfo.title);
}
@@ -210,7 +223,7 @@ export const useSettingStore = defineStore({
cancelText: "不是,回到原来的地址",
onCancel: () => {
window.location.href = bindUrl;
}
},
});
}
}
@@ -224,8 +237,8 @@ export const useSettingStore = defineStore({
}
await this.init();
this.inited = true;
}
}
},
},
});
mitter.on("app.login", async () => {

View File

@@ -177,6 +177,21 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
},
},
},
port: {
title: "HTTPS端口",
search: {
show: false,
},
type: "number",
form: {
value: 443,
rules: [{ required: true, message: "请输入端口" }],
},
column: {
width: 100,
show: false,
},
},
certDomains: {
title: "证书域名",
search: {

View File

@@ -14,7 +14,8 @@ export default function (certPlugins: any[], formWrapperRef: any): CreateCrudOpt
for (const plugin of certPlugins) {
for (const inputKey in plugin.input) {
if (inputs[inputKey]) {
// inputs[inputKey].form.show = true;
//如果两个插件有的字段,直接显示
inputs[inputKey].form.show = true;
continue;
}
const inputDefine = _.cloneDeep(plugin.input[inputKey]);

View File

@@ -82,9 +82,9 @@
key: 'title',
component: {
name: 'a-input',
vModel: 'value'
vModel: 'value',
},
rules: [{ required: true, message: '此项必填' }]
rules: [{ required: true, message: '此项必填' }],
}"
:get-context-fn="getScopeFunc"
/>
@@ -126,8 +126,8 @@ export default {
props: {
editMode: {
type: Boolean,
default: true
}
default: true,
},
},
emits: ["update"],
setup(props: any, context: any) {
@@ -154,9 +154,9 @@ export default {
{
type: "string",
required: true,
message: "请输入名称"
}
]
message: "请输入名称",
},
],
});
const stepTypeSelected = (item: any) => {
@@ -209,7 +209,7 @@ export default {
type: undefined,
_isAdd: true,
input: {},
status: null
status: null,
};
_.merge(step, stepDef);
stepOpen(step, emit);
@@ -235,7 +235,7 @@ export default {
function getContext() {
return {
form: currentStep.value.input
form: currentStep.value.input,
};
}
const { doComputed } = useCompute();
@@ -300,7 +300,7 @@ export default {
async onOk() {
callback.value("delete");
stepDrawerClose();
}
},
});
};
@@ -314,24 +314,24 @@ export default {
const getScopeFunc = () => {
return {
form: currentStep.value
form: currentStep.value,
};
};
const pluginSearch = ref({
keyword: "",
result: []
result: [],
});
const pluginGroupActive = ref("all");
const computedPluginGroups: any = computed(() => {
const groups = pluginGroups.groups;
if (pluginSearch.value.keyword) {
const keyword = pluginSearch.value.keyword.toLowerCase();
const list = groups.all.plugins.filter((plugin) => {
const list = groups.all.plugins.filter(plugin => {
return plugin.title?.toLowerCase().includes(keyword) || plugin.desc?.toLowerCase().includes(keyword) || plugin.name?.toLowerCase().includes(keyword);
});
return {
search: { key: "search", title: "搜索结果", plugins: list }
search: { key: "search", title: "搜索结果", plugins: list },
};
} else {
return groups;
@@ -371,7 +371,7 @@ export default {
rules,
getScopeFunc,
stepCopy,
fullscreen
fullscreen,
};
}
@@ -382,22 +382,22 @@ export default {
name: "a-select",
vModel: "value",
options: [
{ value: 0, label: "正常运行(证书申请任务选择它)" },
{ value: 1, label: "成功后跳过(非证书任务请选择它)" }
]
{ value: 0, label: "正常运行(只有证书申请任务需要选择它)" },
{ value: 1, label: "成功后跳过(其他任务请选择它)" },
],
},
helper: {
render: () => {
return (
<div>
<div>正常运行每次都运行证书任务需要每次都运行</div>
<div>成功后跳过在证书没变化时该任务成功一次之后跳过不重复部署</div>
<div>保持默认即可如果你想要再次测试部署可以临时设置为正常运行</div>
<div>成功后跳过该任务成功一次之后跳过不重复执行证书变化之后才会再次运行</div>
<div class="green">保持默认即可</div>
</div>
);
}
},
},
rules: [{ required: true, message: "此项必填" }]
rules: [{ required: true, message: "此项必填" }],
});
return {
@@ -405,9 +405,9 @@ export default {
labelCol: { span: 6 },
wrapperCol: { span: 16 },
runStrategyProps,
transformDesc
transformDesc,
};
}
},
};
</script>

View File

@@ -14,7 +14,12 @@
<span>您好{{ userInfo.nickName || userInfo.username }} 欢迎使用 {{ siteInfo.title }}</span>
</div>
<div class="flex-o flex-wrap profile-badges">
<a-tag color="green" class="flex-inline pointer"> <fs-icon icon="ion:time-outline"></fs-icon> {{ now }}</a-tag>
<a-tooltip :title="deltaTimeTip">
<a-badge :dot="deltaTimeWarning">
<a-tag :color="deltaTimeWarning ? 'red' : 'green'" class="flex-inline pointer"> <fs-icon icon="ion:time-outline"></fs-icon> {{ now }}</a-tag>
</a-badge>
</a-tooltip>
<template v-if="userStore.isAdmin">
<a-divider type="vertical" />
<a-badge :dot="hasNewVersion">
@@ -138,11 +143,11 @@ import { GetStatisticCount } from "/@/views/framework/home/dashboard/api";
import { useRouter } from "vue-router";
import * as api from "./api";
defineOptions({
name: "DashboardUser"
name: "DashboardUser",
});
const version = ref(import.meta.env.VITE_APP_VERSION);
const latestVersion = ref();
const latestVersion = ref("");
const hasNewVersion = computed(() => {
if (!latestVersion.value) {
return false;
@@ -174,7 +179,16 @@ const userInfo: ComputedRef<UserInfoRes> = computed(() => {
return userStore.getUserInfo;
});
const now = computed(() => {
return dayjs().format("YYYY-MM-DD HH:mm:ss");
const serverTime = settingStore.app.deltaTime + Date.now();
return dayjs(serverTime).format("YYYY-MM-DD HH:mm:ss");
});
const deltaTimeWarning = computed(() => {
return Math.abs(settingStore.app.deltaTime) > 1000 * 60 * 4;
});
const deltaTimeTip = computed(() => {
const deltaMin = (Math.abs(settingStore.app.deltaTime) / 1000 / 60).toFixed(2);
return `服务器时间相差:${deltaMin}分钟${deltaTimeWarning.value ? ",请检查服务器时间是否正确" : ""}`;
});
const router = useRouter();
function goPipeline() {
@@ -189,7 +203,7 @@ function transformStatusCount() {
{ name: "start", label: "运行中" },
{ name: "error", label: "失败" },
{ name: "canceled", label: "已取消" },
{ name: null, label: "未执行" }
{ name: null, label: "未执行" },
];
const result = [];
for (const item of sorted) {
@@ -208,7 +222,7 @@ async function loadCount() {
count.value.historyCountPerDay = count.value.historyCountPerDay.map((item: any) => {
return {
name: item.date,
value: item.count
value: item.count,
};
});
}

View File

@@ -22,10 +22,10 @@ onMounted(() => {
content: "为了您的账户安全,请立即修改密码",
onOk: () => {
changePasswordButtonRef.value.open({
password: "123456"
password: "123456",
});
},
okText: "立即修改"
okText: "立即修改",
});
}
});

View File

@@ -3,6 +3,35 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
### Bug Fixes
* 修复编辑通知勾选默认导致出现多个默认通知的bug ([6cd7bdd](https://github.com/certd/certd/commit/6cd7bddc37da8b0d7b9860fd9a26ddfe84c869a7))
### Performance Improvements
* 优化scp上传 ([e51123a](https://github.com/certd/certd/commit/e51123a95131cc76d655937488caf08956a67020))
* 支持又拍云cdn ([fd0536b](https://github.com/certd/certd/commit/fd0536bd4b41f15b6b5d42e0b447f0dcbf73b8a8))
* 支持又拍云cdn ([57389a7](https://github.com/certd/certd/commit/57389a79a1a61c45d081712562f8b33c9633158e))
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
### Performance Improvements
* 支持部署到lucky ([e18e399](https://github.com/certd/certd/commit/e18e399ce6529e8c7e36b56c5f674cfdbbd3d3d1))
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
### Bug Fixes
* 修复dns.la无法申请证书的bug ([90b045a](https://github.com/certd/certd/commit/90b045af6d1a4f46986e4b118885c1f050df067c))
### Performance Improvements
* 上传到主机支持scp方式 ([05b6159](https://github.com/certd/certd/commit/05b6159802b9e85b6a410361b60b5c28875b48e7))
* 优化图标 ([c56f48c](https://github.com/certd/certd/commit/c56f48c1e3c54c4e203fafb380d9091d75681b7e))
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
**Note:** Version bump only for package @certd/ui-server

View File

@@ -1,6 +1,6 @@
{
"name": "@certd/ui-server",
"version": "1.31.5",
"version": "1.31.8",
"description": "fast-server base midway",
"private": true,
"type": "module",
@@ -38,18 +38,18 @@
"@aws-sdk/client-acm": "^3.699.0",
"@aws-sdk/client-cloudfront": "^3.699.0",
"@aws-sdk/client-s3": "^3.705.0",
"@certd/acme-client": "^1.31.5",
"@certd/basic": "^1.31.5",
"@certd/commercial-core": "^1.31.5",
"@certd/lib-huawei": "^1.31.5",
"@certd/lib-k8s": "^1.31.5",
"@certd/lib-server": "^1.31.5",
"@certd/midway-flyway-js": "^1.31.5",
"@certd/pipeline": "^1.31.5",
"@certd/plugin-cert": "^1.31.5",
"@certd/plugin-lib": "^1.31.5",
"@certd/plugin-plus": "^1.31.5",
"@certd/plus-core": "^1.31.5",
"@certd/acme-client": "^1.31.8",
"@certd/basic": "^1.31.8",
"@certd/commercial-core": "^1.31.8",
"@certd/lib-huawei": "^1.31.8",
"@certd/lib-k8s": "^1.31.8",
"@certd/lib-server": "^1.31.8",
"@certd/midway-flyway-js": "^1.31.8",
"@certd/pipeline": "^1.31.8",
"@certd/plugin-cert": "^1.31.8",
"@certd/plugin-lib": "^1.31.8",
"@certd/plugin-plus": "^1.31.8",
"@certd/plus-core": "^1.31.8",
"@corsinvest/cv4pve-api-javascript": "^8.3.0",
"@huaweicloud/huaweicloud-sdk-cdn": "^3.1.120",
"@huaweicloud/huaweicloud-sdk-core": "^3.1.120",

View File

@@ -12,6 +12,7 @@ import {
} from '@certd/lib-server';
import { AppKey, getPlusInfo, isComm } from '@certd/plus-core';
import { cloneDeep } from 'lodash-es';
import {getVersion} from "../../utils/version.js";
/**
*/
@@ -81,6 +82,8 @@ export class BasicSettingsController extends BaseController {
const plusInfo = await this.plusInfo();
const headerMenus = await this.getHeaderMenus();
const suiteSetting = await this.getSuiteSetting();
const version = await getVersion()
return this.ok({
sysPublic,
installInfo,
@@ -89,6 +92,10 @@ export class BasicSettingsController extends BaseController {
plusInfo,
headerMenus,
suiteSetting,
app:{
time: new Date().getTime(),
version,
}
});
}
}

View File

@@ -45,6 +45,23 @@ export class NotificationService extends BaseService<NotificationEntity> {
return notificationRegistry.getDefine(type);
}
async add(bean: NotificationEntity) {
const res = await super.add(bean);
if(bean.isDefault){
await this.setDefault(res.id, bean.userId);
}
return res
}
async update(bean: NotificationEntity) {
const res = await super.update(bean);
if(bean.isDefault){
const old = await this.info(bean.id);
await this.setDefault(bean.id, old.userId);
}
return res
}
async getById(id: number, userId: number): Promise<NotificationInstanceConfig> {
if (!id) {
throw new ValidateException('id不能为空');

View File

@@ -15,3 +15,4 @@ export * from './plugin-gcore/index.js';
export * from './plugin-qnap/index.js';
export * from './plugin-aws/index.js';
export * from './plugin-dnsla/index.js';
export * from './plugin-upyun/index.js';

View File

@@ -8,7 +8,7 @@ import { AliyunAccess, AliyunClient } from '@certd/plugin-lib';
title: '阿里云',
desc: '阿里云DNS解析提供商',
accessType: 'aliyun',
icon: 'ant-design:aliyun-outlined',
icon: 'svg:icon-aliyun',
})
export class AliyunDnsProvider extends AbstractDnsProvider {
client: any;

View File

@@ -5,7 +5,7 @@ import { AliyunAccess, AliyunClient, AliyunSslClient, createCertDomainGetterInpu
@IsTaskPlugin({
name: 'AliyunDeployCertToALB',
title: '阿里云-部署至ALB应用负载均衡',
icon: 'ant-design:aliyun-outlined',
icon: 'svg:icon-aliyun',
group: pluginGroups.aliyun.key,
desc: 'ALB,更新监听器的默认证书',
needPlus: false,

View File

@@ -5,7 +5,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
@IsTaskPlugin({
name: 'DeployCertToAliyunCDN',
title: '阿里云-部署证书至CDN',
icon: 'ant-design:aliyun-outlined',
icon: 'svg:icon-aliyun',
group: pluginGroups.aliyun.key,
desc: '自动部署域名证书至阿里云CDN',
default: {

View File

@@ -6,7 +6,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
@IsTaskPlugin({
name: 'DeployCertToAliyunDCDN',
title: '阿里云-部署证书至DCDN',
icon: 'ant-design:aliyun-outlined',
icon: 'svg:icon-aliyun',
group: pluginGroups.aliyun.key,
desc: '依赖证书申请前置任务自动部署域名证书至阿里云DCDN',
default: {

View File

@@ -6,7 +6,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
@IsTaskPlugin({
name: 'AliyunDeployCertToFC',
title: '阿里云-部署至阿里云FC(3.0)',
icon: 'ant-design:aliyun-outlined',
icon: 'svg:icon-aliyun',
group: pluginGroups.aliyun.key,
desc: '部署证书到阿里云函数计算FC3.0,【注意】证书的加密算法必须选择【pkcs1旧版】',
needPlus: true,

View File

@@ -5,7 +5,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
@IsTaskPlugin({
name: 'AliyunDeployCertToNLB',
title: '阿里云-部署至NLB网络负载均衡',
icon: 'ant-design:aliyun-outlined',
icon: 'svg:icon-aliyun',
group: pluginGroups.aliyun.key,
desc: 'NLB,网络负载均衡,更新监听器的默认证书',
needPlus: false,

View File

@@ -5,7 +5,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
@IsTaskPlugin({
name: 'DeployCertToAliyunOSS',
title: '阿里云-部署证书至OSS',
icon: 'ant-design:aliyun-outlined',
icon: 'svg:icon-aliyun',
group: pluginGroups.aliyun.key,
desc: '自动部署域名证书至阿里云OSS',
default: {

View File

@@ -5,7 +5,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
@IsTaskPlugin({
name: 'AliyunDeployCertToSLB',
title: '阿里云-部署至SLB(传统负载均衡)',
icon: 'ant-design:aliyun-outlined',
icon: 'svg:icon-aliyun',
group: pluginGroups.aliyun.key,
desc: '部署证书到阿里云SLB(传统负载均衡)',
needPlus: false,

View File

@@ -6,7 +6,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
@IsTaskPlugin({
name: 'AliyunDeployCertToWaf',
title: '阿里云-部署至阿里云WAF',
icon: 'ant-design:aliyun-outlined',
icon: 'svg:icon-aliyun',
group: pluginGroups.aliyun.key,
desc: '部署证书到阿里云WAF',
needPlus: true,

View File

@@ -24,7 +24,7 @@ const regionDict = [
@IsTaskPlugin({
name: 'uploadCertToAliyun',
title: '阿里云-上传证书到阿里云',
icon: 'ant-design:aliyun-outlined',
icon: 'svg:icon-aliyun',
group: pluginGroups.aliyun.key,
desc: '如果不想在阿里云上同一份证书上传多次,可以把此任务作为前置任务,其他阿里云任务证书那一项选择此任务的输出',
default: {

View File

@@ -37,7 +37,7 @@ export const AwsRegions = [
name: 'aws',
title: '亚马逊云aws授权',
desc: '',
icon: 'ant-design:aws-outlined',
icon: 'svg:icon-aws',
})
export class AwsAccess extends BaseAccess {
@AccessInput({

View File

@@ -10,7 +10,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
name: 'AwsDeployToCloudFront',
title: 'AWS-部署证书到CloudFront',
desc: '部署证书到 AWS CloudFront',
icon: 'clarity:plugin-line',
icon: 'svg:icon-aws',
group: pluginGroups.aws.key,
needPlus: true,
default: {

View File

@@ -7,7 +7,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
name: 'AwsUploadToACM',
title: 'AWS-上传证书到ACM',
desc: '上传证书 AWS ACM',
icon: 'clarity:plugin-line',
icon: 'svg:icon-aws',
group: pluginGroups.aws.key,
default: {
strategy: {

View File

@@ -4,7 +4,7 @@ import { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from
import { optionsUtils } from '@certd/basic/dist/utils/util.options.js';
import { CertApplyPluginNames} from '@certd/plugin-cert';
@IsTaskPlugin({
//命名规范,插件名称+功能就是目录plugin-demo中的demo大写字母开头驼峰命名
//命名规范,插件类型+功能就是目录plugin-demo中的demo大写字母开头驼峰命名
name: 'DemoTest',
title: 'Demo-测试插件',
icon: 'clarity:plugin-line',

View File

@@ -144,9 +144,9 @@ export class DnslaDnsProvider extends AbstractDnsProvider<DnslaRecord> {
const res = await this.doRequestApi(url, {
domainId: domainId,
type: 16,
host: fullRecord,
host: fullRecord.replace(`.${domain}`, ''),
data: value,
ttl: 1,
ttl: 60,
});
return res.data;

View File

@@ -179,6 +179,21 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin {
})
accessId!: string;
@TaskInput({
title: '上传方式',
helper: '选择上传方式sftp或者scp',
value:"sftp",
component: {
name: 'a-select',
options: [
{ value: 'sftp', label: 'sftp' },
{ value: 'scp', label: 'scp' },
],
},
required: true,
})
uploadType: string = 'sftp';
@TaskInput({
title: '自动创建远程目录',
helper: '是否自动创建远程目录,如果关闭则你需要自己确保远程目录存在',
@@ -249,18 +264,7 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin {
async onInstance() {}
// copyFile(srcFile: string, destFile: string) {
// if (!srcFile || !destFile) {
// this.logger.warn(`srcFile:${srcFile} 或 destFile:${destFile} 为空,不复制`);
// return;
// }
// const dir = destFile.substring(0, destFile.lastIndexOf('/'));
// if (!fs.existsSync(dir)) {
// fs.mkdirSync(dir, { recursive: true });
// }
// fs.copyFileSync(srcFile, destFile);
// this.logger.info(`复制文件:${srcFile} => ${destFile}`);
// }
async execute(): Promise<void> {
const { cert, accessId } = this;
let { crtPath, keyPath, icPath, pfxPath, derPath, jksPath, onePath } = this;
@@ -268,16 +272,6 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin {
const handle = async (opts: CertReaderHandleContext) => {
const { tmpCrtPath, tmpKeyPath, tmpDerPath, tmpJksPath, tmpPfxPath, tmpIcPath, tmpOnePath } = opts;
// if (this.copyToThisHost) {
// this.logger.info('复制到目标路径');
// this.copyFile(tmpCrtPath, crtPath);
// this.copyFile(tmpKeyPath, keyPath);
// this.copyFile(tmpIcPath, this.icPath);
// this.copyFile(tmpPfxPath, this.pfxPath);
// this.copyFile(tmpDerPath, this.derPath);
// this.logger.warn('复制到当前主机功能已迁移到 “复制到本机”插件,请尽快换成复制到本机插件');
// return;
// }
if (accessId == null) {
this.logger.error('复制到当前主机功能已迁移到 “复制到本机”插件,请换成复制到本机插件');
@@ -355,7 +349,9 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin {
connectConf,
transports,
mkdirs: this.mkdirs,
uploadType: this.uploadType,
});
this.logger.info('上传文件到服务器成功');
//输出
this.hostCrtPath = crtPath;

View File

@@ -131,7 +131,7 @@ export class DingTalkNotification extends BaseNotification {
data: {
at: at,
text: {
content: `· ${body.title}\n· ${body.content}\n· 查看详情: ${body.url}`,
content: `${body.title}\n${body.content}\n查看详情: ${body.url}`,
},
msgtype:"text"
},

View File

@@ -106,7 +106,7 @@ export class DingTalkNotification extends BaseNotification {
}
if (atText){
atText = `\n· ${atText}`
atText = `\n${atText}`
}
let sign:any = {}
@@ -125,7 +125,7 @@ export class DingTalkNotification extends BaseNotification {
data: {
...sign,
content: {
text: `· ${body.title}\n· ${body.content}\n· 查看详情: ${body.url}${atText}`,
text: `${body.title}\n${body.content}\n查看详情: ${body.url}${atText}`,
},
msg_type:"text"
},

View File

@@ -62,7 +62,7 @@ export class QywxNotification extends BaseNotification {
data: {
msgtype: 'text',
text: {
content: `· ${body.title}\n· ${body.content}\n· 查看详情: ${body.url}`,
content: `${body.title}\n${body.content}\n查看详情: ${body.url}`,
mentioned_list: this.mentionedList,
mentioned_mobile_list: this.mentionedMobileList,
},

View File

@@ -8,7 +8,7 @@ import { IsAccess, AccessInput, BaseAccess } from '@certd/pipeline';
name: 'proxmox',
title: 'proxmox',
desc: '',
icon: 'svg:icon-dogecloud',
icon: 'svg:icon-proxmox',
})
export class ProxmoxAccess extends BaseAccess {
/**

View File

@@ -7,8 +7,8 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
@IsTaskPlugin({
//命名规范,插件名称+功能就是目录plugin-demo中的demo大写字母开头驼峰命名
name: 'ProxmoxUploadCert',
title: '上传证书到Proxmox',
icon: 'clarity:plugin-line',
title: 'Proxmox-上传证书到Proxmox',
icon: 'svg:icon-proxmox',
//插件分组
group: pluginGroups.other.key,
needPlus: true,

View File

@@ -8,7 +8,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
@IsTaskPlugin({
name: 'QnapDeploy',
title: '威联通-部署证书到威联通',
icon: 'simple-icons:qnap',
icon: 'svg:icon-qnap',
group: pluginGroups.panel.key,
desc: '部署证书到qnap',
default: {

View File

@@ -0,0 +1,35 @@
import {AccessInput, BaseAccess, IsAccess} from '@certd/pipeline';
/**
* 这个注解将注册一个授权配置
* 在certd的后台管理系统中用户可以选择添加此类型的授权
*/
@IsAccess({
name: 'upyun',
title: '又拍云',
desc: '',
icon: 'svg:icon-upyun',
})
export class UpyunAccess extends BaseAccess {
@AccessInput({
title: '账号',
component: {
placeholder: '又拍云账号',
},
required: true,
})
username = '';
@AccessInput({
title: '密码',
component: {
placeholder: '又拍云密码',
},
required: true,
encrypt: true,
})
password = '';
}
new UpyunAccess();

View File

@@ -0,0 +1,2 @@
export * from './plugins/index.js';
export * from './access.js';

View File

@@ -0,0 +1 @@
export * from './plugin-depoy-to-cdn.js';

View File

@@ -0,0 +1,185 @@
import { IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';
import { CertInfo } from '@certd/plugin-cert';
import { AbstractPlusTaskPlugin } from '@certd/plugin-plus';
import { UpyunAccess } from '../access.js';
import {createCertDomainGetterInputDefine, createRemoteSelectInputDefine} from '@certd/plugin-lib';
import { CertApplyPluginNames} from '@certd/plugin-cert';
import {optionsUtils} from "@certd/basic/dist/utils/util.options.js";
@IsTaskPlugin({
//命名规范,插件名称+功能就是目录plugin-demo中的demo大写字母开头驼峰命名
name: 'UpyunDeployToCdn',
title: '又拍云-部署证书到CDN',
icon: 'svg:icon-upyun',
//插件分组
group: pluginGroups.cdn.key,
needPlus: true,
default: {
//默认值配置照抄即可
strategy: {
runStrategy: RunStrategy.SkipWhenSucceed,
},
},
})
//类名规范跟上面插件名称name一致
export class UpyunDeployToCdn extends AbstractPlusTaskPlugin {
//证书选择,此项必须要有
@TaskInput({
title: '域名证书',
helper: '请选择前置任务输出的域名证书',
component: {
name: 'output-selector',
from: [...CertApplyPluginNames],
},
// required: true, // 必填
})
cert!: CertInfo;
@TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))
certDomains!: string[];
//授权选择框
@TaskInput({
title: 'Upyun授权',
component: {
name: 'access-selector',
type: 'upyun', //固定授权类型
},
required: true, //必填
})
accessId!: string;
//
@TaskInput(
createRemoteSelectInputDefine({
title: 'CDN加速域名',
helper: '选择CDN加速域名可以手动输入',
typeName: 'UpyunDeployToCdn',
action: UpyunDeployToCdn.prototype.onGetCdnList.name,
watches: ['accessId'],
})
)
cdnList!: string[];
//插件实例化时执行的方法
async onInstance() {}
//插件执行方法
async execute(): Promise<void> {
const cookie = await this.getLoginToken();
this.logger.info(`登录成功`);
const certId = await this.uploadCert(cookie);
this.logger.info(`上传证书成功:${certId}`);
for (const item of this.cdnList) {
this.logger.info(`开始部署证书:${item}`);
const res = await this.doRequest({
cookie:cookie,
url: 'https://console.upyun.com/api/https/migrate/domain',
method: 'POST',
data:{
crt_id: certId,
domain_name : item
}
})
this.logger.info(`部署成功:${JSON.stringify(res)}`);
}
this.logger.info('部署成功');
}
async uploadCert(cookie:string){
// https://console.upyun.com/api/https/certificate/
const res = await this.doRequest({
cookie:cookie,
url: 'https://console.upyun.com/api/https/certificate/',
method: 'POST',
data:{
certificate: this.cert.crt,
private_key: this.cert.key
}
})
return res.data.result.certificate_id
}
async getLoginToken(){
const access = await this.accessService.getById<UpyunAccess>(this.accessId)
const res = await this.http.request({
url: 'https://console.upyun.com/accounts/signin/',
method: 'POST',
data:{
username: access.username,
password: access.password
},
logRes:false,
returnResponse:true
});
if (res.data?.errors?.length>0) {
throw new Error(JSON.stringify(res.data.msg));
}
const cookie = res.headers['set-cookie'];
return cookie;
}
async doRequest(req:{
cookie:string,
url:string,
method:string,
data:any
}){
const res = await this.http.request({
url: req.url,
method: req.method,
data:req.data,
headers:{
Cookie: req.cookie
}
})
if (res.msg.errors.length>0) {
throw new Error(JSON.stringify(res.msg));
}
return res
}
async onGetCdnList() {
if(!this.accessId){
throw new Error('accessId不能为空');
}
const cookie = await this.getLoginToken();
const req = {
cookie,
url: 'https://console.upyun.com/api/v2/buckets/?bucket_name=&with_domains=true&business_type=file&perPage=100&page=1&tag=all&state=all&type=ucdn&security_cdn=false',
method: 'GET',
data:{}
}
const res = await this.doRequest(req);
const buckets = res.data?.buckets;
if(!buckets || buckets.length === 0){
throw new Error('没有找到CDN加速域名');
}
const list= []
for (const item of buckets) {
for (const domain of item.domains) {
list.push({
domain:domain.domain,
bucket:item.bucket_name
});
}
}
const options = list.map((item: any) => {
return {
value: item.domain,
label: `${item.domain}<${item.bucket}>`,
domain: item.domain,
};
});
return optionsUtils.buildGroupOptions(options, this.certDomains);
}
}
//实例化一下,注册插件
new UpyunDeployToCdn();

View File

@@ -17,7 +17,7 @@ type westRecord = {
name: 'west',
title: '西部数码',
desc: 'west dns provider',
icon: 'tabler:map-west',
icon: 'svg:icon-xibushuma',
// 这里是对应的云平台的access类型名称
accessType: 'west',
})

156
pnpm-lock.yaml generated
View File

@@ -46,7 +46,7 @@ importers:
packages/core/acme-client:
dependencies:
'@certd/basic':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../basic
'@peculiar/x509':
specifier: ^1.11.0
@@ -204,10 +204,10 @@ importers:
packages/core/pipeline:
dependencies:
'@certd/basic':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../basic
'@certd/plus-core':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../pro/plus-core
dayjs:
specifier: ^1.11.7
@@ -342,7 +342,7 @@ importers:
packages/libs/lib-k8s:
dependencies:
'@certd/basic':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/basic
'@kubernetes/client-node':
specifier: 0.21.0
@@ -382,16 +382,16 @@ importers:
packages/libs/lib-server:
dependencies:
'@certd/acme-client':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/acme-client
'@certd/basic':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/basic
'@certd/pipeline':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/pipeline
'@certd/plus-core':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../pro/plus-core
'@midwayjs/cache':
specifier: ~3.14.0
@@ -534,16 +534,16 @@ importers:
packages/plugins/plugin-cert:
dependencies:
'@certd/acme-client':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/acme-client
'@certd/basic':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/basic
'@certd/pipeline':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/pipeline
'@certd/plugin-lib':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../plugin-lib
'@google-cloud/publicca':
specifier: ^1.3.0
@@ -610,10 +610,10 @@ importers:
specifier: ^1.7.10
version: 1.8.0
'@certd/basic':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/basic
'@certd/pipeline':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/pipeline
'@kubernetes/client-node':
specifier: 0.21.0
@@ -701,19 +701,19 @@ importers:
packages/pro/commercial-core:
dependencies:
'@certd/basic':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/basic
'@certd/lib-server':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../libs/lib-server
'@certd/pipeline':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/pipeline
'@certd/plugin-plus':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../plugin-plus
'@certd/plus-core':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../plus-core
'@midwayjs/core':
specifier: ~3.20.3
@@ -798,22 +798,22 @@ importers:
specifier: ^1.0.2
version: 1.0.2
'@certd/basic':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/basic
'@certd/lib-k8s':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../libs/lib-k8s
'@certd/pipeline':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/pipeline
'@certd/plugin-cert':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../plugins/plugin-cert
'@certd/plugin-lib':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../plugins/plugin-lib
'@certd/plus-core':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../plus-core
ali-oss:
specifier: ^6.21.0
@@ -910,7 +910,7 @@ importers:
packages/pro/plus-core:
dependencies:
'@certd/basic':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/basic
dayjs:
specifier: ^1.11.7
@@ -1072,9 +1072,6 @@ importers:
cropperjs:
specifier: ^1.6.1
version: 1.6.2
crypto-js:
specifier: ^4.2.0
version: 4.2.0
cssnano:
specifier: ^7.0.6
version: 7.0.6(postcss@8.5.3)
@@ -1188,10 +1185,10 @@ importers:
version: 0.1.3(zod@3.24.2)
devDependencies:
'@certd/lib-iframe':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../libs/lib-iframe
'@certd/pipeline':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/pipeline
'@rollup/plugin-commonjs':
specifier: ^25.0.7
@@ -1371,40 +1368,40 @@ importers:
specifier: ^3.705.0
version: 3.758.0(aws-crt@1.25.3)
'@certd/acme-client':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/acme-client
'@certd/basic':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/basic
'@certd/commercial-core':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../pro/commercial-core
'@certd/lib-huawei':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../libs/lib-huawei
'@certd/lib-k8s':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../libs/lib-k8s
'@certd/lib-server':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../libs/lib-server
'@certd/midway-flyway-js':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../libs/midway-flyway-js
'@certd/pipeline':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../core/pipeline
'@certd/plugin-cert':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../plugins/plugin-cert
'@certd/plugin-lib':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../plugins/plugin-lib
'@certd/plugin-plus':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../pro/plugin-plus
'@certd/plus-core':
specifier: ^1.31.3
specifier: ^1.31.7
version: link:../../pro/plus-core
'@corsinvest/cv4pve-api-javascript':
specifier: ^8.3.0
@@ -1577,6 +1574,9 @@ importers:
typeorm:
specifier: ^0.3.20
version: 0.3.21(better-sqlite3@11.8.1)(pg@8.13.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2))
upyun:
specifier: ^3.4.6
version: 3.4.6
uuid:
specifier: ^10.0.0
version: 10.0.0
@@ -5348,6 +5348,9 @@ packages:
peerDependencies:
axios: '>= 0.17.0'
axios@0.26.1:
resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==}
axios@1.8.2:
resolution: {integrity: sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==}
@@ -5375,6 +5378,9 @@ packages:
balanced-match@2.0.0:
resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==}
base-64@1.0.0:
resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==}
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
@@ -5663,6 +5669,9 @@ packages:
chardet@0.7.0:
resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
charenc@0.0.2:
resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==}
check-error@1.0.3:
resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
@@ -6078,6 +6087,9 @@ packages:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
crypt@0.0.2:
resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==}
crypto-js@4.2.0:
resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==}
@@ -7441,6 +7453,9 @@ packages:
resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
engines: {node: '>=12.0.0'}
hmacsha1@1.0.0:
resolution: {integrity: sha512-4FP6J0oI8jqb6gLLl9tSwVdosWJ/AKSGJ+HwYf6Ixe4MUcEkst4uWzpVQrNOCin0fzTRQbXV8ePheU8WiiDYBw==}
hookable@5.5.3:
resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
@@ -7683,6 +7698,9 @@ packages:
resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
engines: {node: '>= 0.4'}
is-buffer@1.1.6:
resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
is-buffer@2.0.5:
resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==}
engines: {node: '>=4'}
@@ -7812,6 +7830,9 @@ packages:
resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
engines: {node: '>=0.10.0'}
is-promise@4.0.0:
resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
is-reference@1.2.1:
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
@@ -8532,6 +8553,9 @@ packages:
mathml-tag-names@2.1.3:
resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
md5@2.3.0:
resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==}
mdast-util-to-hast@13.2.0:
resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==}
@@ -11567,6 +11591,10 @@ packages:
resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==}
engines: {node: '>=10'}
upyun@3.4.6:
resolution: {integrity: sha512-ThAI7woGkVE2lsOq8MFYb0Oeg8avOQQbY3XmXmaq1aZVjzcglcMuI/RImBrq+KJw7nX39iNKCJKYs65xiAF53Q==}
engines: {node: '>=8.0.0'}
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@@ -17349,6 +17377,12 @@ snapshots:
fast-deep-equal: 3.1.3
is-buffer: 2.0.5
axios@0.26.1:
dependencies:
follow-redirects: 1.15.9(debug@4.4.0)
transitivePeerDependencies:
- debug
axios@1.8.2(debug@4.4.0):
dependencies:
follow-redirects: 1.15.9(debug@4.4.0)
@@ -17397,6 +17431,8 @@ snapshots:
balanced-match@2.0.0: {}
base-64@1.0.0: {}
base64-js@1.5.1: {}
base64url@3.0.1: {}
@@ -17742,6 +17778,8 @@ snapshots:
chardet@0.7.0: {}
charenc@0.0.2: {}
check-error@1.0.3:
dependencies:
get-func-name: 2.0.2
@@ -18168,6 +18206,8 @@ snapshots:
shebang-command: 2.0.0
which: 2.0.2
crypt@0.0.2: {}
crypto-js@4.2.0: {}
crypto-random-string@2.0.0: {}
@@ -18988,13 +19028,13 @@ snapshots:
resolve: 1.22.10
semver: 6.3.1
eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@7.32.0)(prettier@2.8.8):
eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.10.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.8.8):
dependencies:
eslint: 7.32.0
prettier: 2.8.8
prettier-linter-helpers: 1.0.0
optionalDependencies:
eslint-config-prettier: 8.10.0(eslint@8.57.0)
eslint-config-prettier: 8.10.0(eslint@7.32.0)
eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8):
dependencies:
@@ -19857,6 +19897,8 @@ snapshots:
highlight.js@11.11.1: {}
hmacsha1@1.0.0: {}
hookable@5.5.3: {}
hosted-git-info@2.8.9: {}
@@ -20108,6 +20150,8 @@ snapshots:
call-bound: 1.0.4
has-tostringtag: 1.0.2
is-buffer@1.1.6: {}
is-buffer@2.0.5: {}
is-callable@1.2.7: {}
@@ -20207,6 +20251,8 @@ snapshots:
is-plain-object@5.0.0: {}
is-promise@4.0.0: {}
is-reference@1.2.1:
dependencies:
'@types/estree': 1.0.6
@@ -20999,6 +21045,12 @@ snapshots:
mathml-tag-names@2.1.3: {}
md5@2.3.0:
dependencies:
charenc: 0.0.2
crypt: 0.0.2
is-buffer: 1.1.6
mdast-util-to-hast@13.2.0:
dependencies:
'@types/hast': 3.0.4
@@ -21330,7 +21382,7 @@ snapshots:
eslint: 7.32.0
eslint-config-prettier: 8.10.0(eslint@7.32.0)
eslint-plugin-node: 11.1.0(eslint@7.32.0)
eslint-plugin-prettier: 3.4.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@7.32.0)(prettier@2.8.8)
eslint-plugin-prettier: 3.4.1(eslint-config-prettier@8.10.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.8.8)
execa: 5.1.1
inquirer: 7.3.3
json5: 2.2.3
@@ -24373,6 +24425,18 @@ snapshots:
semver-diff: 3.1.1
xdg-basedir: 4.0.0
upyun@3.4.6:
dependencies:
axios: 0.26.1
base-64: 1.0.0
form-data: 4.0.2
hmacsha1: 1.0.0
is-promise: 4.0.0
md5: 2.3.0
mime-types: 2.1.35
transitivePeerDependencies:
- debug
uri-js@4.4.1:
dependencies:
punycode: 2.3.1