Files
grafana/pkg/storage/unified/apistore/managed_test.go
Alexander ZobninandJo Garnier 294fd943c0 Chore: Update authlib (#110880)
* Chore: Update authlib

* exclude incompatible version of github.com/grafana/gomemcache

* Update go-jose to v4

* fix jose imports

* remove jose v3 from go.mod

* fix tests

* fix serialize

* fix failing live tests

* add v1 of ES256 testkeys. Port tests to use ES256 instead of HS256

* accept more signature algs for okta and azuread

* azure social graph token sig

* accept more signature algs for oauth refresh and jwt auth

* update workspace

* add a static signer for inproc

* rebase and fix ext_jwt

* fix jwt tests

* apply alex patch on gomemcache

* update linting

* fix ext_jwt panic

* update workspaces

---------

Co-authored-by: Jo Garnier <git@jguer.space>
2025-09-15 12:45:15 +02:00

161 lines
4.1 KiB
Go

package apistore
import (
"context"
"testing"
"github.com/go-jose/go-jose/v4/jwt"
"github.com/stretchr/testify/require"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
authnlib "github.com/grafana/authlib/authn"
authtypes "github.com/grafana/authlib/types"
dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1beta1"
provisioning "github.com/grafana/grafana/apps/provisioning/pkg/apis/provisioning/v0alpha1"
"github.com/grafana/grafana/pkg/apimachinery/identity"
"github.com/grafana/grafana/pkg/apimachinery/utils"
serviceauthn "github.com/grafana/grafana/pkg/services/authn"
)
func TestManagedAuthorizer(t *testing.T) {
user := &identity.StaticRequester{Type: authtypes.TypeUser, UserUID: "uuu"}
_, provisioner, err := identity.WithProvisioningIdentity(context.Background(), "default")
require.NoError(t, err)
tests := []struct {
name string
auth authtypes.AuthInfo
obj runtime.Object
old runtime.Object
err string
}{
{
name: "user can create",
auth: user,
obj: &unstructured.Unstructured{},
},
{
name: "provisioning can create",
auth: provisioner,
obj: &dashboard.Dashboard{
ObjectMeta: v1.ObjectMeta{
Annotations: map[string]string{
utils.AnnoKeyManagerKind: string(utils.ManagerKindRepo),
utils.AnnoKeyManagerIdentity: "abc",
},
},
},
},
{
name: "user can not create provisioned resource",
auth: user,
err: "Provisioned resources must be manaaged by the provisioning service account",
obj: &dashboard.Dashboard{
ObjectMeta: v1.ObjectMeta{
Annotations: map[string]string{
utils.AnnoKeyManagerKind: string(utils.ManagerKindRepo),
utils.AnnoKeyManagerIdentity: "abc",
},
},
},
},
{
name: "user can not update provisioned resource",
auth: user,
err: "Provisioned resources must be manaaged by the provisioning service account",
obj: &dashboard.Dashboard{
ObjectMeta: v1.ObjectMeta{
Generation: 1,
},
},
old: &dashboard.Dashboard{
ObjectMeta: v1.ObjectMeta{
Generation: 2,
Annotations: map[string]string{
utils.AnnoKeyManagerKind: string(utils.ManagerKindRepo),
utils.AnnoKeyManagerIdentity: "abc",
},
},
},
},
{
name: "provisioner can remove manager flags",
auth: provisioner,
obj: &dashboard.Dashboard{
ObjectMeta: v1.ObjectMeta{
Generation: 1,
},
},
old: &dashboard.Dashboard{
ObjectMeta: v1.ObjectMeta{
Generation: 2,
Annotations: map[string]string{
utils.AnnoKeyManagerKind: string(utils.ManagerKindRepo),
utils.AnnoKeyManagerIdentity: "abc",
},
},
},
},
{
name: "provisioner can add manager flags",
auth: provisioner,
old: &dashboard.Dashboard{
ObjectMeta: v1.ObjectMeta{
Generation: 1,
},
},
obj: &dashboard.Dashboard{
ObjectMeta: v1.ObjectMeta{
Generation: 2,
Annotations: map[string]string{
utils.AnnoKeyManagerKind: string(utils.ManagerKindRepo),
utils.AnnoKeyManagerIdentity: "abc",
},
},
},
},
{
name: "audience includes provisioning group",
auth: &serviceauthn.Identity{
Type: authtypes.TypeAccessPolicy,
UID: "access-policy:random-uid",
AccessTokenClaims: &authnlib.Claims[authnlib.AccessTokenClaims]{
Claims: jwt.Claims{
Audience: []string{provisioning.GROUP},
},
},
},
obj: &dashboard.Dashboard{
ObjectMeta: v1.ObjectMeta{
Annotations: map[string]string{
utils.AnnoKeyManagerKind: string(utils.ManagerKindRepo),
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
obj, err := utils.MetaAccessor(tt.obj)
require.NoError(t, err)
if tt.old == nil {
err = checkManagerPropertiesOnCreate(tt.auth, obj)
} else {
old, _ := utils.MetaAccessor(tt.old)
err = checkManagerPropertiesOnUpdateSpec(tt.auth, obj, old)
}
if tt.err != "" {
require.Error(t, err, tt.err)
} else {
require.NoError(t, err)
}
})
}
}