mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	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:
		
				
					committed by
					
						
						Lauris BH
					
				
			
			
				
	
			
			
			
						parent
						
							a93f13849c
						
					
				
				
					commit
					d84da8fe65
				
			@@ -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)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user