diff --git a/config/config.go b/config/config.go index 58e61ae3d..6b93e75f6 100644 --- a/config/config.go +++ b/config/config.go @@ -581,7 +581,17 @@ func LoadConfigFile(config string) ([]byte, error) { } // If it isn't a https scheme, try it as a file - return os.ReadFile(config) + buffer, err := os.ReadFile(config) + if err != nil { + return nil, err + } + + mimeType := http.DetectContentType(buffer) + if !strings.Contains(mimeType, "text/plain") { + return nil, fmt.Errorf("provided config is not a TOML file: %s", config) + } + + return buffer, nil } func fetchConfig(u *url.URL) ([]byte, error) { diff --git a/config/config_test.go b/config/config_test.go index d7d3228f2..0223832dc 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -1,10 +1,13 @@ package config import ( + "bytes" "fmt" "net/http" "net/http/httptest" "os" + "os/exec" + "path/filepath" "reflect" "runtime" "strings" @@ -26,6 +29,32 @@ import ( "github.com/influxdata/telegraf/plugins/parsers/json" ) +func TestReadBinaryFile(t *testing.T) { + // Create a temporary binary file using the Telegraf tool custom_builder to pass as a config + wd, err := os.Getwd() + require.NoError(t, err) + t.Cleanup(func() { + err := os.Chdir(wd) + require.NoError(t, err) + }) + + err = os.Chdir("../") + require.NoError(t, err) + tmpdir := t.TempDir() + binaryFile := filepath.Join(tmpdir, "custom_builder") + cmd := exec.Command("go", "build", "-o", binaryFile, "./tools/custom_builder") + var outb, errb bytes.Buffer + cmd.Stdout = &outb + cmd.Stderr = &errb + err = cmd.Run() + + require.NoError(t, err, fmt.Sprintf("stdout: %s, stderr: %s", outb.String(), errb.String())) + c := NewConfig() + err = c.LoadConfig(binaryFile) + require.Error(t, err) + require.ErrorContains(t, err, "provided config is not a TOML file") +} + func TestConfig_LoadSingleInputWithEnvVars(t *testing.T) { c := NewConfig() require.NoError(t, os.Setenv("MY_TEST_SERVER", "192.168.1.1"))