mysql: Fix escaping of '+' character in passwords (#200)

Fixes #199
This commit is contained in:
Matt Snider 2021-03-09 08:46:36 +01:00 committed by GitHub
parent ece2c3c122
commit 08022422d4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 1 deletions

View file

@ -52,7 +52,7 @@ func connectionString(u *url.URL) string {
// Get decoded user:pass
userPassEncoded := u.User.String()
userPass, _ := url.QueryUnescape(userPassEncoded)
userPass, _ := url.PathUnescape(userPassEncoded)
// Build DSN w/ user:pass percent-decoded
normalizedString := ""

View file

@ -78,6 +78,18 @@ func TestConnectionString(t *testing.T) {
require.Equal(t, "duhfsd7s:123!@123!@@tcp(host:123)/foo?flag=on&multiStatements=true", s)
})
t.Run("url encoding", func(t *testing.T) {
u, err := url.Parse("mysql://bob%2Balice:secret%5E%5B%2A%28%29@host:123/foo")
require.NoError(t, err)
require.Equal(t, "bob+alice:secret%5E%5B%2A%28%29", u.User.String())
require.Equal(t, "123", u.Port())
s := connectionString(u)
// ensure that '+' is correctly encoded by url.PathUnescape as '+'
// (not whitespace as url.QueryUnescape generates)
require.Equal(t, "bob+alice:secret^[*()@tcp(host:123)/foo?multiStatements=true", s)
})
t.Run("socket", func(t *testing.T) {
// test with no user/pass
u, err := url.Parse("mysql:///foo?socket=/var/run/mysqld/mysqld.sock&flag=on")