Commit Graph

28 Commits

Author SHA1 Message Date
0932ecd39e fix: 아키텍처 리뷰 이슈 3건 수정
Some checks failed
CI/CD / test (push) Has been cancelled
CI/CD / release (push) Has been cancelled
- 명령줄 토큰 노출 제거 — 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>
2026-03-20 15:57:02 +09:00
b026520b35 fix: 런처 안정성 개선 (4건)
Some checks failed
CI/CD / test (push) Has been cancelled
CI/CD / release (push) Has been cancelled
- ticket JSON 직렬화 json.Marshal 사용 (특수문자 안전)
- 4xx 에러 메시지 "서버 오류"→"요청 실패" 수정
- 자동 업데이트 실패 시 stderr 로깅 추가
- 서버 URL을 ldflags로 오버라이드 가능하도록 var 전환

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 23:26:41 +09:00
d55be620bd Merge branch 'main' of https://git.tolelom.xyz/A301/a301_launcher
# Conflicts:
#	main.go
2026-03-18 21:39:57 +09:00
03345d18b9 ci: Gitea 환경으로 전환 (릴리즈 GitHub Actions → Gitea API)
Some checks failed
CI/CD / test (push) Has been cancelled
CI/CD / release (push) Has been cancelled
- softprops/action-gh-release 제거
- Gitea REST API (PowerShell)로 릴리즈 생성 + launcher.exe 업로드

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 17:25:31 +09:00
1e7aebf6b0 ci: go vet + go test 추가 + Go 1.25 업그레이드 + 태그 릴리즈 빌드
- 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>
2026-03-18 17:22:01 +09:00
84dd2373a4 refactor: 단일 파일을 main/ui/download/protocol 4개 파일로 분리
- main.go: 진입점(main), handleURI, version
- ui.go: Win32 UI (progress window, DPI, 폰트, 메시지박스)
- download.go: 다운로드/추출 로직 (HTTP client, extractZip, doDownload)
- protocol.go: 레지스트리 등록/해제, ensureGame, ensureLauncher, 서버 API

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-18 17:11:41 +09:00
8759587e25 test: 보안 크리티컬 함수 유닛 테스트 20개 추가
- extractZip: ZipSlip/NTFS ADS/Symlink 차단 검증 포함
- hashFile: 정상/빈파일/미존재 케이스
- redeemTicket: httptest 기반 서버 응답 처리
- URI 파싱: 정상/파라미터 누락/잘못된 스킴

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 16:58:53 +09:00
19b4d4895f feat: ticket redeem 인증 + 토큰 이중 전달 + 보안/품질 개선
- 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>
2026-03-18 16:42:43 +09:00
13b44b04a2 ci: GitHub Actions 워크플로우 추가
Windows Go 빌드 자동화 (push/PR on main)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:57:20 +09:00
a8d9ab9d36 feat: 오프라인 모드 + 다운로드 UX + 언인스톨 개선
오프라인 모드:
- 서버 미응답 시 설치된 게임 직접 실행 옵션

다운로드 UX:
- 속도(MB/s) + 남은 시간 표시 (초/분)

