122 lines
3.0 KiB
Go
122 lines
3.0 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
type Config struct {
|
|
Server struct {
|
|
Port int `yaml:"port"`
|
|
Key string `yaml:"key"`
|
|
} `yaml:"server"`
|
|
Database struct {
|
|
Path string `yaml:"path"`
|
|
} `yaml:"database"`
|
|
Telegram struct {
|
|
Enabled bool `yaml:"enabled"`
|
|
Token string `yaml:"token"`
|
|
} `yaml:"telegram"`
|
|
QQBot struct {
|
|
Enabled bool `yaml:"enabled"`
|
|
AppID string `yaml:"appid"`
|
|
Secret string `yaml:"secret"`
|
|
} `yaml:"qqbot"`
|
|
Feishu struct {
|
|
Enabled bool `yaml:"enabled"`
|
|
AppID string `yaml:"app_id"`
|
|
AppSecret string `yaml:"app_secret"`
|
|
VerificationToken string `yaml:"verification_token"`
|
|
EncryptKey string `yaml:"encrypt_key"`
|
|
} `yaml:"feishu"`
|
|
AI struct {
|
|
Enabled bool `yaml:"enabled"`
|
|
BaseURL string `yaml:"base_url"`
|
|
APIKey string `yaml:"api_key"`
|
|
Model string `yaml:"model"`
|
|
TimeoutSeconds int `yaml:"timeout_seconds"`
|
|
} `yaml:"ai"`
|
|
Admin struct {
|
|
Username string `yaml:"username"`
|
|
Password string `yaml:"password"`
|
|
} `yaml:"admin"`
|
|
}
|
|
|
|
func LoadConfig(path string) (*Config, error) {
|
|
cfg := &Config{}
|
|
file, err := os.Open(path)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("打开配置文件失败: %w", err)
|
|
}
|
|
defer file.Close()
|
|
|
|
d := yaml.NewDecoder(file)
|
|
if err := d.Decode(&cfg); err != nil {
|
|
return nil, fmt.Errorf("解析配置文件失败: %w", err)
|
|
}
|
|
|
|
if err := cfg.Validate(); err != nil {
|
|
return nil, fmt.Errorf("配置验证失败: %w", err)
|
|
}
|
|
|
|
return cfg, nil
|
|
}
|
|
|
|
func IsWeakPassword(pw string) bool {
|
|
p := strings.TrimSpace(pw)
|
|
if p == "" {
|
|
return true
|
|
}
|
|
weak := map[string]bool{
|
|
"admin123": true,
|
|
"your_password": true,
|
|
"CHANGE_ME": true,
|
|
"change_me": true,
|
|
"password": true,
|
|
"123456": true,
|
|
"12345678": true,
|
|
"qwerty": true,
|
|
}
|
|
return weak[p]
|
|
}
|
|
|
|
func (c *Config) Validate() error {
|
|
if c.Database.Path == "" {
|
|
return fmt.Errorf("database.path 不能为空")
|
|
}
|
|
if c.Server.Port <= 0 || c.Server.Port > 65535 {
|
|
return fmt.Errorf("server.port 必须在 1-65535 之间,当前值: %d", c.Server.Port)
|
|
}
|
|
if c.Server.Key == "" {
|
|
return fmt.Errorf("server.key 不能为空(用于会话签名)")
|
|
}
|
|
if c.Admin.Username == "" || c.Admin.Password == "" {
|
|
return fmt.Errorf("admin.username 和 admin.password 不能为空")
|
|
}
|
|
if c.Telegram.Enabled && c.Telegram.Token == "" {
|
|
return fmt.Errorf("telegram 已启用但 token 为空")
|
|
}
|
|
if c.QQBot.Enabled {
|
|
if c.QQBot.AppID == "" || c.QQBot.Secret == "" {
|
|
return fmt.Errorf("qqbot 已启用但 appid 或 secret 为空")
|
|
}
|
|
}
|
|
if c.Feishu.Enabled {
|
|
if c.Feishu.AppID == "" || c.Feishu.AppSecret == "" {
|
|
return fmt.Errorf("feishu 已启用但 app_id 或 app_secret 为空")
|
|
}
|
|
}
|
|
if c.AI.Enabled {
|
|
if c.AI.BaseURL == "" || c.AI.APIKey == "" || c.AI.Model == "" {
|
|
return fmt.Errorf("ai 已启用但 base_url/api_key/model 为空")
|
|
}
|
|
if c.AI.TimeoutSeconds <= 0 {
|
|
c.AI.TimeoutSeconds = 15
|
|
}
|
|
}
|
|
return nil
|
|
}
|