Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 27 additions & 1 deletion vault/responses.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,25 @@ type defaultResponse struct {
secret *api.Secret
}

// authAsData converts secret.Auth into a map[string]any via JSON roundtrip.
// Vault endpoints like auth/token/create return data in the "auth" field
// instead of "data", so this allows those responses to be consumed as
// standard secret data.
func (r *defaultResponse) authAsData() map[string]any {
if r.secret == nil || r.secret.Auth == nil {
return nil
}
b, err := json.Marshal(r.secret.Auth)
if err != nil {
return nil
}
var d map[string]any
if err := json.Unmarshal(b, &d); err != nil {
return nil
}
return d
}

func (r *defaultResponse) WrapInfo() *api.SecretWrapInfo {
if r.secret != nil {
return r.secret.WrapInfo
Expand All @@ -42,6 +61,9 @@ func (r *defaultResponse) SecretK8sData(opt *helpers.SecretTransformationOption)
var rawData map[string]interface{}
if r.secret != nil {
rawData = r.secret.Data
if rawData == nil {
rawData = r.authAsData()
}
}

var wrapData map[string]any
Expand All @@ -67,7 +89,11 @@ func (r *defaultResponse) Data() map[string]any {
return nil
}

return r.secret.Data
if r.secret.Data != nil {
return r.secret.Data
}

return r.authAsData()
}

type kvV1Response struct {
Expand Down
102 changes: 102 additions & 0 deletions vault/responses_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,46 @@ func Test_defaultResponse_Data(t *testing.T) {
},
},
},
{
name: "auth-fallback-nil-data",
respFunc: respFunc,
secret: &api.Secret{
Auth: &api.SecretAuth{
ClientToken: "s.abc123",
Accessor: "accessor-xyz",
Policies: []string{"default", "prometheus"},
Renewable: true,
},
},
want: map[string]interface{}{
"client_token": "s.abc123",
"accessor": "accessor-xyz",
"policies": []interface{}{"default", "prometheus"},
"renewable": true,
"lease_duration": float64(0),
"token_policies": interface{}(nil),
"identity_policies": interface{}(nil),
"metadata": interface{}(nil),
"entity_id": "",
"orphan": false,
"mfa_requirement": interface{}(nil),
},
},
{
name: "data-takes-precedence-over-auth",
respFunc: respFunc,
secret: &api.Secret{
Data: map[string]interface{}{
"key": "from-data",
},
Auth: &api.SecretAuth{
ClientToken: "s.abc123",
},
},
want: map[string]interface{}{
"key": "from-data",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Expand Down Expand Up @@ -229,6 +269,68 @@ func Test_defaultResponse_SecretK8sData(t *testing.T) {
return assert.EqualError(t, err, "json: unsupported type: chan int")
},
},
{
name: "auth-fallback-token-create",
respFunc: respFunc,
secret: &api.Secret{
Auth: &api.SecretAuth{
ClientToken: "s.abc123",
Accessor: "accessor-xyz",
Renewable: true,
},
},
want: map[string][]byte{
"client_token": []byte("s.abc123"),
"accessor": []byte("accessor-xyz"),
"renewable": []byte("true"),
"orphan": []byte("false"),
"lease_duration": []byte("0"),
"entity_id": []byte(""),
"policies": []byte(`null`),
"token_policies": []byte(`null`),
"identity_policies": []byte(`null`),
"metadata": []byte(`null`),
"mfa_requirement": []byte(`null`),
helpers.SecretDataKeyRaw: []byte(`{"accessor":"accessor-xyz","client_token":"s.abc123","entity_id":"","identity_policies":null,"lease_duration":0,"metadata":null,"mfa_requirement":null,"orphan":false,"policies":null,"renewable":true,"token_policies":null}`),
},
wantErr: assert.NoError,
},
{
name: "auth-fallback-with-template",
respFunc: respFunc,
secret: &api.Secret{
Auth: &api.SecretAuth{
ClientToken: "s.abc123",
},
},
opt: &helpers.SecretTransformationOption{
KeyedTemplates: []*helpers.KeyedTemplate{
{
Key: "token",
Template: secretsv1beta1.Template{
Name: "tmpl1",
Text: `{{ get .Secrets "client_token" }}`,
},
},
},
},
want: map[string][]byte{
"client_token": []byte("s.abc123"),
"accessor": []byte(""),
"renewable": []byte("false"),
"orphan": []byte("false"),
"lease_duration": []byte("0"),
"entity_id": []byte(""),
"policies": []byte(`null`),
"token_policies": []byte(`null`),
"identity_policies": []byte(`null`),
"metadata": []byte(`null`),
"mfa_requirement": []byte(`null`),
"token": []byte("s.abc123"),
helpers.SecretDataKeyRaw: []byte(`{"accessor":"","client_token":"s.abc123","entity_id":"","identity_policies":null,"lease_duration":0,"metadata":null,"mfa_requirement":null,"orphan":false,"policies":null,"renewable":false,"token_policies":null}`),
},
wantErr: assert.NoError,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Expand Down
Loading