瀏覽代碼

Merge pull request #11428 from bergquist/11281_fix

Avoid panic when GF_DATABASE_URL contains illegal chars
Daniel Lee 7 年之前
父節點
當前提交
1f3602c7dd
共有 3 個文件被更改,包括 27 次插入7 次删除
  1. 1 1
      pkg/cmd/grafana-server/server.go
  2. 19 6
      pkg/setting/setting.go
  3. 7 0
      pkg/setting/setting_test.go

+ 1 - 1
pkg/cmd/grafana-server/server.go

@@ -111,7 +111,7 @@ func (g *GrafanaServerImpl) initLogging() {
 	})
 	})
 
 
 	if err != nil {
 	if err != nil {
-		g.log.Error(err.Error())
+		fmt.Fprintf(os.Stderr, "Failed to start grafana. error: %s\n", err.Error())
 		os.Exit(1)
 		os.Exit(1)
 	}
 	}
 
 

+ 19 - 6
pkg/setting/setting.go

@@ -223,7 +223,7 @@ func shouldRedactURLKey(s string) bool {
 	return strings.Contains(uppercased, "DATABASE_URL")
 	return strings.Contains(uppercased, "DATABASE_URL")
 }
 }
 
 
-func applyEnvVariableOverrides() {
+func applyEnvVariableOverrides() error {
 	appliedEnvOverrides = make([]string, 0)
 	appliedEnvOverrides = make([]string, 0)
 	for _, section := range Cfg.Sections() {
 	for _, section := range Cfg.Sections() {
 		for _, key := range section.Keys() {
 		for _, key := range section.Keys() {
@@ -238,7 +238,10 @@ func applyEnvVariableOverrides() {
 					envValue = "*********"
 					envValue = "*********"
 				}
 				}
 				if shouldRedactURLKey(envKey) {
 				if shouldRedactURLKey(envKey) {
-					u, _ := url.Parse(envValue)
+					u, err := url.Parse(envValue)
+					if err != nil {
+						return fmt.Errorf("could not parse environment variable. key: %s, value: %s. error: %v", envKey, envValue, err)
+					}
 					ui := u.User
 					ui := u.User
 					if ui != nil {
 					if ui != nil {
 						_, exists := ui.Password()
 						_, exists := ui.Password()
@@ -252,6 +255,8 @@ func applyEnvVariableOverrides() {
 			}
 			}
 		}
 		}
 	}
 	}
+
+	return nil
 }
 }
 
 
 func applyCommandLineDefaultProperties(props map[string]string) {
 func applyCommandLineDefaultProperties(props map[string]string) {
@@ -377,7 +382,7 @@ func loadSpecifedConfigFile(configFile string) error {
 	return nil
 	return nil
 }
 }
 
 
-func loadConfiguration(args *CommandLineArgs) {
+func loadConfiguration(args *CommandLineArgs) error {
 	var err error
 	var err error
 
 
 	// load config defaults
 	// load config defaults
@@ -395,7 +400,7 @@ func loadConfiguration(args *CommandLineArgs) {
 	if err != nil {
 	if err != nil {
 		fmt.Println(fmt.Sprintf("Failed to parse defaults.ini, %v", err))
 		fmt.Println(fmt.Sprintf("Failed to parse defaults.ini, %v", err))
 		os.Exit(1)
 		os.Exit(1)
-		return
+		return err
 	}
 	}
 
 
 	Cfg.BlockMode = false
 	Cfg.BlockMode = false
@@ -413,7 +418,10 @@ func loadConfiguration(args *CommandLineArgs) {
 	}
 	}
 
 
 	// apply environment overrides
 	// apply environment overrides
-	applyEnvVariableOverrides()
+	err = applyEnvVariableOverrides()
+	if err != nil {
+		return err
+	}
 
 
 	// apply command line overrides
 	// apply command line overrides
 	applyCommandLineProperties(commandLineProps)
 	applyCommandLineProperties(commandLineProps)
@@ -424,6 +432,8 @@ func loadConfiguration(args *CommandLineArgs) {
 	// update data path and logging config
 	// update data path and logging config
 	DataPath = makeAbsolute(Cfg.Section("paths").Key("data").String(), HomePath)
 	DataPath = makeAbsolute(Cfg.Section("paths").Key("data").String(), HomePath)
 	initLogging()
 	initLogging()
+
+	return err
 }
 }
 
 
 func pathExists(path string) bool {
 func pathExists(path string) bool {
@@ -471,7 +481,10 @@ func validateStaticRootPath() error {
 
 
 func NewConfigContext(args *CommandLineArgs) error {
 func NewConfigContext(args *CommandLineArgs) error {
 	setHomePath(args)
 	setHomePath(args)
-	loadConfiguration(args)
+	err := loadConfiguration(args)
+	if err != nil {
+		return err
+	}
 
 
 	Env = Cfg.Section("").Key("app_mode").MustString("development")
 	Env = Cfg.Section("").Key("app_mode").MustString("development")
 	InstanceName = Cfg.Section("").Key("instance_name").MustString("unknown_instance_name")
 	InstanceName = Cfg.Section("").Key("instance_name").MustString("unknown_instance_name")

+ 7 - 0
pkg/setting/setting_test.go

@@ -37,6 +37,13 @@ func TestLoadingSettings(t *testing.T) {
 			So(appliedEnvOverrides, ShouldContain, "GF_SECURITY_ADMIN_PASSWORD=*********")
 			So(appliedEnvOverrides, ShouldContain, "GF_SECURITY_ADMIN_PASSWORD=*********")
 		})
 		})
 
 
+		Convey("Should replace password when defined in environment2", func() {
+			os.Setenv("GF_DATABASE_URL", "postgres://grafana:sec{ret@postgres:5432/grafana")
+			err := NewConfigContext(&CommandLineArgs{HomePath: "../../"})
+
+			So(err, ShouldNotBeNil)
+		})
+
 		Convey("Should replace password in URL when url environment is defined", func() {
 		Convey("Should replace password in URL when url environment is defined", func() {
 			os.Setenv("GF_DATABASE_URL", "mysql://user:secret@localhost:3306/database")
 			os.Setenv("GF_DATABASE_URL", "mysql://user:secret@localhost:3306/database")
 			NewConfigContext(&CommandLineArgs{HomePath: "../../"})
 			NewConfigContext(&CommandLineArgs{HomePath: "../../"})