mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +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 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
 | 
					// Use of this source code is governed by a MIT-style
 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					// license that can be found in the LICENSE file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -184,6 +185,18 @@ func parsePostgreSQLHostPort(info string) (string, string) {
 | 
				
			|||||||
	return host, port
 | 
						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) {
 | 
					func parseMSSQLHostPort(info string) (string, string) {
 | 
				
			||||||
	host, port := "127.0.0.1", "1433"
 | 
						host, port := "127.0.0.1", "1433"
 | 
				
			||||||
	if strings.Contains(info, ":") {
 | 
						if strings.Contains(info, ":") {
 | 
				
			||||||
@@ -214,14 +227,7 @@ func getEngine() (*xorm.Engine, error) {
 | 
				
			|||||||
				DbCfg.User, DbCfg.Passwd, DbCfg.Host, DbCfg.Name, Param)
 | 
									DbCfg.User, DbCfg.Passwd, DbCfg.Host, DbCfg.Name, Param)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	case "postgres":
 | 
						case "postgres":
 | 
				
			||||||
		host, port := parsePostgreSQLHostPort(DbCfg.Host)
 | 
							connStr = getPostgreSQLConnectionString(DbCfg.Host, DbCfg.User, DbCfg.Passwd, DbCfg.Name, Param, DbCfg.SSLMode)
 | 
				
			||||||
		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)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	case "mssql":
 | 
						case "mssql":
 | 
				
			||||||
		host, port := parseMSSQLHostPort(DbCfg.Host)
 | 
							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)
 | 
							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 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
 | 
					// Use of this source code is governed by a MIT-style
 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					// 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)
 | 
							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