Skip to content

Commit f56ca73

Browse files
authored
Merge pull request #2496 from shv-ng/fix-empty-user-default
Fix empty user in connection string defaulting to OS user
2 parents 91c80f1 + 17b628d commit f56ca73

2 files changed

Lines changed: 59 additions & 1 deletion

File tree

pgconn/config.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,9 @@ func parseURLSettings(connString string) (map[string]string, error) {
491491
}
492492

493493
if parsedURL.User != nil {
494-
settings["user"] = parsedURL.User.Username()
494+
if u := parsedURL.User.Username(); u != "" {
495+
settings["user"] = u
496+
}
495497
if password, present := parsedURL.User.Password(); present {
496498
settings["password"] = password
497499
}
@@ -618,6 +620,9 @@ func parseKeywordValueSettings(s string) (map[string]string, error) {
618620
return nil, errors.New("invalid keyword/value")
619621
}
620622

623+
if key == "user" && val == "" {
624+
continue
625+
}
621626
settings[key] = val
622627
}
623628

pgconn/config_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,3 +1145,56 @@ application_name = spaced string
11451145
assertConfigsEqual(t, tt.config, config, fmt.Sprintf("Test %d (%s)", i, tt.name))
11461146
}
11471147
}
1148+
1149+
func TestParseConfigExplicitEmptyUserDefaultsToOSUser(t *testing.T) {
1150+
skipOnWindows(t)
1151+
clearPgEnvvars(t)
1152+
1153+
currentUser, err := user.Current()
1154+
if err != nil {
1155+
t.Skip("cannot determine current OS user")
1156+
}
1157+
1158+
tests := []struct {
1159+
name string
1160+
connString string
1161+
expected string
1162+
}{
1163+
{
1164+
name: "keyword value explicit empty user",
1165+
connString: "host=localhost dbname=test user=",
1166+
expected: currentUser.Username,
1167+
},
1168+
{
1169+
name: "keyword value quoted empty user",
1170+
connString: "host=localhost dbname=test user=''",
1171+
expected: currentUser.Username,
1172+
},
1173+
{
1174+
name: "url explicit empty user without password",
1175+
connString: "postgres://@localhost/test",
1176+
expected: currentUser.Username,
1177+
},
1178+
{
1179+
name: "url explicit empty user with password",
1180+
connString: "postgres://:secret@localhost/test",
1181+
expected: currentUser.Username,
1182+
},
1183+
}
1184+
1185+
for i, tt := range tests {
1186+
config, err := pgconn.ParseConfig(tt.connString)
1187+
if !assert.NoErrorf(t, err, "Test %d (%s)", i, tt.name) {
1188+
continue
1189+
}
1190+
1191+
assert.Equalf(
1192+
t,
1193+
tt.expected,
1194+
config.User,
1195+
"Test %d (%s): unexpected user",
1196+
i,
1197+
tt.name,
1198+
)
1199+
}
1200+
}

0 commit comments

Comments
 (0)