Files
Gnuboard7/modules/_bundled/sirsoft-board/src/Http/Requests/Concerns/ResolvesAllowedExtensions.php
T
HeuJung 7f8fb6870f fix(core,board,ecommerce): 조건부 검증 결함 패밀리 일괄 수정 및 실패 안내 노출
여러 화면에서 조건부(FormRequest) 검증이 우회되거나 과도하게 제한되던 결함을 한 계열로 묶어 수정한다.

- 검증 규칙 확장 필터 이름 10개를 나머지 92개와 동일 규칙으로 통일
- 설명 길이를 바이트가 아닌 글자 수로 계산(한글 오검출 해소)
- 비활성 언어팩 번역 보존한 채 수정 허용
- 알림 템플릿 제목 nullable 존중, 미지원 발송 수단 저장 차단
- 일정/실행 이력 목록 조회 검증 정합
- 게시판 첨부 미사용 시 빈 확장자 통과, new_display_hours/최소 길이 0 허용, 일괄 적용 override_values 범위 검증(SSoT)
- 이커머스 클레임 사유 조회 검증, 용어 정정
- 원문 i18n 키 노출 다수 해소, 저장/삭제 실패 시 사유 화면 노출
- 아이콘 크기/다크모드 대비 회귀 수정

번들 확장(모듈3·플러그인6·템플릿2·언어팩5) 버전 new-bump 및 CHANGELOG 반영, ja 언어팩 동기.
2026-07-23 10:54:17 +09:00

75 lines
2.6 KiB
PHP

<?php
namespace Modules\Sirsoft\Board\Http\Requests\Concerns;
/**
* 허용 확장자 목록 해석 트레이트
*
* `$board->allowed_extensions ?? $기본값` 패턴은 null 만 잡고 빈 배열([])을 통과시킵니다.
* 그 결과 `implode(',', [])` 가 `mimes:` 빈 규칙을 만들어 해당 게시판의 모든 파일 업로드가
* 거부됩니다. 빈 배열과 null 은 "확장자 미지정" 이라는 같은 의미이므로 동일하게 취급합니다.
*
* 저장 시점에도 빈 배열을 null 로 정규화하지만(Board 모델 mutator), 이미 저장된 레거시 행을
* 소급 치유하지는 못하므로 소비 시점 방어를 함께 둡니다.
*/
trait ResolvesAllowedExtensions
{
/**
* 모듈 설정도 비어 있을 때 사용할 최종 확장자 목록
*/
private const FALLBACK_ALLOWED_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'zip'];
/**
* 게시판의 허용 확장자를 해석합니다.
*
* 게시판 값이 비어 있으면 모듈 환경설정 기본값 → 최종 기본값 순으로 폴백합니다.
*
* @param mixed $boardExtensions 게시판의 allowed_extensions 값
* @param mixed $defaultExtensions 모듈 환경설정 기본값 (없으면 null)
* @return array<int, string> 비어있지 않은 확장자 목록
*/
protected function resolveAllowedExtensions(mixed $boardExtensions, mixed $defaultExtensions = null): array
{
foreach ([$boardExtensions, $defaultExtensions] as $candidate) {
$normalized = self::normalizeAllowedExtensions($candidate);
if ($normalized !== []) {
return $normalized;
}
}
return self::FALLBACK_ALLOWED_EXTENSIONS;
}
/**
* 확장자 목록을 정규화합니다.
*
* 배열이 아니거나 빈 문자열/비문자열 항목은 제거하고, 소문자 + 중복 제거된
* 순차 배열로 반환합니다.
*
* @param mixed $extensions 원본 값
* @return array<int, string> 정규화된 확장자 목록 (없으면 빈 배열)
*/
public static function normalizeAllowedExtensions(mixed $extensions): array
{
if (! is_array($extensions)) {
return [];
}
$normalized = [];
foreach ($extensions as $extension) {
if (! is_string($extension)) {
continue;
}
$extension = mb_strtolower(trim($extension, " \t\n\r\0\x0B."));
if ($extension !== '') {
$normalized[] = $extension;
}
}
return array_values(array_unique($normalized));
}
}