Skip to content

Task-프로젝트 삭제 흐름 안전성 강화 #169

@SilverSupplier

Description

@SilverSupplier

Summary

Project Navigator의 프로젝트 삭제 흐름을 휴지통 이동 기반으로 전환하고, 드라이브/볼륨 루트·심볼릭 링크·Windows 정션 등 위험 경로에 대한 가드를 강화합니다. 또한 최근 목록의 경로 비교를 정규화하고, 다이얼로그가 사용자 입력을 리치텍스트로 해석하지 않도록 합니다.

Parent Issue

#2

Area

Application

Target Sprint

Sprint 1

Scope

  • ProjectPersistence::deleteProjectQDir::removeRecursively 대신 QFile::moveToTrash로 휴지통에 이동하도록 변경합니다. 휴지통 이동 실패 시 영구 삭제로 폴백하지 않고 사용자에게 명확한 오류를 반환합니다.
  • canDeleteProjectFolder에서 폴더 자체와 내부 엔트리에 대해 심볼릭 링크 / Windows 정션을 거부합니다.
  • 드라이브 루트 검사 결함을 수정합니다(QDir::isRoot + QStorageInfo로 드라이브/볼륨 루트 모두 검출).
  • removeRecentProject / upsertRecentProject가 공통 헬퍼로 정규화된(canonical, Windows/macOS는 대소문자 무시) 경로 키로 비교하도록 통일하고, 쓰기 실패는 qWarning으로 로깅합니다.
  • MainWindow의 삭제 확인/경고 다이얼로그를 Qt::PlainText로 강제하고, 안내 문구를 휴지통 이동 동작에 맞춰 갱신합니다.

Acceptance Criteria

  • 일반 프로젝트 삭제 시 프로젝트 폴더가 OS 휴지통으로 이동하고, 휴지통에서 복원할 수 있습니다.
  • 휴지통 이동에 실패하면 폴더는 그대로 보존되고 사용자에게 실패 사유가 표시됩니다.
  • 다음 경우 삭제가 거부됩니다: 비관리 파일/하위 폴더가 있는 경우, 폴더가 심볼릭 링크/정션인 경우, 폴더가 드라이브 또는 볼륨의 루트인 경우.
  • 동일 폴더가 대소문자만 다르게 등록되어 있어도 최근 목록에서 한 번에 정리됩니다.
  • 삭제 확인/경고 다이얼로그에서 사용자 프로젝트 이름이나 경로가 리치텍스트로 해석되지 않습니다.

Architecture / Dependency Check

  • 변경 범위는 src/application/에 한정합니다(ProjectPersistence.{h,cpp}, MainWindow.cpp).
  • domain / engine에 의존성을 추가하지 않습니다.
  • include는 application/... 경로를 사용하며, Qt 사용은 application 레이어 안에서만 이루어집니다.

Verification Plan

  • cmake --preset windows-debug
  • cmake --build --preset build-debug
  • ctest --preset test-debug
  • 수동 검증:
    1. 프로젝트 생성 후 최근 목록에서 삭제 → 휴지통 이동 및 복원 가능 여부 확인
    2. 비관리 파일/하위 폴더 포함 폴더 삭제 시도 → 거부 메시지 확인
    3. 정션/심링크로 만든 가짜 프로젝트 폴더 삭제 시도 → 거부 메시지 확인
    4. 동일 경로를 대소문자 다르게 등록 후 삭제 → 최근 목록에서 모두 사라지는지 확인

Dependencies / Blockers

Repository Checks

  • I checked for an existing related issue or epic before creating this task.
  • I will keep the issue title aligned with the repository naming convention.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    Status

    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions