- 명령줄 토큰 노출 제거 — exec.Command에서 -token 인자 제거, 환경변수(A301_TOKEN)만 사용
- redeemTicket 재시도 추가 — 3회 exponential backoff, 4xx는 즉시 실패
- 임시 추출 디렉토리 defer os.RemoveAll 추가 — 중복 정리 코드 제거
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- ticket JSON 직렬화 json.Marshal 사용 (특수문자 안전)
- 4xx 에러 메시지 "서버 오류"→"요청 실패" 수정
- 자동 업데이트 실패 시 stderr 로깅 추가
- 서버 URL을 ldflags로 오버라이드 가능하도록 var 전환
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- test job: go vet + build + go test ./... (Windows runner)
- release job: 'v*' 태그 push 시 launcher.exe를 GitHub Release에 업로드
- Go 1.24 → 1.25 업그레이드
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- extractZip: ZipSlip/NTFS ADS/Symlink 차단 검증 포함
- hashFile: 정상/빈파일/미존재 케이스
- redeemTicket: httptest 기반 서버 응답 처리
- URI 파싱: 정상/파라미터 누락/잘못된 스킴
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- launch ticket을 서버에서 redeem하여 새 JWT 획득 (토큰 수명 문제 해결)
- 게임에 커맨드라인 -token + 환경변수 A301_TOKEN 이중 전달
- fileHash 빈 문자열 이중 방어 (변조된 게임 실행 차단)
- Win32 API 반환값 검증 (RegisterClassEx, CreateWindowEx)
- 버전 ldflags 주입 지원 (var version = "dev")
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
오프라인 모드:
- 서버 미응답 시 설치된 게임 직접 실행 옵션
다운로드 UX:
- 속도(MB/s) + 남은 시간 표시 (초/분)
언인스톨:
- 게임 데이터 삭제 여부 사용자 선택
- --version 플래그 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
자동 업데이트:
- ensureLauncher(): SHA256 비교 → 다운로드 → 해시 검증 → rename-dance 교체
- 첫 실행 시 확인 대화 제거 → 자동 설치
- handleURI() 진입 시 프로토콜 등록 자동 갱신
- .old/.new 잔여 파일 자동 정리
보안:
- DLL Hijacking 방어 (SetDefaultDllDirectories)
- ZIP 경로 탈출 강화 (절대경로/NTFS ADS 거부)
- UTF16 에러 처리 (msgBox, setProgress)
- out.Close() 에러 체크
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
브라우저에서 a301://launch?ticket=<hex> 형태로 호출 시
POST /api/auth/redeem-ticket으로 JWT를 받아 게임에 전달.
기존 token 파라미터 하위 호환 유지.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 416 응답 시 무한 재귀를 doDownloadRequest 반복문으로 교체
- copyFile에서 out.Close() 에러를 반환하도록 수정
- ContentLength=-1일 때 잘못된 total 계산 방지
- fetchServerInfo 재시도 로직을 errNoRetry 타입 에러로 교체
- extractZip에서 최상위 디렉토리 엔트리 스킵 처리
- moveContents 크로스 드라이브 복사 후 원본 파일 삭제
- 진행률 100% 초과 클램핑
- install() SetStringValue 에러 체크 추가
- handleURI에서 gameDir 미존재 시 MkdirAll 방어 코드 추가
- ensureGame에서 os.Stat 비정상 에러 명시적 처리
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 토큰 전달 방식 변경: 명령줄 인자(-token) → 환경변수(A301_TOKEN)로 프로세스 목록 노출 방지
- 고정 설치 경로: %LOCALAPPDATA%\A301\로 런처 복사 후 레지스트리 등록 (Downloads 정리 시 깨짐 방지)
- zip 추출 시 symlink 엔트리 스킵 (경로 탈출 방지)
- fetchServerInfo 3회 재시도 (exponential backoff)
- 다운로드 이어받기: Range 헤더 지원, 취소/오류 시 임시 파일 유지
- 416 응답 시 서버 파일 변경 감지하여 처음부터 재다운로드
- 단일 인스턴스 UX: 기존 창 FindWindow+SetForegroundWindow로 활성화
- uninstall 시 설치 디렉토리 정리
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- extractZip: io.LimitReader 적용으로 zip bomb 방어 (개별 파일 4GB 제한)
- moveContents: cross-drive 복사 실패 시 부분 파일 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Zip Slip 경로 검증 추가
- HTTP 상태 코드 검증 (doDownload)
- HTTP 타임아웃 설정 (API/다운로드 클라이언트 분리)
- 다운로드 URL 스킴 검증 (https/http만 허용)
- 리다이렉트 스킴 제한 (CheckRedirect)
- 다운로드 크기 제한 (2GB)
- fetchServerInfo 응답 크기 제한 (1MB)
- 다운로드 후 해시 검증
- 다중 인스턴스 실행 방지 (CreateMutexW)
- 다운로드 취소 기능 (wmClose 핸들러)
- 압축 해제 실패 시 잔여 파일 정리 (임시 디렉토리 추출)
- 도달 불가능한 dead code 및 미사용 코드 제거
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 배경 #2E2C2F, 타이틀 #BACDB0(강조색), 상태 텍스트 밝은 회색
- WM_CTLCOLORSTATIC으로 STATIC 컨트롤 색상 제어
- SetWindowTheme + PBM_SETBARCOLOR로 진행 막대 색상 변경
- "A301" 타이틀 레이블(13pt bold) + 상태 레이블(9pt) 분리
- 웹사이트 색상 팔레트와 통일
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- SetProcessDpiAwarenessContext(PER_MONITOR_AWARE_V2)로 고DPI 디스플레이 지원
- GetDpiForSystem()으로 시스템 DPI 조회 후 모든 크기 동적 스케일링
- 다운로드 진행창에 msctls_progress32 진행 막대 추가 (0~100%)
- Segoe UI 9pt 폰트를 DPI에 맞게 CreateFontIndirectW로 생성
- 4K(200% / 192 DPI)와 FHD(100% / 96 DPI) 모두 동일한 시각적 크기 보장
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 게임 파일 없거나 해시 불일치 시 서버에서 zip 자동 다운로드
- Win32 진행률 창으로 다운로드 진행률 표시 (X% 업데이트)
- zip 압축 해제 후 게임 실행 (런처 자신은 덮어쓰기 방지)
- 더블클릭 시 프로토콜만 등록 (토큰 없으므로 다운로드 불필요)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 서버 /api/download/info에서 최신 fileHash 조회
- 로컬 A301.exe SHA256과 비교
- 불일치 시 게임 실행 차단 + 다운로드 페이지 열기
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 인자 없이 실행(더블클릭) 시 install 확인 팝업 표시
- 모든 결과/에러를 Windows MessageBox로 표시
- -H windowsgui 빌드 플래그로 콘솔창 표시 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>