package config import ( "fmt" "os" "path/filepath" "strings" "gopkg.in/yaml.v3" ) type Config struct { Service struct { LogLevel string `yaml:"log_level"` } `yaml:"service"` Kafka struct { Host string `yaml:"host"` Port string `yaml:"port"` OrderTopic string `yaml:"order_topic"` ConsumerGroupID string `yaml:"consumer_group_id"` Brokers string `yaml:"brokers"` } `yaml:"kafka"` } func LoadConfig(filename string) (*Config, error) { workDir, err := os.Getwd() if err != nil { return nil, err } cfgRoot := filepath.Join(workDir, "configs") absCfgRoot, _ := filepath.Abs(cfgRoot) filePath := filepath.Join(absCfgRoot, filepath.Clean(filename)) if !strings.HasPrefix(filePath, absCfgRoot) { return nil, fmt.Errorf("invalid path") } f, err := os.Open(filename) if err != nil { return nil, err } defer f.Close() config := &Config{} if err := yaml.NewDecoder(f).Decode(config); err != nil { return nil, err } return config, nil }