259 lines
6.8 KiB
Go
259 lines
6.8 KiB
Go
package authorizer_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
"github.com/influxdata/influxdb"
|
|
"github.com/influxdata/influxdb/authorizer"
|
|
influxdbcontext "github.com/influxdata/influxdb/context"
|
|
"github.com/influxdata/influxdb/mock"
|
|
influxdbtesting "github.com/influxdata/influxdb/testing"
|
|
)
|
|
|
|
type OrgService struct {
|
|
OrgID influxdb.ID
|
|
}
|
|
|
|
func (s *OrgService) FindResourceOrganizationID(ctx context.Context, rt influxdb.ResourceType, id influxdb.ID) (influxdb.ID, error) {
|
|
return s.OrgID, nil
|
|
}
|
|
|
|
func TestURMService_FindUserResourceMappings(t *testing.T) {
|
|
type fields struct {
|
|
UserResourceMappingService influxdb.UserResourceMappingService
|
|
OrgService authorizer.OrganizationService
|
|
}
|
|
type args struct {
|
|
permission influxdb.Permission
|
|
}
|
|
type wants struct {
|
|
err error
|
|
urms []*influxdb.UserResourceMapping
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
fields fields
|
|
args args
|
|
wants wants
|
|
}{
|
|
{
|
|
name: "authorized to see all users",
|
|
fields: fields{
|
|
OrgService: &OrgService{OrgID: 10},
|
|
UserResourceMappingService: &mock.UserResourceMappingService{
|
|
FindMappingsFn: func(ctx context.Context, filter influxdb.UserResourceMappingFilter) ([]*influxdb.UserResourceMapping, int, error) {
|
|
return []*influxdb.UserResourceMapping{
|
|
{
|
|
ResourceID: 1,
|
|
ResourceType: influxdb.BucketsResourceType,
|
|
},
|
|
{
|
|
ResourceID: 2,
|
|
ResourceType: influxdb.BucketsResourceType,
|
|
},
|
|
{
|
|
ResourceID: 3,
|
|
ResourceType: influxdb.BucketsResourceType,
|
|
},
|
|
}, 3, nil
|
|
},
|
|
},
|
|
},
|
|
args: args{
|
|
permission: influxdb.Permission{
|
|
Action: "read",
|
|
Resource: influxdb.Resource{
|
|
Type: influxdb.BucketsResourceType,
|
|
OrgID: influxdbtesting.IDPtr(10),
|
|
},
|
|
},
|
|
},
|
|
wants: wants{
|
|
urms: []*influxdb.UserResourceMapping{
|
|
{
|
|
ResourceID: 1,
|
|
ResourceType: influxdb.BucketsResourceType,
|
|
},
|
|
{
|
|
ResourceID: 2,
|
|
ResourceType: influxdb.BucketsResourceType,
|
|
},
|
|
{
|
|
ResourceID: 3,
|
|
ResourceType: influxdb.BucketsResourceType,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "authorized to see all users",
|
|
fields: fields{
|
|
OrgService: &OrgService{OrgID: 10},
|
|
UserResourceMappingService: &mock.UserResourceMappingService{
|
|
FindMappingsFn: func(ctx context.Context, filter influxdb.UserResourceMappingFilter) ([]*influxdb.UserResourceMapping, int, error) {
|
|
return []*influxdb.UserResourceMapping{
|
|
{
|
|
ResourceID: 1,
|
|
ResourceType: influxdb.BucketsResourceType,
|
|
},
|
|
{
|
|
ResourceID: 2,
|
|
ResourceType: influxdb.BucketsResourceType,
|
|
},
|
|
{
|
|
ResourceID: 3,
|
|
ResourceType: influxdb.BucketsResourceType,
|
|
},
|
|
}, 3, nil
|
|
},
|
|
},
|
|
},
|
|
args: args{
|
|
permission: influxdb.Permission{
|
|
Action: "read",
|
|
Resource: influxdb.Resource{
|
|
Type: influxdb.BucketsResourceType,
|
|
OrgID: influxdbtesting.IDPtr(11),
|
|
},
|
|
},
|
|
},
|
|
wants: wants{
|
|
urms: []*influxdb.UserResourceMapping{},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
s := authorizer.NewURMService(tt.fields.OrgService, tt.fields.UserResourceMappingService)
|
|
|
|
ctx := context.Background()
|
|
ctx = influxdbcontext.SetAuthorizer(ctx, &Authorizer{[]influxdb.Permission{tt.args.permission}})
|
|
|
|
urms, _, err := s.FindUserResourceMappings(ctx, influxdb.UserResourceMappingFilter{})
|
|
influxdbtesting.ErrorsEqual(t, err, tt.wants.err)
|
|
|
|
if diff := cmp.Diff(urms, tt.wants.urms); diff != "" {
|
|
t.Errorf("urms are different -got/+want\ndiff %s", diff)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestURMService_WriteUserResourceMapping(t *testing.T) {
|
|
type fields struct {
|
|
UserResourceMappingService influxdb.UserResourceMappingService
|
|
OrgService authorizer.OrganizationService
|
|
}
|
|
type args struct {
|
|
permission influxdb.Permission
|
|
}
|
|
type wants struct {
|
|
err error
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
fields fields
|
|
args args
|
|
wants wants
|
|
}{
|
|
{
|
|
name: "authorized to write urm",
|
|
fields: fields{
|
|
OrgService: &OrgService{OrgID: 10},
|
|
UserResourceMappingService: &mock.UserResourceMappingService{
|
|
CreateMappingFn: func(ctx context.Context, m *influxdb.UserResourceMapping) error {
|
|
return nil
|
|
},
|
|
DeleteMappingFn: func(ctx context.Context, rid, uid influxdb.ID) error {
|
|
return nil
|
|
},
|
|
FindMappingsFn: func(ctx context.Context, filter influxdb.UserResourceMappingFilter) ([]*influxdb.UserResourceMapping, int, error) {
|
|
return []*influxdb.UserResourceMapping{
|
|
{
|
|
ResourceID: 1,
|
|
ResourceType: influxdb.BucketsResourceType,
|
|
UserID: 100,
|
|
},
|
|
}, 3, nil
|
|
},
|
|
},
|
|
},
|
|
args: args{
|
|
permission: influxdb.Permission{
|
|
Action: "write",
|
|
Resource: influxdb.Resource{
|
|
Type: influxdb.BucketsResourceType,
|
|
OrgID: influxdbtesting.IDPtr(10),
|
|
},
|
|
},
|
|
},
|
|
wants: wants{
|
|
err: nil,
|
|
},
|
|
},
|
|
{
|
|
name: "unauthorized to write urm",
|
|
fields: fields{
|
|
OrgService: &OrgService{OrgID: 10},
|
|
UserResourceMappingService: &mock.UserResourceMappingService{
|
|
CreateMappingFn: func(ctx context.Context, m *influxdb.UserResourceMapping) error {
|
|
return nil
|
|
},
|
|
DeleteMappingFn: func(ctx context.Context, rid, uid influxdb.ID) error {
|
|
return nil
|
|
},
|
|
FindMappingsFn: func(ctx context.Context, filter influxdb.UserResourceMappingFilter) ([]*influxdb.UserResourceMapping, int, error) {
|
|
return []*influxdb.UserResourceMapping{
|
|
{
|
|
ResourceID: 1,
|
|
ResourceType: influxdb.BucketsResourceType,
|
|
UserID: 100,
|
|
},
|
|
}, 3, nil
|
|
},
|
|
},
|
|
},
|
|
args: args{
|
|
permission: influxdb.Permission{
|
|
Action: "write",
|
|
Resource: influxdb.Resource{
|
|
Type: influxdb.BucketsResourceType,
|
|
OrgID: influxdbtesting.IDPtr(11),
|
|
},
|
|
},
|
|
},
|
|
wants: wants{
|
|
err: &influxdb.Error{
|
|
Msg: "write:orgs/000000000000000a/buckets/0000000000000001 is unauthorized",
|
|
Code: influxdb.EUnauthorized,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
s := authorizer.NewURMService(tt.fields.OrgService, tt.fields.UserResourceMappingService)
|
|
|
|
ctx := context.Background()
|
|
ctx = influxdbcontext.SetAuthorizer(ctx, &Authorizer{[]influxdb.Permission{tt.args.permission}})
|
|
|
|
t.Run("create urm", func(t *testing.T) {
|
|
err := s.CreateUserResourceMapping(ctx, &influxdb.UserResourceMapping{ResourceType: influxdb.BucketsResourceType, ResourceID: 1})
|
|
influxdbtesting.ErrorsEqual(t, err, tt.wants.err)
|
|
})
|
|
|
|
t.Run("delete urm", func(t *testing.T) {
|
|
err := s.DeleteUserResourceMapping(ctx, 1, 100)
|
|
influxdbtesting.ErrorsEqual(t, err, tt.wants.err)
|
|
})
|
|
|
|
})
|
|
}
|
|
}
|