All checks were successful
Server CI/CD / deploy (push) Successful in 7s
- middleware: JWT MapClaims 타입 단언 패닉 → ok 패턴으로 방어 - auth/service: Redis Set 오류 처리, 지갑 생성 실패 시 유저 롤백 - auth/service: EnsureAdmin 지갑 생성 추가, Logout 리프레시 토큰도 삭제 - auth/service: 리프레시 토큰 발급(7일) 및 로테이션, REFRESH_SECRET 분리 - auth/handler: Login 응답에 refreshToken 포함, Refresh 핸들러 추가 - auth/handler: Logout 에러 처리 추가 - download/service: hashGameExeFromZip io.Copy 오류 처리 - download/handler: Content-Disposition mime.FormatMediaType으로 헤더 인젝션 방어 - announcement/handler: Update 빈 body 400 반환 - config: REFRESH_SECRET 환경변수 추가 - routes: POST /api/auth/refresh 엔드포인트 추가 - main: INTERNAL_API_KEY 미설정 시 경고 출력 - .env.example: 누락 환경변수 7개 보완 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
75 lines
1.9 KiB
Go
75 lines
1.9 KiB
Go
package config
|
|
|
|
import (
|
|
"os"
|
|
"strconv"
|
|
|
|
"github.com/joho/godotenv"
|
|
)
|
|
|
|
type Config struct {
|
|
AppPort string
|
|
DBHost string
|
|
DBPort string
|
|
DBUser string
|
|
DBPassword string
|
|
DBName string
|
|
RedisAddr string
|
|
RedisPassword string
|
|
JWTSecret string
|
|
RefreshSecret string
|
|
JWTExpiryHours int
|
|
AdminUsername string
|
|
AdminPassword string
|
|
BaseURL string
|
|
GameDir string
|
|
|
|
// Chain integration
|
|
ChainNodeURL string
|
|
ChainID string
|
|
OperatorKeyHex string
|
|
WalletEncryptionKey string
|
|
|
|
// Server-to-server auth
|
|
InternalAPIKey string
|
|
}
|
|
|
|
var C Config
|
|
|
|
func Load() {
|
|
_ = godotenv.Load()
|
|
|
|
hours, _ := strconv.Atoi(getEnv("JWT_EXPIRY_HOURS", "24"))
|
|
C = Config{
|
|
AppPort: getEnv("APP_PORT", "8080"),
|
|
DBHost: getEnv("DB_HOST", "localhost"),
|
|
DBPort: getEnv("DB_PORT", "3306"),
|
|
DBUser: getEnv("DB_USER", "root"),
|
|
DBPassword: getEnv("DB_PASSWORD", ""),
|
|
DBName: getEnv("DB_NAME", "a301"),
|
|
RedisAddr: getEnv("REDIS_ADDR", "localhost:6379"),
|
|
RedisPassword: getEnv("REDIS_PASSWORD", ""),
|
|
JWTSecret: getEnv("JWT_SECRET", "secret"),
|
|
RefreshSecret: getEnv("REFRESH_SECRET", "refresh-secret"),
|
|
JWTExpiryHours: hours,
|
|
AdminUsername: getEnv("ADMIN_USERNAME", "admin"),
|
|
AdminPassword: getEnv("ADMIN_PASSWORD", "admin1234"),
|
|
BaseURL: getEnv("BASE_URL", "http://localhost:8080"),
|
|
GameDir: getEnv("GAME_DIR", "/data/game"),
|
|
|
|
ChainNodeURL: getEnv("CHAIN_NODE_URL", "http://localhost:8545"),
|
|
ChainID: getEnv("CHAIN_ID", "tolchain-dev"),
|
|
OperatorKeyHex: getEnv("OPERATOR_KEY_HEX", ""),
|
|
WalletEncryptionKey: getEnv("WALLET_ENCRYPTION_KEY", ""),
|
|
|
|
InternalAPIKey: getEnv("INTERNAL_API_KEY", ""),
|
|
}
|
|
}
|
|
|
|
func getEnv(key, fallback string) string {
|
|
if v := os.Getenv(key); v != "" {
|
|
return v
|
|
}
|
|
return fallback
|
|
}
|