Skip to content

Commit

Permalink
fix: [2.4] metastore privilege name check with privilege name all (#3…
Browse files Browse the repository at this point in the history
…9493)

cherry-pick from master: #39476
related: #39365

Signed-off-by: shaoting-huang <shaoting.huang@zilliz.com>
  • Loading branch information
shaoting-huang authored Jan 26, 2025
1 parent 6eadcac commit ecd1ea5
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 17 deletions.
32 changes: 15 additions & 17 deletions internal/rootcoord/root_coord.go
Original file line number Diff line number Diff line change
Expand Up @@ -624,15 +624,11 @@ func (c *Core) initBuiltinRoles() error {
return errors.Wrapf(err, "failed to create a builtin role: %s", role)
}
for _, privilege := range privilegesJSON[util.RoleConfigPrivileges] {
privilegeName := privilege[util.RoleConfigPrivilege]
if !util.IsAnyWord(privilege[util.RoleConfigPrivilege]) {
dbPrivName, err := c.getMetastorePrivilegeName(c.ctx, privilege[util.RoleConfigPrivilege])
if err != nil {
return errors.Wrapf(err, "failed to get metastore privilege name for: %s", privilege[util.RoleConfigPrivilege])
}
privilegeName = dbPrivName
privilegeName, err := c.getMetastorePrivilegeName(c.ctx, privilege[util.RoleConfigPrivilege])
if err != nil {
return errors.Wrapf(err, "failed to get metastore privilege name for: %s", privilege[util.RoleConfigPrivilege])
}
err := c.meta.OperatePrivilege(util.DefaultTenant, &milvuspb.GrantEntity{
err = c.meta.OperatePrivilege(util.DefaultTenant, &milvuspb.GrantEntity{
Role: &milvuspb.RoleEntity{Name: role},
Object: &milvuspb.ObjectEntity{Name: privilege[util.RoleConfigObjectType]},
ObjectName: privilege[util.RoleConfigObjectName],
Expand Down Expand Up @@ -2664,16 +2660,14 @@ func (c *Core) OperatePrivilege(ctx context.Context, in *milvuspb.OperatePrivile

redoTask := newBaseRedoTask(c.stepExecutor)
redoTask.AddSyncStep(NewSimpleStep("operate privilege meta data", func(ctx context.Context) ([]nestedStep, error) {
if !util.IsAnyWord(privName) {
// set up privilege name for metastore
dbPrivName, err := c.getMetastorePrivilegeName(ctx, privName)
if err != nil {
return nil, err
}
in.Entity.Grantor.Privilege.Name = dbPrivName
// set up privilege name for metastore
dbPrivName, err := c.getMetastorePrivilegeName(ctx, privName)
if err != nil {
return nil, err
}
in.Entity.Grantor.Privilege.Name = dbPrivName

err := c.meta.OperatePrivilege(util.DefaultTenant, in.Entity, in.Type)
err = c.meta.OperatePrivilege(util.DefaultTenant, in.Entity, in.Type)
if err != nil && !common.IsIgnorableError(err) {
log.Warn("fail to operate the privilege", zap.Any("in", in), zap.Error(err))
return nil, err
Expand Down Expand Up @@ -2822,6 +2816,10 @@ func (c *Core) validatePrivilegeGroupParams(ctx context.Context, entity string,
}

func (c *Core) getMetastorePrivilegeName(ctx context.Context, privName string) (string, error) {
// if it is '*', return directly
if util.IsAnyWord(privName) {
return privName, nil
}
// if it is built-in privilege, return the privilege name directly
if util.IsPrivilegeNameDefined(privName) {
return util.PrivilegeNameForMetastore(privName), nil
Expand All @@ -2834,7 +2832,7 @@ func (c *Core) getMetastorePrivilegeName(ctx context.Context, privName string) (
if customGroup {
return util.PrivilegeGroupNameForMetastore(privName), nil
}
return "", errors.New("not found the privilege name")
return "", errors.Newf("not found the privilege name [%s] from metastore", privName)
}

// SelectGrant select grant
Expand Down
34 changes: 34 additions & 0 deletions internal/rootcoord/root_coord_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1993,6 +1993,40 @@ func TestCore_RestoreRBAC(t *testing.T) {
assert.False(t, merr.Ok(resp))
}

func TestCore_getMetastorePrivilegeName(t *testing.T) {
meta := mockrootcoord.NewIMetaTable(t)
c := newTestCore(withHealthyCode(), withMeta(meta))

priv, err := c.getMetastorePrivilegeName(context.Background(), util.AnyWord)
assert.NoError(t, err)
assert.Equal(t, priv, util.AnyWord)

meta.EXPECT().IsCustomPrivilegeGroup("unknown").Return(false, nil)
_, err = c.getMetastorePrivilegeName(context.Background(), "unknown")
assert.Equal(t, err.Error(), "not found the privilege name [unknown] from metastore")
}

func TestCore_expandPrivilegeGroup(t *testing.T) {
meta := mockrootcoord.NewIMetaTable(t)
c := newTestCore(withHealthyCode(), withMeta(meta))

grants := []*milvuspb.GrantEntity{
{
ObjectName: "*",
Object: &milvuspb.ObjectEntity{
Name: "Global",
},
Role: &milvuspb.RoleEntity{Name: "role"},
Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: "*"}},
},
}
groups := map[string][]*milvuspb.PrivilegeEntity{}
expandGrants, err := c.expandPrivilegeGroups(grants, groups)
assert.NoError(t, err)
assert.Equal(t, len(expandGrants), len(grants))
assert.Equal(t, expandGrants[0].Grantor.Privilege.Name, grants[0].Grantor.Privilege.Name)
}

type RootCoordSuite struct {
suite.Suite
}
Expand Down

0 comments on commit ecd1ea5

Please sign in to comment.