Reject missing explicit configuration files
This commit is contained in:
committed by
Brandon McGinty
parent
1ea71b1862
commit
6da5b249f9
@@ -356,6 +356,20 @@ func (c *Config) UpdateConfig(u *gumble.User) {
|
|||||||
j.LocallyMuted = u.LocallyMuted() // Save LocallyMuted state to config
|
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 {
|
func NewConfig(fn *string) *Config {
|
||||||
var c *Config
|
var c *Config
|
||||||
c = &Config{}
|
c = &Config{}
|
||||||
|
|||||||
@@ -8,6 +8,15 @@ import (
|
|||||||
"git.stormux.org/storm/barnard/uiterm"
|
"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) {
|
func TestConfigBackfillsRecordingDefaults(t *testing.T) {
|
||||||
dir := t.TempDir()
|
dir := t.TempDir()
|
||||||
configPath := filepath.Join(dir, "barnard.toml")
|
configPath := filepath.Join(dir, "barnard.toml")
|
||||||
|
|||||||
@@ -129,6 +129,8 @@ func main() {
|
|||||||
fifo := flag.String("fifo", "", "path of a FIFO from which to read commands")
|
fifo := flag.String("fifo", "", "path of a FIFO from which to read commands")
|
||||||
serverSet := false
|
serverSet := false
|
||||||
usernameSet := false
|
usernameSet := false
|
||||||
|
configSet := false
|
||||||
|
certificateSet := false
|
||||||
buffers := flag.Int("buffers", 16, "number of audio buffers to use")
|
buffers := flag.Int("buffers", 16, "number of audio buffers to use")
|
||||||
profile := flag.Bool("profile", false, "add http server to serve profiles")
|
profile := flag.Bool("profile", false, "add http server to serve profiles")
|
||||||
noiseSuppressionEnabled := flag.Bool("noise-suppression", false, "enable noise suppression for microphone input")
|
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) {
|
flag.CommandLine.Visit(func(theFlag *flag.Flag) {
|
||||||
switch theFlag.Name {
|
switch theFlag.Name {
|
||||||
case "server":
|
case "server":
|
||||||
serverSet = true
|
serverSet = true
|
||||||
case "username":
|
case "username":
|
||||||
usernameSet = true
|
usernameSet = true
|
||||||
|
case "config":
|
||||||
|
configSet = true
|
||||||
case "certificate":
|
case "certificate":
|
||||||
certificateSet = true
|
certificateSet = true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
if configSet {
|
||||||
|
if err := config.RequireConfigFile(*cfgfn); err != nil {
|
||||||
|
handle_raw_error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
userConfig := config.NewConfig(cfgfn)
|
||||||
|
|
||||||
if !serverSet {
|
if !serverSet {
|
||||||
server = userConfig.GetDefaultServer()
|
server = userConfig.GetDefaultServer()
|
||||||
|
|||||||
Reference in New Issue
Block a user