언인스톨:
- 게임 데이터 삭제 여부 사용자 선택
- --version 플래그 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:51:18 +09:00
66dc8a14de feat: 런처 자동 업데이트 + 보안 수정
자동 업데이트:
- 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>
2026-03-18 10:37:57 +09:00
a28510df57 feat: 일회용 ticket을 서버에서 JWT로 교환하는 로직 추가
브라우저에서 a301://launch?ticket=<hex> 형태로 호출 시
POST /api/auth/redeem-ticket으로 JWT를 받아 게임에 전달.
기존 token 파라미터 하위 호환 유지.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 21:28:36 +09:00
574a6ee277 fix: DPI 스케일링 정밀도 개선 및 토큰 형식 검증
- DPI 계산을 float64 기반으로 변경하여 반올림 정확도 향상
- JWT 토큰 3-part 형식 사전 검증 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:40:12 +09:00
b71c0d7baf fix: URI 스킴 검증 추가
handleURI에서 parsed.Scheme이 "a301"인지 검증하여
잘못된 스킴의 URI 입력 방지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 17:49:54 +09:00
a0face763a fix: 다운로드·파일 처리 버그 수정 및 에러 핸들링 강화
- 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>
2026-03-12 13:08:39 +09:00
48df55a82e fix: 보안 강화, 안정성 및 UX 개선
- 토큰 전달 방식 변경: 명령줄 인자(-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>
2026-03-06 11:10:11 +09:00
9bb422f9b2 fix: 보안 강화 및 안정성 개선
- extractZip: io.LimitReader 적용으로 zip bomb 방어 (개별 파일 4GB 제한)
- moveContents: cross-drive 복사 실패 시 부분 파일 제거

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-06 09:51:43 +09:00
9fb98b0028 fix: 보안 및 안정성 보강
- 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>
2026-03-05 11:04:45 +09:00
10651d294a docs: README, CLAUDE.md 작성
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-25 00:20:43 +09:00
f77a7e0e23 feat: 게임 가제 'One of the plans' UI 텍스트 적용
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-25 00:18:13 +09:00
28c1b377df feat: 다운로드 창 다크 테마 적용
- 배경 #2E2C2F, 타이틀 #BACDB0(강조색), 상태 텍스트 밝은 회색
- WM_CTLCOLORSTATIC으로 STATIC 컨트롤 색상 제어
- SetWindowTheme + PBM_SETBARCOLOR로 진행 막대 색상 변경
- "A301" 타이틀 레이블(13pt bold) + 상태 레이블(9pt) 분리
- 웹사이트 색상 팔레트와 통일

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-25 00:14:39 +09:00
22b5efdaab feat: DPI 인식 및 진행 막대 UI 추가
- 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>
2026-02-25 00:08:06 +09:00
6fafe1f3af fix: serverInfoURL을 API 서버 주소로 수정
프론트엔드 nginx에 /api/ 프록시 없음 → index.html 반환 → JSON 파싱 실패
직접 API 서버(a301.api.tolelom.xyz)로 요청하도록 변경

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 23:40:48 +09:00
90fcc0f94e fix: 서버 상태 코드별 명확한 에러 메시지 처리
- 404: 게임이 아직 준비되지 않았습니다
- 4xx/5xx: 서버 오류 (HTTP 상태코드)
- JSON 파싱 실패는 진짜 비정상 응답일 때만 표시

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 23:38:24 +09:00
ad9d372d7c feat: 자동 다운로드/설치 기능 추가
- 게임 파일 없거나 해시 불일치 시 서버에서 zip 자동 다운로드
- Win32 진행률 창으로 다운로드 진행률 표시 (X% 업데이트)
- zip 압축 해제 후 게임 실행 (런처 자신은 덮어쓰기 방지)
- 더블클릭 시 프로토콜만 등록 (토큰 없으므로 다운로드 불필요)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 23:00:19 +09:00
7cff574c1d feat: 게임 실행 전 서버 해시 검증으로 버전 강제 차단
- 서버 /api/download/info에서 최신 fileHash 조회
- 로컬 A301.exe SHA256과 비교
- 불일치 시 게임 실행 차단 + 다운로드 페이지 열기

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v0.0.1
2026-02-24 22:22:58 +09:00
861796fe5a feat: 더블클릭 시 MessageBox로 프로토콜 등록 안내
- 인자 없이 실행(더블클릭) 시 install 확인 팝업 표시
- 모든 결과/에러를 Windows MessageBox로 표시
- -H windowsgui 빌드 플래그로 콘솔창 표시 제거

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 22:15:54 +09:00
c3b557419d chore: first commit 2026-02-24 20:52:16 +09:00