Reject missing explicit configuration files

This commit is contained in:
Brandon McGinty (chatgpt)
2026-08-09 22:35:38 -04:00
committed by Brandon McGinty
parent 1ea71b1862
commit 6da5b249f9
3 changed files with 33 additions and 3 deletions
+14
View File
@@ -356,6 +356,20 @@ func (c *Config) UpdateConfig(u *gumble.User) {
j.LocallyMuted = u.LocallyMuted() // Save LocallyMuted state to config
}
// RequireConfigFile verifies that an explicitly requested configuration file
// exists and is a regular file. The default configuration remains optional.
func RequireConfigFile(fn string) error {
path := resolvePath(fn)
info, err := os.Stat(path)
if err != nil {
return fmt.Errorf("config file %q: %w", path, err)
}
if info.IsDir() {
return fmt.Errorf("config file %q is a directory", path)
}
return nil
}
func NewConfig(fn *string) *Config {
var c *Config
c = &Config{}
+9
View File
@@ -8,6 +8,15 @@ import (
"git.stormux.org/storm/barnard/uiterm"
)
// Regression: an explicit -config path silently fell back to in-memory
// defaults, then overwrote the intended file on exit.
func TestRequireConfigFileRejectsMissingExplicitPath(t *testing.T) {
missing := filepath.Join(t.TempDir(), "missing.toml")
if err := RequireConfigFile(missing); err == nil {
t.Fatal("missing explicit config was accepted")
}
}
func TestConfigBackfillsRecordingDefaults(t *testing.T) {
dir := t.TempDir()
configPath := filepath.Join(dir, "barnard.toml")
+10 -3
View File
@@ -129,6 +129,8 @@ func main() {
fifo := flag.String("fifo", "", "path of a FIFO from which to read commands")
serverSet := false
usernameSet := false
configSet := false
certificateSet := false
buffers := flag.Int("buffers", 16, "number of audio buffers to use")
profile := flag.Bool("profile", false, "add http server to serve profiles")
noiseSuppressionEnabled := flag.Bool("noise-suppression", false, "enable noise suppression for microphone input")
@@ -173,19 +175,24 @@ func main() {
}()
}
userConfig := config.NewConfig(cfgfn)
certificateSet := false
flag.CommandLine.Visit(func(theFlag *flag.Flag) {
switch theFlag.Name {
case "server":
serverSet = true
case "username":
usernameSet = true
case "config":
configSet = true
case "certificate":
certificateSet = true
}
})
if configSet {
if err := config.RequireConfigFile(*cfgfn); err != nil {
handle_raw_error(err)
}
}
userConfig := config.NewConfig(cfgfn)
if !serverSet {
server = userConfig.GetDefaultServer()