• 1.1.0

    데이터 보호

    • 공유 폴더 자체(맨 위 단계의 폴더)는 웹·WebDAV 어디서든 지우기, 옮기기, 이름 바꾸기를 할 수 없습니다. 맨 위 단계에는 파일이나 폴더를 만들 수 없습니다. 화면에서도 해당 버튼이 꺼집니다.
    • 덮어쓴 기존 파일은 #recycle로 옮겨 둡니다. 중간에 실패하면 원래 파일을 되돌립니다.
    • 공유 폴더 사이 이동은 파일마다 복사한 뒤 원본을 지웁니다. 숨김 파일과 링크도 함께 옮기고, 그 안을 가리키던 공유 링크 경로가 따라갑니다.
    • 복사할 때 링크는 따라가지 않고 링크 그대로 복사합니다.

    새 기능

    • 복사·이동 작업에 취소 버튼이 생겼습니다. 이미 옮긴 항목은 그대로 둡니다.
    • 격자 보기: 시놀로지가 만들어 둔 썸네일을 보여 주고, 작은 이미지는 원본을 씁니다. 고른 보기는 기억합니다.
    • 공유 링크
      • 다운로드 횟수 제한
      • 일시 중지(설정 버튼)
      • 폴더 링크에서 방문자 업로드 허용: 이름이 겹치면 이름 (1)로 저장, 올린 파일 기록 탭

    보안

    • IP별 제한에 더해 계정별 로그인 실패 제한(MAX_ACCOUNT_FAILURES, 기본 30)을 둡니다. WebDAV 로그인과 OTP 실패도 횟수에 넣습니다.
    • 패스키는 PIN이나 생체 인증을 요구합니다(PASSKEY_REQUIRE_UV, 기본 true). 사용 횟수를 확인하고, 등록되지 않은 계정에도 가짜 키 정보를 돌려줘서 계정 유무를 알 수 없게 합니다.
    • 로그인 세션을 해시로 state/app.db에 저장해서 재시작해도 로그인이 유지됩니다. 업데이트 직후에는 한 번 다시 로그인해야 합니다.
    • 활동 로그(state/activity.log)에 로그인, 공유, 업로드, 이동·복사, WebDAV 쓰기를 남깁니다.
    • 보내는 파일에 Content-Security-Policy: sandbox(PDF 제외), 컨테이너는 읽기 전용(read_only, tmpfs /tmp, pids_limit)으로 바꿨습니다.
    • 공유 링크 방문자는 미디어 재생과 ZIP 받기를 동시에 몇 개까지만 할 수 있습니다. 공유 폴더 밖을 가리키는 링크는 목록에서 숨깁니다.
    • Cloudflare IP 목록을 CLOUDFLARE_IPS로 바꿀 수 있습니다.

    정리

    • 웹 화면 코드를 기능별 모듈로 나눴고, 정적 파일은 ETag로 캐시합니다.
    • ZIP 이어받기 계획을 다시 쓰고, CRC 캐시는 SQLite로 옮겼습니다.
    • 단위 테스트(npm run test:unit)를 추가했습니다.

    업데이트

    compose.yaml이 바뀌었습니다(읽기 전용 설정). 새 compose.yaml을 받은 뒤 docker compose pull && docker compose up -d 하세요.

    이미지: git.2ex.dev/hanyul/webdav:latest

    Downloads 2