* 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>
161 lines
4.1 KiB
Go
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)
|
|
}
|
|
})
|
|
}
|
|
}
|