112 lines
2.4 KiB
Go
112 lines
2.4 KiB
Go
|
|
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
|
||
|
|
}
|