mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
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:
parent
5a6ac44902
commit
72d32eed27
@ -762,7 +762,7 @@ func TestService_SaveExternalServiceRole(t *testing.T) {
|
|||||||
runs: []run{
|
runs: []run{
|
||||||
{
|
{
|
||||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||||
OrgID: 2,
|
AssignmentOrgID: 2,
|
||||||
ServiceAccountID: 2,
|
ServiceAccountID: 2,
|
||||||
ExternalServiceID: "App 1",
|
ExternalServiceID: "App 1",
|
||||||
Permissions: []accesscontrol.Permission{{Action: "users:read", Scope: "users:id:1"}},
|
Permissions: []accesscontrol.Permission{{Action: "users:read", Scope: "users:id:1"}},
|
||||||
@ -776,7 +776,7 @@ func TestService_SaveExternalServiceRole(t *testing.T) {
|
|||||||
runs: []run{
|
runs: []run{
|
||||||
{
|
{
|
||||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||||
Global: true,
|
AssignmentOrgID: 1,
|
||||||
ServiceAccountID: 2,
|
ServiceAccountID: 2,
|
||||||
ExternalServiceID: "App 1",
|
ExternalServiceID: "App 1",
|
||||||
Permissions: []accesscontrol.Permission{{Action: "users:read", Scope: "users:id:1"}},
|
Permissions: []accesscontrol.Permission{{Action: "users:read", Scope: "users:id:1"}},
|
||||||
@ -785,7 +785,7 @@ func TestService_SaveExternalServiceRole(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||||
Global: true,
|
AssignmentOrgID: 1,
|
||||||
ServiceAccountID: 2,
|
ServiceAccountID: 2,
|
||||||
ExternalServiceID: "App 1",
|
ExternalServiceID: "App 1",
|
||||||
Permissions: []accesscontrol.Permission{
|
Permissions: []accesscontrol.Permission{
|
||||||
@ -802,7 +802,7 @@ func TestService_SaveExternalServiceRole(t *testing.T) {
|
|||||||
runs: []run{
|
runs: []run{
|
||||||
{
|
{
|
||||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||||
OrgID: 2,
|
AssignmentOrgID: 2,
|
||||||
ExternalServiceID: "App 1",
|
ExternalServiceID: "App 1",
|
||||||
Permissions: []accesscontrol.Permission{{Action: "users:read", Scope: "users:id:1"}},
|
Permissions: []accesscontrol.Permission{{Action: "users:read", Scope: "users:id:1"}},
|
||||||
},
|
},
|
||||||
@ -825,7 +825,7 @@ func TestService_SaveExternalServiceRole(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Check that the permissions and assignment are stored correctly
|
// Check that the permissions and assignment are stored correctly
|
||||||
perms, errGetPerms := ac.getUserPermissions(ctx, &user.SignedInUser{OrgID: r.cmd.OrgID, UserID: 2}, accesscontrol.Options{})
|
perms, errGetPerms := ac.getUserPermissions(ctx, &user.SignedInUser{OrgID: r.cmd.AssignmentOrgID, UserID: 2}, accesscontrol.Options{})
|
||||||
require.NoError(t, errGetPerms)
|
require.NoError(t, errGetPerms)
|
||||||
assert.ElementsMatch(t, r.cmd.Permissions, perms)
|
assert.ElementsMatch(t, r.cmd.Permissions, perms)
|
||||||
}
|
}
|
||||||
@ -848,7 +848,7 @@ func TestService_DeleteExternalServiceRole(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "handles deleting role that exists",
|
name: "handles deleting role that exists",
|
||||||
initCmd: &accesscontrol.SaveExternalServiceRoleCommand{
|
initCmd: &accesscontrol.SaveExternalServiceRoleCommand{
|
||||||
Global: true,
|
AssignmentOrgID: 1,
|
||||||
ServiceAccountID: 2,
|
ServiceAccountID: 2,
|
||||||
ExternalServiceID: "App 1",
|
ExternalServiceID: "App 1",
|
||||||
Permissions: []accesscontrol.Permission{{Action: "users:read", Scope: "users:id:1"}},
|
Permissions: []accesscontrol.Permission{{Action: "users:read", Scope: "users:id:1"}},
|
||||||
@ -877,7 +877,7 @@ func TestService_DeleteExternalServiceRole(t *testing.T) {
|
|||||||
|
|
||||||
if tt.initCmd != nil {
|
if tt.initCmd != nil {
|
||||||
// Check that the permissions and assignment are removed correctly
|
// Check that the permissions and assignment are removed correctly
|
||||||
perms, errGetPerms := ac.getUserPermissions(ctx, &user.SignedInUser{OrgID: tt.initCmd.OrgID, UserID: 2}, accesscontrol.Options{})
|
perms, errGetPerms := ac.getUserPermissions(ctx, &user.SignedInUser{OrgID: tt.initCmd.AssignmentOrgID, UserID: 2}, accesscontrol.Options{})
|
||||||
require.NoError(t, errGetPerms)
|
require.NoError(t, errGetPerms)
|
||||||
assert.Empty(t, perms)
|
assert.Empty(t, perms)
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ func (s *AccessControlStore) SaveExternalServiceRole(ctx context.Context, cmd ac
|
|||||||
func genExternalServiceRole(cmd accesscontrol.SaveExternalServiceRoleCommand) accesscontrol.Role {
|
func genExternalServiceRole(cmd accesscontrol.SaveExternalServiceRoleCommand) accesscontrol.Role {
|
||||||
name := extServiceRoleName(cmd.ExternalServiceID)
|
name := extServiceRoleName(cmd.ExternalServiceID)
|
||||||
role := accesscontrol.Role{
|
role := accesscontrol.Role{
|
||||||
OrgID: cmd.OrgID,
|
OrgID: accesscontrol.GlobalOrgID, // External Service Roles are global
|
||||||
Version: 1,
|
Version: 1,
|
||||||
Name: name,
|
Name: name,
|
||||||
UID: accesscontrol.PrefixedRoleUID(name),
|
UID: accesscontrol.PrefixedRoleUID(name),
|
||||||
@ -90,21 +90,15 @@ func genExternalServiceRole(cmd accesscontrol.SaveExternalServiceRoleCommand) ac
|
|||||||
Created: time.Now(),
|
Created: time.Now(),
|
||||||
Updated: time.Now(),
|
Updated: time.Now(),
|
||||||
}
|
}
|
||||||
if cmd.Global {
|
|
||||||
role.OrgID = accesscontrol.GlobalOrgID
|
|
||||||
}
|
|
||||||
return role
|
return role
|
||||||
}
|
}
|
||||||
|
|
||||||
func genExternalServiceAssignment(cmd accesscontrol.SaveExternalServiceRoleCommand) accesscontrol.UserRole {
|
func genExternalServiceAssignment(cmd accesscontrol.SaveExternalServiceRoleCommand) accesscontrol.UserRole {
|
||||||
assignment := accesscontrol.UserRole{
|
assignment := accesscontrol.UserRole{
|
||||||
OrgID: cmd.OrgID,
|
OrgID: cmd.AssignmentOrgID,
|
||||||
UserID: cmd.ServiceAccountID,
|
UserID: cmd.ServiceAccountID,
|
||||||
Created: time.Now(),
|
Created: time.Now(),
|
||||||
}
|
}
|
||||||
if cmd.Global {
|
|
||||||
assignment.OrgID = accesscontrol.GlobalOrgID
|
|
||||||
}
|
|
||||||
return assignment
|
return assignment
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ func TestAccessControlStore_SaveExternalServiceRole(t *testing.T) {
|
|||||||
{
|
{
|
||||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||||
ExternalServiceID: "app1",
|
ExternalServiceID: "app1",
|
||||||
Global: true,
|
AssignmentOrgID: 1,
|
||||||
ServiceAccountID: 1,
|
ServiceAccountID: 1,
|
||||||
Permissions: []accesscontrol.Permission{
|
Permissions: []accesscontrol.Permission{
|
||||||
{Action: "users:read", Scope: "users:id:1"},
|
{Action: "users:read", Scope: "users:id:1"},
|
||||||
@ -44,7 +44,7 @@ func TestAccessControlStore_SaveExternalServiceRole(t *testing.T) {
|
|||||||
{
|
{
|
||||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||||
ExternalServiceID: "app1",
|
ExternalServiceID: "app1",
|
||||||
Global: true,
|
AssignmentOrgID: 1,
|
||||||
ServiceAccountID: 1,
|
ServiceAccountID: 1,
|
||||||
Permissions: []accesscontrol.Permission{
|
Permissions: []accesscontrol.Permission{
|
||||||
{Action: "users:read", Scope: "users:id:1"},
|
{Action: "users:read", Scope: "users:id:1"},
|
||||||
@ -55,7 +55,7 @@ func TestAccessControlStore_SaveExternalServiceRole(t *testing.T) {
|
|||||||
{
|
{
|
||||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||||
ExternalServiceID: "app1",
|
ExternalServiceID: "app1",
|
||||||
Global: true,
|
AssignmentOrgID: 1,
|
||||||
ServiceAccountID: 1,
|
ServiceAccountID: 1,
|
||||||
Permissions: []accesscontrol.Permission{
|
Permissions: []accesscontrol.Permission{
|
||||||
{Action: "users:write", Scope: "users:id:1"},
|
{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",
|
name: "edge case - remove all permissions",
|
||||||
runs: []run{
|
runs: []run{
|
||||||
{
|
{
|
||||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||||
ExternalServiceID: "app1",
|
ExternalServiceID: "app1",
|
||||||
Global: true,
|
AssignmentOrgID: 1,
|
||||||
ServiceAccountID: 1,
|
ServiceAccountID: 1,
|
||||||
Permissions: []accesscontrol.Permission{
|
Permissions: []accesscontrol.Permission{
|
||||||
{Action: "users:read", Scope: "users:id:1"},
|
{Action: "users:read", Scope: "users:id:1"},
|
||||||
@ -120,7 +82,7 @@ func TestAccessControlStore_SaveExternalServiceRole(t *testing.T) {
|
|||||||
{
|
{
|
||||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||||
ExternalServiceID: "app1",
|
ExternalServiceID: "app1",
|
||||||
Global: true,
|
AssignmentOrgID: 1,
|
||||||
ServiceAccountID: 1,
|
ServiceAccountID: 1,
|
||||||
Permissions: []accesscontrol.Permission{},
|
Permissions: []accesscontrol.Permission{},
|
||||||
},
|
},
|
||||||
@ -133,14 +95,14 @@ func TestAccessControlStore_SaveExternalServiceRole(t *testing.T) {
|
|||||||
{
|
{
|
||||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||||
ExternalServiceID: "app1",
|
ExternalServiceID: "app1",
|
||||||
Global: true,
|
AssignmentOrgID: 1,
|
||||||
ServiceAccountID: 1,
|
ServiceAccountID: 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
cmd: accesscontrol.SaveExternalServiceRoleCommand{
|
||||||
ExternalServiceID: "app1",
|
ExternalServiceID: "app1",
|
||||||
Global: true,
|
AssignmentOrgID: 1,
|
||||||
ServiceAccountID: 2,
|
ServiceAccountID: 2,
|
||||||
},
|
},
|
||||||
wantErr: true,
|
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)))
|
storedRole, err := getRoleByUID(ctx, sess, accesscontrol.PrefixedRoleUID(extServiceRoleName(tt.runs[i].cmd.ExternalServiceID)))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotNil(t, storedRole)
|
require.NotNil(t, storedRole)
|
||||||
require.Equal(t, tt.runs[i].cmd.Global, storedRole.Global(), "Incorrect global state of the role")
|
require.True(t, storedRole.Global(), "Incorrect global state of the role")
|
||||||
require.Equal(t, tt.runs[i].cmd.OrgID, storedRole.OrgID, "Incorrect OrgID of the role")
|
|
||||||
|
|
||||||
storedPerm, err := getRolePermissions(ctx, sess, storedRole.ID)
|
storedPerm, err := getRolePermissions(ctx, sess, storedRole.ID)
|
||||||
require.NoError(t, err)
|
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)
|
has, err := sess.Where("role_id = ? AND user_id = ?", storedRole.ID, tt.runs[i].cmd.ServiceAccountID).Get(&assignment)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.True(t, has)
|
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.AssignmentOrgID, assignment.OrgID, "Incorrect OrgID for the role assignment")
|
||||||
require.Equal(t, tt.runs[i].cmd.OrgID, assignment.OrgID, "Incorrect OrgID for the role assignment")
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
@ -206,27 +166,10 @@ func TestAccessControlStore_DeleteExternalServiceRole(t *testing.T) {
|
|||||||
wantErr: false,
|
wantErr: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "delete local role",
|
name: "delete role",
|
||||||
init: func(t *testing.T, ctx context.Context, s *AccessControlStore) {
|
init: func(t *testing.T, ctx context.Context, s *AccessControlStore) {
|
||||||
errSave := s.SaveExternalServiceRole(ctx, accesscontrol.SaveExternalServiceRoleCommand{
|
errSave := s.SaveExternalServiceRole(ctx, accesscontrol.SaveExternalServiceRoleCommand{
|
||||||
OrgID: 2,
|
AssignmentOrgID: 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,
|
|
||||||
ExternalServiceID: extID,
|
ExternalServiceID: extID,
|
||||||
ServiceAccountID: 3,
|
ServiceAccountID: 3,
|
||||||
Permissions: []accesscontrol.Permission{
|
Permissions: []accesscontrol.Permission{
|
||||||
|
@ -274,8 +274,7 @@ type SetResourcePermissionCommand struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type SaveExternalServiceRoleCommand struct {
|
type SaveExternalServiceRoleCommand struct {
|
||||||
OrgID int64
|
AssignmentOrgID int64
|
||||||
Global bool
|
|
||||||
ExternalServiceID string
|
ExternalServiceID string
|
||||||
ServiceAccountID int64
|
ServiceAccountID int64
|
||||||
Permissions []Permission
|
Permissions []Permission
|
||||||
@ -289,10 +288,6 @@ func (cmd *SaveExternalServiceRoleCommand) Validate() error {
|
|||||||
// slugify the external service id ID for the role to have correct name and uid
|
// slugify the external service id ID for the role to have correct name and uid
|
||||||
cmd.ExternalServiceID = slugify.Slugify(cmd.ExternalServiceID)
|
cmd.ExternalServiceID = slugify.Slugify(cmd.ExternalServiceID)
|
||||||
|
|
||||||
if (cmd.OrgID == GlobalOrgID) != cmd.Global {
|
|
||||||
return fmt.Errorf("invalid org id %d for global role %t", cmd.OrgID, cmd.Global)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check and deduplicate permissions
|
// Check and deduplicate permissions
|
||||||
if cmd.Permissions == nil || len(cmd.Permissions) == 0 {
|
if cmd.Permissions == nil || len(cmd.Permissions) == 0 {
|
||||||
return errors.New("no permissions provided")
|
return errors.New("no permissions provided")
|
||||||
|
@ -15,21 +15,10 @@ func TestSaveExternalServiceRoleCommand_Validate(t *testing.T) {
|
|||||||
wantPermissions []Permission
|
wantPermissions []Permission
|
||||||
wantErr bool
|
wantErr bool
|
||||||
}{
|
}{
|
||||||
{
|
|
||||||
name: "invalid global statement",
|
|
||||||
cmd: SaveExternalServiceRoleCommand{
|
|
||||||
OrgID: 1,
|
|
||||||
Global: true,
|
|
||||||
ExternalServiceID: "app 1",
|
|
||||||
ServiceAccountID: 2,
|
|
||||||
Permissions: []Permission{{Action: "users:read", Scope: "users:id:1"}},
|
|
||||||
},
|
|
||||||
wantErr: true,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: "invalid no permissions",
|
name: "invalid no permissions",
|
||||||
cmd: SaveExternalServiceRoleCommand{
|
cmd: SaveExternalServiceRoleCommand{
|
||||||
OrgID: 1,
|
AssignmentOrgID: 1,
|
||||||
ExternalServiceID: "app 1",
|
ExternalServiceID: "app 1",
|
||||||
ServiceAccountID: 2,
|
ServiceAccountID: 2,
|
||||||
Permissions: []Permission{},
|
Permissions: []Permission{},
|
||||||
@ -39,7 +28,7 @@ func TestSaveExternalServiceRoleCommand_Validate(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "invalid service account id",
|
name: "invalid service account id",
|
||||||
cmd: SaveExternalServiceRoleCommand{
|
cmd: SaveExternalServiceRoleCommand{
|
||||||
OrgID: 1,
|
AssignmentOrgID: 1,
|
||||||
ExternalServiceID: "app 1",
|
ExternalServiceID: "app 1",
|
||||||
ServiceAccountID: -1,
|
ServiceAccountID: -1,
|
||||||
Permissions: []Permission{{Action: "users:read", Scope: "users:id:1"}},
|
Permissions: []Permission{{Action: "users:read", Scope: "users:id:1"}},
|
||||||
@ -49,7 +38,7 @@ func TestSaveExternalServiceRoleCommand_Validate(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "invalid no Ext Service ID",
|
name: "invalid no Ext Service ID",
|
||||||
cmd: SaveExternalServiceRoleCommand{
|
cmd: SaveExternalServiceRoleCommand{
|
||||||
OrgID: 1,
|
AssignmentOrgID: 1,
|
||||||
ServiceAccountID: 2,
|
ServiceAccountID: 2,
|
||||||
Permissions: []Permission{{Action: "users:read", Scope: "users:id:1"}},
|
Permissions: []Permission{{Action: "users:read", Scope: "users:id:1"}},
|
||||||
},
|
},
|
||||||
@ -59,7 +48,7 @@ func TestSaveExternalServiceRoleCommand_Validate(t *testing.T) {
|
|||||||
name: "slugify the external service ID correctly",
|
name: "slugify the external service ID correctly",
|
||||||
cmd: SaveExternalServiceRoleCommand{
|
cmd: SaveExternalServiceRoleCommand{
|
||||||
ExternalServiceID: "ThisIs a Very Strange ___ App Name?",
|
ExternalServiceID: "ThisIs a Very Strange ___ App Name?",
|
||||||
Global: true,
|
AssignmentOrgID: 1,
|
||||||
ServiceAccountID: 2,
|
ServiceAccountID: 2,
|
||||||
Permissions: []Permission{{Action: "users:read", Scope: "users:id:1"}},
|
Permissions: []Permission{{Action: "users:read", Scope: "users:id:1"}},
|
||||||
},
|
},
|
||||||
@ -69,7 +58,7 @@ func TestSaveExternalServiceRoleCommand_Validate(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "invalid empty Action",
|
name: "invalid empty Action",
|
||||||
cmd: SaveExternalServiceRoleCommand{
|
cmd: SaveExternalServiceRoleCommand{
|
||||||
OrgID: 1,
|
AssignmentOrgID: 1,
|
||||||
ExternalServiceID: "app 1",
|
ExternalServiceID: "app 1",
|
||||||
ServiceAccountID: 2,
|
ServiceAccountID: 2,
|
||||||
Permissions: []Permission{{Action: "", Scope: "users:id:1"}},
|
Permissions: []Permission{{Action: "", Scope: "users:id:1"}},
|
||||||
@ -80,7 +69,7 @@ func TestSaveExternalServiceRoleCommand_Validate(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "permission deduplication",
|
name: "permission deduplication",
|
||||||
cmd: SaveExternalServiceRoleCommand{
|
cmd: SaveExternalServiceRoleCommand{
|
||||||
OrgID: 1,
|
AssignmentOrgID: 1,
|
||||||
ExternalServiceID: "app 1",
|
ExternalServiceID: "app 1",
|
||||||
ServiceAccountID: 2,
|
ServiceAccountID: 2,
|
||||||
Permissions: []Permission{
|
Permissions: []Permission{
|
||||||
|
@ -458,7 +458,12 @@ func (*OAuth2ServiceImpl) handleRegistrationPermissions(registration *extsvcauth
|
|||||||
|
|
||||||
// handlePluginStateChanged reset the client authorized grant_types according to the plugin state
|
// handlePluginStateChanged reset the client authorized grant_types according to the plugin state
|
||||||
func (s *OAuth2ServiceImpl) handlePluginStateChanged(ctx context.Context, event *pluginsettings.PluginStateChangedEvent) error {
|
func (s *OAuth2ServiceImpl) handlePluginStateChanged(ctx context.Context, event *pluginsettings.PluginStateChangedEvent) error {
|
||||||
s.logger.Info("Plugin state changed", "pluginId", event.PluginId, "enabled", event.Enabled)
|
s.logger.Debug("Plugin state changed", "pluginId", event.PluginId, "enabled", event.Enabled)
|
||||||
|
|
||||||
|
if event.OrgId != extsvcauth.TmpOrgID {
|
||||||
|
s.logger.Debug("External Service not tied to this organization", "OrgId", event.OrgId)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve client associated to the plugin
|
// Retrieve client associated to the plugin
|
||||||
client, err := s.sqlstore.GetExternalServiceByName(ctx, event.PluginId)
|
client, err := s.sqlstore.GetExternalServiceByName(ctx, event.PluginId)
|
||||||
|
@ -297,8 +297,7 @@ func (esa *ExtSvcAccountsService) saveExtSvcAccount(ctx context.Context, cmd *sa
|
|||||||
// update the service account's permissions
|
// update the service account's permissions
|
||||||
esa.logger.Debug("Update role permissions", "service", cmd.ExtSvcSlug, "saID", cmd.SaID)
|
esa.logger.Debug("Update role permissions", "service", cmd.ExtSvcSlug, "saID", cmd.SaID)
|
||||||
if err := esa.acSvc.SaveExternalServiceRole(ctx, ac.SaveExternalServiceRoleCommand{
|
if err := esa.acSvc.SaveExternalServiceRole(ctx, ac.SaveExternalServiceRoleCommand{
|
||||||
OrgID: ac.GlobalOrgID,
|
AssignmentOrgID: cmd.OrgID,
|
||||||
Global: true,
|
|
||||||
ExternalServiceID: cmd.ExtSvcSlug,
|
ExternalServiceID: cmd.ExtSvcSlug,
|
||||||
ServiceAccountID: cmd.SaID,
|
ServiceAccountID: cmd.SaID,
|
||||||
Permissions: cmd.Permissions,
|
Permissions: cmd.Permissions,
|
||||||
@ -397,17 +396,17 @@ func (esa *ExtSvcAccountsService) DeleteExtSvcCredentials(ctx context.Context, o
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (esa *ExtSvcAccountsService) handlePluginStateChanged(ctx context.Context, event *pluginsettings.PluginStateChangedEvent) error {
|
func (esa *ExtSvcAccountsService) handlePluginStateChanged(ctx context.Context, event *pluginsettings.PluginStateChangedEvent) error {
|
||||||
esa.logger.Info("Plugin state changed", "pluginId", event.PluginId, "enabled", event.Enabled)
|
esa.logger.Debug("Plugin state changed", "pluginId", event.PluginId, "enabled", event.Enabled)
|
||||||
|
|
||||||
errEnable := esa.EnableExtSvcAccount(ctx, &sa.EnableExtSvcAccountCmd{
|
errEnable := esa.EnableExtSvcAccount(ctx, &sa.EnableExtSvcAccountCmd{
|
||||||
ExtSvcSlug: event.PluginId,
|
ExtSvcSlug: event.PluginId,
|
||||||
Enabled: event.Enabled,
|
Enabled: event.Enabled,
|
||||||
OrgID: extsvcauth.TmpOrgID,
|
OrgID: event.OrgId,
|
||||||
})
|
})
|
||||||
|
|
||||||
// Ignore service account not found error
|
// Ignore service account not found error
|
||||||
if errors.Is(errEnable, sa.ErrServiceAccountNotFound) {
|
if errors.Is(errEnable, sa.ErrServiceAccountNotFound) {
|
||||||
esa.logger.Debug("No ext svc account with this plugin", "pluginId", event.PluginId)
|
esa.logger.Debug("No ext svc account with this plugin", "pluginId", event.PluginId, "orgId", event.OrgId)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return errEnable
|
return errEnable
|
||||||
|
@ -84,7 +84,7 @@ func TestExtSvcAccountsService_ManageExtSvcAccount(t *testing.T) {
|
|||||||
mock.Anything,
|
mock.Anything,
|
||||||
mock.MatchedBy(func(cmd ac.SaveExternalServiceRoleCommand) bool {
|
mock.MatchedBy(func(cmd ac.SaveExternalServiceRoleCommand) bool {
|
||||||
return cmd.ServiceAccountID == extSvcAccID && cmd.ExternalServiceID == extSvcSlug &&
|
return cmd.ServiceAccountID == extSvcAccID && cmd.ExternalServiceID == extSvcSlug &&
|
||||||
cmd.OrgID == int64(ac.GlobalOrgID) && len(cmd.Permissions) == 1 &&
|
cmd.AssignmentOrgID == extSvcOrgID && len(cmd.Permissions) == 1 &&
|
||||||
cmd.Permissions[0] == extSvcPerms[0]
|
cmd.Permissions[0] == extSvcPerms[0]
|
||||||
})).
|
})).
|
||||||
Return(nil)
|
Return(nil)
|
||||||
@ -133,7 +133,7 @@ func TestExtSvcAccountsService_ManageExtSvcAccount(t *testing.T) {
|
|||||||
mock.Anything,
|
mock.Anything,
|
||||||
mock.MatchedBy(func(cmd ac.SaveExternalServiceRoleCommand) bool {
|
mock.MatchedBy(func(cmd ac.SaveExternalServiceRoleCommand) bool {
|
||||||
return cmd.ServiceAccountID == extSvcAccount.Id && cmd.ExternalServiceID == extSvcSlug &&
|
return cmd.ServiceAccountID == extSvcAccount.Id && cmd.ExternalServiceID == extSvcSlug &&
|
||||||
cmd.OrgID == int64(ac.GlobalOrgID) && len(cmd.Permissions) == 1 &&
|
cmd.AssignmentOrgID == extSvcOrgID && len(cmd.Permissions) == 1 &&
|
||||||
cmd.Permissions[0] == extSvcPerms[0]
|
cmd.Permissions[0] == extSvcPerms[0]
|
||||||
})).
|
})).
|
||||||
Return(nil)
|
Return(nil)
|
||||||
@ -158,7 +158,7 @@ func TestExtSvcAccountsService_ManageExtSvcAccount(t *testing.T) {
|
|||||||
mock.Anything,
|
mock.Anything,
|
||||||
mock.MatchedBy(func(cmd ac.SaveExternalServiceRoleCommand) bool {
|
mock.MatchedBy(func(cmd ac.SaveExternalServiceRoleCommand) bool {
|
||||||
return cmd.ServiceAccountID == int64(11) && cmd.ExternalServiceID == extSvcSlug &&
|
return cmd.ServiceAccountID == int64(11) && cmd.ExternalServiceID == extSvcSlug &&
|
||||||
cmd.OrgID == int64(ac.GlobalOrgID) && len(cmd.Permissions) == 1 &&
|
cmd.AssignmentOrgID == extSvcOrgID && len(cmd.Permissions) == 1 &&
|
||||||
cmd.Permissions[0] == extSvcPerms[0]
|
cmd.Permissions[0] == extSvcPerms[0]
|
||||||
})).
|
})).
|
||||||
Return(nil)
|
Return(nil)
|
||||||
@ -228,7 +228,7 @@ func TestExtSvcAccountsService_SaveExternalService(t *testing.T) {
|
|||||||
mock.Anything,
|
mock.Anything,
|
||||||
mock.MatchedBy(func(cmd ac.SaveExternalServiceRoleCommand) bool {
|
mock.MatchedBy(func(cmd ac.SaveExternalServiceRoleCommand) bool {
|
||||||
return cmd.ServiceAccountID == extSvcAccID && cmd.ExternalServiceID == extSvcSlug &&
|
return cmd.ServiceAccountID == extSvcAccID && cmd.ExternalServiceID == extSvcSlug &&
|
||||||
cmd.OrgID == int64(ac.GlobalOrgID) && len(cmd.Permissions) == 1 &&
|
cmd.AssignmentOrgID == tmpOrgID && len(cmd.Permissions) == 1 &&
|
||||||
cmd.Permissions[0] == extSvcPerms[0]
|
cmd.Permissions[0] == extSvcPerms[0]
|
||||||
})).
|
})).
|
||||||
Return(nil)
|
Return(nil)
|
||||||
@ -291,14 +291,14 @@ func TestExtSvcAccountsService_SaveExternalService(t *testing.T) {
|
|||||||
return cmd.Name == sa.ExtSvcPrefix+extSvcSlug && *cmd.Role == roletype.RoleNone
|
return cmd.Name == sa.ExtSvcPrefix+extSvcSlug && *cmd.Role == roletype.RoleNone
|
||||||
})).
|
})).
|
||||||
Return(extSvcAccount, nil)
|
Return(extSvcAccount, nil)
|
||||||
env.SaSvc.On("EnableServiceAccount", mock.Anything, extsvcauth.TmpOrgID, extSvcAccID, true).Return(nil)
|
env.SaSvc.On("EnableServiceAccount", mock.Anything, tmpOrgID, extSvcAccID, true).Return(nil)
|
||||||
// Api Key was added without problem
|
// Api Key was added without problem
|
||||||
env.SaSvc.On("AddServiceAccountToken", mock.Anything, mock.Anything, mock.Anything).Return(&apikey.APIKey{}, nil)
|
env.SaSvc.On("AddServiceAccountToken", mock.Anything, mock.Anything, mock.Anything).Return(&apikey.APIKey{}, nil)
|
||||||
env.AcStore.On("SaveExternalServiceRole",
|
env.AcStore.On("SaveExternalServiceRole",
|
||||||
mock.Anything,
|
mock.Anything,
|
||||||
mock.MatchedBy(func(cmd ac.SaveExternalServiceRoleCommand) bool {
|
mock.MatchedBy(func(cmd ac.SaveExternalServiceRoleCommand) bool {
|
||||||
return cmd.ServiceAccountID == extSvcAccount.Id && cmd.ExternalServiceID == extSvcSlug &&
|
return cmd.ServiceAccountID == extSvcAccount.Id && cmd.ExternalServiceID == extSvcSlug &&
|
||||||
cmd.OrgID == int64(ac.GlobalOrgID) && len(cmd.Permissions) == 1 &&
|
cmd.AssignmentOrgID == tmpOrgID && len(cmd.Permissions) == 1 &&
|
||||||
cmd.Permissions[0] == extSvcPerms[0]
|
cmd.Permissions[0] == extSvcPerms[0]
|
||||||
})).
|
})).
|
||||||
Return(nil)
|
Return(nil)
|
||||||
@ -327,7 +327,7 @@ func TestExtSvcAccountsService_SaveExternalService(t *testing.T) {
|
|||||||
mock.Anything,
|
mock.Anything,
|
||||||
mock.MatchedBy(func(cmd ac.SaveExternalServiceRoleCommand) bool {
|
mock.MatchedBy(func(cmd ac.SaveExternalServiceRoleCommand) bool {
|
||||||
return cmd.ServiceAccountID == int64(11) && cmd.ExternalServiceID == extSvcSlug &&
|
return cmd.ServiceAccountID == int64(11) && cmd.ExternalServiceID == extSvcSlug &&
|
||||||
cmd.OrgID == int64(ac.GlobalOrgID) && len(cmd.Permissions) == 1 &&
|
cmd.AssignmentOrgID == tmpOrgID && len(cmd.Permissions) == 1 &&
|
||||||
cmd.Permissions[0] == extSvcPerms[0]
|
cmd.Permissions[0] == extSvcPerms[0]
|
||||||
})).
|
})).
|
||||||
Return(nil)
|
Return(nil)
|
||||||
|
Loading…
Reference in New Issue
Block a user