fix(identity): 잔여 과제 전건 처리 + 로딩 표시 실렌더 확정
앞선 커밋이 CHANGELOG 에 주장한 "로딩 표시가 나오지 않던 문제 수정" 이 실제로 화면에 나타나는지 브라우저로 확정했다. 전달 경로부터 DOM 마운트·해제까지 측정했고, 지연·에러 응답에서도 영구 로딩이 남지 않음을 확인했다. 측정 과정에서 앞선 세션의 판단 하나가 틀렸음을 확인했다 — "오버레이 DOM 이 어느 화면에서도 관측되지 않는다" 는 관측 대상 노드를 잘못 잡은 것이었다. 스피너 방식 레이아웃은 다른 노드를 쓰며, 대조군에서도 안 보였던 이유가 이것이다. 미뤄 두었던 과제 4건을 함께 구현했다. - 인증창을 그냥 닫고 이탈하면 그 인증 요청을 서버에도 종료로 표시한다. 이전에는 브라우저만 알고 있어 인증 이력에 "보낸 뒤 소식 없는" 항목이 남았다 - 플러그인 설정 화면이 저장된 비밀값을 다시 내려받던 것을 가려서 표시한다. 그 항목을 건드리지 않고 저장하면 저장된 값이 그대로 유지된다 - 언어팩 반영 누락 검사가 버전만 비교해 "버전 같고 내용 다름" 을 놓치던 사각을 콘텐츠 비교로 닫았다 - 확장이 검증 규칙을 추가할 때 쓰는 필터 이름 6개를 표준 형태로 통일했다. 예전 이름도 함께 발행하므로 기존 확장은 수정 없이 동작한다 정적 검사 룰 2종의 오탐·사각을 함께 고쳤고, 개명으로 검사 대상에 편입된 파일의 사전 결함 8건을 해소했다. 검수용 데이터는 전량 정리했다.
This commit is contained in:
1 parent
bd215bc586
commit
b127afcea7
38 files changed
+503
-53
No files matched your search
@@ -5,6 +5,7 @@ namespace App\Services;
|
||||
use App\Extension\HookManager;
|
||||
use App\Extension\PluginManager;
|
||||
use App\Extension\TemplateManager;
|
||||
use App\Support\SensitiveSettingMask;
|
||||
use App\Traits\FiltersFrontendSchema;
|
||||
use App\Traits\NormalizesSettingsData;
|
||||
use Illuminate\Support\Arr;
|
||||
@@ -140,6 +141,17 @@ class PluginSettingsService
|
||||
return $settings ?? [];
|
||||
}
|
||||
|
||||
/**
|
||||
* 플러그인 설정을 저장합니다.
|
||||
*
|
||||
* 스키마의 sensitive 필드는 암호화하여 보관하며, 화면이 마스크를 그대로 되돌려 보낸 항목은
|
||||
* "변경 없음" 으로 보아 기존 값을 유지합니다. 저장은 기존 설정 위 병합이므로 요청에 없는
|
||||
* 키는 종전 값이 남습니다.
|
||||
*
|
||||
* @param string $identifier 플러그인 식별자
|
||||
* @param array<string, mixed> $settings 저장할 설정 (검증 통과분)
|
||||
* @return bool 저장 성공 여부
|
||||
*/
|
||||
public function save(string $identifier, array $settings): bool
|
||||
{
|
||||
// Before 훅
|
||||
@@ -162,6 +174,9 @@ class PluginSettingsService
|
||||
|
||||
// 스키마 기반으로 민감한 필드 암호화
|
||||
$schema = $pluginInstance->getSettingsSchema();
|
||||
// 화면이 마스크를 그대로 되돌려 보낸 sensitive 필드는 "변경 없음" 이다 — 병합에서 기존 값이
|
||||
// 유지되도록 요청에서 제거한다. 빈 문자열은 제거하지 않는다(지우겠다는 명시적 의사).
|
||||
$settings = SensitiveSettingMask::stripUnchanged($settings, $schema);
|
||||
$settings = $this->encryptSensitiveFields($settings, $schema);
|
||||
|
||||
// 기존 설정과 병합
|
||||
@@ -202,6 +217,14 @@ class PluginSettingsService
|
||||
return $storage->put('settings', self::SETTINGS_FILENAME, $content);
|
||||
}
|
||||
|
||||
/**
|
||||
* 플러그인 설정을 기본값으로 되돌립니다.
|
||||
*
|
||||
* 설정 파일을 삭제하고 캐시를 비웁니다 — 이후 조회는 플러그인이 선언한 기본값을 돌려줍니다.
|
||||
*
|
||||
* @param string $identifier 플러그인 식별자
|
||||
* @return bool 초기화 성공 여부
|
||||
*/
|
||||
public function reset(string $identifier): bool
|
||||
{
|
||||
// Before 훅
|
||||
@@ -230,6 +253,14 @@ class PluginSettingsService
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 플러그인 설정 디렉토리를 통째로 삭제합니다.
|
||||
*
|
||||
* 플러그인 삭제 시 남은 설정 파일을 정리하는 용도입니다.
|
||||
*
|
||||
* @param string $identifier 플러그인 식별자
|
||||
* @return bool 삭제 성공 여부
|
||||
*/
|
||||
public function deleteSettingsDirectory(string $identifier): bool
|
||||
{
|
||||
// Before 훅
|
||||
|
||||
Reference in new issue
Block a user