Browse Source

fix(webhook): perform conversion of data (#3638)

Instead of assuming that the data fields are strings that can be
converted to byte array, convert the actual type to a byte array.
fixes #3239

Signed-off-by: Doug Goldstein <cardoe@cardoe.com>
Doug Goldstein 1 year ago
parent
commit
93e9b4cef7
2 changed files with 33 additions and 5 deletions
  1. 5 5
      pkg/common/webhook/webhook.go
  2. 28 0
      pkg/provider/webhook/webhook_test.go

+ 5 - 5
pkg/common/webhook/webhook.go

@@ -35,6 +35,7 @@ import (
 	"github.com/external-secrets/external-secrets/pkg/constants"
 	"github.com/external-secrets/external-secrets/pkg/constants"
 	"github.com/external-secrets/external-secrets/pkg/metrics"
 	"github.com/external-secrets/external-secrets/pkg/metrics"
 	"github.com/external-secrets/external-secrets/pkg/template/v2"
 	"github.com/external-secrets/external-secrets/pkg/template/v2"
+	"github.com/external-secrets/external-secrets/pkg/utils"
 	"github.com/external-secrets/external-secrets/pkg/utils/resolvers"
 	"github.com/external-secrets/external-secrets/pkg/utils/resolvers"
 )
 )
 
 
@@ -106,12 +107,11 @@ func (w *Webhook) GetSecretMap(ctx context.Context, provider *Spec, ref *esv1bet
 	}
 	}
 	// Change the map of generic objects to a map of byte arrays
 	// Change the map of generic objects to a map of byte arrays
 	values := make(map[string][]byte)
 	values := make(map[string][]byte)
-	for rKey, rValue := range jsonvalue {
-		jVal, ok := rValue.(string)
-		if !ok {
-			return nil, fmt.Errorf("failed to get response (wrong type in key '%s': %T)", rKey, rValue)
+	for rKey := range jsonvalue {
+		values[rKey], err = utils.GetByteValueFromMap(jsonvalue, rKey)
+		if err != nil {
+			return nil, fmt.Errorf("failed to get response for key '%s': %w", rKey, err)
 		}
 		}
-		values[rKey] = []byte(jVal)
 	}
 	}
 	return values, nil
 	return values, nil
 }
 }

+ 28 - 0
pkg/provider/webhook/webhook_test.go

@@ -299,6 +299,34 @@ want:
   path: /api/getsecret?id=testkey&version=1
   path: /api/getsecret?id=testkey&version=1
   err: ''
   err: ''
   result: "RE/DACTED=="
   result: "RE/DACTED=="
+---
+case: good json with mixed fields and jsonpath filter
+args:
+  url: /api/getsecret?id={{ .remoteRef.key }}&version={{ .remoteRef.version }}
+  key: testkey
+  version: 1
+  jsonpath: $.result.thesecret
+  response: '{"result":{"thesecret":"secret-value","alsosecret":"another-value", "id": 1234, "weight": 1.5}}'
+want:
+  path: /api/getsecret?id=testkey&version=1
+  err: ''
+  result: secret-value
+---
+case: good json with mixed fields to map
+args:
+  url: /api/getsecret?id={{ .remoteRef.key }}&version={{ .remoteRef.version }}
+  key: testkey
+  version: 1
+  jsonpath: $.result
+  response: '{"result":{"thesecret":"secret-value","alsosecret":"another-value", "id": 1234, "weight": 1.5}}'
+want:
+  path: /api/getsecret?id=testkey&version=1
+  err: ''
+  resultmap:
+    thesecret: secret-value
+    alsosecret: another-value
+    id: 1234
+    weight: 1.5
 `
 `
 
 
 func TestWebhookGetSecret(t *testing.T) {
 func TestWebhookGetSecret(t *testing.T) {