Skip to content

Commit de52964

Browse files
committed
generified dynamic/rotated secret values to return json string
Signed-off-by: Kobbi Gal <[email protected]>
1 parent 8f47044 commit de52964

File tree

3 files changed

+43
-86
lines changed

3 files changed

+43
-86
lines changed

secretstores/akeyless/akeyless.go

Lines changed: 15 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -342,29 +342,29 @@ func (a *akeylessSecretStore) GetSingleSecretValue(secretName string, secretType
342342
break
343343
}
344344

345-
// assert type of secretRespMap to DynamicSecretResponse
346-
var dynamicSecretResp DynamicSecretResponse
345+
// Parse response to extract value and check for errors
346+
var dynamicSecretResp struct {
347+
Value string `json:"value"`
348+
Error string `json:"error"`
349+
}
347350
jsonBytes, marshalErr := json.Marshal(secretRespMap)
348351
if marshalErr != nil {
349352
err = fmt.Errorf("failed to marshal secret response to JSON: %w", marshalErr)
350353
break
351354
}
352-
if unmarshalErr := json.Unmarshal([]byte(jsonBytes), &dynamicSecretResp); unmarshalErr != nil {
353-
err = fmt.Errorf("failed to unmarshal secret response to DynamicSecretResponse: %w", unmarshalErr)
355+
if unmarshalErr := json.Unmarshal(jsonBytes, &dynamicSecretResp); unmarshalErr != nil {
356+
err = fmt.Errorf("failed to unmarshal secret response: %w", unmarshalErr)
354357
break
355358
}
356359

357-
// take only relevant fields (DisplayName and SecretText) from response and marshal it to a JSON string
358-
dynamicSecretResp.Secret.AppID = ""
359-
dynamicSecretResp.Secret.EndDateTime = ""
360-
dynamicSecretResp.Secret.KeyID = ""
361-
dynamicSecretResp.Secret.TenantID = ""
362-
jsonBytes, marshalErr = json.Marshal(dynamicSecretResp.Secret)
363-
if marshalErr != nil {
364-
err = fmt.Errorf("failed to marshal secret response to JSON: %w", marshalErr)
360+
// Check if the response contains an error
361+
if dynamicSecretResp.Error != "" {
362+
err = fmt.Errorf("dynamic secret retrieval error: %s", dynamicSecretResp.Error)
365363
break
366364
}
367-
secretValue = string(jsonBytes)
365+
366+
// Return the value field directly (already a JSON string with credentials)
367+
secretValue = dynamicSecretResp.Value
368368

369369
case AKEYLESS_SECRET_TYPE_ROTATED_SECRET_RESPONSE:
370370
getRotatedSecretValue := akeyless.NewGetRotatedSecretValue(secretName)
@@ -375,23 +375,10 @@ func (a *akeylessSecretStore) GetSingleSecretValue(secretName string, secretType
375375
break
376376
}
377377

378-
// assert type of secretRespMap to RotatedSecretResponse
379-
var rotatedSecretResp RotatedSecretResponse
378+
// Marshal the entire response value object
380379
jsonBytes, marshalErr := json.Marshal(secretRespMap)
381380
if marshalErr != nil {
382-
err = fmt.Errorf("failed to marshal secret response to JSON: %w", marshalErr)
383-
break
384-
}
385-
if unmarshalErr := json.Unmarshal([]byte(jsonBytes), &rotatedSecretResp); unmarshalErr != nil {
386-
err = fmt.Errorf("failed to unmarshal secret response to RotatedSecretResponse: %w", unmarshalErr)
387-
break
388-
}
389-
390-
// take only relevant fields (Username and Password) from response and marshal it to a JSON string
391-
rotatedSecretResp.Value.ApplicationID = ""
392-
jsonBytes, marshalErr = json.Marshal(rotatedSecretResp.Value)
393-
if marshalErr != nil {
394-
err = fmt.Errorf("failed to marshal secret response to JSON: %w", marshalErr)
381+
err = fmt.Errorf("failed to marshal rotated secret response to JSON: %w", marshalErr)
395382
break
396383
}
397384
secretValue = string(jsonBytes)

secretstores/akeyless/akeyless_test.go

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -75,18 +75,9 @@ var (
7575
},
7676
},
7777
}
78-
mockGetSingleDynamicSecretValueResponse = DynamicSecretResponse{
79-
ID: "{\"secret_name\": \"tmp.p-1234567890.GV7LR\",\"secret_key_id\": \"1234567890\"}",
80-
Msg: "User has been added successfully to the following Group(s): [] Role(s): [] Expires on Thu Sep 25 15:54:06 UTC 2025",
81-
Secret: DynamicSecretSecret{
82-
AppID: "1234567890",
83-
DisplayName: "tmp.p-1234567890.GV7LR",
84-
EndDateTime: "2025-09-26T14:54:05.1643791Z",
85-
KeyID: "1234567890",
86-
SecretText: testSecretValue,
87-
TenantID: "1234567890",
88-
},
89-
TTLInMinutes: "60",
78+
mockGetSingleDynamicSecretValueResponse = map[string]interface{}{
79+
"value": "{\"user\":\"generated_username\",\"password\":\"generated_password\",\"ttl_in_minutes\":\"60\",\"id\":\"username\"}",
80+
"error": "",
9081
}
9182
mockDescribeRotatedSecretName = fmt.Sprintf("/path/to/akeyless%s", mockRotatedSecretItemName)
9283
mockDescribeRotatedSecretType = AKEYLESS_SECRET_TYPE_ROTATED_SECRET_RESPONSE
@@ -100,11 +91,11 @@ var (
10091
},
10192
},
10293
}
103-
mockGetSingleRotatedSecretValueResponse = RotatedSecretResponse{
104-
Value: RotatedSecretValue{
105-
Username: "abcdefghijklmnopqrstuvwxyz",
106-
Password: testSecretValue,
107-
ApplicationID: "1234567890",
94+
mockGetSingleRotatedSecretValueResponse = map[string]interface{}{
95+
"value": map[string]interface{}{
96+
"username": "abcdefghijklmnopqrstuvwxyz",
97+
"password": testSecretValue,
98+
"application_id": "1234567890",
10899
},
109100
}
110101
)
@@ -706,7 +697,7 @@ func TestGetSingleDynamicSecret(t *testing.T) {
706697

707698
secretValue, err := store.GetSingleSecretValue(mockDescribeDynamicSecretName, AKEYLESS_SECRET_TYPE_DYNAMIC_SECRET_RESPONSE)
708699
assert.NoError(t, err)
709-
assert.Equal(t, "{\"displayName\":\"tmp.p-1234567890.GV7LR\",\"secretText\":\"r3vE4L3D\"}", secretValue)
700+
assert.Equal(t, "{\"user\":\"generated_username\",\"password\":\"generated_password\",\"ttl_in_minutes\":\"60\",\"id\":\"username\"}", secretValue)
710701

711702
mockGateway.Close()
712703
}
@@ -758,7 +749,7 @@ func TestGetSingleRotatedSecret(t *testing.T) {
758749

759750
secretValue, err := store.GetSingleSecretValue(mockDescribeRotatedSecretName, AKEYLESS_SECRET_TYPE_ROTATED_SECRET_RESPONSE)
760751
assert.NoError(t, err)
761-
assert.Equal(t, "{\"username\":\"abcdefghijklmnopqrstuvwxyz\",\"password\":\"r3vE4L3D\"}", secretValue)
752+
assert.Equal(t, "{\"value\":{\"application_id\":\"1234567890\",\"password\":\"r3vE4L3D\",\"username\":\"abcdefghijklmnopqrstuvwxyz\"}}", secretValue)
762753

763754
mockGateway.Close()
764755
}
@@ -859,13 +850,13 @@ func TestGetBulkSecretValues(t *testing.T) {
859850
// Check dynamic secret
860851
dynamicSecretKey := "/path/to/akeyless/dynamic-secret-test"
861852
assert.Contains(t, response.Data, dynamicSecretKey)
862-
expectedDynamicValue := "{\"displayName\":\"tmp.p-1234567890.GV7LR\",\"secretText\":\"r3vE4L3D\"}"
853+
expectedDynamicValue := "{\"user\":\"generated_username\",\"password\":\"generated_password\",\"ttl_in_minutes\":\"60\",\"id\":\"username\"}"
863854
assert.Equal(t, expectedDynamicValue, response.Data[dynamicSecretKey][dynamicSecretKey])
864855

865856
// Check rotated secret
866857
rotatedSecretKey := "/path/to/akeyless/rotated-secret-test"
867858
assert.Contains(t, response.Data, rotatedSecretKey)
868-
assert.Equal(t, "{\"username\":\"abcdefghijklmnopqrstuvwxyz\",\"password\":\"r3vE4L3D\"}", response.Data[rotatedSecretKey][rotatedSecretKey])
859+
assert.Equal(t, "{\"value\":{\"application_id\":\"1234567890\",\"password\":\"r3vE4L3D\",\"username\":\"abcdefghijklmnopqrstuvwxyz\"}}", response.Data[rotatedSecretKey][rotatedSecretKey])
869860

870861
mockGateway.Close()
871862
}
@@ -1029,18 +1020,23 @@ func TestGetBulkSecretValuesFromDifferentPaths(t *testing.T) {
10291020

10301021
case "/get-dynamic-secret-value":
10311022
// Create dynamic secret responses for each secret
1032-
var dynamicSecretResponse DynamicSecretResponse
1033-
dynamicSecretResponse.Secret.SecretText = "dynamic-secret-1-value"
1034-
dynamicSecretResponse.Secret.DisplayName = "dynamic-secret-1"
1023+
dynamicSecretResponse := map[string]interface{}{
1024+
"value": "{\"user\":\"dynamic-secret-1\",\"password\":\"dynamic-secret-1-value\",\"ttl_in_minutes\":\"60\",\"id\":\"dynamic-secret-1\"}",
1025+
"error": "",
1026+
}
10351027
jsonResponse, _ := json.Marshal(&dynamicSecretResponse)
10361028
w.WriteHeader(http.StatusOK)
10371029
w.Write(jsonResponse)
10381030

10391031
case "/get-rotated-secret-value":
10401032
// Create rotated secret response
1041-
var rotatedSecretResponse RotatedSecretResponse
1042-
rotatedSecretResponse.Value.Username = "rotated-user"
1043-
rotatedSecretResponse.Value.Password = "rotated-secret-1-value"
1033+
rotatedSecretResponse := map[string]interface{}{
1034+
"value": map[string]interface{}{
1035+
"username": "rotated-user",
1036+
"password": "rotated-secret-1-value",
1037+
"application_id": "1234567890",
1038+
},
1039+
}
10441040
jsonResponse, _ := json.Marshal(&rotatedSecretResponse)
10451041
w.WriteHeader(http.StatusOK)
10461042
w.Write(jsonResponse)
@@ -1144,25 +1140,25 @@ func TestGetBulkSecretValuesFromDifferentPaths(t *testing.T) {
11441140

11451141
// Check dynamic secrets from /path/to/dynamic/secrets
11461142
assert.Contains(t, response.Data, dynamicSecret1)
1147-
expectedDynamicValue1 := "{\"displayName\":\"dynamic-secret-1\",\"secretText\":\"dynamic-secret-1-value\"}"
1143+
expectedDynamicValue1 := "{\"user\":\"dynamic-secret-1\",\"password\":\"dynamic-secret-1-value\",\"ttl_in_minutes\":\"60\",\"id\":\"dynamic-secret-1\"}"
11481144
assert.Equal(t, expectedDynamicValue1, response.Data[dynamicSecret1][dynamicSecret1])
11491145
assert.Contains(t, response.Data, dynamicSecret2)
1150-
expectedDynamicValue2 := "{\"displayName\":\"dynamic-secret-1\",\"secretText\":\"dynamic-secret-1-value\"}"
1146+
expectedDynamicValue2 := "{\"user\":\"dynamic-secret-1\",\"password\":\"dynamic-secret-1-value\",\"ttl_in_minutes\":\"60\",\"id\":\"dynamic-secret-1\"}"
11511147
assert.Equal(t, expectedDynamicValue2, response.Data[dynamicSecret2][dynamicSecret2])
11521148

11531149
// Check rotated secret from /path/to/rotated/secrets
11541150
assert.Contains(t, response.Data, rotatedSecret1)
1155-
expectedRotatedValue1 := "{\"username\":\"rotated-user\",\"password\":\"rotated-secret-1-value\"}"
1151+
expectedRotatedValue1 := "{\"value\":{\"application_id\":\"1234567890\",\"password\":\"rotated-secret-1-value\",\"username\":\"rotated-user\"}}"
11561152
assert.Equal(t, expectedRotatedValue1, response.Data[rotatedSecret1][rotatedSecret1])
11571153

11581154
// Check mixed secrets from /path/to/mixed/secrets
11591155
assert.Contains(t, response.Data, mixedStaticSecret)
11601156
assert.Equal(t, "mixed-static-secret-value", response.Data[mixedStaticSecret][mixedStaticSecret])
11611157
assert.Contains(t, response.Data, mixedDynamicSecret)
1162-
expectedMixedDynamicValue := "{\"displayName\":\"dynamic-secret-1\",\"secretText\":\"dynamic-secret-1-value\"}"
1158+
expectedMixedDynamicValue := "{\"user\":\"dynamic-secret-1\",\"password\":\"dynamic-secret-1-value\",\"ttl_in_minutes\":\"60\",\"id\":\"dynamic-secret-1\"}"
11631159
assert.Equal(t, expectedMixedDynamicValue, response.Data[mixedDynamicSecret][mixedDynamicSecret])
11641160
assert.Contains(t, response.Data, mixedRotatedSecret)
1165-
expectedMixedRotatedValue := "{\"username\":\"rotated-user\",\"password\":\"rotated-secret-1-value\"}"
1161+
expectedMixedRotatedValue := "{\"value\":{\"application_id\":\"1234567890\",\"password\":\"rotated-secret-1-value\",\"username\":\"rotated-user\"}}"
11661162
assert.Equal(t, expectedMixedRotatedValue, response.Data[mixedRotatedSecret][mixedRotatedSecret])
11671163

11681164
mockGateway.Close()

secretstores/akeyless/utils.go

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -73,32 +73,6 @@ func GetAccessTypeDisplayName(typeChar string) (string, error) {
7373
return displayName, nil
7474
}
7575

76-
type DynamicSecretResponse struct {
77-
ID string `json:"id"`
78-
Msg string `json:"msg"`
79-
Secret DynamicSecretSecret `json:"secret"`
80-
TTLInMinutes string `json:"ttl_in_minutes"`
81-
}
82-
83-
type DynamicSecretSecret struct {
84-
AppID string `json:"appId,omitempty"`
85-
DisplayName string `json:"displayName"`
86-
EndDateTime string `json:"endDateTime,omitempty"`
87-
KeyID string `json:"keyId,omitempty"`
88-
SecretText string `json:"secretText"`
89-
TenantID string `json:"tenantId,omitempty"`
90-
}
91-
92-
type RotatedSecretResponse struct {
93-
Value RotatedSecretValue `json:"value"`
94-
}
95-
96-
type RotatedSecretValue struct {
97-
Username string `json:"username"`
98-
Password string `json:"password"`
99-
ApplicationID string `json:"application_id,omitempty"`
100-
}
101-
10276
func GetDaprSingleSecretResponse(secretName string, secretValue string) (secretstores.GetSecretResponse, error) {
10377
return secretstores.GetSecretResponse{
10478
Data: map[string]string{

0 commit comments

Comments
 (0)