Compare commits

..

2 Commits

7 changed files with 17 additions and 26 deletions

View File

@@ -1,11 +1,12 @@
import { defineConfig } from 'drizzle-kit' import { defineConfig } from 'drizzle-kit'
import { env } from '@/env'
const databasePath = process.env.DATABASE_PATH ?? 'data.db'
export default defineConfig({ export default defineConfig({
out: './drizzle', out: './drizzle',
schema: './src/server/db/schema/index.ts', schema: './src/server/db/schema/index.ts',
dialect: 'sqlite', dialect: 'sqlite',
dbCredentials: { dbCredentials: {
url: env.DATABASE_PATH, url: databasePath,
}, },
}) })

View File

@@ -14,10 +14,10 @@
"compile:linux:x64": "bun compile.ts --target bun-linux-x64", "compile:linux:x64": "bun compile.ts --target bun-linux-x64",
"compile:windows": "bun run compile:windows:x64", "compile:windows": "bun run compile:windows:x64",
"compile:windows:x64": "bun compile.ts --target bun-windows-x64", "compile:windows:x64": "bun compile.ts --target bun-windows-x64",
"db:generate": "drizzle-kit generate", "db:generate": "bun --bun drizzle-kit generate",
"db:migrate": "drizzle-kit migrate", "db:migrate": "bun --bun drizzle-kit migrate",
"db:push": "drizzle-kit push", "db:push": "bun --bun drizzle-kit push",
"db:studio": "drizzle-kit studio", "db:studio": "bun --bun drizzle-kit studio",
"dev": "bunx --bun vite dev", "dev": "bunx --bun vite dev",
"fix": "biome check --write", "fix": "biome check --write",
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"

View File

@@ -80,7 +80,7 @@ export const signAndPackReport = oc
operationId: 'signAndPackReport', operationId: 'signAndPackReport',
summary: '签名并打包报告 ZIP', summary: '签名并打包报告 ZIP',
description: description:
'接收原始 ZIPmultipart/form-data 文件字段 rawZip由 UX 生成 summary.json、manifest.json、signature.asc返回 signedZipBase64。', '接收原始 ZIPmultipart/form-data 文件字段 rawZip由 UX 生成 summary.json、manifest.json、signature.asc直接返回签名后 ZIP 二进制文件。',
tags: ['Crypto', 'Report'], tags: ['Crypto', 'Report'],
}) })
.input( .input(
@@ -96,9 +96,4 @@ export const signAndPackReport = oc
.describe('原始报告 ZIP 文件multipart/form-data 字段)'), .describe('原始报告 ZIP 文件multipart/form-data 字段)'),
}), }),
) )
.output( .output(z.file().describe('签名后报告 ZIP 文件(二进制响应)'))
z.object({
deviceSignature: z.string().describe('设备签名HMAC-SHA256 Base64'),
signedZipBase64: z.string().describe('签名后 ZIP 的 Base64 编码'),
}),
)

View File

@@ -301,7 +301,7 @@ export const signAndPackReport = os.crypto.signAndPackReport.use(db).handler(asy
compressionOptions: { level: 9 }, compressionOptions: { level: 9 },
}) })
const signedZipBase64 = Buffer.from(signedZipBytes).toString('base64') return new File([Buffer.from(signedZipBytes)], `${input.taskId}-signed-report.zip`, {
type: 'application/zip',
return { deviceSignature, signedZipBase64 } })
}) })

View File

@@ -58,7 +58,7 @@
5. 生成 `META-INF/manifest.json` 5. 生成 `META-INF/manifest.json`
6. OpenPGP 分离签名生成 `META-INF/signature.asc` 6. OpenPGP 分离签名生成 `META-INF/signature.asc`
7. 重新打包为 signed ZIP 7. 重新打包为 signed ZIP
- 输出:`signedZipBase64``deviceSignature` - 输出:签名后 ZIP 文件(二进制响应,`application/zip`
## 4. 安全约束(签名打包) ## 4. 安全约束(签名打包)

View File

@@ -12,7 +12,7 @@
> >
> 1. UX 校验 ZIP 并提取必需文件; > 1. UX 校验 ZIP 并提取必需文件;
> 2. UX 生成 `deviceSignature`、`summary.json`、`META-INF/manifest.json`、`META-INF/signature.asc` > 2. UX 生成 `deviceSignature`、`summary.json`、`META-INF/manifest.json`、`META-INF/signature.asc`
> 3. UX 重新打包并返回签名后的 ZIPBase64),工具箱再用于离线介质回传平台。 > 3. UX 重新打包并返回签名后的 ZIP二进制文件响应),工具箱再用于离线介质回传平台。
## 一、ZIP 文件结构要求 ## 一、ZIP 文件结构要求

View File

@@ -74,7 +74,7 @@ OpenAPI 中已按 `tags` 分组:
- 文件类型:`application/zip``application/x-zip-compressed` - 文件类型:`application/zip``application/x-zip-compressed`
- 其他业务字段(如 `deviceId``taskId`)与文件一起提交 - 其他业务字段(如 `deviceId``taskId`)与文件一起提交
- 接口响应为 JSON其中 `signedZipBase64` 为签名后 ZIP 的 Base64 编码 - 接口响应为签名后 ZIP 文件(`application/zip`
示例curl 示例curl
@@ -85,13 +85,8 @@ curl -X POST "http://localhost:3000/api/crypto/sign-and-pack-report" \
-F "enterpriseId=1173040813421105152" \ -F "enterpriseId=1173040813421105152" \
-F "inspectionId=702286470691215417" \ -F "inspectionId=702286470691215417" \
-F "summary=检查摘要信息" \ -F "summary=检查摘要信息" \
-F "rawZip=@./report-raw.zip;type=application/zip" -F "rawZip=@./report-raw.zip;type=application/zip" \
``` --output signed-report.zip
响应中的 `signedZipBase64` 可按以下方式还原为 ZIP
```bash
# jq -r '.signedZipBase64' response.json | base64 -d > signed-report.zip
``` ```
## 6. 推荐接入方式 ## 6. 推荐接入方式