From b5fb1caa7b744e6d8d5995d5a6e306ea15ce2e06 Mon Sep 17 00:00:00 2001 From: Oksana Grishchenko Date: Wed, 20 Nov 2024 11:31:35 +0200 Subject: [PATCH] EVEREST-1680 ConnectionURL fix --- api/database_cluster.go | 21 +++++++++++++-------- api/database_cluster_test.go | 4 ++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/api/database_cluster.go b/api/database_cluster.go index 315707975..d9e1c4523 100644 --- a/api/database_cluster.go +++ b/api/database_cluster.go @@ -411,24 +411,29 @@ func (e *EverestServer) connectionURL(ctx context.Context, db *everestv1alpha1.D if db.Status.Hostname == "" { return nil } - url := url.URL{User: url.UserPassword(user, url.QueryEscape(password))} + var url string + defaultHost := net.JoinHostPort(db.Status.Hostname, fmt.Sprint(db.Status.Port)) switch db.Spec.Engine.Type { case everestv1alpha1.DatabaseEnginePXC: - url.Scheme = "jdbc:mysql" - url.Host = net.JoinHostPort(db.Status.Hostname, fmt.Sprint(db.Status.Port)) + url = queryEscapedUrl("jdbc:mysql", user, password, defaultHost) case everestv1alpha1.DatabaseEnginePSMDB: hosts, err := psmdbHosts(ctx, db, e.kubeClient.GetPods) if err != nil { e.l.Error(err) return nil } - url.Scheme = "mongodb" - url.Host = hosts + url = queryEscapedUrl("mongodb", user, password, hosts) case everestv1alpha1.DatabaseEnginePostgresql: - url.Scheme = "postgres" - url.Host = net.JoinHostPort(db.Status.Hostname, fmt.Sprint(db.Status.Port)) + url = queryEscapedUrl("postgres", user, password, defaultHost) } - return pointer.ToString(url.String()) + return pointer.ToString(url) +} + +// Using own format instead of url.URL bc it uses the password encoding policy which does not encode char like ',' +// however such char may appear in the db passwords +func queryEscapedUrl(scheme, user, password, hosts string) string { + format := "%s://%s:%s@%s" + return fmt.Sprintf(format, scheme, user, url.QueryEscape(password), hosts) } func psmdbHosts( diff --git a/api/database_cluster_test.go b/api/database_cluster_test.go index b7ae22cd2..9ed5cace2 100644 --- a/api/database_cluster_test.go +++ b/api/database_cluster_test.go @@ -223,7 +223,7 @@ func TestConnectionURL(t *testing.T) { }, user: "postgres", password: "55aBDedMF;So|C?^3x|h.dDC", - expected: "postgres://postgres:55aBDedMF%253BSo%257CC%253F%255E3x%257Ch.dDC@postgresql-a5d-pgbouncer.everest.svc:5432", + expected: "postgres://postgres:55aBDedMF%3BSo%7CC%3F%5E3x%7Ch.dDC@postgresql-a5d-pgbouncer.everest.svc:5432", }, { name: "pxc", @@ -234,7 +234,7 @@ func TestConnectionURL(t *testing.T) { }, user: "root", password: ",0#3PdCIc=9CS(do2", - expected: "jdbc:mysql://root:%252C0%25233PdCIc%253D9CS%2528do2@mysql-29o-haproxy.everest:3306", + expected: "jdbc:mysql://root:%2C0%233PdCIc%3D9CS%28do2@mysql-29o-haproxy.everest:3306", }, }