ExtSvcAuth: Assign roles locally (#78669)
* ExtSvcAuth: Assign roles locally * Fix test * HandlePluginStateChanged in the OrgID * Remove Global from command * Use AssignmentOrgID instead of OrgID * Remove unecessary test case
This commit is contained in:
@@ -79,7 +79,7 @@ func (s *AccessControlStore) SaveExternalServiceRole(ctx context.Context, cmd ac
|
||||
func genExternalServiceRole(cmd accesscontrol.SaveExternalServiceRoleCommand) accesscontrol.Role {
|
||||
name := extServiceRoleName(cmd.ExternalServiceID)
|
||||
role := accesscontrol.Role{
|
||||
OrgID: cmd.OrgID,
|
||||
OrgID: accesscontrol.GlobalOrgID, // External Service Roles are global
|
||||
Version: 1,
|
||||
Name: name,
|
||||
UID: accesscontrol.PrefixedRoleUID(name),
|
||||
@@ -90,21 +90,15 @@ func genExternalServiceRole(cmd accesscontrol.SaveExternalServiceRoleCommand) ac
|
||||
Created: time.Now(),
|
||||
Updated: time.Now(),
|
||||
}
|
||||
if cmd.Global {
|
||||
role.OrgID = accesscontrol.GlobalOrgID
|
||||
}
|
||||
return role
|
||||
}
|
||||
|
||||
func genExternalServiceAssignment(cmd accesscontrol.SaveExternalServiceRoleCommand) accesscontrol.UserRole {
|
||||
assignment := accesscontrol.UserRole{
|
||||
OrgID: cmd.OrgID,
|
||||
OrgID: cmd.AssignmentOrgID,
|
||||
UserID: cmd.ServiceAccountID,
|
||||
Created: time.Now(),
|
||||
}
|
||||
if cmd.Global {
|
||||
assignment.OrgID = accesscontrol.GlobalOrgID
|
||||
}
|
||||
return assignment
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ func TestAccessControlStore_SaveExternalServiceRole(t *testing.T) {
|
||||
{
|
||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||
ExternalServiceID: "app1",
|
||||
Global: true,
|
||||
AssignmentOrgID: 1,
|
||||
ServiceAccountID: 1,
|
||||
Permissions: []accesscontrol.Permission{
|
||||
{Action: "users:read", Scope: "users:id:1"},
|
||||
@@ -44,7 +44,7 @@ func TestAccessControlStore_SaveExternalServiceRole(t *testing.T) {
|
||||
{
|
||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||
ExternalServiceID: "app1",
|
||||
Global: true,
|
||||
AssignmentOrgID: 1,
|
||||
ServiceAccountID: 1,
|
||||
Permissions: []accesscontrol.Permission{
|
||||
{Action: "users:read", Scope: "users:id:1"},
|
||||
@@ -55,7 +55,7 @@ func TestAccessControlStore_SaveExternalServiceRole(t *testing.T) {
|
||||
{
|
||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||
ExternalServiceID: "app1",
|
||||
Global: true,
|
||||
AssignmentOrgID: 1,
|
||||
ServiceAccountID: 1,
|
||||
Permissions: []accesscontrol.Permission{
|
||||
{Action: "users:write", Scope: "users:id:1"},
|
||||
@@ -65,51 +65,13 @@ func TestAccessControlStore_SaveExternalServiceRole(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "allow switching role from local to global and back",
|
||||
runs: []run{
|
||||
{
|
||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||
ExternalServiceID: "app1",
|
||||
OrgID: 1,
|
||||
ServiceAccountID: 1,
|
||||
Permissions: []accesscontrol.Permission{
|
||||
{Action: "users:read", Scope: "users:id:1"},
|
||||
{Action: "users:read", Scope: "users:id:2"},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||
ExternalServiceID: "app1",
|
||||
Global: true,
|
||||
ServiceAccountID: 1,
|
||||
Permissions: []accesscontrol.Permission{
|
||||
{Action: "users:read", Scope: "users:id:1"},
|
||||
{Action: "users:read", Scope: "users:id:2"},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||
ExternalServiceID: "app1",
|
||||
OrgID: 1,
|
||||
ServiceAccountID: 1,
|
||||
Permissions: []accesscontrol.Permission{
|
||||
{Action: "users:read", Scope: "users:id:1"},
|
||||
{Action: "users:read", Scope: "users:id:2"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "edge case - remove all permissions",
|
||||
runs: []run{
|
||||
{
|
||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||
ExternalServiceID: "app1",
|
||||
Global: true,
|
||||
AssignmentOrgID: 1,
|
||||
ServiceAccountID: 1,
|
||||
Permissions: []accesscontrol.Permission{
|
||||
{Action: "users:read", Scope: "users:id:1"},
|
||||
@@ -120,7 +82,7 @@ func TestAccessControlStore_SaveExternalServiceRole(t *testing.T) {
|
||||
{
|
||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||
ExternalServiceID: "app1",
|
||||
Global: true,
|
||||
AssignmentOrgID: 1,
|
||||
ServiceAccountID: 1,
|
||||
Permissions: []accesscontrol.Permission{},
|
||||
},
|
||||
@@ -133,14 +95,14 @@ func TestAccessControlStore_SaveExternalServiceRole(t *testing.T) {
|
||||
{
|
||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||
ExternalServiceID: "app1",
|
||||
Global: true,
|
||||
AssignmentOrgID: 1,
|
||||
ServiceAccountID: 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||
ExternalServiceID: "app1",
|
||||
Global: true,
|
||||
AssignmentOrgID: 1,
|
||||
ServiceAccountID: 2,
|
||||
},
|
||||
wantErr: true,
|
||||
@@ -167,8 +129,7 @@ func TestAccessControlStore_SaveExternalServiceRole(t *testing.T) {
|
||||
storedRole, err := getRoleByUID(ctx, sess, accesscontrol.PrefixedRoleUID(extServiceRoleName(tt.runs[i].cmd.ExternalServiceID)))
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, storedRole)
|
||||
require.Equal(t, tt.runs[i].cmd.Global, storedRole.Global(), "Incorrect global state of the role")
|
||||
require.Equal(t, tt.runs[i].cmd.OrgID, storedRole.OrgID, "Incorrect OrgID of the role")
|
||||
require.True(t, storedRole.Global(), "Incorrect global state of the role")
|
||||
|
||||
storedPerm, err := getRolePermissions(ctx, sess, storedRole.ID)
|
||||
require.NoError(t, err)
|
||||
@@ -181,8 +142,7 @@ func TestAccessControlStore_SaveExternalServiceRole(t *testing.T) {
|
||||
has, err := sess.Where("role_id = ? AND user_id = ?", storedRole.ID, tt.runs[i].cmd.ServiceAccountID).Get(&assignment)
|
||||
require.NoError(t, err)
|
||||
require.True(t, has)
|
||||
require.Equal(t, tt.runs[i].cmd.Global, assignment.OrgID == accesscontrol.GlobalOrgID, "Incorrect global state of the assignment")
|
||||
require.Equal(t, tt.runs[i].cmd.OrgID, assignment.OrgID, "Incorrect OrgID for the role assignment")
|
||||
require.Equal(t, tt.runs[i].cmd.AssignmentOrgID, assignment.OrgID, "Incorrect OrgID for the role assignment")
|
||||
|
||||
return nil
|
||||
})
|
||||
@@ -206,27 +166,10 @@ func TestAccessControlStore_DeleteExternalServiceRole(t *testing.T) {
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "delete local role",
|
||||
name: "delete role",
|
||||
init: func(t *testing.T, ctx context.Context, s *AccessControlStore) {
|
||||
errSave := s.SaveExternalServiceRole(ctx, accesscontrol.SaveExternalServiceRoleCommand{
|
||||
OrgID: 2,
|
||||
ExternalServiceID: extID,
|
||||
ServiceAccountID: 3,
|
||||
Permissions: []accesscontrol.Permission{
|
||||
{Action: "users:read", Scope: "users:id:1"},
|
||||
{Action: "users:write", Scope: "users:id:1"},
|
||||
},
|
||||
})
|
||||
require.NoError(t, errSave)
|
||||
},
|
||||
id: extID,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "delete global role",
|
||||
init: func(t *testing.T, ctx context.Context, s *AccessControlStore) {
|
||||
errSave := s.SaveExternalServiceRole(ctx, accesscontrol.SaveExternalServiceRoleCommand{
|
||||
Global: true,
|
||||
AssignmentOrgID: 2,
|
||||
ExternalServiceID: extID,
|
||||
ServiceAccountID: 3,
|
||||
Permissions: []accesscontrol.Permission{
|
||||
|
||||
Reference in New Issue
Block a user