Change parsing of postgresql settings (#4275)
* Change parsing of postgresql settings Fix #4200 * Add copyright * update postgresql connection string * add tests
This commit is contained in:
		
							parent
							
								
									a93f13849c
								
							
						
					
					
						commit
						d84da8fe65
					
				
					 2 changed files with 54 additions and 8 deletions
				
			
		|  | @ -1,4 +1,5 @@ | |||
| // Copyright 2014 The Gogs Authors. All rights reserved.
 | ||||
| // Copyright 2018 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
|  | @ -184,6 +185,18 @@ func parsePostgreSQLHostPort(info string) (string, string) { | |||
| 	return host, port | ||||
| } | ||||
| 
 | ||||
| func getPostgreSQLConnectionString(DBHost, DBUser, DBPasswd, DBName, DBParam, DBSSLMode string) (connStr string) { | ||||
| 	host, port := parsePostgreSQLHostPort(DBHost) | ||||
| 	if host[0] == '/' { // looks like a unix socket
 | ||||
| 		connStr = fmt.Sprintf("postgres://%s:%s@:%s/%s%ssslmode=%s&host=%s", | ||||
| 			url.PathEscape(DBUser), url.PathEscape(DBPasswd), port, DBName, DBParam, DBSSLMode, host) | ||||
| 	} else { | ||||
| 		connStr = fmt.Sprintf("postgres://%s:%s@%s:%s/%s%ssslmode=%s", | ||||
| 			url.PathEscape(DBUser), url.PathEscape(DBPasswd), host, port, DBName, DBParam, DBSSLMode) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func parseMSSQLHostPort(info string) (string, string) { | ||||
| 	host, port := "127.0.0.1", "1433" | ||||
| 	if strings.Contains(info, ":") { | ||||
|  | @ -214,14 +227,7 @@ func getEngine() (*xorm.Engine, error) { | |||
| 				DbCfg.User, DbCfg.Passwd, DbCfg.Host, DbCfg.Name, Param) | ||||
| 		} | ||||
| 	case "postgres": | ||||
| 		host, port := parsePostgreSQLHostPort(DbCfg.Host) | ||||
| 		if host[0] == '/' { // looks like a unix socket
 | ||||
| 			connStr = fmt.Sprintf("postgres://%s:%s@:%s/%s%ssslmode=%s&host=%s", | ||||
| 				url.QueryEscape(DbCfg.User), url.QueryEscape(DbCfg.Passwd), port, DbCfg.Name, Param, DbCfg.SSLMode, host) | ||||
| 		} else { | ||||
| 			connStr = fmt.Sprintf("postgres://%s:%s@%s:%s/%s%ssslmode=%s", | ||||
| 				url.QueryEscape(DbCfg.User), url.QueryEscape(DbCfg.Passwd), host, port, DbCfg.Name, Param, DbCfg.SSLMode) | ||||
| 		} | ||||
| 		connStr = getPostgreSQLConnectionString(DbCfg.Host, DbCfg.User, DbCfg.Passwd, DbCfg.Name, Param, DbCfg.SSLMode) | ||||
| 	case "mssql": | ||||
| 		host, port := parseMSSQLHostPort(DbCfg.Host) | ||||
| 		connStr = fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", host, port, DbCfg.Name, DbCfg.User, DbCfg.Passwd) | ||||
|  |  | |||
|  | @ -1,4 +1,5 @@ | |||
| // Copyright 2016 The Gogs Authors. All rights reserved.
 | ||||
| // Copyright 2018 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
|  | @ -53,3 +54,42 @@ func Test_parsePostgreSQLHostPort(t *testing.T) { | |||
| 		assert.Equal(t, test.Port, port) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func Test_getPostgreSQLConnectionString(t *testing.T) { | ||||
| 	tests := []struct { | ||||
| 		Host    string | ||||
| 		Port    string | ||||
| 		User    string | ||||
| 		Passwd  string | ||||
| 		Name    string | ||||
| 		Param   string | ||||
| 		SSLMode string | ||||
| 		Output  string | ||||
| 	}{ | ||||
| 		{ | ||||
| 			Host:    "/tmp/pg.sock", | ||||
| 			Port:    "4321", | ||||
| 			User:    "testuser", | ||||
| 			Passwd:  "space space !#$%^^%^```-=?=", | ||||
| 			Name:    "gitea", | ||||
| 			Param:   "", | ||||
| 			SSLMode: "false", | ||||
| 			Output:  "postgres://testuser:space%20space%20%21%23$%25%5E%5E%25%5E%60%60%60-=%3F=@:5432/giteasslmode=false&host=/tmp/pg.sock", | ||||
| 		}, | ||||
| 		{ | ||||
| 			Host:    "localhost", | ||||
| 			Port:    "1234", | ||||
| 			User:    "pgsqlusername", | ||||
| 			Passwd:  "I love Gitea!", | ||||
| 			Name:    "gitea", | ||||
| 			Param:   "", | ||||
| 			SSLMode: "true", | ||||
| 			Output:  "postgres://pgsqlusername:I%20love%20Gitea%21@localhost:5432/giteasslmode=true", | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	for _, test := range tests { | ||||
| 		connStr := getPostgreSQLConnectionString(test.Host, test.User, test.Passwd, test.Name, test.Param, test.SSLMode) | ||||
| 		assert.Equal(t, test.Output, connStr) | ||||
| 	} | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue