fix: 메뉴 아이콘에 svg를 다시 올릴 수 있게 한다
허용 확장자를 저장소 설정과 Globals.fileUpload.Extensions의 교집합으로 계산해 저장소가 허용하는 svg가 화면 단계에서 잘려 나갔다. 파일 선택창의 accept에서 빠져 svg를 고를 수조차 없었다. 실제 업로드를 막는 것은 저장소 설정의 PRM_FILE_EXTN 하나뿐이다 (EgovFileMngUtil.checkAllowFileExtension). EgovMultipartResolver의 전역 목록 검사는 어긋났을 때 던지는 SecurityException이 주석 처리돼 있어 로그만 남는다. 교집합을 걷어내고 저장소 설정만 보게 한다. Co-Authored-By: Claude Opus 5
@a3d6469b88ddb2eab39c428c1c78b489ee957743
--- lib/domain/file-module.ts
+++ lib/domain/file-module.ts
... | ... | @@ -18,12 +18,12 @@ |
| 18 | 18 |
}; |
| 19 | 19 |
|
| 20 | 20 |
/** |
| 21 |
- * 업로드 전체에 걸린 확장자 화이트리스트 — 백엔드 `Globals.fileUpload.Extensions`. |
|
| 22 |
- * `EgovMultipartResolver`가 저장소 설정보다 **먼저** 이 목록으로 거른다. |
|
| 21 |
+ * 백엔드 `Globals.fileUpload.Extensions`의 사본 — 확장자를 못 받은 저장소의 잠정값으로만 쓴다. |
|
| 23 | 22 |
* |
| 24 |
- * 이슈: 저장소 설정이 허용해도 여기 없으면 못 올린다. `MODULE_VOD_CONTENT`는 mov·avi·mkv· |
|
| 25 |
- * webm·wmv를 허용하지만 실제로 통과하는 것은 mp4뿐이고, svg도 마찬가지로 막힌다. |
|
| 26 |
- * 백엔드에 이 목록 확장을 요청하면 그때 여기만 늘리면 된다. |
|
| 23 |
+ * 실제 업로드를 막는 것은 이 목록이 아니라 저장소 설정의 `PRM_FILE_EXTN`이다 |
|
| 24 |
+ * (`EgovFileMngUtil.checkAllowFileExtension`). `EgovMultipartResolver`도 이 목록을 보긴 하지만 |
|
| 25 |
+ * 어긋났을 때 던지는 `SecurityException`이 주석 처리돼 있어 실제로는 로그만 남는다. |
|
| 26 |
+ * 그래서 저장소가 허용하는 확장자를 이 목록으로 다시 거르면 안 된다 — svg가 그렇게 막혔다. |
|
| 27 | 27 |
*/ |
| 28 | 28 |
export const GLOBAL_UPLOAD_EXTENSIONS: readonly string[] = [ |
| 29 | 29 |
'gif', 'jpg', 'jpeg', 'png', |
... | ... | @@ -50,8 +50,8 @@ |
| 50 | 50 |
vodContent: {
|
| 51 | 51 |
id: 'MODULE_VOD_CONTENT', |
| 52 | 52 |
description: '동영상 콘텐츠 저장소', |
| 53 |
- // 이슈: 백엔드 전역 화이트리스트(Globals.fileUpload.Extensions)에 영상은 mp4뿐이다. |
|
| 54 |
- // mov·avi 등은 목록에 추가되면 여기도 되돌린다. |
|
| 53 |
+ // TODO: 저장소 표는 mov·avi·mkv·webm·wmv도 허용하지만 실제 통과 여부를 확인하지 못해 |
|
| 54 |
+ // mp4로 좁혀 둔 상태다. 확인되면 표대로 되돌린다. |
|
| 55 | 55 |
extensions: ['mp4'], |
| 56 | 56 |
}, |
| 57 | 57 |
/** 꾸미기 아이템 썸네일. */ |
... | ... | @@ -91,11 +91,9 @@ |
| 91 | 91 |
} as const satisfies Record<string, FileModule>; |
| 92 | 92 |
|
| 93 | 93 |
|
| 94 |
-/** 실제로 통과하는 확장자 — 저장소 설정과 전역 화이트리스트의 교집합이다. */ |
|
| 94 |
+/** 실제로 통과하는 확장자 — 판단 기준은 저장소 설정 하나뿐이다. */ |
|
| 95 | 95 |
export function allowedExtensions(module: FileModule): string[] {
|
| 96 |
- return module.extensions.filter((extension) => |
|
| 97 |
- GLOBAL_UPLOAD_EXTENSIONS.includes(extension) |
|
| 98 |
- ); |
|
| 96 |
+ return [...module.extensions]; |
|
| 99 | 97 |
} |
| 100 | 98 |
|
| 101 | 99 |
/** 확장자 목록 → `<input accept>` 값. 화면이 백엔드 허용 목록을 직접 베끼지 않게 한다. */ |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?