Add plain text clipboard transfers and refine input feedback

This commit is contained in:
2026-10-13 14:07:03 +09:00
parent af004a2942
commit 8a8df417aa
32 changed files with 1263 additions and 197 deletions

View File

@@ -0,0 +1,29 @@
# 클립보드 전송
2026-10-13 수정안은 기존 링크 전송을 링크·텍스트 자동 판별 방식으로 확장한다. 파일 전송, 수락 정책, 기기 발견과 보관함을 유지한다.
## 화면과 동작
- 전송 대상 기기를 선택하면 첫 클립보드 읽기를 시도한다. 브라우저가 별도 확인을 요구하는 모바일 환경이나 권한 조회를 지원하지 않는 Safari/Firefox에서는 자동 읽기를 생략하고 빈 입력창을 제공한다. 직접 입력·붙여넣기·‘다시 가져오기’는 그대로 사용할 수 있다.
- 전체 내용이 단일 HTTP/HTTPS URL이면 한 줄 입력창, 나머지는 여러 줄 텍스트 입력창을 표시한다. `www.example.com`과 일반 도메인 주소에는 전송 시 HTTPS를 붙인다. 여러 URL이나 URL을 포함한 문장은 텍스트로 보낸다. URL의 자격 증명과 HTTP/HTTPS 이외의 스킴은 자동 열기 대상으로 취급하지 않는다.
- 텍스트는 줄바꿈·탭·앞뒤 공백을 그대로 보관하고 전달한다. 화면에는 글자 수를 표시하며 최대 크기는 UTF-8 기준 **256KiB**다. 공백만 있는 내용은 보내지 않는다.
- 창 포커스·클립보드 변경으로 입력 중 내용을 바꾸지 않는다. 첫 진입과 ‘다시 가져오기’에서만 읽는다. 빈 클립보드나 읽기 실패는 현재 입력을 유지한다.
- 파일을 선택하면 클립보드 콘텐츠를 대체한다. 한 번에 파일 또는 클립보드만 보내고 전송 버튼도 하나다. 로그인 사용자는 기존 보관함 자료도 가져올 수 있다.
- 링크는 수락 후 자동으로 열고 주소 복사를 보조 동작으로 제공한다. 파일은 기존처럼 다운로드한다.
- 텍스트는 수락 후 중앙 미리보기를 표시한다. 원문은 HTML로 실행하지 않고 스크롤 가능한 영역에 보여준다. 가장 큰 버튼은 ‘클립보드에 복사’이며 복사 완료를 알린다. 읽음은 복사·닫기 동작으로 반영한다.
- 익명 화면에는 과거 전송 내역을 제공하지 않는다. 수락한 탭에서만 도착 동작을 처리하며 새로고침으로 텍스트 미리보기나 링크 열기를 재실행하지 않는다.
- 로그인 중 받은 텍스트는 기존 받은 항목에 자동 저장한다. 직접 저장·수신 기록·보관함 재전송 모두 기존 7일 만료·계정 세션 경계를 적용한다.
브라우저의 시스템 붙여넣기 안내는 웹사이트가 숨기거나 우회할 수 없다. 의도적인 클립보드 버튼 동작에서만 표시되도록 읽기 경로를 제한한다. [WebKit 설명](https://webkit.org/blog/10855/async-clipboard-api/).
## 서버와 데이터
기존 `transfer_requests.kind`와 `items.kind`에 `text`가 있고 `items.text` 컬럼도 있으므로 DB 구조 변경이나 별도 파일 생성은 필요 없다. 코드·이미지만 재빌드해 배포한다.
- `POST /api/transfer-requests`: `{ targetDeviceId, kind: "text", byteSize, count: 1 }`로 본문 없이 요청한다. 크기는 실제 UTF-8 바이트 수다.
- 기존 수락 이후 `POST /api/transfers/:id/complete`: `{ text: "원문" }`으로 확정한다. 본문 종류, 승인 크기, 발신자, 수락·만료·차단·CSRF·Origin·멱등성을 검증한다.
- 기존 `{ urls: [...] }` API와 여러 URL 항목도 유지한다. 새 클립보드 UI에서는 여러 URL을 한 텍스트로 취급한다.
- `POST /api/vault`: `{ kind: "text", text, note? }`로 직접 저장한다. 보관함 검색·복사·기기 전송도 지원한다. 외부 이메일 전송은 다시 열지 않는다.
- `MAX_TEXT_PAYLOAD_SIZE_KB=256`을 기본값으로 적용한다. 최대 설정값은 1024KiB이며 프런트엔드도 서버가 제공한 한도로 검사한다. 기존 `.env`에 값이 없으면 256KiB를 사용한다.
파일 용량은 기존 파일 저장 한도에 따라 계산한다. 텍스트는 인라인 본문 제한과 기존 요청 빈도 제한을 적용한다. 좌표·클립보드 원문을 로그나 오프라인 캐시에 추가하지 않는다.

View File

@@ -33,7 +33,7 @@
- `GET /api/inbox`: 로그인 중 수신 기록.
- `GET /api/vault`: 자신의 임시 저장 목록, 검색·페이지네이션.
- `GET /api/vault/contents`: 직접 저장·받은 항목 중 전송할 수 있는 본인 자료. 보관함 원본 조회는 계정 전환과 겹친 이전 응답을 화면에 반영하지 않는다.
- `POST /api/vault`: 링크 또는 파일 저장 요청과 선택적 메모. 링크는 즉시 확정하고 파일은 기존 인증 업로드 API를 사용한다.
- `POST /api/vault`: 링크·텍스트 또는 파일 저장 요청과 선택적 메모. 링크·텍스트는 즉시 확정하고 파일은 기존 인증 업로드 API를 사용한다.
- `PATCH /api/vault/:accessId/note`: 개인 메모 수정.
- `POST /api/vault/:accessId/send`: 선택한 기기에 기존 자료 전송 요청.
- 기존 기기 요청의 수락/거절/취소와 파일 다운로드 API는 유지한다. 새 이메일 원격 전송, 영구 즐겨찾기와 익명 자료의 사후 계정 이동은 410으로 거절한다.
@@ -49,3 +49,5 @@
- 파일은 8MiB 조각으로 전송하며 같은 파일 내용 검증·이미 받은 위치·중복 조각·서버 재시작을 처리한다. 자동 재시도 실패 시 기존 단일 버튼이 다시 전송으로 바뀐다. 완료 전후 취소와 접근 범위 검사는 유지한다.
- 운영 자동 발견은 신뢰한 인접 프록시에서 온 CF-Connecting-IP만 사용하고, 원본 IP와 프록시 진단 결과는 일반 사용자에게 공개하지 않는다. 목록 변화는 접속 이벤트로 갱신하고 대기 중 반복 탐색 문구를 표시하지 않는다. 위치 허용 기반 100m 근처 검색도 제공하며 상세 동작은 NEARBY_DISCOVERY.md를 따른다.
- PWA 설치: Android 등 설치 이벤트 지원 브라우저는 설치 창, iPhone은 홈 화면 추가 안내. 설치 앱 안에서는 버튼을 숨긴다. Service Worker는 민감한 자료나 API를 캐시하지 않고 오프라인에서는 인터넷 연결 안내만 제공한다.
2026-10-13부터 일반 텍스트도 클립보드 전송·직접 저장·수신 기록·보관함 기기 전송에 포함한다. 세부 판별과 256KiB 제한은 [클립보드 전송](CLIPBOARD_TRANSFER.md)을 따른다.

View File

@@ -121,3 +121,11 @@
- 발견 허용은 실제 체크박스 입력과 switch 역할을 유지한 Tailwind 토글로 표시한다. 키보드 포커스·비활성·동작 줄이기 상태를 지원하고 아래 구분선을 제거했다.
- 이름 저장 버튼은 ‘저장’으로 변경하고 입력창과 44px 높이·둥근 모서리를 맞췄다. PC 폼의 이전 30px 고정 높이를 없애 제목과 입력창이 겹치지 않도록 했다.
- 전체 빌드, PC/모바일 레이아웃·테마별 로고 색·기기명 유지·토글 및 방 관리·파일/링크 전송·PWA 브라우저 검증을 통과했다. PNG 크기·청록색 점 보존과 maskable의 불투명 배경·중앙 안전 영역도 확인했다. 실제 Galaxy/iPhone의 설치 아이콘 반영은 운영 재배포 후 확인한다.
## 2026-10-13 클립보드 텍스트 확장
- 기존 URL/파일 API와 DB 텍스트 컬럼을 재사용해 텍스트 요청·수락 후 확정·조회·계정 기록·보관함 저장/재전송을 확장했다. 마이그레이션이나 텍스트용 파일 생성은 없다. UTF-8 기준 기본 한도는 사용자 선택대로 256KiB다.
- API 테스트 80개 통과: 수락 전 비공개, 발신자/수신자 접근 격리, 원문과 CRLF·공백·한글·일본어·이모지 보존, 256KiB 경계, 본문 타입/크기 변경, 빈 내용, 멱등성, 7일 기록·검색·재전송·만료를 검사했다.
- 새 두 브라우저 테스트에서 단일 URL·www 주소는 링크로 열고, 일반 문장·여러 줄·여러 URL·URL 포함 문장·장문은 텍스트 미리보기와 복사로 처리했다. 미리보기 스크롤·복사 피드백·HTML 이스케이프·입력 중 포커스/클립보드 변화 보존·명시적 다시 읽기·빈/거절된 클립보드·직접 입력·URL/텍스트 전환·크기 제한을 검증했다.
- 초기 스켈레톤과 안내 문구 사이 간격, 기기명 현재/최대 40자 표시, 카드 텍스트 선택 방지와 모바일/미지원 브라우저에서 의도하지 않은 클립보드 읽기 방지를 검증했다. Safari의 네이티브 붙여넣기 확인은 공식 WebKit 동작을 참고했으며 실제 기기 확인은 운영 재배포 후 진행한다.
- 기존 복수 URL API·수락 후 자동 탭 열기·파일 자동 다운로드·101MiB 조각 업로드·계정 보관함·방 승인/내보내기·PWA·위치 자동 발견의 회귀 검증을 통과했다. 운영 Docker 이미지 빌드와 재시작 뒤 원문 유니코드 텍스트·DB·파일·미완료 조각 업로드 보존 및 이어 보내기를 확인했다.