mirror of https://github.com/certd/certd
				
				
				
			Merge remote-tracking branch 'origin/v2-dev' into v2-dev
						commit
						7daad5477a
					
				|  | @ -3,6 +3,14 @@ | |||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
| 
 | ||||
| ## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17) | ||||
| 
 | ||||
| ### Performance Improvements | ||||
| 
 | ||||
| * 登录支持双重认证 ([48aef25](https://github.com/certd/certd/commit/48aef25b3f6499d674ca4e4ef16f4c62399fb735)) | ||||
| * 多重认证登录 ([0f82cf4](https://github.com/certd/certd/commit/0f82cf409bc60706ab07e4ca4f272b9a1ca7eecb)) | ||||
| * 优化部署到华为云CDN,支持先上传到ccm,再使用证书id部署,修复offline状态下导致部署报错的bug ([79df39a](https://github.com/certd/certd/commit/79df39acabab10ae7e1864dadcdc186bb007a3c5)) | ||||
| 
 | ||||
| ## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15) | ||||
| 
 | ||||
| ### Bug Fixes | ||||
|  |  | |||
|  | @ -1 +1 @@ | |||
| 23:49 | ||||
| 23:37 | ||||
|  |  | |||
|  | @ -3,6 +3,14 @@ | |||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
| 
 | ||||
| ## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17) | ||||
| 
 | ||||
| ### Performance Improvements | ||||
| 
 | ||||
| * 登录支持双重认证 ([48aef25](https://github.com/certd/certd/commit/48aef25b3f6499d674ca4e4ef16f4c62399fb735)) | ||||
| * 多重认证登录 ([0f82cf4](https://github.com/certd/certd/commit/0f82cf409bc60706ab07e4ca4f272b9a1ca7eecb)) | ||||
| * 优化部署到华为云CDN,支持先上传到ccm,再使用证书id部署,修复offline状态下导致部署报错的bug ([79df39a](https://github.com/certd/certd/commit/79df39acabab10ae7e1864dadcdc186bb007a3c5)) | ||||
| 
 | ||||
| ## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15) | ||||
| 
 | ||||
| ### Bug Fixes | ||||
|  |  | |||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 70 KiB | 
|  | @ -22,9 +22,11 @@ Certd 存储了证书以及授权等敏感数据,所以需要严格保障安 | |||
| * [站点隐藏设置说明](./hidden/) | ||||
|    | ||||
| 
 | ||||
| ## 4、登录二次验证 | ||||
| ## 4、登录双重验证 | ||||
| 
 | ||||
| 待实现 | ||||
| 支持2FA双重认证 | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| ## 5、数据库自动备份【建议开启】 | ||||
| * [自动备份设置说明](../../use/backup/) | ||||
|  |  | |||
|  | @ -9,5 +9,5 @@ | |||
|     } | ||||
|   }, | ||||
|   "npmClient": "pnpm", | ||||
|   "version": "1.33.4" | ||||
|   "version": "1.33.5" | ||||
| } | ||||
|  |  | |||
|  | @ -3,6 +3,10 @@ | |||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
| 
 | ||||
| ## [1.33.5](https://github.com/publishlab/node-acme-client/compare/v1.33.4...v1.33.5) (2025-04-17) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/acme-client | ||||
| 
 | ||||
| ## [1.33.4](https://github.com/publishlab/node-acme-client/compare/v1.33.3...v1.33.4) (2025-04-15) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/acme-client | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
|     "description": "Simple and unopinionated ACME client", | ||||
|     "private": false, | ||||
|     "author": "nmorsman", | ||||
|     "version": "1.33.4", | ||||
|     "version": "1.33.5", | ||||
|     "type": "module", | ||||
|     "module": "scr/index.js", | ||||
|     "main": "src/index.js", | ||||
|  | @ -18,7 +18,7 @@ | |||
|         "types" | ||||
|     ], | ||||
|     "dependencies": { | ||||
|         "@certd/basic": "^1.33.4", | ||||
|         "@certd/basic": "^1.33.5", | ||||
|         "@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": "5b3fb7387df65ed67811623ef9a2c5adadc8bf4f" | ||||
|     "gitHead": "198a97b00c75219ea8efdc6db4676158506a07c1" | ||||
| } | ||||
|  |  | |||
|  | @ -3,6 +3,12 @@ | |||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
| 
 | ||||
| ## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17) | ||||
| 
 | ||||
| ### Performance Improvements | ||||
| 
 | ||||
| * 多重认证登录 ([0f82cf4](https://github.com/certd/certd/commit/0f82cf409bc60706ab07e4ca4f272b9a1ca7eecb)) | ||||
| 
 | ||||
| ## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/basic | ||||
|  |  | |||
|  | @ -1 +1 @@ | |||
| 23:45 | ||||
| 23:32 | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| { | ||||
|   "name": "@certd/basic", | ||||
|   "private": false, | ||||
|   "version": "1.33.4", | ||||
|   "version": "1.33.5", | ||||
|   "type": "module", | ||||
|   "main": "./dist/index.js", | ||||
|   "module": "./dist/index.js", | ||||
|  | @ -44,5 +44,5 @@ | |||
|     "tslib": "^2.8.1", | ||||
|     "typescript": "^5.4.2" | ||||
|   }, | ||||
|   "gitHead": "5b3fb7387df65ed67811623ef9a2c5adadc8bf4f" | ||||
|   "gitHead": "198a97b00c75219ea8efdc6db4676158506a07c1" | ||||
| } | ||||
|  |  | |||
|  | @ -3,6 +3,10 @@ | |||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
| 
 | ||||
| ## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/pipeline | ||||
| 
 | ||||
| ## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/pipeline | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| { | ||||
|   "name": "@certd/pipeline", | ||||
|   "private": false, | ||||
|   "version": "1.33.4", | ||||
|   "version": "1.33.5", | ||||
|   "type": "module", | ||||
|   "main": "./dist/index.js", | ||||
|   "module": "./dist/index.js", | ||||
|  | @ -16,8 +16,8 @@ | |||
|     "test": "mocha   --loader=ts-node/esm" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@certd/basic": "^1.33.4", | ||||
|     "@certd/plus-core": "^1.33.4", | ||||
|     "@certd/basic": "^1.33.5", | ||||
|     "@certd/plus-core": "^1.33.5", | ||||
|     "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": "5b3fb7387df65ed67811623ef9a2c5adadc8bf4f" | ||||
|   "gitHead": "198a97b00c75219ea8efdc6db4676158506a07c1" | ||||
| } | ||||
|  |  | |||
|  | @ -3,6 +3,10 @@ | |||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
| 
 | ||||
| ## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/lib-huawei | ||||
| 
 | ||||
| ## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/lib-huawei | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| { | ||||
|   "name": "@certd/lib-huawei", | ||||
|   "private": false, | ||||
|   "version": "1.33.4", | ||||
|   "version": "1.33.5", | ||||
|   "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": "5b3fb7387df65ed67811623ef9a2c5adadc8bf4f" | ||||
|   "gitHead": "198a97b00c75219ea8efdc6db4676158506a07c1" | ||||
| } | ||||
|  |  | |||
|  | @ -3,6 +3,10 @@ | |||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
| 
 | ||||
| ## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/lib-iframe | ||||
| 
 | ||||
| ## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/lib-iframe | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| { | ||||
|   "name": "@certd/lib-iframe", | ||||
|   "private": false, | ||||
|   "version": "1.33.4", | ||||
|   "version": "1.33.5", | ||||
|   "type": "module", | ||||
|   "main": "./dist/index.js", | ||||
|   "module": "./dist/index.js", | ||||
|  | @ -30,5 +30,5 @@ | |||
|     "tslib": "^2.8.1", | ||||
|     "typescript": "^5.4.2" | ||||
|   }, | ||||
|   "gitHead": "5b3fb7387df65ed67811623ef9a2c5adadc8bf4f" | ||||
|   "gitHead": "198a97b00c75219ea8efdc6db4676158506a07c1" | ||||
| } | ||||
|  |  | |||
|  | @ -3,6 +3,10 @@ | |||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
| 
 | ||||
| ## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/jdcloud | ||||
| 
 | ||||
| ## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/jdcloud | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "@certd/jdcloud", | ||||
|   "version": "1.33.4", | ||||
|   "version": "1.33.5", | ||||
|   "description": "jdcloud openApi sdk", | ||||
|   "main": "./dist/bundle.js", | ||||
|   "module": "./dist/bundle.js", | ||||
|  | @ -60,5 +60,5 @@ | |||
|       "fetch" | ||||
|     ] | ||||
|   }, | ||||
|   "gitHead": "5b3fb7387df65ed67811623ef9a2c5adadc8bf4f" | ||||
|   "gitHead": "198a97b00c75219ea8efdc6db4676158506a07c1" | ||||
| } | ||||
|  |  | |||
|  | @ -3,6 +3,10 @@ | |||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
| 
 | ||||
| ## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/lib-k8s | ||||
| 
 | ||||
| ## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/lib-k8s | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| { | ||||
|   "name": "@certd/lib-k8s", | ||||
|   "private": false, | ||||
|   "version": "1.33.4", | ||||
|   "version": "1.33.5", | ||||
|   "type": "module", | ||||
|   "main": "./dist/index.js", | ||||
|   "module": "./dist/index.js", | ||||
|  | @ -16,7 +16,7 @@ | |||
|     "preview": "vite preview" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@certd/basic": "^1.33.4", | ||||
|     "@certd/basic": "^1.33.5", | ||||
|     "@kubernetes/client-node": "0.21.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|  | @ -31,5 +31,5 @@ | |||
|     "tslib": "^2.8.1", | ||||
|     "typescript": "^5.4.2" | ||||
|   }, | ||||
|   "gitHead": "5b3fb7387df65ed67811623ef9a2c5adadc8bf4f" | ||||
|   "gitHead": "198a97b00c75219ea8efdc6db4676158506a07c1" | ||||
| } | ||||
|  |  | |||
|  | @ -3,6 +3,12 @@ | |||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
| 
 | ||||
| ## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17) | ||||
| 
 | ||||
| ### Performance Improvements | ||||
| 
 | ||||
| * 登录支持双重认证 ([48aef25](https://github.com/certd/certd/commit/48aef25b3f6499d674ca4e4ef16f4c62399fb735)) | ||||
| 
 | ||||
| ## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/lib-server | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "@certd/lib-server", | ||||
|   "version": "1.33.4", | ||||
|   "version": "1.33.5", | ||||
|   "description": "midway with flyway, sql upgrade way ", | ||||
|   "private": false, | ||||
|   "type": "module", | ||||
|  | @ -27,10 +27,10 @@ | |||
|   ], | ||||
|   "license": "AGPL", | ||||
|   "dependencies": { | ||||
|     "@certd/acme-client": "^1.33.4", | ||||
|     "@certd/basic": "^1.33.4", | ||||
|     "@certd/pipeline": "^1.33.4", | ||||
|     "@certd/plus-core": "^1.33.4", | ||||
|     "@certd/acme-client": "^1.33.5", | ||||
|     "@certd/basic": "^1.33.5", | ||||
|     "@certd/pipeline": "^1.33.5", | ||||
|     "@certd/plus-core": "^1.33.5", | ||||
|     "@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": "5b3fb7387df65ed67811623ef9a2c5adadc8bf4f" | ||||
|   "gitHead": "198a97b00c75219ea8efdc6db4676158506a07c1" | ||||
| } | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| import { Constants } from '../constants.js'; | ||||
| import { BaseException } from './base-exception.js'; | ||||
| import { TextException } from "./common-exception.js"; | ||||
| /** | ||||
|  * 授权异常 | ||||
|  */ | ||||
|  | @ -10,9 +11,9 @@ export class AuthException extends BaseException { | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| export class Need2FAException extends BaseException { | ||||
|   constructor(message?:string) { | ||||
|     super('Need2FAException', Constants.res.need2fa.code, message ? message : Constants.res.need2fa.message); | ||||
| export class Need2FAException extends TextException { | ||||
|   constructor(message:string,data:any) { | ||||
|     super('Need2FAException', Constants.res.need2fa.code, message ? message : Constants.res.need2fa.message,data); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,9 +3,11 @@ | |||
|  */ | ||||
| export class BaseException extends Error { | ||||
|   code: number; | ||||
|   constructor(name, code, message) { | ||||
|   data?:any | ||||
|   constructor(name, code, message,data?:any) { | ||||
|     super(message); | ||||
|     this.name = name; | ||||
|     this.code = code; | ||||
|     this.data = data; | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,16 +1,23 @@ | |||
| import { Constants } from '../constants.js'; | ||||
| import { BaseException } from './base-exception.js'; | ||||
| import { Constants } from "../constants.js"; | ||||
| import { BaseException } from "./base-exception.js"; | ||||
| 
 | ||||
| /** | ||||
|  * 通用异常 | ||||
|  */ | ||||
| export class CommonException extends BaseException { | ||||
|   constructor(message) { | ||||
|     super('CommonException', Constants.res.error.code, message ? message : Constants.res.error.message); | ||||
|     super("CommonException", Constants.res.error.code, message ? message : Constants.res.error.message); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| export class CodeException extends BaseException { | ||||
|   constructor(res: { code: number; message: string }) { | ||||
|     super('CodeException', res.code, res.message); | ||||
|     super("CodeException", res.code, res.message); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| export class TextException extends BaseException { | ||||
|   constructor(name, code,message, data?) { | ||||
|     super(name, code, message, data); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -2,14 +2,15 @@ export class Result<T> { | |||
|   code: number; | ||||
|   msg: string; | ||||
|   data: T; | ||||
| 
 | ||||
|   constructor(code, msg, data?) { | ||||
|     this.code = code; | ||||
|     this.msg = msg; | ||||
|     this.data = data; | ||||
|   } | ||||
| 
 | ||||
|   static error(code = 1, msg) { | ||||
|     return new Result(code, msg); | ||||
|   static error(code = 1, msg, data?: any) { | ||||
|     return new Result(code, msg, data); | ||||
|   } | ||||
| 
 | ||||
|   static success(msg, data?) { | ||||
|  |  | |||
|  | @ -3,6 +3,10 @@ | |||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
| 
 | ||||
| ## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/midway-flyway-js | ||||
| 
 | ||||
| ## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/midway-flyway-js | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "@certd/midway-flyway-js", | ||||
|   "version": "1.33.4", | ||||
|   "version": "1.33.5", | ||||
|   "description": "midway with flyway, sql upgrade way ", | ||||
|   "private": false, | ||||
|   "type": "module", | ||||
|  | @ -46,5 +46,5 @@ | |||
|     "typeorm": "^0.3.11", | ||||
|     "typescript": "^5.4.2" | ||||
|   }, | ||||
|   "gitHead": "5b3fb7387df65ed67811623ef9a2c5adadc8bf4f" | ||||
|   "gitHead": "198a97b00c75219ea8efdc6db4676158506a07c1" | ||||
| } | ||||
|  |  | |||
|  | @ -3,6 +3,10 @@ | |||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
| 
 | ||||
| ## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/plugin-cert | ||||
| 
 | ||||
| ## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/plugin-cert | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| { | ||||
|   "name": "@certd/plugin-cert", | ||||
|   "private": false, | ||||
|   "version": "1.33.4", | ||||
|   "version": "1.33.5", | ||||
|   "type": "module", | ||||
|   "main": "./dist/index.js", | ||||
|   "types": "./dist/index.d.ts", | ||||
|  | @ -15,10 +15,10 @@ | |||
|     "preview": "vite preview" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@certd/acme-client": "^1.33.4", | ||||
|     "@certd/basic": "^1.33.4", | ||||
|     "@certd/pipeline": "^1.33.4", | ||||
|     "@certd/plugin-lib": "^1.33.4", | ||||
|     "@certd/acme-client": "^1.33.5", | ||||
|     "@certd/basic": "^1.33.5", | ||||
|     "@certd/pipeline": "^1.33.5", | ||||
|     "@certd/plugin-lib": "^1.33.5", | ||||
|     "@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": "5b3fb7387df65ed67811623ef9a2c5adadc8bf4f" | ||||
|   "gitHead": "198a97b00c75219ea8efdc6db4676158506a07c1" | ||||
| } | ||||
|  |  | |||
|  | @ -3,6 +3,10 @@ | |||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
| 
 | ||||
| ## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17) | ||||
| 
 | ||||
| **Note:** Version bump only for package @certd/plugin-lib | ||||
| 
 | ||||
| ## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15) | ||||
| 
 | ||||
| ### Performance Improvements | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| { | ||||
|   "name": "@certd/plugin-lib", | ||||
|   "private": false, | ||||
|   "version": "1.33.4", | ||||
|   "version": "1.33.5", | ||||
|   "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.33.4", | ||||
|     "@certd/pipeline": "^1.33.4", | ||||
|     "@certd/basic": "^1.33.5", | ||||
|     "@certd/pipeline": "^1.33.5", | ||||
|     "@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": "5b3fb7387df65ed67811623ef9a2c5adadc8bf4f" | ||||
|   "gitHead": "198a97b00c75219ea8efdc6db4676158506a07c1" | ||||
| } | ||||
|  |  | |||
|  | @ -3,6 +3,13 @@ | |||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
| 
 | ||||
| ## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17) | ||||
| 
 | ||||
| ### Performance Improvements | ||||
| 
 | ||||
| * 登录支持双重认证 ([48aef25](https://github.com/certd/certd/commit/48aef25b3f6499d674ca4e4ef16f4c62399fb735)) | ||||
| * 多重认证登录 ([0f82cf4](https://github.com/certd/certd/commit/0f82cf409bc60706ab07e4ca4f272b9a1ca7eecb)) | ||||
| 
 | ||||
| ## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15) | ||||
| 
 | ||||
| ### Performance Improvements | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "@certd/ui-client", | ||||
|   "version": "1.33.4", | ||||
|   "version": "1.33.5", | ||||
|   "private": true, | ||||
|   "scripts": { | ||||
|     "dev": "vite --open", | ||||
|  | @ -101,8 +101,8 @@ | |||
|     "zod-defaults": "^0.1.3" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@certd/lib-iframe": "^1.33.4", | ||||
|     "@certd/pipeline": "^1.33.4", | ||||
|     "@certd/lib-iframe": "^1.33.5", | ||||
|     "@certd/pipeline": "^1.33.5", | ||||
|     "@rollup/plugin-commonjs": "^25.0.7", | ||||
|     "@rollup/plugin-node-resolve": "^15.2.3", | ||||
|     "@types/chai": "^4.3.12", | ||||
|  |  | |||
|  | @ -3,6 +3,17 @@ import { get } from "lodash-es"; | |||
| import { errorLog, errorCreate } from "./tools"; | ||||
| import { env } from "/src/utils/util.env"; | ||||
| import { useUserStore } from "/@/store/user"; | ||||
| 
 | ||||
| export class CodeError extends Error { | ||||
|   code: number; | ||||
|   data?: any; | ||||
|   constructor(message: string, code: number, data?: any) { | ||||
|     super(message); | ||||
|     this.code = code; | ||||
|     this.data = data; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @description 创建请求实例 | ||||
|  */ | ||||
|  | @ -56,12 +67,13 @@ function createService() { | |||
|             const errorMessage = dataAxios.msg || dataAxios.message || "未知错误"; | ||||
|             // @ts-ignore
 | ||||
|             if (response?.config?.onError) { | ||||
|               // @ts-ignore
 | ||||
|               response.config.onError(new Error(errorMessage)); | ||||
|               const err = new CodeError(errorMessage, dataAxios.code, dataAxios.data); | ||||
|               response.config.onError(err); | ||||
|               return; | ||||
|             } | ||||
|             //@ts-ignore
 | ||||
|             const showErrorNotify = response?.config?.showErrorNotify; | ||||
|             errorCreate(`${errorMessage}: ${response.config.url}`, showErrorNotify); | ||||
|             errorCreate(`${errorMessage}: ${response.config.url}`, showErrorNotify, dataAxios); | ||||
|             return dataAxios; | ||||
|         } | ||||
|       } | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ | |||
|  * @param {String} defaultValue 默认值 | ||||
|  */ | ||||
| import { uiContext } from "@fast-crud/fast-crud"; | ||||
| import { CodeError } from "/@/api/service"; | ||||
| 
 | ||||
| export function parse(jsonString = "{}", defaultValue = {}) { | ||||
|   let result = defaultValue; | ||||
|  | @ -68,8 +69,8 @@ export function errorLog(error: any, notify = true) { | |||
|  * @description 创建一个错误 | ||||
|  * @param {String} msg 错误信息 | ||||
|  */ | ||||
| export function errorCreate(msg: string, notify = true) { | ||||
|   const err = new Error(msg); | ||||
| export function errorCreate(msg: string, notify = true, data?: any) { | ||||
|   const err = new CodeError(msg, data.code, data.data); | ||||
|   console.error("errorCreate", err); | ||||
|   if (notify) { | ||||
|     uiContext.get().notification.error({ message: err.message }); | ||||
|  |  | |||
|  | @ -149,7 +149,7 @@ export const certdResources = [ | |||
|             path: "/certd/mine/security", | ||||
|             component: "/certd/mine/security/index.vue", | ||||
|             meta: { | ||||
|               icon: "ion:locked-outline", | ||||
|               icon: "fluent:shield-keyhole-16-regular", | ||||
|               auth: true, | ||||
|               isMenu: true, | ||||
|             }, | ||||
|  |  | |||
|  | @ -66,3 +66,11 @@ export async function mine(): Promise<UserInfoRes> { | |||
|     method: "post", | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| export async function loginByTwoFactor(data: any) { | ||||
|   return await request({ | ||||
|     url: "/loginByTwoFactor", | ||||
|     method: "post", | ||||
|     data, | ||||
|   }); | ||||
| } | ||||
|  |  | |||
|  | @ -51,7 +51,7 @@ export const useUserStore = defineStore({ | |||
|     setUserInfo(info: UserInfoRes) { | ||||
|       this.userInfo = info; | ||||
|       const userStore = vbenUserStore(); | ||||
|       userStore.setUserInfo(info); | ||||
|       userStore.setUserInfo(info as any); | ||||
|       LocalStorage.set(USER_INFO_KEY, info); | ||||
|     }, | ||||
|     resetState() { | ||||
|  | @ -71,23 +71,18 @@ export const useUserStore = defineStore({ | |||
|      * @description: login | ||||
|      */ | ||||
|     async login(loginType: string, params: LoginReq | SmsLoginReq): Promise<any> { | ||||
|       try { | ||||
|         let loginRes: any = null; | ||||
|         if (loginType === "sms") { | ||||
|           loginRes = await UserApi.loginBySms(params as SmsLoginReq); | ||||
|         } else { | ||||
|           loginRes = await UserApi.login(params as LoginReq); | ||||
|         } | ||||
| 
 | ||||
|         const { token, expire } = loginRes; | ||||
|         // save token
 | ||||
|         this.setToken(token, expire); | ||||
|         // get user info
 | ||||
|         return await this.onLoginSuccess(loginRes); | ||||
|       } catch (error) { | ||||
|         console.error(error); | ||||
|         return null; | ||||
|       let loginRes: any = null; | ||||
|       if (loginType === "sms") { | ||||
|         loginRes = await UserApi.loginBySms(params as SmsLoginReq); | ||||
|       } else { | ||||
|         loginRes = await UserApi.login(params as LoginReq); | ||||
|       } | ||||
|       return await this.onLoginSuccess(loginRes); | ||||
|     }, | ||||
| 
 | ||||
|     async loginByTwoFactor(form: any) { | ||||
|       const loginRes = await UserApi.loginByTwoFactor(form); | ||||
|       return await this.onLoginSuccess(loginRes); | ||||
|     }, | ||||
|     async getUserInfoAction(): Promise<UserInfoRes> { | ||||
|       const userInfo = await UserApi.mine(); | ||||
|  | @ -100,9 +95,13 @@ export const useUserStore = defineStore({ | |||
|     }, | ||||
| 
 | ||||
|     async onLoginSuccess(loginData: any) { | ||||
|       const { token, expire } = loginData; | ||||
|       // save token
 | ||||
|       this.setToken(token, expire); | ||||
|       // get user info
 | ||||
|       // await this.getUserInfoAction();
 | ||||
|       // const userInfo = await this.getUserInfoAction();
 | ||||
|       mitter.emit("app.login", { token: loginData }); | ||||
|       mitter.emit("app.login", { ...loginData }); | ||||
|       await router.replace("/"); | ||||
|     }, | ||||
| 
 | ||||
|  |  | |||
|  | @ -105,4 +105,19 @@ span.fs-icon-svg{ | |||
|   svg{ | ||||
|     vertical-align:0 !important; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| .fs-button{ | ||||
|   span{ | ||||
|     &:first-child{ | ||||
|       margin-right: 5px; | ||||
|     } | ||||
|     &:last-child{ | ||||
|       margin-left: 5px; | ||||
|     } | ||||
|   } | ||||
|   .fs-icon,.fs-button-icon{ | ||||
|     margin: 0 !important; | ||||
| 
 | ||||
|   } | ||||
| } | ||||
|  | @ -5,11 +5,18 @@ | |||
|     </template> | ||||
|     <div class="user-settings-form settings-form"> | ||||
|       <a-form :model="formState" name="basic" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }" autocomplete="off"> | ||||
|         <a-form-item label="OTP多重验证登录" :name="['authenticator', 'enabled']"> | ||||
|         <a-form-item label="2FA多重验证登录" :name="['authenticator', 'enabled']"> | ||||
|           <div class="flex mt-5"> | ||||
|             <a-switch v-model:checked="formState.authenticator.enabled" :disabled="!settingsStore.isPlus" @change="onAuthenticatorEnabledChanged" /> | ||||
| 
 | ||||
|             <a-button v-if="formState.authenticator.enabled && formState.authenticator.verified" :disabled="authenticatorOpenRef" size="small" class="ml-5" type="primary" @click="authenticatorForm.open = true"> | ||||
|             <a-button | ||||
|               v-if="formState.authenticator.enabled && formState.authenticator.verified" | ||||
|               :disabled="authenticatorOpenRef || !settingsStore.isPlus" | ||||
|               size="small" | ||||
|               class="ml-5" | ||||
|               type="primary" | ||||
|               @click="authenticatorForm.open = true" | ||||
|             > | ||||
|               重新绑定 | ||||
|             </a-button> | ||||
| 
 | ||||
|  | @ -19,8 +26,30 @@ | |||
|           <div class="helper">是否开启多重验证登录</div> | ||||
|         </a-form-item> | ||||
|         <a-form-item v-if="authenticatorOpenRef" label="绑定设备" class="authenticator-config"> | ||||
|           <h3 class="font-bold m-5">1. 安装任意一款 Authenticator APP</h3> | ||||
|           <div class="ml-20">比如:Microsoft Authenticator / Google Authenticator / Authy / Synology Secure SignIn 等</div> | ||||
|           <h3 class="font-bold m-5">1. 安装任意一款支持Authenticator的验证APP,比如:</h3> | ||||
|           <div class="ml-20"> | ||||
|             <ul> | ||||
|               <li> | ||||
|                 <a-tooltip title="如果报没有找到谷歌服务的错误,您可以安装KK谷歌助手"> | ||||
|                   <a href="https://appgallery.huawei.com/app/C100262999" target="_blank"> Microsoft Authenticator</a> | ||||
|                 </a-tooltip> | ||||
|               </li> | ||||
|               <li> | ||||
|                 <a href="https://sj.qq.com/appdetail/com.tencent.authenticator" target="_blank">腾讯身份验证器</a> | ||||
|               </li> | ||||
|               <li> | ||||
|                 <a href="https://www.synology.cn/zh-cn/dsm/feature/authentication" target="_blank">群晖身份验证器</a> | ||||
|               </li> | ||||
|               <li> | ||||
|                 <a-tooltip title="如果报没有找到谷歌服务的错误,您可以安装KK谷歌助手"> | ||||
|                   <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2" target="_blank">Google Authenticator</a> | ||||
|                 </a-tooltip> | ||||
|               </li> | ||||
|               <li> | ||||
|                 <a href="https://play.google.com/store/apps/details?id=com.authy.authy" target="_blank">Authy</a> | ||||
|               </li> | ||||
|             </ul> | ||||
|           </div> | ||||
|           <h3 class="font-bold m-10">2. 扫描二维码添加账号</h3> | ||||
|           <div v-if="authenticatorForm.qrcodeSrc" class="qrcode"> | ||||
|             <div class="ml-20"> | ||||
|  | @ -53,7 +82,12 @@ defineOptions({ | |||
|   name: "UserSecurity", | ||||
| }); | ||||
| 
 | ||||
| const formState = reactive<Partial<UserTwoFactorSetting>>({}); | ||||
| const formState = reactive<Partial<UserTwoFactorSetting>>({ | ||||
|   authenticator: { | ||||
|     enabled: false, | ||||
|     verified: false, | ||||
|   }, | ||||
| }); | ||||
| 
 | ||||
| const authenticatorForm = reactive({ | ||||
|   qrcodeSrc: "", | ||||
|  |  | |||
|  | @ -4,10 +4,14 @@ | |||
|       <a-tab-pane v-for="item of detail.nodes" :key="item.node.id"> | ||||
|         <template #tab> | ||||
|           <div class="tab-title flex-between" :title="item.node.title"> | ||||
|             <span class="tab-title-text flex items-center md:w-40"> | ||||
|             <span class="tab-title-text flex items-center md:w-48"> | ||||
|               <pi-status-show class="mr-1" :status="item.node.status?.result" type="icon"></pi-status-show> | ||||
|               <!--              <fs-icon icon="ion:chevron-forward-circle" class="text-md mr-1"></fs-icon>--> | ||||
|               {{ item.node.title }} | ||||
|               <span class="flex-1 ellipsis">{{ item.node.title }}</span> | ||||
| 
 | ||||
|               <a-tooltip title="强制重新执行此步骤"> | ||||
|                 <fs-icon class="pointer color-blue ml-1" style="font-size: 16px" title="强制重新执行此步骤" icon="icon-park-outline:replay-music" @click="triggerRun(item.node.id)"></fs-icon> | ||||
|               </a-tooltip> | ||||
|             </span> | ||||
|           </div> | ||||
|         </template> | ||||
|  | @ -31,13 +35,14 @@ export default { | |||
|   name: "PiTaskView", | ||||
|   components: { PiStatusShow }, | ||||
|   props: {}, | ||||
|   emits: ["run"], | ||||
|   setup(props: any, ctx: any) { | ||||
|     const taskModal = ref({ | ||||
|       open: false, | ||||
|       onOk() { | ||||
|         taskViewClose(); | ||||
|       }, | ||||
|       cancelText: "关闭" | ||||
|       cancelText: "关闭", | ||||
|     }); | ||||
|     const { isMobile } = usePreferences(); | ||||
|     const tabPosition = computed(() => { | ||||
|  | @ -65,7 +70,7 @@ export default { | |||
|           node: step, | ||||
|           type: "步骤", | ||||
|           tab: 2, | ||||
|           logs: [] | ||||
|           logs: [], | ||||
|         }); | ||||
|       } | ||||
|       for (let node of nodes) { | ||||
|  | @ -82,7 +87,7 @@ export default { | |||
|                 list.push({ | ||||
|                   time, | ||||
|                   content, | ||||
|                   color | ||||
|                   color, | ||||
|                 }); | ||||
|               } | ||||
|               return list; | ||||
|  | @ -111,12 +116,12 @@ export default { | |||
|               if (isBottom && el) { | ||||
|                 el?.scrollTo({ | ||||
|                   top: el.scrollHeight, | ||||
|                   behavior: "smooth" | ||||
|                   behavior: "smooth", | ||||
|                 }); | ||||
|               } | ||||
|             }, | ||||
|             { | ||||
|               immediate: true | ||||
|               immediate: true, | ||||
|             } | ||||
|           ); | ||||
|         } | ||||
|  | @ -135,15 +140,21 @@ export default { | |||
|       taskModal.value.open = false; | ||||
|     }; | ||||
| 
 | ||||
|     function triggerRun(id: string) { | ||||
|       ctx.emit("run", id); | ||||
|       taskModal.value.open = false; | ||||
|     } | ||||
| 
 | ||||
|     return { | ||||
|       detail, | ||||
|       taskModal, | ||||
|       activeKey, | ||||
|       taskViewOpen, | ||||
|       taskViewClose, | ||||
|       tabPosition | ||||
|       tabPosition, | ||||
|       triggerRun, | ||||
|     }; | ||||
|   } | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
| 
 | ||||
|  | @ -154,7 +165,7 @@ export default { | |||
| 
 | ||||
|     .tab-title-text { | ||||
|       display: flex; | ||||
|       max-width: 180px; | ||||
|       //max-width: 180px; | ||||
|       white-space: nowrap; | ||||
|       overflow: hidden; | ||||
|       text-overflow: ellipsis; | ||||
|  |  | |||
|  | @ -249,7 +249,7 @@ | |||
| 
 | ||||
|     <pi-task-form ref="taskFormRef" :edit-mode="editMode"></pi-task-form> | ||||
|     <pi-trigger-form ref="triggerFormRef" :edit-mode="editMode"></pi-trigger-form> | ||||
|     <pi-task-view ref="taskViewRef"></pi-task-view> | ||||
|     <pi-task-view ref="taskViewRef" @run="run"></pi-task-view> | ||||
|     <PiNotificationForm ref="notificationFormRef" :edit-mode="editMode"></PiNotificationForm> | ||||
|   </fs-page> | ||||
| </template> | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| <template> | ||||
|   <div class="main login-page"> | ||||
|     <a-form ref="formRef" class="user-layout-login" name="custom-validation" :model="formState" v-bind="layout" @finish="handleFinish" @finish-failed="handleFinishFailed"> | ||||
|     <a-form v-if="!twoFactor.loginId" ref="formRef" class="user-layout-login" name="custom-validation" :model="formState" v-bind="layout" @finish="handleFinish" @finish-failed="handleFinishFailed"> | ||||
|       <!--      <div class="login-title">登录</div>--> | ||||
|       <a-tabs v-model:active-key="formState.loginType" :tab-bar-style="{ textAlign: 'center', borderBottom: 'unset' }"> | ||||
|         <a-tab-pane key="password" tab="密码登录" :disabled="sysPublicSettings.passwordLoginEnabled !== true"> | ||||
|  | @ -49,6 +49,23 @@ | |||
|         <router-link v-if="hasRegisterTypeEnabled()" class="register" :to="{ name: 'register' }"> 注册 </router-link> | ||||
|       </a-form-item> | ||||
|     </a-form> | ||||
|     <a-form v-else ref="twoFactorFormRef" class="user-layout-login" :model="twoFactor" v-bind="layout"> | ||||
|       <div class="mb-10 flex flex-center">请打开您的Authenticator APP,获取动态验证码。</div> | ||||
|       <a-form-item name="verifyCode"> | ||||
|         <a-input v-model:value="twoFactor.verifyCode" placeholder="请输入动态验证码" allow-clear> | ||||
|           <template #prefix> | ||||
|             <fs-icon icon="ion:lock-closed-outline"></fs-icon> | ||||
|           </template> | ||||
|         </a-input> | ||||
|       </a-form-item> | ||||
|       <a-form-item> | ||||
|         <loading-button type="primary" size="large" html-type="button" class="login-button" :click="handleTwoFactorSubmit">OTP验证登录</loading-button> | ||||
|       </a-form-item> | ||||
| 
 | ||||
|       <a-form-item class="user-login-other"> | ||||
|         <a class="register" @click="twoFactor.loginId = null"> 返回 </a> | ||||
|       </a-form-item> | ||||
|     </a-form> | ||||
|   </div> | ||||
| </template> | ||||
| <script lang="ts"> | ||||
|  | @ -113,11 +130,28 @@ export default defineComponent({ | |||
|       }, | ||||
|     }; | ||||
| 
 | ||||
|     const twoFactor = reactive({ | ||||
|       loginId: "", | ||||
|       verifyCode: "", | ||||
|     }); | ||||
| 
 | ||||
|     const handleTwoFactorSubmit = async () => { | ||||
|       await userStore.loginByTwoFactor(twoFactor); | ||||
|     }; | ||||
| 
 | ||||
|     const handleFinish = async (values: any) => { | ||||
|       loading.value = true; | ||||
|       try { | ||||
|         const loginType = formState.loginType; | ||||
|         await userStore.login(loginType, toRaw(formState)); | ||||
|       } catch (e: any) { | ||||
|         //@ts-ignore | ||||
|         if (e.code === 10020) { | ||||
|           //@ts-ignore | ||||
|           twoFactor.loginId = e.data; | ||||
|         } else { | ||||
|           throw e; | ||||
|         } | ||||
|       } finally { | ||||
|         loading.value = false; | ||||
|       } | ||||
|  | @ -150,6 +184,8 @@ export default defineComponent({ | |||
|       isLoginError, | ||||
|       sysPublicSettings, | ||||
|       hasRegisterTypeEnabled, | ||||
|       twoFactor, | ||||
|       handleTwoFactorSubmit, | ||||
|     }; | ||||
|   }, | ||||
| }); | ||||
|  |  | |||
|  | @ -4,8 +4,7 @@ | |||
|       <h2>站点隐藏</h2> | ||||
|       <a-form-item label="启用站点隐藏" :name="['hidden', 'enabled']" :required="true"> | ||||
|         <div class="flex"> | ||||
|           <a-switch v-model:checked="formState.hidden.enabled" :disabled="!settingsStore.isPlus" /> | ||||
|           <vip-button class="ml-5" mode="button"></vip-button> | ||||
|           <a-switch v-model:checked="formState.hidden.enabled" /> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="helper"> | ||||
|  |  | |||
|  | @ -3,6 +3,14 @@ | |||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
| 
 | ||||
| ## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17) | ||||
| 
 | ||||
| ### Performance Improvements | ||||
| 
 | ||||
| * 登录支持双重认证 ([48aef25](https://github.com/certd/certd/commit/48aef25b3f6499d674ca4e4ef16f4c62399fb735)) | ||||
| * 多重认证登录 ([0f82cf4](https://github.com/certd/certd/commit/0f82cf409bc60706ab07e4ca4f272b9a1ca7eecb)) | ||||
| * 优化部署到华为云CDN,支持先上传到ccm,再使用证书id部署,修复offline状态下导致部署报错的bug ([79df39a](https://github.com/certd/certd/commit/79df39acabab10ae7e1864dadcdc186bb007a3c5)) | ||||
| 
 | ||||
| ## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15) | ||||
| 
 | ||||
| ### Bug Fixes | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "@certd/ui-server", | ||||
|   "version": "1.33.4", | ||||
|   "version": "1.33.5", | ||||
|   "description": "fast-server base midway", | ||||
|   "private": true, | ||||
|   "type": "module", | ||||
|  | @ -38,19 +38,19 @@ | |||
|     "@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.33.4", | ||||
|     "@certd/basic": "^1.33.4", | ||||
|     "@certd/commercial-core": "^1.33.4", | ||||
|     "@certd/jdcloud": "^1.33.4", | ||||
|     "@certd/lib-huawei": "^1.33.4", | ||||
|     "@certd/lib-k8s": "^1.33.4", | ||||
|     "@certd/lib-server": "^1.33.4", | ||||
|     "@certd/midway-flyway-js": "^1.33.4", | ||||
|     "@certd/pipeline": "^1.33.4", | ||||
|     "@certd/plugin-cert": "^1.33.4", | ||||
|     "@certd/plugin-lib": "^1.33.4", | ||||
|     "@certd/plugin-plus": "^1.33.4", | ||||
|     "@certd/plus-core": "^1.33.4", | ||||
|     "@certd/acme-client": "^1.33.5", | ||||
|     "@certd/basic": "^1.33.5", | ||||
|     "@certd/commercial-core": "^1.33.5", | ||||
|     "@certd/jdcloud": "^1.33.5", | ||||
|     "@certd/lib-huawei": "^1.33.5", | ||||
|     "@certd/lib-k8s": "^1.33.5", | ||||
|     "@certd/lib-server": "^1.33.5", | ||||
|     "@certd/midway-flyway-js": "^1.33.5", | ||||
|     "@certd/pipeline": "^1.33.5", | ||||
|     "@certd/plugin-cert": "^1.33.5", | ||||
|     "@certd/plugin-lib": "^1.33.5", | ||||
|     "@certd/plugin-plus": "^1.33.5", | ||||
|     "@certd/plus-core": "^1.33.5", | ||||
|     "@corsinvest/cv4pve-api-javascript": "^8.3.0", | ||||
|     "@huaweicloud/huaweicloud-sdk-cdn": "^3.1.120", | ||||
|     "@huaweicloud/huaweicloud-sdk-core": "^3.1.120", | ||||
|  |  | |||
|  | @ -1,8 +1,7 @@ | |||
| import {ALL, Body, Controller, Inject, Post, Provide} from '@midwayjs/core'; | ||||
| import {BaseController, SysSafeSetting} from '@certd/lib-server'; | ||||
| import {cloneDeep} from 'lodash-es'; | ||||
| import {SafeService} from "../../../modules/sys/settings/safe-service.js"; | ||||
| import {isPlus} from "@certd/plus-core"; | ||||
| import { ALL, Body, Controller, Inject, Post, Provide } from "@midwayjs/core"; | ||||
| import { BaseController, SysSafeSetting } from "@certd/lib-server"; | ||||
| import { cloneDeep } from "lodash-es"; | ||||
| import { SafeService } from "../../../modules/sys/settings/safe-service.js"; | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  | @ -25,9 +24,6 @@ export class SysSettingsController extends BaseController { | |||
| 
 | ||||
|   @Post("/save", { summary: "sys:settings:edit" }) | ||||
|   async safeSave(@Body(ALL) body: any) { | ||||
|     if (!isPlus()) { | ||||
|       throw new Error('本功能需要开通专业版') | ||||
|     } | ||||
|     await this.safeService.saveSafeSetting(body); | ||||
|     return this.ok({}); | ||||
|   } | ||||
|  |  | |||
|  | @ -63,7 +63,7 @@ export class LoginController extends BaseController { | |||
|   ) { | ||||
| 
 | ||||
|     const token = await this.loginService.loginByTwoFactor({ | ||||
|       loginCode: body.loginCode, | ||||
|       loginId: body.loginId, | ||||
|       verifyCode: body.verifyCode, | ||||
|     }); | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| import { Provide } from '@midwayjs/core'; | ||||
| import { IMidwayKoaContext, IWebMiddleware, NextFunction } from '@midwayjs/koa'; | ||||
| import { logger } from '@certd/basic'; | ||||
| import { Result } from '@certd/lib-server'; | ||||
| import { Result, TextException } from "@certd/lib-server"; | ||||
| 
 | ||||
| @Provide() | ||||
| export class GlobalExceptionMiddleware implements IWebMiddleware { | ||||
|  | @ -14,12 +14,15 @@ export class GlobalExceptionMiddleware implements IWebMiddleware { | |||
|         await next(); | ||||
|         logger.info('请求完成:', url, Date.now() - startTime + 'ms'); | ||||
|       } catch (err) { | ||||
|         if(err instanceof TextException){ | ||||
|           delete err.stack | ||||
|         } | ||||
|         logger.error('请求异常:', url, Date.now() - startTime + 'ms', err); | ||||
|         ctx.status = 200; | ||||
|         if (err.code == null || typeof err.code !== 'number') { | ||||
|           err.code = 1; | ||||
|         } | ||||
|         ctx.body = Result.error(err.code, err.message); | ||||
|         ctx.body = Result.error(err.code, err.message,err.data); | ||||
|       } | ||||
|     }; | ||||
|   } | ||||
|  |  | |||
|  | @ -158,21 +158,21 @@ export class LoginService { | |||
|       //要检查
 | ||||
|       const randomKey = utils.id.simpleNanoId(12) | ||||
|       cache.set(`login_2fa_code:${randomKey}`, userId, { | ||||
|         ttl: 60 * 1000, | ||||
|         ttl: 60 * 1000 * 2, | ||||
|       }) | ||||
|       throw new Need2FAException('已开启多重认证,请在60秒内输入验证码') | ||||
|       throw new Need2FAException('已开启多重认证,请在2分钟内输入OPT验证码',randomKey) | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   async loginByTwoFactor(req: { loginCode: string; verifyCode: string }) { | ||||
|   async loginByTwoFactor(req: { loginId: string; verifyCode: string }) { | ||||
|     //检查是否开启多重认证
 | ||||
|     if (!isPlus()) { | ||||
|       throw new Error('本功能需要开通专业版') | ||||
|     } | ||||
|     const userId = cache.get(`login_2fa_code:${req.loginCode}`) | ||||
|     const userId = cache.get(`login_2fa_code:${req.loginId}`) | ||||
|     if (!userId) { | ||||
|       throw new AuthException('登录状态已失效,请重新登录') | ||||
|       throw new AuthException('已超时,请返回重新登录') | ||||
|     } | ||||
|     await this.twoFactorService.verifyAuthenticatorCode(userId, req.verifyCode) | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 xiaojunnuo
						xiaojunnuo