여러 화면에서 조건부(FormRequest) 검증이 우회되거나 과도하게 제한되던 결함을 한 계열로 묶어 수정한다. - 검증 규칙 확장 필터 이름 10개를 나머지 92개와 동일 규칙으로 통일 - 설명 길이를 바이트가 아닌 글자 수로 계산(한글 오검출 해소) - 비활성 언어팩 번역 보존한 채 수정 허용 - 알림 템플릿 제목 nullable 존중, 미지원 발송 수단 저장 차단 - 일정/실행 이력 목록 조회 검증 정합 - 게시판 첨부 미사용 시 빈 확장자 통과, new_display_hours/최소 길이 0 허용, 일괄 적용 override_values 범위 검증(SSoT) - 이커머스 클레임 사유 조회 검증, 용어 정정 - 원문 i18n 키 노출 다수 해소, 저장/삭제 실패 시 사유 화면 노출 - 아이콘 크기/다크모드 대비 회귀 수정 번들 확장(모듈3·플러그인6·템플릿2·언어팩5) 버전 new-bump 및 CHANGELOG 반영, ja 언어팩 동기.
75 lines
2.6 KiB
PHP
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));
|
|
}
|
|
}
|