Secrets: Add authz checks for the single-tenant SecureValue client (#108216)

This commit is contained in:
Matheus Macabu
2025-07-21 11:09:07 +02:00
committed by GitHub
parent 47abf5f811
commit f7e55f2c5d
4 changed files with 124 additions and 6 deletions
@@ -4,6 +4,7 @@ import (
"testing"
"github.com/stretchr/testify/require"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/utils/ptr"
@@ -21,11 +22,15 @@ func TestIntegration_SecureValueClient_CRUD(t *testing.T) {
client := ProvideSecureValueClient(
setup.SecureValueService,
validator,
setup.AccessClient,
)
ns := "stacks-1234"
ctx := testutils.CreateUserAuthContext(t.Context(), ns, map[string][]string{
"securevalues:read": {"securevalues:uid:*"},
"securevalues:create": {"securevalues:uid:*"},
"securevalues:read": {"securevalues:uid:*"},
"securevalues:write": {"securevalues:uid:*"},
"securevalues:delete": {"securevalues:uid:*"},
})
nsClient, err := client.Client(ctx, ns)
@@ -107,3 +112,63 @@ func TestIntegration_SecureValueClient_CRUD(t *testing.T) {
require.ErrorIs(t, err, contracts.ErrSecureValueNotFound)
require.Nil(t, read)
}
func Test_SecureValueClient_CRUD_NoPermissions(t *testing.T) {
setup := testutils.Setup(t)
validator := validator.ProvideSecureValueValidator()
client := ProvideSecureValueClient(
setup.SecureValueService,
validator,
setup.AccessClient,
)
ns := "stacks-1234"
ctx := testutils.CreateUserAuthContext(t.Context(), ns, nil)
nsClient, err := client.Client(ctx, ns)
require.NoError(t, err)
require.NotNil(t, nsClient)
sv := &secretv1beta1.SecureValue{
ObjectMeta: metav1.ObjectMeta{
Name: "test-sv",
Namespace: ns,
},
}
unstructured, err := toUnstructured(sv)
require.NoError(t, err)
// Create
created, err := nsClient.Create(ctx, unstructured, metav1.CreateOptions{})
var apiErr *apierrors.StatusError
require.ErrorAs(t, err, &apiErr)
require.Equal(t, apiErr.ErrStatus.Reason, metav1.StatusReasonForbidden)
require.Nil(t, created)
// Read
read, err := nsClient.Get(ctx, sv.Name, metav1.GetOptions{})
require.ErrorAs(t, err, &apiErr)
require.Equal(t, apiErr.ErrStatus.Reason, metav1.StatusReasonForbidden)
require.Nil(t, created)
// Update
updated, err := nsClient.Update(ctx, unstructured, metav1.UpdateOptions{})
require.ErrorAs(t, err, &apiErr)
require.Equal(t, apiErr.ErrStatus.Reason, metav1.StatusReasonForbidden)
require.Nil(t, updated)
// List
list, err := nsClient.List(ctx, metav1.ListOptions{})
require.ErrorAs(t, err, &apiErr)
require.Equal(t, apiErr.ErrStatus.Reason, metav1.StatusReasonForbidden)
require.Nil(t, list)
// Delete
err = nsClient.Delete(ctx, sv.Name, metav1.DeleteOptions{})
require.ErrorAs(t, err, &apiErr)
require.Equal(t, apiErr.ErrStatus.Reason, metav1.StatusReasonForbidden)
require.Nil(t, read)
}