Organize uploader storage and restore transfer readiness
This commit is contained in:
@@ -22,7 +22,7 @@
|
||||
|
||||
받은 항목과 임시 저장은 각각 저장 시점부터 최대 7일이다. 기존 자료도 마이그레이션 시점부터 최대 7일로 제한하며, 더 가까운 기존 만료는 유지한다. 즐겨찾기로 만료를 우회할 수 없다. 만료 항목과 접근권을 정리하고 마지막 유효한 파일 참조가 사라지면 원본 파일을 제거한다. 새 전송의 수신 기록은 새 저장 시점부터 7일이며 원본 기록의 만료를 연장하지 않는다.
|
||||
|
||||
물리 파일은 `uploads/originals`에 저장하고 안전한 원래 확장자를 무작위 식별자에 붙인다. 수신자의 다운로드 응답이 끝난 뒤 유효한 계정 보관함 참조가 없으면 `uploads/completed`로 이동한다. 삭제 실행 취소 시간 안의 계정 참조도 보호한다. 진행 중인 다운로드·이미지 미리보기가 모두 종료될 때까지 이동을 미루며, 계정 참조가 생기거나 복원되면 정리 시 `originals`로 돌아온다. 폴더 이동으로 접근권·용량·만료일을 바꾸지 않는다. 두 폴더 모두 수동 삭제 감지와 만료 정리를 적용한다. 이동 기록으로 중단 후 DB·물리 경로를 복구하고, 확장자 없는 기존 파일은 시작 시 이름을 변경한다. 이전 다운로드 완료 여부는 추정하지 않는다.
|
||||
물리 파일은 `uploads/originals/user-계정ID` 또는 `uploads/originals/guest-기기세션ID`에 업로드한 사람 기준으로 저장하고 안전한 원래 확장자를 무작위 식별자에 붙인다. 로그인 중 기기 전송은 계정 폴더를 선택하되 기존 기기 세션의 업로드 권한·용량 정책을 유지한다. 수신 보관함은 같은 원본을 참조하며 다른 수신자별로 복제하지 않는다. 다운로드 완료로 폴더를 바꾸지 않으며 `completed`는 사용하지 않는다. 기존 평면 및 `completed` 파일은 시작 시 기록된 업로드 소유자 폴더로 이동한다. 계정 정보가 기록되지 않은 과거 파일은 기기 세션 소유자를 사용하며 추정하지 않는다. 진행 중인 파일 읽기는 보호하며 이동 기록으로 중단 후 DB·물리 경로를 복구한다. 사용자 폴더 안에도 수동 삭제 감지와 기존 만료·고아 정리를 적용한다.
|
||||
|
||||
## 주변 발견과 방
|
||||
|
||||
|
||||
@@ -174,3 +174,10 @@
|
||||
- 물리 파일명에 안전한 원래 확장자를 붙이며 확장자 없는 기존 파일은 앱 시작 시 DB와 함께 변경한다. 이동은 진행 중 다운로드·이미지 미리보기가 종료될 때까지 미룬다. DB 변경 실패 시 파일을 원래 경로로 돌리고, 이동 기록으로 재시작 중 경로 불일치를 복구한다. 기존 다운로드 완료 여부는 소급 추정하지 않는다. 두 폴더에 수동 삭제 감지·기존 만료 및 고아 파일 정리를 적용했다.
|
||||
- API 총 112개 통과. 새 실제 파일 검사 10개로 로그인 발신→익명 수신 완료 분류·익명 발신→로그인 수신 보관함 유지·재다운로드·만료일과 체크섬 보존·권한 없는 읽기 및 발신자 읽기의 분류 제외·동시 읽기·HTTP 중도 종료·기존 확장자 이전·DB 실패 롤백·계정 삭제 실행 취소와 복원·재시작 복구·수동 삭제·자연 만료를 확인했다. 전체 빌드·타입 검사·포맷 및 셸 문법 검사도 통과했다.
|
||||
- 기존 익명 파일/링크 전송 및 PC/모바일 보관함·파일 재전송·수동 원본 삭제 브라우저 검증을 통과했다. 새 운영 Docker 이미지와 격리한 임시 DB 볼륨·바인드 업로드에서 완료 폴더와 `.txt` 확장자, 재시작 후 기존 주소 다운로드, 8MiB 조각 이어 보내기, Unicode 텍스트·세션 보존, SQLite integrity, 완료 폴더의 호스트 수동 삭제를 확인했다. NAS 설정 검사도 통과했고 `docker-compose.yaml`은 변경하지 않았다. 실제 NAS 재배포는 수행하지 않았다.
|
||||
|
||||
## 2026-10-14 업로드 주체별 저장과 첫 전송 복구
|
||||
|
||||
- `completed` 분류를 업로드한 사람 기준의 `originals/user-계정ID`·`originals/guest-기기세션ID`로 변경했다. 로그인 기기 전송은 계정 폴더를 사용하되 기존 기기 업로드 권한·용량 정책은 유지한다. 기존 평면 및 completed 파일은 기록된 업로드 소유자를 기준으로 이전하며 ID·만료·원래 이름·다운로드 주소와 공유 원본을 유지한다. 원본 확장자, DB 실패 롤백과 재시작 복구, 읽기 보호, 사용자 폴더 안의 수동 삭제·만료·고아 정리를 검증했다.
|
||||
- 네이티브 파일 선택창의 숨김/복귀 때 위치 재등록보다 POST가 먼저 나가던 상황을 수정 전 브라우저에서 재현했다. 위치 기반 대상은 위치 수신 확인까지 기다리며 같은 네트워크의 잠깐 끊긴 대상은 서버가 재접속 상태로 구분한다. 현재 연결을 최대 5초 기다리고 같은 요청 키로만 재시도해 첫 클릭의 초안·파일을 유지한다. 권한 없음·차단·다른 공간은 재시도하지 않는다. 연결 확인 중 버튼 안내를 적용했다. 개인정보 보호를 위해 숨김 시 좌표 제거는 유지한다.
|
||||
- 로그아웃 후 메인 기기 화면을 표시한다. 사용자 폴더의 owner-info.json에는 검증된 기본 접속 IP·국가·지역·도시만 업로드 요청 시 기록하며 원문·좌표·인증 값은 기록하지 않는다. 제공되지 않은 지역과 과거 파일은 추정하지 않는다. 최대 20개·기본 7일의 기록만 유지하고 마지막 원본/대기 업로드가 사라지면 제거한다. 공개 URL·일반 보관함에서는 제공하지 않는다.
|
||||
- API 114개·전체 빌드·타입 검사 통과. 실제 Chromium에서 파일 선택창 위치 복귀 대기와 단일 요청, 같은 네트워크의 재접속 중 자동 재시도·동일 키·파일 유지·모바일 수락 다운로드, 보관함 원본 재전송·수동 삭제·로그아웃 후 메인 화면을 확인했다. 운영 Docker의 사용자 폴더·확장자·호스트 파일 가시성·재시작 후 재다운로드·수동 삭제·8MiB 조각 재개·Unicode 텍스트와 인증 세션 보존·SQLite integrity도 통과했다. 실제 NAS 배포는 수행하지 않았다.
|
||||
|
||||
Reference in New Issue
Block a user