package main import ( "bufio" "os" "path/filepath" "strings" ) // Config holds all auth configuration. type Config struct { AuthBase string ClientKey string CacheDir string MinTTLSec int APIBase string // for business API calls, defaults to AuthBase } // loadConfig reads ~/.openclaw/.env and builds Config. func loadConfig() Config { loadEnvFile() authBase := strings.TrimRight(envOrDefault("AUTH_BASE", "https://api-gw-test.yuanwei-lnc.com"), "/") clientKey := os.Getenv("CLIENT_KEY") cfg := Config{ AuthBase: authBase, ClientKey: clientKey, CacheDir: envOrDefault("AUTH_CACHE_DIR", "/tmp/skill-auth-cache"), MinTTLSec: envOrDefaultInt("AUTH_MIN_TTL_SEC", 60), APIBase: strings.TrimRight(envOrDefault("ECOM_BASE", authBase), "/"), } return cfg } // reloadConfig re-reads .env from disk and rebuilds config. func reloadConfig(old Config) Config { loadEnvFile() return Config{ AuthBase: strings.TrimRight(envOrDefault("AUTH_BASE", "https://api-gw-test.yuanwei-lnc.com"), "/"), ClientKey: os.Getenv("CLIENT_KEY"), CacheDir: envOrDefault("AUTH_CACHE_DIR", "/tmp/skill-auth-cache"), MinTTLSec: envOrDefaultInt("AUTH_MIN_TTL_SEC", 60), APIBase: old.APIBase, // preserve explicit override } } // loadEnvFile reads ~/.openclaw/.env into os environment. // File values always override existing env vars (no caching). func loadEnvFile() { home, err := os.UserHomeDir() if err != nil { return } envPath := filepath.Join(home, ".openclaw", ".env") f, err := os.Open(envPath) if err != nil { return } defer f.Close() scanner := bufio.NewScanner(f) for scanner.Scan() { line := strings.TrimSpace(scanner.Text()) if line == "" || strings.HasPrefix(line, "#") { continue } idx := strings.Index(line, "=") if idx < 1 { continue } key := strings.TrimSpace(line[:idx]) value := strings.TrimSpace(line[idx+1:]) // strip surrounding quotes if len(value) >= 2 { if (value[0] == '"' && value[len(value)-1] == '"') || (value[0] == '\'' && value[len(value)-1] == '\'') { value = value[1 : len(value)-1] } } os.Setenv(key, value) } } func envOrDefault(key, def string) string { if v := os.Getenv(key); v != "" { return v } return def } func envOrDefaultInt(key string, def int) int { v := os.Getenv(key) if v == "" { return def } n := 0 for _, c := range v { if c < '0' || c > '9' { return def } n = n*10 + int(c-'0') } return n }