# [InsuRo P0-1] Drive 프록시 Phase 3 — 공개 완전 차단 (신규 제거 + 소급 회수)

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "server/gdrive.py"
    - "server/scripts/**"
    - "server/tests/**"
  forbidden_paths:
    - ".env"
    - ".env.*"
    - ".github/**"
  commands:
    - "pytest"
    - "python3 -m py_compile"
    - "python3 -c"
  merge_policy: "tiered"
  ttl_hours: 48
```

## 배경
P0-1 Drive 프록시 Phase 1/1.5/2 완료·배포(프록시 라이브 + 프론트 8곳 배선). **Codex 확인: 프론트 직접링크 잔존 0, 서버 소유자 OAuth 전환 완료** → 이제 공개(anyone)를 완전 제거해도 안전. 본 Phase 3로 목표(유출 차단) 달성.

## Phase 3a — 신규 anyone 생성 제거 (Codex GO, 안전)
- `server/gdrive.py`의 `upload_pdf`(약 141행)·`upload_file_to_drive`(약 197행)에서 `permissions().create(body={"type":"anyone","role":"reader"})` 호출 **제거**. 신규 업로드는 소유자 전용(비공개) → 프론트 프록시로만 열림.
- 검증: 신규 업로드 시 anyone 권한 생성 안 됨(모킹 테스트). 기존 업로드 기능(파일 생성·file_url 반환) 무변경.

## Phase 3b — 기존 공개파일 소급 회수 스크립트 (신중 — 실행은 ANU 승인 하)
`server/scripts/revoke_public_drive.py`(신규):
1. **대상 수집**: DB `newsletters.drive_file_id` + `premium_data.drive_file_id` + `policy_analyses.drive_file_ids[]` 의 file_id 전수. **★FCPA(`fcpa_config`)는 제외**(금소법 PDF는 회장 결정=공개 유지).
2. **스냅샷**: 각 file_id `permissions.list` → `type:"anyone"` 항목을 **JSON 스냅샷 파일로 저장**(롤백 기준, 타임스탬프).
3. **선별 삭제**: `type:"anyone"` permission만 `permissions.delete`. 소유자·특정사용자 공유 권한은 **보존**. 소유자 OAuth(`get_drive_service`) 사용.
4. **안전장치**: `--dry-run`(기본, 대상·건수만 출력, 삭제 안 함) / `--execute`(실제 삭제). rate limit 백오프, 부분 실패 개별 로그+계속, 결과 리포트(성공/실패/스킵).
5. **롤백 스크립트** `server/scripts/restore_public_drive.py`: 스냅샷 JSON 기반 `type:anyone` 권한 재부여(문제 시).

## 검증 (Phase 3b는 dry-run까지만, 실제 실행 금지)
1. Phase 3a: 신규 anyone 미생성 유닛테스트, 기존 기능 회귀 0.
2. Phase 3b: `--dry-run` 실행 시 대상 file_id 목록·건수 정확(FCPA 제외 확인), 스냅샷 생성 로직 유닛테스트(모킹), `type:anyone`만 선별하는 필터 테스트. **실제 `--execute`는 하지 말 것**(ANU가 스냅샷 확인 후 승인 실행).
3. py_compile / pytest 통과.

## 배포
- Phase 3a: 서버 코드 → 머지·systemd 재배포=ANU.
- Phase 3b: 스크립트는 머지만. **실제 소급 실행(--execute)은 ANU가 dry-run 검토·스냅샷 확보 후 별도 실행**. finalize-only.

## 완료 보고
gdrive anyone 제거 diff · 소급 스크립트(수집/스냅샷/선별삭제/dry-run/롤백) · dry-run 테스트 결과 · FCPA 제외 확인 · 회귀 · callback.