From aaa2a821ae5199c4df03592aa0b5ff376f985768 Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Tue, 31 Jan 2023 12:28:59 +0000 Subject: [PATCH] [v9.3.x] Plugins: Fix circular reference in customOptions leading to MarshalJSON errors (#62564) Plugins: Fix circular reference in customOptions leading to MarshalJSON errors (#62328) * Plugins: test ds.JsonData.MarshalJSON() * CustomOptions: copy to avoid cyclic marshal (cherry picked from commit c41f97029eed9b84f4c45b38cb7240177b57fd63) Co-authored-by: Yasir Ekinci --- pkg/services/datasources/service/datasource.go | 5 ++++- pkg/services/datasources/service/datasource_test.go | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/pkg/services/datasources/service/datasource.go b/pkg/services/datasources/service/datasource.go index 598dfadb474..03ab6d45404 100644 --- a/pkg/services/datasources/service/datasource.go +++ b/pkg/services/datasources/service/datasource.go @@ -417,7 +417,10 @@ func (s *Service) httpClientOptions(ctx context.Context, ds *datasources.DataSou if ds.JsonData != nil { opts.CustomOptions = ds.JsonData.MustMap() // allow the plugin sdk to get the json data in JSONDataFromHTTPClientOptions - opts.CustomOptions["grafanaData"] = ds.JsonData.MustMap() + opts.CustomOptions["grafanaData"] = make(map[string]interface{}) + for k, v := range opts.CustomOptions { + opts.CustomOptions[k] = v + } } if ds.BasicAuth { password, err := s.DecryptedBasicAuthPassword(ctx, ds) diff --git a/pkg/services/datasources/service/datasource_test.go b/pkg/services/datasources/service/datasource_test.go index b06cb9913fa..f4e41d0a175 100644 --- a/pkg/services/datasources/service/datasource_test.go +++ b/pkg/services/datasources/service/datasource_test.go @@ -363,6 +363,10 @@ func TestService_GetHttpTransport(t *testing.T) { require.NotNil(t, rt) tr := configuredTransport + // make sure we can still marshal the JsonData after httpClientOptions (avoid cycles) + _, err = ds.JsonData.MarshalJSON() + require.NoError(t, err) + require.False(t, tr.TLSClientConfig.InsecureSkipVerify) require.Len(t, tr.TLSClientConfig.RootCAs.Subjects(), 1) require.Equal(t, "server-name", tr.TLSClientConfig.ServerName)