summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--components/drm/drmUtils.ts62
-rw-r--r--lib/rfqs/service.ts12
2 files changed, 71 insertions, 3 deletions
diff --git a/components/drm/drmUtils.ts b/components/drm/drmUtils.ts
new file mode 100644
index 00000000..c7b7ae5e
--- /dev/null
+++ b/components/drm/drmUtils.ts
@@ -0,0 +1,62 @@
+/**
+ * drmUtils.ts
+ * 1. 복호화 엔드포인트 (/api/drm/decrypt)를 사용하는 함수
+ * 2. 복호화 서버액션을 제공한다.
+ *
+ * decryptWithServerAction(file): 서버액션을 사용하여 복호화한 파일을 응답하는 함수
+ * decryptWithRoute(file): 라우트를 사용하여 복호화한 파일을 응답하는 함수 (클라이언트용 함수는 drmClientUtils.ts에 구현됨)
+ *
+ */
+
+'use server';
+
+// 서버 액션을 사용하여 복호화하는 함수
+export async function decryptWithServerAction(file: File): Promise<ArrayBuffer> {
+ try {
+ const formData = new FormData();
+ formData.append('file', file);
+
+ // 로컬 6543 포트에 drm-proxy 서버가 실행되고 있어야 함
+ const backendUrl = "http://localhost:6543/api/drm-proxy/decrypt";
+
+ // 로깅은 스프링 자체적으로도 진행하지만(log 파일), 필요시 db 액션을 호출해 eVCP 데이터베이스에 저장
+ console.log(`[DRM] 파일 복호화 시도: ${file.name} (크기: ${file.size} bytes, 타입: ${file.type})`);
+
+ // POST 요청으로 파일을 file 이라는 키로 Body에 담아 전송하면, 복호화된 파일을 응답받음
+ // 응답 헤더에 원본 파일명이 있음. (현재는 미사용)
+ const response = await fetch(backendUrl, {
+ method: "POST",
+ body: formData,
+ });
+
+ if (!response.ok) {
+ const errorText = await response.text().catch(() => '응답 텍스트를 가져올 수 없음');
+ throw new Error(`DRM 서버 응답 오류 [${response.status}]: ${errorText}`);
+ }
+
+ // 응답을 ArrayBuffer로 받아서 리턴함
+ const data = await response.arrayBuffer();
+ console.log(`[DRM] 파일 복호화 성공: ${file.name} (결과 크기: ${data.byteLength} bytes)`);
+
+ return data;
+ } catch (error) {
+
+ // 오류 발생시 로깅하며, 폴백으로 복호화되지 않은 파일을 리턴
+ const errorMessage = error instanceof Error
+ ? `${error.name}: ${error.message}`
+ : String(error);
+
+ console.error(`[DRM] 복호화 오류: ${errorMessage}`, {
+ fileName: file.name,
+ fileSize: file.size,
+ fileType: file.type,
+ error
+ });
+
+ return await file.arrayBuffer();
+ }
+}
+
+// decryptWithRoute 함수는 클라이언트용이므로 drmClientUtils.ts로 이동함
+// 클라이언트에서는 'components/drm/drmClientUtils'의 decryptWithRoute를 사용할 것
+
diff --git a/lib/rfqs/service.ts b/lib/rfqs/service.ts
index c7d1c3cd..820de294 100644
--- a/lib/rfqs/service.ts
+++ b/lib/rfqs/service.ts
@@ -27,6 +27,8 @@ import * as z from "zod"
import { users } from "@/db/schema/users";
import { headers } from 'next/headers';
+// DRM 복호화 관련 유틸 import
+import { decryptWithServerAction } from "@/components/drm/drmUtils";
interface InviteVendorsInput {
rfqId: number
@@ -468,9 +470,13 @@ export async function processRfqAttachments(args: {
await fs.mkdir(rfqDir, { recursive: true });
for (const file of newFiles) {
- // 2-1) File -> Buffer
- const ab = await file.arrayBuffer();
- const buffer = Buffer.from(ab);
+ // 2-1) DRM 복호화 시도 ----------------------------------------------------------------------
+ // decryptWithServerAction 함수는 오류 처리 및 원본 반환 로직을 포함하고 있음 (해제 실패시 원본 반환)
+ // 이후 코드가 buffer로 작업하므로 buffer로 전환한다.
+ const decryptedData = await decryptWithServerAction(file);
+ const buffer = Buffer.from(decryptedData);
+ // -----------------------------------------------------------------------------------------
+
// 2-2) 고유 파일명
const uniqueName = `${randomUUID()}-${file.name}`;