Chore: Remove dashboard ACL from models (#61749)

* Remove dashboard ACL from models

* Remove unused comment
pull/61850/head
idafurjes 2 years ago committed by GitHub
parent c106c7700b
commit 68445a7c77
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      pkg/api/annotations_test.go
  2. 8
      pkg/api/common_test.go
  3. 28
      pkg/api/dashboard_permission.go
  4. 38
      pkg/api/dashboard_permission_test.go
  5. 14
      pkg/api/dashboard_snapshot_test.go
  6. 56
      pkg/api/dashboard_test.go
  7. 22
      pkg/api/folder_permission.go
  8. 38
      pkg/api/folder_permission_test.go
  9. 6
      pkg/api/folder_test.go
  10. 2
      pkg/api/org_users_test.go
  11. 4
      pkg/infra/db/sqlbuilder_test.go
  12. 76
      pkg/models/dashboard_acl.go
  13. 8
      pkg/services/dashboards/dashboard.go
  14. 8
      pkg/services/dashboards/dashboard_service_mock.go
  15. 5
      pkg/services/dashboards/database/acl.go
  16. 72
      pkg/services/dashboards/database/acl_test.go
  17. 2
      pkg/services/dashboards/database/database.go
  18. 20
      pkg/services/dashboards/database/database_folder_test.go
  19. 4
      pkg/services/dashboards/database/database_test.go
  20. 77
      pkg/services/dashboards/models.go
  21. 10
      pkg/services/dashboards/service/dashboard_service.go
  22. 20
      pkg/services/dashboards/service/dashboard_service_integration_test.go
  23. 9
      pkg/services/dashboards/service/dashboard_service_test.go
  24. 8
      pkg/services/dashboards/store_mock.go
  25. 6
      pkg/services/folder/folderimpl/folder.go
  26. 38
      pkg/services/guardian/accesscontrol_guardian.go
  27. 76
      pkg/services/guardian/guardian.go
  28. 136
      pkg/services/guardian/guardian_test.go
  29. 52
      pkg/services/guardian/guardian_util_test.go
  30. 4
      pkg/services/libraryelements/libraryelements_test.go
  31. 4
      pkg/services/librarypanels/librarypanels_test.go
  32. 20
      pkg/services/sqlstore/migrations/accesscontrol/dashboard_permissions.go
  33. 10
      pkg/services/team/teamimpl/store_test.go
  34. 16
      pkg/services/user/userimpl/store_test.go

@ -680,9 +680,9 @@ func setUpACL() {
store := dbtest.NewFakeDB() store := dbtest.NewFakeDB()
teamSvc := &teamtest.FakeService{} teamSvc := &teamtest.FakeService{}
dashSvc := &dashboards.FakeDashboardService{} dashSvc := &dashboards.FakeDashboardService{}
dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) { dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) {
q := args.Get(1).(*models.GetDashboardACLInfoListQuery) q := args.Get(1).(*dashboards.GetDashboardACLInfoListQuery)
q.Result = []*models.DashboardACLInfoDTO{ q.Result = []*dashboards.DashboardACLInfoDTO{
{Role: &viewerRole, Permission: models.PERMISSION_VIEW}, {Role: &viewerRole, Permission: models.PERMISSION_VIEW},
{Role: &editorRole, Permission: models.PERMISSION_EDIT}, {Role: &editorRole, Permission: models.PERMISSION_EDIT},
} }

@ -541,7 +541,7 @@ var (
) )
type setUpConf struct { type setUpConf struct {
aclMockResp []*models.DashboardACLInfoDTO aclMockResp []*dashboards.DashboardACLInfoDTO
} }
type mockSearchService struct{ ExpectedResult models.HitList } type mockSearchService struct{ ExpectedResult models.HitList }
@ -556,7 +556,7 @@ func setUp(confs ...setUpConf) *HTTPServer {
store := dbtest.NewFakeDB() store := dbtest.NewFakeDB()
hs := &HTTPServer{SQLStore: store, SearchService: &mockSearchService{}} hs := &HTTPServer{SQLStore: store, SearchService: &mockSearchService{}}
aclMockResp := []*models.DashboardACLInfoDTO{} aclMockResp := []*dashboards.DashboardACLInfoDTO{}
for _, c := range confs { for _, c := range confs {
if c.aclMockResp != nil { if c.aclMockResp != nil {
aclMockResp = c.aclMockResp aclMockResp = c.aclMockResp
@ -564,8 +564,8 @@ func setUp(confs ...setUpConf) *HTTPServer {
} }
teamSvc := &teamtest.FakeService{} teamSvc := &teamtest.FakeService{}
dashSvc := &dashboards.FakeDashboardService{} dashSvc := &dashboards.FakeDashboardService{}
dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) { dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) {
q := args.Get(1).(*models.GetDashboardACLInfoListQuery) q := args.Get(1).(*dashboards.GetDashboardACLInfoListQuery)
q.Result = aclMockResp q.Result = aclMockResp
}).Return(nil) }).Return(nil)
guardian.InitLegacyGuardian(store, dashSvc, teamSvc) guardian.InitLegacyGuardian(store, dashSvc, teamSvc)

@ -71,19 +71,19 @@ func (hs *HTTPServer) GetDashboardPermissionList(c *models.ReqContext) response.
return response.Error(500, "Failed to get dashboard permissions", err) return response.Error(500, "Failed to get dashboard permissions", err)
} }
filteredACLs := make([]*models.DashboardACLInfoDTO, 0, len(acl)) filteredACLs := make([]*dashboards.DashboardACLInfoDTO, 0, len(acl))
for _, perm := range acl { for _, perm := range acl {
if perm.UserId > 0 && dtos.IsHiddenUser(perm.UserLogin, c.SignedInUser, hs.Cfg) { if perm.UserID > 0 && dtos.IsHiddenUser(perm.UserLogin, c.SignedInUser, hs.Cfg) {
continue continue
} }
perm.UserAvatarUrl = dtos.GetGravatarUrl(perm.UserEmail) perm.UserAvatarURL = dtos.GetGravatarUrl(perm.UserEmail)
if perm.TeamId > 0 { if perm.TeamID > 0 {
perm.TeamAvatarUrl = dtos.GetGravatarUrlWithDefault(perm.TeamEmail, perm.Team) perm.TeamAvatarURL = dtos.GetGravatarUrlWithDefault(perm.TeamEmail, perm.Team)
} }
if perm.Slug != "" { if perm.Slug != "" {
perm.Url = dashboards.GetDashboardFolderURL(perm.IsFolder, perm.Uid, perm.Slug) perm.URL = dashboards.GetDashboardFolderURL(perm.IsFolder, perm.UID, perm.Slug)
} }
filteredACLs = append(filteredACLs, perm) filteredACLs = append(filteredACLs, perm)
@ -156,9 +156,9 @@ func (hs *HTTPServer) UpdateDashboardPermissions(c *models.ReqContext) response.
return dashboardGuardianResponse(err) return dashboardGuardianResponse(err)
} }
items := make([]*models.DashboardACL, 0, len(apiCmd.Items)) items := make([]*dashboards.DashboardACL, 0, len(apiCmd.Items))
for _, item := range apiCmd.Items { for _, item := range apiCmd.Items {
items = append(items, &models.DashboardACL{ items = append(items, &dashboards.DashboardACL{
OrgID: c.OrgID, OrgID: c.OrgID,
DashboardID: dashID, DashboardID: dashID,
UserID: item.UserID, UserID: item.UserID,
@ -211,7 +211,7 @@ func (hs *HTTPServer) UpdateDashboardPermissions(c *models.ReqContext) response.
} }
// updateDashboardAccessControl is used for api backward compatibility // updateDashboardAccessControl is used for api backward compatibility
func (hs *HTTPServer) updateDashboardAccessControl(ctx context.Context, orgID int64, uid string, isFolder bool, items []*models.DashboardACL, old []*models.DashboardACLInfoDTO) error { func (hs *HTTPServer) updateDashboardAccessControl(ctx context.Context, orgID int64, uid string, isFolder bool, items []*dashboards.DashboardACL, old []*dashboards.DashboardACLInfoDTO) error {
commands := []accesscontrol.SetResourcePermissionCommand{} commands := []accesscontrol.SetResourcePermissionCommand{}
for _, item := range items { for _, item := range items {
permissions := item.Permission.String() permissions := item.Permission.String()
@ -231,11 +231,11 @@ func (hs *HTTPServer) updateDashboardAccessControl(ctx context.Context, orgID in
for _, o := range old { for _, o := range old {
shouldRemove := true shouldRemove := true
for _, item := range items { for _, item := range items {
if item.UserID != 0 && item.UserID == o.UserId { if item.UserID != 0 && item.UserID == o.UserID {
shouldRemove = false shouldRemove = false
break break
} }
if item.TeamID != 0 && item.TeamID == o.TeamId { if item.TeamID != 0 && item.TeamID == o.TeamID {
shouldRemove = false shouldRemove = false
break break
} }
@ -251,8 +251,8 @@ func (hs *HTTPServer) updateDashboardAccessControl(ctx context.Context, orgID in
} }
commands = append(commands, accesscontrol.SetResourcePermissionCommand{ commands = append(commands, accesscontrol.SetResourcePermissionCommand{
UserID: o.UserId, UserID: o.UserID,
TeamID: o.TeamId, TeamID: o.TeamID,
BuiltinRole: role, BuiltinRole: role,
Permission: "", Permission: "",
}) })
@ -321,5 +321,5 @@ type UpdateDashboardPermissionsByUIDParams struct {
// swagger:response getDashboardPermissionsListResponse // swagger:response getDashboardPermissionsListResponse
type GetDashboardPermissionsResponse struct { type GetDashboardPermissionsResponse struct {
// in: body // in: body
Body []*models.DashboardACLInfoDTO `json:"body"` Body []*dashboards.DashboardACLInfoDTO `json:"body"`
} }

@ -93,12 +93,12 @@ func TestDashboardPermissionAPIEndpoint(t *testing.T) {
guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{ guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{
CanAdminValue: true, CanAdminValue: true,
CheckPermissionBeforeUpdateValue: true, CheckPermissionBeforeUpdateValue: true,
GetACLValue: []*models.DashboardACLInfoDTO{ GetACLValue: []*dashboards.DashboardACLInfoDTO{
{OrgId: 1, DashboardId: 1, UserId: 2, Permission: models.PERMISSION_VIEW}, {OrgID: 1, DashboardID: 1, UserID: 2, Permission: models.PERMISSION_VIEW},
{OrgId: 1, DashboardId: 1, UserId: 3, Permission: models.PERMISSION_EDIT}, {OrgID: 1, DashboardID: 1, UserID: 3, Permission: models.PERMISSION_EDIT},
{OrgId: 1, DashboardId: 1, UserId: 4, Permission: models.PERMISSION_ADMIN}, {OrgID: 1, DashboardID: 1, UserID: 4, Permission: models.PERMISSION_ADMIN},
{OrgId: 1, DashboardId: 1, TeamId: 1, Permission: models.PERMISSION_VIEW}, {OrgID: 1, DashboardID: 1, TeamID: 1, Permission: models.PERMISSION_VIEW},
{OrgId: 1, DashboardId: 1, TeamId: 2, Permission: models.PERMISSION_ADMIN}, {OrgID: 1, DashboardID: 1, TeamID: 2, Permission: models.PERMISSION_ADMIN},
}, },
}) })
@ -107,12 +107,12 @@ func TestDashboardPermissionAPIEndpoint(t *testing.T) {
callGetDashboardPermissions(sc, hs) callGetDashboardPermissions(sc, hs)
assert.Equal(t, 200, sc.resp.Code) assert.Equal(t, 200, sc.resp.Code)
var resp []*models.DashboardACLInfoDTO var resp []*dashboards.DashboardACLInfoDTO
err := json.Unmarshal(sc.resp.Body.Bytes(), &resp) err := json.Unmarshal(sc.resp.Body.Bytes(), &resp)
require.NoError(t, err) require.NoError(t, err)
assert.Len(t, resp, 5) assert.Len(t, resp, 5)
assert.Equal(t, int64(2), resp[0].UserId) assert.Equal(t, int64(2), resp[0].UserID)
assert.Equal(t, models.PERMISSION_VIEW, resp[0].Permission) assert.Equal(t, models.PERMISSION_VIEW, resp[0].Permission)
}, mockSQLStore) }, mockSQLStore)
@ -269,19 +269,19 @@ func TestDashboardPermissionAPIEndpoint(t *testing.T) {
}) })
mockSQLStore := dbtest.NewFakeDB() mockSQLStore := dbtest.NewFakeDB()
var resp []*models.DashboardACLInfoDTO var resp []*dashboards.DashboardACLInfoDTO
loggedInUserScenarioWithRole(t, "When calling GET on", "GET", "/api/dashboards/id/1/permissions", loggedInUserScenarioWithRole(t, "When calling GET on", "GET", "/api/dashboards/id/1/permissions",
"/api/dashboards/id/:dashboardId/permissions", org.RoleAdmin, func(sc *scenarioContext) { "/api/dashboards/id/:dashboardId/permissions", org.RoleAdmin, func(sc *scenarioContext) {
setUp() setUp()
guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{ guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{
CanAdminValue: true, CanAdminValue: true,
CheckPermissionBeforeUpdateValue: true, CheckPermissionBeforeUpdateValue: true,
GetACLValue: []*models.DashboardACLInfoDTO{ GetACLValue: []*dashboards.DashboardACLInfoDTO{
{OrgId: 1, DashboardId: 1, UserId: 2, UserLogin: "hiddenUser", Permission: models.PERMISSION_VIEW}, {OrgID: 1, DashboardID: 1, UserID: 2, UserLogin: "hiddenUser", Permission: models.PERMISSION_VIEW},
{OrgId: 1, DashboardId: 1, UserId: 3, UserLogin: testUserLogin, Permission: models.PERMISSION_EDIT}, {OrgID: 1, DashboardID: 1, UserID: 3, UserLogin: testUserLogin, Permission: models.PERMISSION_EDIT},
{OrgId: 1, DashboardId: 1, UserId: 4, UserLogin: "user_1", Permission: models.PERMISSION_ADMIN}, {OrgID: 1, DashboardID: 1, UserID: 4, UserLogin: "user_1", Permission: models.PERMISSION_ADMIN},
}, },
GetHiddenACLValue: []*models.DashboardACL{ GetHiddenACLValue: []*dashboards.DashboardACL{
{OrgID: 1, DashboardID: 1, UserID: 2, Permission: models.PERMISSION_VIEW}, {OrgID: 1, DashboardID: 1, UserID: 2, Permission: models.PERMISSION_VIEW},
}, },
}) })
@ -293,9 +293,9 @@ func TestDashboardPermissionAPIEndpoint(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
assert.Len(t, resp, 2) assert.Len(t, resp, 2)
assert.Equal(t, int64(3), resp[0].UserId) assert.Equal(t, int64(3), resp[0].UserID)
assert.Equal(t, models.PERMISSION_EDIT, resp[0].Permission) assert.Equal(t, models.PERMISSION_EDIT, resp[0].Permission)
assert.Equal(t, int64(4), resp[1].UserId) assert.Equal(t, int64(4), resp[1].UserID)
assert.Equal(t, models.PERMISSION_ADMIN, resp[1].Permission) assert.Equal(t, models.PERMISSION_ADMIN, resp[1].Permission)
}, mockSQLStore) }, mockSQLStore)
@ -306,15 +306,15 @@ func TestDashboardPermissionAPIEndpoint(t *testing.T) {
} }
for _, acl := range resp { for _, acl := range resp {
cmd.Items = append(cmd.Items, dtos.DashboardACLUpdateItem{ cmd.Items = append(cmd.Items, dtos.DashboardACLUpdateItem{
UserID: acl.UserId, UserID: acl.UserID,
Permission: acl.Permission, Permission: acl.Permission,
}) })
} }
assert.Len(t, cmd.Items, 3) assert.Len(t, cmd.Items, 3)
var numOfItems []*models.DashboardACL var numOfItems []*dashboards.DashboardACL
dashboardStore.On("UpdateDashboardACL", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { dashboardStore.On("UpdateDashboardACL", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
items := args.Get(2).([]*models.DashboardACL) items := args.Get(2).([]*dashboards.DashboardACL)
numOfItems = items numOfItems = items
}).Return(nil).Once() }).Return(nil).Once()
updateDashboardPermissionScenario(t, updatePermissionContext{ updateDashboardPermissionScenario(t, updatePermissionContext{

@ -79,7 +79,7 @@ func TestDashboardSnapshotAPIEndpoint_singleSnapshot(t *testing.T) {
UID: q.UID, UID: q.UID,
} }
}).Return(nil).Maybe() }).Return(nil).Maybe()
dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Return(nil).Maybe() dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Return(nil).Maybe()
hs.DashboardService = dashSvc hs.DashboardService = dashSvc
guardian.InitLegacyGuardian(sc.sqlStore, dashSvc, teamSvc) guardian.InitLegacyGuardian(sc.sqlStore, dashSvc, teamSvc)
@ -118,9 +118,9 @@ func TestDashboardSnapshotAPIEndpoint_singleSnapshot(t *testing.T) {
t.Run("When user is editor and dashboard has default ACL", func(t *testing.T) { t.Run("When user is editor and dashboard has default ACL", func(t *testing.T) {
teamSvc := &teamtest.FakeService{} teamSvc := &teamtest.FakeService{}
dashSvc := &dashboards.FakeDashboardService{} dashSvc := &dashboards.FakeDashboardService{}
dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) { dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) {
q := args.Get(1).(*models.GetDashboardACLInfoListQuery) q := args.Get(1).(*dashboards.GetDashboardACLInfoListQuery)
q.Result = []*models.DashboardACLInfoDTO{ q.Result = []*dashboards.DashboardACLInfoDTO{
{Role: &viewerRole, Permission: models.PERMISSION_VIEW}, {Role: &viewerRole, Permission: models.PERMISSION_VIEW},
{Role: &editorRole, Permission: models.PERMISSION_EDIT}, {Role: &editorRole, Permission: models.PERMISSION_EDIT},
} }
@ -141,9 +141,9 @@ func TestDashboardSnapshotAPIEndpoint_singleSnapshot(t *testing.T) {
OrgID: q.OrgID, OrgID: q.OrgID,
} }
}).Return(nil).Maybe() }).Return(nil).Maybe()
dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) { dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) {
q := args.Get(1).(*models.GetDashboardACLInfoListQuery) q := args.Get(1).(*dashboards.GetDashboardACLInfoListQuery)
q.Result = []*models.DashboardACLInfoDTO{ q.Result = []*dashboards.DashboardACLInfoDTO{
{Role: &viewerRole, Permission: models.PERMISSION_VIEW}, {Role: &viewerRole, Permission: models.PERMISSION_VIEW},
{Role: &editorRole, Permission: models.PERMISSION_EDIT}, {Role: &editorRole, Permission: models.PERMISSION_EDIT},
} }

@ -157,9 +157,9 @@ func TestDashboardAPIEndpoint(t *testing.T) {
setUp := func() { setUp := func() {
viewerRole := org.RoleViewer viewerRole := org.RoleViewer
editorRole := org.RoleEditor editorRole := org.RoleEditor
dashboardService.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) { dashboardService.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) {
q := args.Get(1).(*models.GetDashboardACLInfoListQuery) q := args.Get(1).(*dashboards.GetDashboardACLInfoListQuery)
q.Result = []*models.DashboardACLInfoDTO{ q.Result = []*dashboards.DashboardACLInfoDTO{
{Role: &viewerRole, Permission: models.PERMISSION_VIEW}, {Role: &viewerRole, Permission: models.PERMISSION_VIEW},
{Role: &editorRole, Permission: models.PERMISSION_EDIT}, {Role: &editorRole, Permission: models.PERMISSION_EDIT},
} }
@ -248,13 +248,13 @@ func TestDashboardAPIEndpoint(t *testing.T) {
q := args.Get(1).(*dashboards.GetDashboardQuery) q := args.Get(1).(*dashboards.GetDashboardQuery)
q.Result = fakeDash q.Result = fakeDash
}).Return(nil) }).Return(nil)
dashboardService.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) { dashboardService.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) {
q := args.Get(1).(*models.GetDashboardACLInfoListQuery) q := args.Get(1).(*dashboards.GetDashboardACLInfoListQuery)
q.Result = []*models.DashboardACLInfoDTO{ q.Result = []*dashboards.DashboardACLInfoDTO{
{ {
DashboardId: 1, DashboardID: 1,
Permission: models.PERMISSION_EDIT, Permission: models.PERMISSION_EDIT,
UserId: 200, UserID: 200,
}, },
} }
}).Return(nil) }).Return(nil)
@ -380,10 +380,10 @@ func TestDashboardAPIEndpoint(t *testing.T) {
setting.ViewersCanEdit = false setting.ViewersCanEdit = false
dashboardService := dashboards.NewFakeDashboardService(t) dashboardService := dashboards.NewFakeDashboardService(t)
dashboardService.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) { dashboardService.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) {
q := args.Get(1).(*models.GetDashboardACLInfoListQuery) q := args.Get(1).(*dashboards.GetDashboardACLInfoListQuery)
q.Result = []*models.DashboardACLInfoDTO{ q.Result = []*dashboards.DashboardACLInfoDTO{
{OrgId: 1, DashboardId: 2, UserId: 1, Permission: models.PERMISSION_EDIT}, {OrgID: 1, DashboardID: 2, UserID: 1, Permission: models.PERMISSION_EDIT},
} }
}).Return(nil) }).Return(nil)
guardian.InitLegacyGuardian(mockSQLStore, dashboardService, teamService) guardian.InitLegacyGuardian(mockSQLStore, dashboardService, teamService)
@ -442,10 +442,10 @@ func TestDashboardAPIEndpoint(t *testing.T) {
setting.ViewersCanEdit = true setting.ViewersCanEdit = true
dashboardService := dashboards.NewFakeDashboardService(t) dashboardService := dashboards.NewFakeDashboardService(t)
dashboardService.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) { dashboardService.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) {
q := args.Get(1).(*models.GetDashboardACLInfoListQuery) q := args.Get(1).(*dashboards.GetDashboardACLInfoListQuery)
q.Result = []*models.DashboardACLInfoDTO{ q.Result = []*dashboards.DashboardACLInfoDTO{
{OrgId: 1, DashboardId: 2, UserId: 1, Permission: models.PERMISSION_VIEW}, {OrgID: 1, DashboardID: 2, UserID: 1, Permission: models.PERMISSION_VIEW},
} }
}).Return(nil) }).Return(nil)
guardian.InitLegacyGuardian(mockSQLStore, dashboardService, teamService) guardian.InitLegacyGuardian(mockSQLStore, dashboardService, teamService)
@ -482,10 +482,10 @@ func TestDashboardAPIEndpoint(t *testing.T) {
setting.ViewersCanEdit = true setting.ViewersCanEdit = true
dashboardService := dashboards.NewFakeDashboardService(t) dashboardService := dashboards.NewFakeDashboardService(t)
dashboardService.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) { dashboardService.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) {
q := args.Get(1).(*models.GetDashboardACLInfoListQuery) q := args.Get(1).(*dashboards.GetDashboardACLInfoListQuery)
q.Result = []*models.DashboardACLInfoDTO{ q.Result = []*dashboards.DashboardACLInfoDTO{
{OrgId: 1, DashboardId: 2, UserId: 1, Permission: models.PERMISSION_ADMIN}, {OrgID: 1, DashboardID: 2, UserID: 1, Permission: models.PERMISSION_ADMIN},
} }
}).Return(nil) }).Return(nil)
guardian.InitLegacyGuardian(mockSQLStore, dashboardService, teamService) guardian.InitLegacyGuardian(mockSQLStore, dashboardService, teamService)
@ -535,10 +535,10 @@ func TestDashboardAPIEndpoint(t *testing.T) {
setUpInner := func() { setUpInner := func() {
dashboardService := dashboards.NewFakeDashboardService(t) dashboardService := dashboards.NewFakeDashboardService(t)
dashboardService.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) { dashboardService.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) {
q := args.Get(1).(*models.GetDashboardACLInfoListQuery) q := args.Get(1).(*dashboards.GetDashboardACLInfoListQuery)
q.Result = []*models.DashboardACLInfoDTO{ q.Result = []*dashboards.DashboardACLInfoDTO{
{OrgId: 1, DashboardId: 2, UserId: 1, Permission: models.PERMISSION_VIEW}, {OrgID: 1, DashboardID: 2, UserID: 1, Permission: models.PERMISSION_VIEW},
} }
}).Return(nil) }).Return(nil)
guardian.InitLegacyGuardian(mockSQLStore, dashboardService, teamService) guardian.InitLegacyGuardian(mockSQLStore, dashboardService, teamService)
@ -807,7 +807,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
setUp := func() { setUp := func() {
teamSvc := &teamtest.FakeService{} teamSvc := &teamtest.FakeService{}
dashSvc := dashboards.NewFakeDashboardService(t) dashSvc := dashboards.NewFakeDashboardService(t)
dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Return(nil) dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Return(nil)
dashSvc.On("GetDashboard", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardQuery")).Run(func(args mock.Arguments) { dashSvc.On("GetDashboard", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardQuery")).Run(func(args mock.Arguments) {
q := args.Get(1).(*dashboards.GetDashboardQuery) q := args.Get(1).(*dashboards.GetDashboardQuery)
q.Result = &dashboards.Dashboard{ q.Result = &dashboards.Dashboard{
@ -940,9 +940,9 @@ func TestDashboardAPIEndpoint(t *testing.T) {
q := args.Get(1).(*dashboards.GetDashboardQuery) q := args.Get(1).(*dashboards.GetDashboardQuery)
q.Result = &dashboards.Dashboard{ID: 1, Data: dataValue} q.Result = &dashboards.Dashboard{ID: 1, Data: dataValue}
}).Return(nil) }).Return(nil)
dashboardService.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) { dashboardService.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) {
q := args.Get(1).(*models.GetDashboardACLInfoListQuery) q := args.Get(1).(*dashboards.GetDashboardACLInfoListQuery)
q.Result = []*models.DashboardACLInfoDTO{{OrgId: testOrgID, DashboardId: 1, UserId: testUserID, Permission: models.PERMISSION_EDIT}} q.Result = []*dashboards.DashboardACLInfoDTO{{OrgID: testOrgID, DashboardID: 1, UserID: testUserID, Permission: models.PERMISSION_EDIT}}
}).Return(nil) }).Return(nil)
guardian.InitLegacyGuardian(mockSQLStore, dashboardService, teamService) guardian.InitLegacyGuardian(mockSQLStore, dashboardService, teamService)

@ -48,23 +48,23 @@ func (hs *HTTPServer) GetFolderPermissionList(c *models.ReqContext) response.Res
return response.Error(500, "Failed to get folder permissions", err) return response.Error(500, "Failed to get folder permissions", err)
} }
filteredACLs := make([]*models.DashboardACLInfoDTO, 0, len(acl)) filteredACLs := make([]*dashboards.DashboardACLInfoDTO, 0, len(acl))
for _, perm := range acl { for _, perm := range acl {
if perm.UserId > 0 && dtos.IsHiddenUser(perm.UserLogin, c.SignedInUser, hs.Cfg) { if perm.UserID > 0 && dtos.IsHiddenUser(perm.UserLogin, c.SignedInUser, hs.Cfg) {
continue continue
} }
perm.FolderId = folder.ID perm.FolderID = folder.ID
perm.DashboardId = 0 perm.DashboardID = 0
perm.UserAvatarUrl = dtos.GetGravatarUrl(perm.UserEmail) perm.UserAvatarURL = dtos.GetGravatarUrl(perm.UserEmail)
if perm.TeamId > 0 { if perm.TeamID > 0 {
perm.TeamAvatarUrl = dtos.GetGravatarUrlWithDefault(perm.TeamEmail, perm.Team) perm.TeamAvatarURL = dtos.GetGravatarUrlWithDefault(perm.TeamEmail, perm.Team)
} }
if perm.Slug != "" { if perm.Slug != "" {
perm.Url = dashboards.GetDashboardFolderURL(perm.IsFolder, perm.Uid, perm.Slug) perm.URL = dashboards.GetDashboardFolderURL(perm.IsFolder, perm.UID, perm.Slug)
} }
filteredACLs = append(filteredACLs, perm) filteredACLs = append(filteredACLs, perm)
@ -112,9 +112,9 @@ func (hs *HTTPServer) UpdateFolderPermissions(c *models.ReqContext) response.Res
return apierrors.ToFolderErrorResponse(dashboards.ErrFolderAccessDenied) return apierrors.ToFolderErrorResponse(dashboards.ErrFolderAccessDenied)
} }
items := make([]*models.DashboardACL, 0, len(apiCmd.Items)) items := make([]*dashboards.DashboardACL, 0, len(apiCmd.Items))
for _, item := range apiCmd.Items { for _, item := range apiCmd.Items {
items = append(items, &models.DashboardACL{ items = append(items, &dashboards.DashboardACL{
OrgID: c.OrgID, OrgID: c.OrgID,
DashboardID: folder.ID, DashboardID: folder.ID,
UserID: item.UserID, UserID: item.UserID,
@ -198,5 +198,5 @@ type UpdateFolderPermissionsParams struct {
// swagger:response getFolderPermissionListResponse // swagger:response getFolderPermissionListResponse
type GetFolderPermissionsResponse struct { type GetFolderPermissionsResponse struct {
// in: body // in: body
Body []*models.DashboardACLInfoDTO `json:"body"` Body []*dashboards.DashboardACLInfoDTO `json:"body"`
} }

@ -122,12 +122,12 @@ func TestFolderPermissionAPIEndpoint(t *testing.T) {
guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{ guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{
CanAdminValue: true, CanAdminValue: true,
CheckPermissionBeforeUpdateValue: true, CheckPermissionBeforeUpdateValue: true,
GetACLValue: []*models.DashboardACLInfoDTO{ GetACLValue: []*dashboards.DashboardACLInfoDTO{
{OrgId: 1, DashboardId: 1, UserId: 2, Permission: models.PERMISSION_VIEW}, {OrgID: 1, DashboardID: 1, UserID: 2, Permission: models.PERMISSION_VIEW},
{OrgId: 1, DashboardId: 1, UserId: 3, Permission: models.PERMISSION_EDIT}, {OrgID: 1, DashboardID: 1, UserID: 3, Permission: models.PERMISSION_EDIT},
{OrgId: 1, DashboardId: 1, UserId: 4, Permission: models.PERMISSION_ADMIN}, {OrgID: 1, DashboardID: 1, UserID: 4, Permission: models.PERMISSION_ADMIN},
{OrgId: 1, DashboardId: 1, TeamId: 1, Permission: models.PERMISSION_VIEW}, {OrgID: 1, DashboardID: 1, TeamID: 1, Permission: models.PERMISSION_VIEW},
{OrgId: 1, DashboardId: 1, TeamId: 2, Permission: models.PERMISSION_ADMIN}, {OrgID: 1, DashboardID: 1, TeamID: 2, Permission: models.PERMISSION_ADMIN},
}, },
}) })
@ -139,12 +139,12 @@ func TestFolderPermissionAPIEndpoint(t *testing.T) {
callGetFolderPermissions(sc, hs) callGetFolderPermissions(sc, hs)
assert.Equal(t, 200, sc.resp.Code) assert.Equal(t, 200, sc.resp.Code)
var resp []*models.DashboardACLInfoDTO var resp []*dashboards.DashboardACLInfoDTO
err := json.Unmarshal(sc.resp.Body.Bytes(), &resp) err := json.Unmarshal(sc.resp.Body.Bytes(), &resp)
require.NoError(t, err) require.NoError(t, err)
assert.Len(t, resp, 5) assert.Len(t, resp, 5)
assert.Equal(t, int64(2), resp[0].UserId) assert.Equal(t, int64(2), resp[0].UserID)
assert.Equal(t, models.PERMISSION_VIEW, resp[0].Permission) assert.Equal(t, models.PERMISSION_VIEW, resp[0].Permission)
}, mockSQLStore) }, mockSQLStore)
@ -286,24 +286,24 @@ func TestFolderPermissionAPIEndpoint(t *testing.T) {
guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{ guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{
CanAdminValue: true, CanAdminValue: true,
CheckPermissionBeforeUpdateValue: true, CheckPermissionBeforeUpdateValue: true,
GetACLValue: []*models.DashboardACLInfoDTO{ GetACLValue: []*dashboards.DashboardACLInfoDTO{
{OrgId: 1, DashboardId: 1, UserId: 2, UserLogin: "hiddenUser", Permission: models.PERMISSION_VIEW}, {OrgID: 1, DashboardID: 1, UserID: 2, UserLogin: "hiddenUser", Permission: models.PERMISSION_VIEW},
{OrgId: 1, DashboardId: 1, UserId: 3, UserLogin: testUserLogin, Permission: models.PERMISSION_EDIT}, {OrgID: 1, DashboardID: 1, UserID: 3, UserLogin: testUserLogin, Permission: models.PERMISSION_EDIT},
{OrgId: 1, DashboardId: 1, UserId: 4, UserLogin: "user_1", Permission: models.PERMISSION_ADMIN}, {OrgID: 1, DashboardID: 1, UserID: 4, UserLogin: "user_1", Permission: models.PERMISSION_ADMIN},
}, },
GetHiddenACLValue: []*models.DashboardACL{ GetHiddenACLValue: []*dashboards.DashboardACL{
{OrgID: 1, DashboardID: 1, UserID: 2, Permission: models.PERMISSION_VIEW}, {OrgID: 1, DashboardID: 1, UserID: 2, Permission: models.PERMISSION_VIEW},
}, },
}) })
var gotItems []*models.DashboardACL var gotItems []*dashboards.DashboardACL
folderService.ExpectedFolder = &folder.Folder{ID: 1, UID: "uid", Title: "Folder"} folderService.ExpectedFolder = &folder.Folder{ID: 1, UID: "uid", Title: "Folder"}
dashboardStore.On("UpdateDashboardACL", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { dashboardStore.On("UpdateDashboardACL", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
gotItems = args.Get(2).([]*models.DashboardACL) gotItems = args.Get(2).([]*dashboards.DashboardACL)
}).Return(nil).Once() }).Return(nil).Once()
var resp []*models.DashboardACLInfoDTO var resp []*dashboards.DashboardACLInfoDTO
mockSQLStore := dbtest.NewFakeDB() mockSQLStore := dbtest.NewFakeDB()
loggedInUserScenarioWithRole(t, "When calling GET on", "GET", "/api/folders/uid/permissions", "/api/folders/:uid/permissions", org.RoleAdmin, func(sc *scenarioContext) { loggedInUserScenarioWithRole(t, "When calling GET on", "GET", "/api/folders/uid/permissions", "/api/folders/:uid/permissions", org.RoleAdmin, func(sc *scenarioContext) {
callGetFolderPermissions(sc, hs) callGetFolderPermissions(sc, hs)
@ -313,9 +313,9 @@ func TestFolderPermissionAPIEndpoint(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
assert.Len(t, resp, 2) assert.Len(t, resp, 2)
assert.Equal(t, int64(3), resp[0].UserId) assert.Equal(t, int64(3), resp[0].UserID)
assert.Equal(t, models.PERMISSION_EDIT, resp[0].Permission) assert.Equal(t, models.PERMISSION_EDIT, resp[0].Permission)
assert.Equal(t, int64(4), resp[1].UserId) assert.Equal(t, int64(4), resp[1].UserID)
assert.Equal(t, models.PERMISSION_ADMIN, resp[1].Permission) assert.Equal(t, models.PERMISSION_ADMIN, resp[1].Permission)
}, mockSQLStore) }, mockSQLStore)
@ -326,7 +326,7 @@ func TestFolderPermissionAPIEndpoint(t *testing.T) {
} }
for _, acl := range resp { for _, acl := range resp {
cmd.Items = append(cmd.Items, dtos.DashboardACLUpdateItem{ cmd.Items = append(cmd.Items, dtos.DashboardACLUpdateItem{
UserID: acl.UserId, UserID: acl.UserID,
Permission: acl.Permission, Permission: acl.Permission,
}) })
} }

@ -235,11 +235,11 @@ func createFolderScenario(t *testing.T, desc string, url string, routePattern st
cmd models.CreateFolderCommand, fn scenarioFunc) { cmd models.CreateFolderCommand, fn scenarioFunc) {
setUpRBACGuardian(t) setUpRBACGuardian(t)
t.Run(fmt.Sprintf("%s %s", desc, url), func(t *testing.T) { t.Run(fmt.Sprintf("%s %s", desc, url), func(t *testing.T) {
aclMockResp := []*models.DashboardACLInfoDTO{} aclMockResp := []*dashboards.DashboardACLInfoDTO{}
teamSvc := &teamtest.FakeService{} teamSvc := &teamtest.FakeService{}
dashSvc := &dashboards.FakeDashboardService{} dashSvc := &dashboards.FakeDashboardService{}
dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) { dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) {
q := args.Get(1).(*models.GetDashboardACLInfoListQuery) q := args.Get(1).(*dashboards.GetDashboardACLInfoListQuery)
q.Result = aclMockResp q.Result = aclMockResp
}).Return(nil) }).Return(nil)
dashSvc.On("GetDashboard", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardQuery")).Run(func(args mock.Arguments) { dashSvc.On("GetDashboard", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardQuery")).Run(func(args mock.Arguments) {

@ -219,7 +219,7 @@ func TestOrgUsersAPIEndpoint_LegacyAccessControl_FolderAdmin(t *testing.T) {
require.NotNil(t, folder) require.NotNil(t, folder)
// Grant our test Viewer with permission to admin the folder // Grant our test Viewer with permission to admin the folder
acls := []*models.DashboardACL{ acls := []*dashboards.DashboardACL{
{ {
DashboardID: folder.ID, DashboardID: folder.ID,
OrgID: testOrgID, OrgID: testOrgID,

@ -259,7 +259,7 @@ func createDummyDashboard(t *testing.T, sqlStore *sqlstore.SQLStore, dashboardPr
func createDummyACL(t *testing.T, sqlStore *sqlstore.SQLStore, dashboardPermission *DashboardPermission, search Search, dashboardID int64) int64 { func createDummyACL(t *testing.T, sqlStore *sqlstore.SQLStore, dashboardPermission *DashboardPermission, search Search, dashboardID int64) int64 {
t.Helper() t.Helper()
acl := &models.DashboardACL{ acl := &dashboards.DashboardACL{
OrgID: 1, OrgID: 1,
Created: time.Now(), Created: time.Now(),
Updated: time.Now(), Updated: time.Now(),
@ -388,7 +388,7 @@ func insertTestDashboard(t *testing.T, sqlStore *sqlstore.SQLStore, title string
} }
// TODO: Use FakeDashboardStore when org has its own service // TODO: Use FakeDashboardStore when org has its own service
func updateDashboardACL(t *testing.T, sqlStore *sqlstore.SQLStore, dashboardID int64, items ...*models.DashboardACL) error { func updateDashboardACL(t *testing.T, sqlStore *sqlstore.SQLStore, dashboardID int64, items ...*dashboards.DashboardACL) error {
t.Helper() t.Helper()
err := sqlStore.WithDbSession(context.Background(), func(sess *Session) error { err := sqlStore.WithDbSession(context.Background(), func(sess *Session) error {

@ -2,9 +2,6 @@ package models
import ( import (
"errors" "errors"
"time"
"github.com/grafana/grafana/pkg/services/org"
) )
type PermissionType int type PermissionType int
@ -33,76 +30,3 @@ var (
ErrPermissionsWithRoleNotAllowed = errors.New("permissions cannot have both a user and team") ErrPermissionsWithRoleNotAllowed = errors.New("permissions cannot have both a user and team")
ErrPermissionsWithUserAndTeamNotAllowed = errors.New("team and user permissions cannot have an associated role") ErrPermissionsWithUserAndTeamNotAllowed = errors.New("team and user permissions cannot have an associated role")
) )
// Dashboard ACL model
type DashboardACL struct {
// nolint:stylecheck
Id int64
OrgID int64 `xorm:"org_id"`
DashboardID int64 `xorm:"dashboard_id"`
UserID int64 `xorm:"user_id"`
TeamID int64 `xorm:"team_id"`
Role *org.RoleType // pointer to be nullable
Permission PermissionType
Created time.Time
Updated time.Time
}
type DashboardACLInfoDTO struct {
OrgId int64 `json:"-"`
DashboardId int64 `json:"dashboardId,omitempty"`
FolderId int64 `json:"folderId,omitempty"`
Created time.Time `json:"created"`
Updated time.Time `json:"updated"`
UserId int64 `json:"userId"`
UserLogin string `json:"userLogin"`
UserEmail string `json:"userEmail"`
UserAvatarUrl string `json:"userAvatarUrl"`
TeamId int64 `json:"teamId"`
TeamEmail string `json:"teamEmail"`
TeamAvatarUrl string `json:"teamAvatarUrl"`
Team string `json:"team"`
Role *org.RoleType `json:"role,omitempty"`
Permission PermissionType `json:"permission"`
PermissionName string `json:"permissionName"`
Uid string `json:"uid"`
Title string `json:"title"`
Slug string `json:"slug"`
IsFolder bool `json:"isFolder"`
Url string `json:"url"`
Inherited bool `json:"inherited"`
}
func (dto *DashboardACLInfoDTO) hasSameRoleAs(other *DashboardACLInfoDTO) bool {
if dto.Role == nil || other.Role == nil {
return false
}
return dto.UserId <= 0 && dto.TeamId <= 0 && dto.UserId == other.UserId && dto.TeamId == other.TeamId && *dto.Role == *other.Role
}
func (dto *DashboardACLInfoDTO) hasSameUserAs(other *DashboardACLInfoDTO) bool {
return dto.UserId > 0 && dto.UserId == other.UserId
}
func (dto *DashboardACLInfoDTO) hasSameTeamAs(other *DashboardACLInfoDTO) bool {
return dto.TeamId > 0 && dto.TeamId == other.TeamId
}
// IsDuplicateOf returns true if other item has same role, same user or same team
func (dto *DashboardACLInfoDTO) IsDuplicateOf(other *DashboardACLInfoDTO) bool {
return dto.hasSameRoleAs(other) || dto.hasSameUserAs(other) || dto.hasSameTeamAs(other)
}
// QUERIES
type GetDashboardACLInfoListQuery struct {
DashboardID int64
OrgID int64
Result []*DashboardACLInfoDTO
}
func (p DashboardACL) TableName() string { return "dashboard_acl" }

@ -16,7 +16,7 @@ type DashboardService interface {
DeleteDashboard(ctx context.Context, dashboardId int64, orgId int64) error DeleteDashboard(ctx context.Context, dashboardId int64, orgId int64) error
FindDashboards(ctx context.Context, query *models.FindPersistedDashboardsQuery) ([]DashboardSearchProjection, error) FindDashboards(ctx context.Context, query *models.FindPersistedDashboardsQuery) ([]DashboardSearchProjection, error)
GetDashboard(ctx context.Context, query *GetDashboardQuery) error GetDashboard(ctx context.Context, query *GetDashboardQuery) error
GetDashboardACLInfoList(ctx context.Context, query *models.GetDashboardACLInfoListQuery) error GetDashboardACLInfoList(ctx context.Context, query *GetDashboardACLInfoListQuery) error
GetDashboards(ctx context.Context, query *GetDashboardsQuery) error GetDashboards(ctx context.Context, query *GetDashboardsQuery) error
GetDashboardTags(ctx context.Context, query *GetDashboardTagsQuery) error GetDashboardTags(ctx context.Context, query *GetDashboardTagsQuery) error
GetDashboardUIDByID(ctx context.Context, query *GetDashboardRefByIDQuery) error GetDashboardUIDByID(ctx context.Context, query *GetDashboardRefByIDQuery) error
@ -26,7 +26,7 @@ type DashboardService interface {
MakeUserAdmin(ctx context.Context, orgID int64, userID, dashboardID int64, setViewAndEditPermissions bool) error MakeUserAdmin(ctx context.Context, orgID int64, userID, dashboardID int64, setViewAndEditPermissions bool) error
SaveDashboard(ctx context.Context, dto *SaveDashboardDTO, allowUiUpdate bool) (*Dashboard, error) SaveDashboard(ctx context.Context, dto *SaveDashboardDTO, allowUiUpdate bool) (*Dashboard, error)
SearchDashboards(ctx context.Context, query *models.FindPersistedDashboardsQuery) error SearchDashboards(ctx context.Context, query *models.FindPersistedDashboardsQuery) error
UpdateDashboardACL(ctx context.Context, uid int64, items []*models.DashboardACL) error UpdateDashboardACL(ctx context.Context, uid int64, items []*DashboardACL) error
DeleteACLByUser(ctx context.Context, userID int64) error DeleteACLByUser(ctx context.Context, userID int64) error
CountDashboardsInFolder(ctx context.Context, query *CountDashboardsInFolderQuery) (int64, error) CountDashboardsInFolder(ctx context.Context, query *CountDashboardsInFolderQuery) (int64, error)
} }
@ -58,7 +58,7 @@ type Store interface {
DeleteOrphanedProvisionedDashboards(ctx context.Context, cmd *DeleteOrphanedProvisionedDashboardsCommand) error DeleteOrphanedProvisionedDashboards(ctx context.Context, cmd *DeleteOrphanedProvisionedDashboardsCommand) error
FindDashboards(ctx context.Context, query *models.FindPersistedDashboardsQuery) ([]DashboardSearchProjection, error) FindDashboards(ctx context.Context, query *models.FindPersistedDashboardsQuery) ([]DashboardSearchProjection, error)
GetDashboard(ctx context.Context, query *GetDashboardQuery) (*Dashboard, error) GetDashboard(ctx context.Context, query *GetDashboardQuery) (*Dashboard, error)
GetDashboardACLInfoList(ctx context.Context, query *models.GetDashboardACLInfoListQuery) error GetDashboardACLInfoList(ctx context.Context, query *GetDashboardACLInfoListQuery) error
GetDashboardUIDByID(ctx context.Context, query *GetDashboardRefByIDQuery) error GetDashboardUIDByID(ctx context.Context, query *GetDashboardRefByIDQuery) error
GetDashboards(ctx context.Context, query *GetDashboardsQuery) error GetDashboards(ctx context.Context, query *GetDashboardsQuery) error
// GetDashboardsByPluginID retrieves dashboards identified by plugin. // GetDashboardsByPluginID retrieves dashboards identified by plugin.
@ -74,7 +74,7 @@ type Store interface {
SaveDashboard(ctx context.Context, cmd SaveDashboardCommand) (*Dashboard, error) SaveDashboard(ctx context.Context, cmd SaveDashboardCommand) (*Dashboard, error)
SaveProvisionedDashboard(ctx context.Context, cmd SaveDashboardCommand, provisioning *DashboardProvisioning) (*Dashboard, error) SaveProvisionedDashboard(ctx context.Context, cmd SaveDashboardCommand, provisioning *DashboardProvisioning) (*Dashboard, error)
UnprovisionDashboard(ctx context.Context, id int64) error UnprovisionDashboard(ctx context.Context, id int64) error
UpdateDashboardACL(ctx context.Context, uid int64, items []*models.DashboardACL) error UpdateDashboardACL(ctx context.Context, uid int64, items []*DashboardACL) error
// ValidateDashboardBeforeSave validates a dashboard before save. // ValidateDashboardBeforeSave validates a dashboard before save.
ValidateDashboardBeforeSave(ctx context.Context, dashboard *Dashboard, overwrite bool) (bool, error) ValidateDashboardBeforeSave(ctx context.Context, dashboard *Dashboard, overwrite bool) (bool, error)
DeleteACLByUser(context.Context, int64) error DeleteACLByUser(context.Context, int64) error

@ -124,11 +124,11 @@ func (_m *FakeDashboardService) GetDashboard(ctx context.Context, query *GetDash
} }
// GetDashboardACLInfoList provides a mock function with given fields: ctx, query // GetDashboardACLInfoList provides a mock function with given fields: ctx, query
func (_m *FakeDashboardService) GetDashboardACLInfoList(ctx context.Context, query *models.GetDashboardACLInfoListQuery) error { func (_m *FakeDashboardService) GetDashboardACLInfoList(ctx context.Context, query *GetDashboardACLInfoListQuery) error {
ret := _m.Called(ctx, query) ret := _m.Called(ctx, query)
var r0 error var r0 error
if rf, ok := ret.Get(0).(func(context.Context, *models.GetDashboardACLInfoListQuery) error); ok { if rf, ok := ret.Get(0).(func(context.Context, *GetDashboardACLInfoListQuery) error); ok {
r0 = rf(ctx, query) r0 = rf(ctx, query)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
@ -282,11 +282,11 @@ func (_m *FakeDashboardService) SearchDashboards(ctx context.Context, query *mod
} }
// UpdateDashboardACL provides a mock function with given fields: ctx, uid, items // UpdateDashboardACL provides a mock function with given fields: ctx, uid, items
func (_m *FakeDashboardService) UpdateDashboardACL(ctx context.Context, uid int64, items []*models.DashboardACL) error { func (_m *FakeDashboardService) UpdateDashboardACL(ctx context.Context, uid int64, items []*DashboardACL) error {
ret := _m.Called(ctx, uid, items) ret := _m.Called(ctx, uid, items)
var r0 error var r0 error
if rf, ok := ret.Get(0).(func(context.Context, int64, []*models.DashboardACL) error); ok { if rf, ok := ret.Get(0).(func(context.Context, int64, []*DashboardACL) error); ok {
r0 = rf(ctx, uid, items) r0 = rf(ctx, uid, items)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)

@ -5,6 +5,7 @@ import (
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/dashboards"
"github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/org"
) )
@ -13,9 +14,9 @@ import (
// 1) Permissions for the dashboard // 1) Permissions for the dashboard
// 2) permissions for its parent folder // 2) permissions for its parent folder
// 3) if no specific permissions have been set for the dashboard or its parent folder then get the default permissions // 3) if no specific permissions have been set for the dashboard or its parent folder then get the default permissions
func (d *DashboardStore) GetDashboardACLInfoList(ctx context.Context, query *models.GetDashboardACLInfoListQuery) error { func (d *DashboardStore) GetDashboardACLInfoList(ctx context.Context, query *dashboards.GetDashboardACLInfoListQuery) error {
outerErr := d.store.WithDbSession(ctx, func(dbSession *db.Session) error { outerErr := d.store.WithDbSession(ctx, func(dbSession *db.Session) error {
query.Result = make([]*models.DashboardACLInfoDTO, 0) query.Result = make([]*dashboards.DashboardACLInfoDTO, 0)
falseStr := d.store.GetDialect().BooleanStr(false) falseStr := d.store.GetDialect().BooleanStr(false)
if query.DashboardID == 0 { if query.DashboardID == 0 {

@ -42,7 +42,7 @@ func TestIntegrationDashboardACLDataAccess(t *testing.T) {
t.Run("Dashboard permission with userId and teamId set to 0", func(t *testing.T) { t.Run("Dashboard permission with userId and teamId set to 0", func(t *testing.T) {
setup(t) setup(t)
err := updateDashboardACL(t, dashboardStore, savedFolder.ID, models.DashboardACL{ err := updateDashboardACL(t, dashboardStore, savedFolder.ID, dashboards.DashboardACL{
OrgID: 1, OrgID: 1,
DashboardID: savedFolder.ID, DashboardID: savedFolder.ID,
Permission: models.PERMISSION_EDIT, Permission: models.PERMISSION_EDIT,
@ -52,34 +52,34 @@ func TestIntegrationDashboardACLDataAccess(t *testing.T) {
t.Run("Folder acl should include default acl", func(t *testing.T) { t.Run("Folder acl should include default acl", func(t *testing.T) {
setup(t) setup(t)
query := models.GetDashboardACLInfoListQuery{DashboardID: savedFolder.ID, OrgID: 1} query := dashboards.GetDashboardACLInfoListQuery{DashboardID: savedFolder.ID, OrgID: 1}
err := dashboardStore.GetDashboardACLInfoList(context.Background(), &query) err := dashboardStore.GetDashboardACLInfoList(context.Background(), &query)
require.Nil(t, err) require.Nil(t, err)
require.Equal(t, 2, len(query.Result)) require.Equal(t, 2, len(query.Result))
defaultPermissionsId := int64(-1) defaultPermissionsId := int64(-1)
require.Equal(t, defaultPermissionsId, query.Result[0].DashboardId) require.Equal(t, defaultPermissionsId, query.Result[0].DashboardID)
require.Equal(t, org.RoleViewer, *query.Result[0].Role) require.Equal(t, org.RoleViewer, *query.Result[0].Role)
require.False(t, query.Result[0].Inherited) require.False(t, query.Result[0].Inherited)
require.Equal(t, defaultPermissionsId, query.Result[1].DashboardId) require.Equal(t, defaultPermissionsId, query.Result[1].DashboardID)
require.Equal(t, org.RoleEditor, *query.Result[1].Role) require.Equal(t, org.RoleEditor, *query.Result[1].Role)
require.False(t, query.Result[1].Inherited) require.False(t, query.Result[1].Inherited)
}) })
t.Run("Dashboard acl should include acl for parent folder", func(t *testing.T) { t.Run("Dashboard acl should include acl for parent folder", func(t *testing.T) {
setup(t) setup(t)
query := models.GetDashboardACLInfoListQuery{DashboardID: childDash.ID, OrgID: 1} query := dashboards.GetDashboardACLInfoListQuery{DashboardID: childDash.ID, OrgID: 1}
err := dashboardStore.GetDashboardACLInfoList(context.Background(), &query) err := dashboardStore.GetDashboardACLInfoList(context.Background(), &query)
require.Nil(t, err) require.Nil(t, err)
require.Equal(t, 2, len(query.Result)) require.Equal(t, 2, len(query.Result))
defaultPermissionsId := int64(-1) defaultPermissionsId := int64(-1)
require.Equal(t, defaultPermissionsId, query.Result[0].DashboardId) require.Equal(t, defaultPermissionsId, query.Result[0].DashboardID)
require.Equal(t, org.RoleViewer, *query.Result[0].Role) require.Equal(t, org.RoleViewer, *query.Result[0].Role)
require.True(t, query.Result[0].Inherited) require.True(t, query.Result[0].Inherited)
require.Equal(t, defaultPermissionsId, query.Result[1].DashboardId) require.Equal(t, defaultPermissionsId, query.Result[1].DashboardID)
require.Equal(t, org.RoleEditor, *query.Result[1].Role) require.Equal(t, org.RoleEditor, *query.Result[1].Role)
require.True(t, query.Result[1].Inherited) require.True(t, query.Result[1].Inherited)
}) })
@ -89,7 +89,7 @@ func TestIntegrationDashboardACLDataAccess(t *testing.T) {
err := dashboardStore.UpdateDashboardACL(context.Background(), savedFolder.ID, nil) err := dashboardStore.UpdateDashboardACL(context.Background(), savedFolder.ID, nil)
require.Nil(t, err) require.Nil(t, err)
query := models.GetDashboardACLInfoListQuery{DashboardID: childDash.ID, OrgID: 1} query := dashboards.GetDashboardACLInfoListQuery{DashboardID: childDash.ID, OrgID: 1}
err = dashboardStore.GetDashboardACLInfoList(context.Background(), &query) err = dashboardStore.GetDashboardACLInfoList(context.Background(), &query)
require.Nil(t, err) require.Nil(t, err)
@ -99,7 +99,7 @@ func TestIntegrationDashboardACLDataAccess(t *testing.T) {
t.Run("Given a dashboard folder and a user", func(t *testing.T) { t.Run("Given a dashboard folder and a user", func(t *testing.T) {
t.Run("Given dashboard folder permission", func(t *testing.T) { t.Run("Given dashboard folder permission", func(t *testing.T) {
setup(t) setup(t)
err := updateDashboardACL(t, dashboardStore, savedFolder.ID, models.DashboardACL{ err := updateDashboardACL(t, dashboardStore, savedFolder.ID, dashboards.DashboardACL{
OrgID: 1, OrgID: 1,
UserID: currentUser.ID, UserID: currentUser.ID,
DashboardID: savedFolder.ID, DashboardID: savedFolder.ID,
@ -108,17 +108,17 @@ func TestIntegrationDashboardACLDataAccess(t *testing.T) {
require.Nil(t, err) require.Nil(t, err)
t.Run("When reading dashboard acl should include acl for parent folder", func(t *testing.T) { t.Run("When reading dashboard acl should include acl for parent folder", func(t *testing.T) {
query := models.GetDashboardACLInfoListQuery{DashboardID: childDash.ID, OrgID: 1} query := dashboards.GetDashboardACLInfoListQuery{DashboardID: childDash.ID, OrgID: 1}
err := dashboardStore.GetDashboardACLInfoList(context.Background(), &query) err := dashboardStore.GetDashboardACLInfoList(context.Background(), &query)
require.Nil(t, err) require.Nil(t, err)
require.Equal(t, 1, len(query.Result)) require.Equal(t, 1, len(query.Result))
require.Equal(t, savedFolder.ID, query.Result[0].DashboardId) require.Equal(t, savedFolder.ID, query.Result[0].DashboardID)
}) })
t.Run("Given child dashboard permission", func(t *testing.T) { t.Run("Given child dashboard permission", func(t *testing.T) {
err := updateDashboardACL(t, dashboardStore, childDash.ID, models.DashboardACL{ err := updateDashboardACL(t, dashboardStore, childDash.ID, dashboards.DashboardACL{
OrgID: 1, OrgID: 1,
UserID: currentUser.ID, UserID: currentUser.ID,
DashboardID: childDash.ID, DashboardID: childDash.ID,
@ -127,15 +127,15 @@ func TestIntegrationDashboardACLDataAccess(t *testing.T) {
require.Nil(t, err) require.Nil(t, err)
t.Run("When reading dashboard acl should include acl for parent folder and child", func(t *testing.T) { t.Run("When reading dashboard acl should include acl for parent folder and child", func(t *testing.T) {
query := models.GetDashboardACLInfoListQuery{OrgID: 1, DashboardID: childDash.ID} query := dashboards.GetDashboardACLInfoListQuery{OrgID: 1, DashboardID: childDash.ID}
err := dashboardStore.GetDashboardACLInfoList(context.Background(), &query) err := dashboardStore.GetDashboardACLInfoList(context.Background(), &query)
require.Nil(t, err) require.Nil(t, err)
require.Equal(t, 2, len(query.Result)) require.Equal(t, 2, len(query.Result))
require.Equal(t, savedFolder.ID, query.Result[0].DashboardId) require.Equal(t, savedFolder.ID, query.Result[0].DashboardID)
require.True(t, query.Result[0].Inherited) require.True(t, query.Result[0].Inherited)
require.Equal(t, childDash.ID, query.Result[1].DashboardId) require.Equal(t, childDash.ID, query.Result[1].DashboardID)
require.False(t, query.Result[1].Inherited) require.False(t, query.Result[1].Inherited)
}) })
}) })
@ -143,7 +143,7 @@ func TestIntegrationDashboardACLDataAccess(t *testing.T) {
t.Run("Reading dashboard acl should include default acl for parent folder and the child acl", func(t *testing.T) { t.Run("Reading dashboard acl should include default acl for parent folder and the child acl", func(t *testing.T) {
setup(t) setup(t)
err := updateDashboardACL(t, dashboardStore, childDash.ID, models.DashboardACL{ err := updateDashboardACL(t, dashboardStore, childDash.ID, dashboards.DashboardACL{
OrgID: 1, OrgID: 1,
UserID: currentUser.ID, UserID: currentUser.ID,
DashboardID: childDash.ID, DashboardID: childDash.ID,
@ -151,26 +151,26 @@ func TestIntegrationDashboardACLDataAccess(t *testing.T) {
}) })
require.Nil(t, err) require.Nil(t, err)
query := models.GetDashboardACLInfoListQuery{OrgID: 1, DashboardID: childDash.ID} query := dashboards.GetDashboardACLInfoListQuery{OrgID: 1, DashboardID: childDash.ID}
err = dashboardStore.GetDashboardACLInfoList(context.Background(), &query) err = dashboardStore.GetDashboardACLInfoList(context.Background(), &query)
require.Nil(t, err) require.Nil(t, err)
defaultPermissionsId := int64(-1) defaultPermissionsId := int64(-1)
require.Equal(t, 3, len(query.Result)) require.Equal(t, 3, len(query.Result))
require.Equal(t, defaultPermissionsId, query.Result[0].DashboardId) require.Equal(t, defaultPermissionsId, query.Result[0].DashboardID)
require.Equal(t, org.RoleViewer, *query.Result[0].Role) require.Equal(t, org.RoleViewer, *query.Result[0].Role)
require.True(t, query.Result[0].Inherited) require.True(t, query.Result[0].Inherited)
require.Equal(t, defaultPermissionsId, query.Result[1].DashboardId) require.Equal(t, defaultPermissionsId, query.Result[1].DashboardID)
require.Equal(t, org.RoleEditor, *query.Result[1].Role) require.Equal(t, org.RoleEditor, *query.Result[1].Role)
require.True(t, query.Result[1].Inherited) require.True(t, query.Result[1].Inherited)
require.Equal(t, childDash.ID, query.Result[2].DashboardId) require.Equal(t, childDash.ID, query.Result[2].DashboardID)
require.False(t, query.Result[2].Inherited) require.False(t, query.Result[2].Inherited)
}) })
t.Run("Add and delete dashboard permission", func(t *testing.T) { t.Run("Add and delete dashboard permission", func(t *testing.T) {
setup(t) setup(t)
err := updateDashboardACL(t, dashboardStore, savedFolder.ID, models.DashboardACL{ err := updateDashboardACL(t, dashboardStore, savedFolder.ID, dashboards.DashboardACL{
OrgID: 1, OrgID: 1,
UserID: currentUser.ID, UserID: currentUser.ID,
DashboardID: savedFolder.ID, DashboardID: savedFolder.ID,
@ -178,21 +178,21 @@ func TestIntegrationDashboardACLDataAccess(t *testing.T) {
}) })
require.Nil(t, err) require.Nil(t, err)
q1 := &models.GetDashboardACLInfoListQuery{DashboardID: savedFolder.ID, OrgID: 1} q1 := &dashboards.GetDashboardACLInfoListQuery{DashboardID: savedFolder.ID, OrgID: 1}
err = dashboardStore.GetDashboardACLInfoList(context.Background(), q1) err = dashboardStore.GetDashboardACLInfoList(context.Background(), q1)
require.Nil(t, err) require.Nil(t, err)
require.Equal(t, savedFolder.ID, q1.Result[0].DashboardId) require.Equal(t, savedFolder.ID, q1.Result[0].DashboardID)
require.Equal(t, models.PERMISSION_EDIT, q1.Result[0].Permission) require.Equal(t, models.PERMISSION_EDIT, q1.Result[0].Permission)
require.Equal(t, "Edit", q1.Result[0].PermissionName) require.Equal(t, "Edit", q1.Result[0].PermissionName)
require.Equal(t, currentUser.ID, q1.Result[0].UserId) require.Equal(t, currentUser.ID, q1.Result[0].UserID)
require.Equal(t, currentUser.Login, q1.Result[0].UserLogin) require.Equal(t, currentUser.Login, q1.Result[0].UserLogin)
require.Equal(t, currentUser.Email, q1.Result[0].UserEmail) require.Equal(t, currentUser.Email, q1.Result[0].UserEmail)
err = updateDashboardACL(t, dashboardStore, savedFolder.ID) err = updateDashboardACL(t, dashboardStore, savedFolder.ID)
require.Nil(t, err) require.Nil(t, err)
q3 := &models.GetDashboardACLInfoListQuery{DashboardID: savedFolder.ID, OrgID: 1} q3 := &dashboards.GetDashboardACLInfoListQuery{DashboardID: savedFolder.ID, OrgID: 1}
err = dashboardStore.GetDashboardACLInfoList(context.Background(), q3) err = dashboardStore.GetDashboardACLInfoList(context.Background(), q3)
require.Nil(t, err) require.Nil(t, err)
require.Equal(t, 0, len(q3.Result)) require.Equal(t, 0, len(q3.Result))
@ -204,7 +204,7 @@ func TestIntegrationDashboardACLDataAccess(t *testing.T) {
team1, err := teamSvc.CreateTeam("group1 name", "", 1) team1, err := teamSvc.CreateTeam("group1 name", "", 1)
require.Nil(t, err) require.Nil(t, err)
err = updateDashboardACL(t, dashboardStore, savedFolder.ID, models.DashboardACL{ err = updateDashboardACL(t, dashboardStore, savedFolder.ID, dashboards.DashboardACL{
OrgID: 1, OrgID: 1,
TeamID: team1.ID, TeamID: team1.ID,
DashboardID: savedFolder.ID, DashboardID: savedFolder.ID,
@ -212,12 +212,12 @@ func TestIntegrationDashboardACLDataAccess(t *testing.T) {
}) })
require.Nil(t, err) require.Nil(t, err)
q1 := &models.GetDashboardACLInfoListQuery{DashboardID: savedFolder.ID, OrgID: 1} q1 := &dashboards.GetDashboardACLInfoListQuery{DashboardID: savedFolder.ID, OrgID: 1}
err = dashboardStore.GetDashboardACLInfoList(context.Background(), q1) err = dashboardStore.GetDashboardACLInfoList(context.Background(), q1)
require.Nil(t, err) require.Nil(t, err)
require.Equal(t, savedFolder.ID, q1.Result[0].DashboardId) require.Equal(t, savedFolder.ID, q1.Result[0].DashboardID)
require.Equal(t, models.PERMISSION_EDIT, q1.Result[0].Permission) require.Equal(t, models.PERMISSION_EDIT, q1.Result[0].Permission)
require.Equal(t, team1.ID, q1.Result[0].TeamId) require.Equal(t, team1.ID, q1.Result[0].TeamID)
}) })
t.Run("Should be able to update an existing permission for a team", func(t *testing.T) { t.Run("Should be able to update an existing permission for a team", func(t *testing.T) {
@ -225,7 +225,7 @@ func TestIntegrationDashboardACLDataAccess(t *testing.T) {
teamSvc := teamimpl.ProvideService(sqlStore, sqlStore.Cfg) teamSvc := teamimpl.ProvideService(sqlStore, sqlStore.Cfg)
team1, err := teamSvc.CreateTeam("group1 name", "", 1) team1, err := teamSvc.CreateTeam("group1 name", "", 1)
require.Nil(t, err) require.Nil(t, err)
err = updateDashboardACL(t, dashboardStore, savedFolder.ID, models.DashboardACL{ err = updateDashboardACL(t, dashboardStore, savedFolder.ID, dashboards.DashboardACL{
OrgID: 1, OrgID: 1,
TeamID: team1.ID, TeamID: team1.ID,
DashboardID: savedFolder.ID, DashboardID: savedFolder.ID,
@ -233,13 +233,13 @@ func TestIntegrationDashboardACLDataAccess(t *testing.T) {
}) })
require.Nil(t, err) require.Nil(t, err)
q3 := &models.GetDashboardACLInfoListQuery{DashboardID: savedFolder.ID, OrgID: 1} q3 := &dashboards.GetDashboardACLInfoListQuery{DashboardID: savedFolder.ID, OrgID: 1}
err = dashboardStore.GetDashboardACLInfoList(context.Background(), q3) err = dashboardStore.GetDashboardACLInfoList(context.Background(), q3)
require.Nil(t, err) require.Nil(t, err)
require.Equal(t, 1, len(q3.Result)) require.Equal(t, 1, len(q3.Result))
require.Equal(t, savedFolder.ID, q3.Result[0].DashboardId) require.Equal(t, savedFolder.ID, q3.Result[0].DashboardID)
require.Equal(t, models.PERMISSION_ADMIN, q3.Result[0].Permission) require.Equal(t, models.PERMISSION_ADMIN, q3.Result[0].Permission)
require.Equal(t, team1.ID, q3.Result[0].TeamId) require.Equal(t, team1.ID, q3.Result[0].TeamID)
}) })
}) })
@ -248,17 +248,17 @@ func TestIntegrationDashboardACLDataAccess(t *testing.T) {
var rootFolderId int64 = 0 var rootFolderId int64 = 0
//sqlStore := db.InitTestDB(t) //sqlStore := db.InitTestDB(t)
query := models.GetDashboardACLInfoListQuery{DashboardID: rootFolderId, OrgID: 1} query := dashboards.GetDashboardACLInfoListQuery{DashboardID: rootFolderId, OrgID: 1}
err := dashboardStore.GetDashboardACLInfoList(context.Background(), &query) err := dashboardStore.GetDashboardACLInfoList(context.Background(), &query)
require.Nil(t, err) require.Nil(t, err)
require.Equal(t, 2, len(query.Result)) require.Equal(t, 2, len(query.Result))
defaultPermissionsId := int64(-1) defaultPermissionsId := int64(-1)
require.Equal(t, defaultPermissionsId, query.Result[0].DashboardId) require.Equal(t, defaultPermissionsId, query.Result[0].DashboardID)
require.Equal(t, org.RoleViewer, *query.Result[0].Role) require.Equal(t, org.RoleViewer, *query.Result[0].Role)
require.False(t, query.Result[0].Inherited) require.False(t, query.Result[0].Inherited)
require.Equal(t, defaultPermissionsId, query.Result[1].DashboardId) require.Equal(t, defaultPermissionsId, query.Result[1].DashboardID)
require.Equal(t, org.RoleEditor, *query.Result[1].Role) require.Equal(t, org.RoleEditor, *query.Result[1].Role)
require.False(t, query.Result[1].Inherited) require.False(t, query.Result[1].Inherited)
}) })

@ -227,7 +227,7 @@ func (d *DashboardStore) SaveDashboard(ctx context.Context, cmd dashboards.SaveD
return cmd.Result, err return cmd.Result, err
} }
func (d *DashboardStore) UpdateDashboardACL(ctx context.Context, dashboardID int64, items []*models.DashboardACL) error { func (d *DashboardStore) UpdateDashboardACL(ctx context.Context, dashboardID int64, items []*dashboards.DashboardACL) error {
return d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error { return d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error {
// delete existing items // delete existing items
_, err := sess.Exec("DELETE FROM dashboard_acl WHERE dashboard_id=?", dashboardID) _, err := sess.Exec("DELETE FROM dashboard_acl WHERE dashboard_id=?", dashboardID)

@ -65,7 +65,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) {
t.Run("and acl is set for dashboard folder", func(t *testing.T) { t.Run("and acl is set for dashboard folder", func(t *testing.T) {
var otherUser int64 = 999 var otherUser int64 = 999
err := updateDashboardACL(t, dashboardStore, folder.ID, models.DashboardACL{ err := updateDashboardACL(t, dashboardStore, folder.ID, dashboards.DashboardACL{
DashboardID: folder.ID, DashboardID: folder.ID,
OrgID: 1, OrgID: 1,
UserID: otherUser, UserID: otherUser,
@ -86,7 +86,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) {
}) })
t.Run("when the user is given permission", func(t *testing.T) { t.Run("when the user is given permission", func(t *testing.T) {
err := updateDashboardACL(t, dashboardStore, folder.ID, models.DashboardACL{ err := updateDashboardACL(t, dashboardStore, folder.ID, dashboards.DashboardACL{
DashboardID: folder.ID, OrgID: 1, UserID: currentUser.ID, Permission: models.PERMISSION_EDIT, DashboardID: folder.ID, OrgID: 1, UserID: currentUser.ID, Permission: models.PERMISSION_EDIT,
}) })
require.NoError(t, err) require.NoError(t, err)
@ -129,7 +129,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) {
var otherUser int64 = 999 var otherUser int64 = 999
err := updateDashboardACL(t, dashboardStore, folder.ID) err := updateDashboardACL(t, dashboardStore, folder.ID)
require.NoError(t, err) require.NoError(t, err)
err = updateDashboardACL(t, dashboardStore, childDash.ID, models.DashboardACL{ err = updateDashboardACL(t, dashboardStore, childDash.ID, dashboards.DashboardACL{
DashboardID: folder.ID, OrgID: 1, UserID: otherUser, Permission: models.PERMISSION_EDIT, DashboardID: folder.ID, OrgID: 1, UserID: otherUser, Permission: models.PERMISSION_EDIT,
}) })
require.NoError(t, err) require.NoError(t, err)
@ -145,7 +145,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) {
}) })
t.Run("when the user is given permission to child", func(t *testing.T) { t.Run("when the user is given permission to child", func(t *testing.T) {
err := updateDashboardACL(t, dashboardStore, childDash.ID, models.DashboardACL{ err := updateDashboardACL(t, dashboardStore, childDash.ID, dashboards.DashboardACL{
DashboardID: childDash.ID, OrgID: 1, UserID: currentUser.ID, Permission: models.PERMISSION_EDIT, DashboardID: childDash.ID, OrgID: 1, UserID: currentUser.ID, Permission: models.PERMISSION_EDIT,
}) })
require.NoError(t, err) require.NoError(t, err)
@ -224,7 +224,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) {
t.Run("and acl is set for one dashboard folder", func(t *testing.T) { t.Run("and acl is set for one dashboard folder", func(t *testing.T) {
const otherUser int64 = 999 const otherUser int64 = 999
err := updateDashboardACL(t, dashboardStore, folder1.ID, models.DashboardACL{ err := updateDashboardACL(t, dashboardStore, folder1.ID, dashboards.DashboardACL{
DashboardID: folder1.ID, OrgID: 1, UserID: otherUser, Permission: models.PERMISSION_EDIT, DashboardID: folder1.ID, OrgID: 1, UserID: otherUser, Permission: models.PERMISSION_EDIT,
}) })
require.NoError(t, err) require.NoError(t, err)
@ -265,7 +265,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) {
}) })
t.Run("and a dashboard with an acl is moved to the folder without an acl", func(t *testing.T) { t.Run("and a dashboard with an acl is moved to the folder without an acl", func(t *testing.T) {
err := updateDashboardACL(t, dashboardStore, childDash1.ID, models.DashboardACL{ err := updateDashboardACL(t, dashboardStore, childDash1.ID, dashboards.DashboardACL{
DashboardID: childDash1.ID, OrgID: 1, UserID: otherUser, Permission: models.PERMISSION_EDIT, DashboardID: childDash1.ID, OrgID: 1, UserID: otherUser, Permission: models.PERMISSION_EDIT,
}) })
require.NoError(t, err) require.NoError(t, err)
@ -363,7 +363,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) {
}) })
t.Run("Should have write access to one dashboard folder if default role changed to view for one folder", func(t *testing.T) { t.Run("Should have write access to one dashboard folder if default role changed to view for one folder", func(t *testing.T) {
err := updateDashboardACL(t, dashboardStore, folder1.ID, models.DashboardACL{ err := updateDashboardACL(t, dashboardStore, folder1.ID, dashboards.DashboardACL{
DashboardID: folder1.ID, OrgID: 1, UserID: editorUser.ID, Permission: models.PERMISSION_VIEW, DashboardID: folder1.ID, OrgID: 1, UserID: editorUser.ID, Permission: models.PERMISSION_VIEW,
}) })
require.NoError(t, err) require.NoError(t, err)
@ -409,7 +409,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) {
}) })
t.Run("Should be able to get one dashboard folder if default role changed to edit for one folder", func(t *testing.T) { t.Run("Should be able to get one dashboard folder if default role changed to edit for one folder", func(t *testing.T) {
err := updateDashboardACL(t, dashboardStore, folder1.ID, models.DashboardACL{ err := updateDashboardACL(t, dashboardStore, folder1.ID, dashboards.DashboardACL{
DashboardID: folder1.ID, OrgID: 1, UserID: viewerUser.ID, Permission: models.PERMISSION_EDIT, DashboardID: folder1.ID, OrgID: 1, UserID: viewerUser.ID, Permission: models.PERMISSION_EDIT,
}) })
require.NoError(t, err) require.NoError(t, err)
@ -442,7 +442,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) {
}) })
t.Run("and admin permission is given for user with org role viewer in one dashboard folder", func(t *testing.T) { t.Run("and admin permission is given for user with org role viewer in one dashboard folder", func(t *testing.T) {
err := updateDashboardACL(t, dashboardStore, folder1.ID, models.DashboardACL{ err := updateDashboardACL(t, dashboardStore, folder1.ID, dashboards.DashboardACL{
DashboardID: folder1.ID, OrgID: 1, UserID: viewerUser.ID, Permission: models.PERMISSION_ADMIN, DashboardID: folder1.ID, OrgID: 1, UserID: viewerUser.ID, Permission: models.PERMISSION_ADMIN,
}) })
require.NoError(t, err) require.NoError(t, err)
@ -458,7 +458,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) {
}) })
t.Run("and edit permission is given for user with org role viewer in one dashboard folder", func(t *testing.T) { t.Run("and edit permission is given for user with org role viewer in one dashboard folder", func(t *testing.T) {
err := updateDashboardACL(t, dashboardStore, folder1.ID, models.DashboardACL{ err := updateDashboardACL(t, dashboardStore, folder1.ID, dashboards.DashboardACL{
DashboardID: folder1.ID, OrgID: 1, UserID: viewerUser.ID, Permission: models.PERMISSION_EDIT, DashboardID: folder1.ID, OrgID: 1, UserID: viewerUser.ID, Permission: models.PERMISSION_EDIT,
}) })
require.NoError(t, err) require.NoError(t, err)

@ -824,10 +824,10 @@ func insertTestDashboardForPlugin(t *testing.T, dashboardStore *DashboardStore,
} }
func updateDashboardACL(t *testing.T, dashboardStore *DashboardStore, dashboardID int64, func updateDashboardACL(t *testing.T, dashboardStore *DashboardStore, dashboardID int64,
items ...models.DashboardACL) error { items ...dashboards.DashboardACL) error {
t.Helper() t.Helper()
var itemPtrs []*models.DashboardACL var itemPtrs []*dashboards.DashboardACL
for _, it := range items { for _, it := range items {
item := it item := it
item.Created = time.Now() item.Created = time.Now()

@ -8,6 +8,7 @@ import (
"github.com/grafana/grafana/pkg/infra/slugify" "github.com/grafana/grafana/pkg/infra/slugify"
"github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/folder" "github.com/grafana/grafana/pkg/services/folder"
"github.com/grafana/grafana/pkg/services/org"
"github.com/grafana/grafana/pkg/services/quota" "github.com/grafana/grafana/pkg/services/quota"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
@ -343,3 +344,79 @@ func FromDashboard(dash *Dashboard) *folder.Folder {
UpdatedBy: dash.UpdatedBy, UpdatedBy: dash.UpdatedBy,
} }
} }
//
// DASHBOARD ACL
//
// Dashboard ACL model
type DashboardACL struct {
ID int64 `xorm:"pk autoincr 'id'"`
OrgID int64 `xorm:"org_id"`
DashboardID int64 `xorm:"dashboard_id"`
UserID int64 `xorm:"user_id"`
TeamID int64 `xorm:"team_id"`
Role *org.RoleType // pointer to be nullable
Permission models.PermissionType
Created time.Time
Updated time.Time
}
func (p DashboardACL) TableName() string { return "dashboard_acl" }
type DashboardACLInfoDTO struct {
OrgID int64 `json:"-" xorm:"org_id"`
DashboardID int64 `json:"dashboardId,omitempty" xorm:"dashboard_id"`
FolderID int64 `json:"folderId,omitempty" xorm:"folder_id"`
Created time.Time `json:"created"`
Updated time.Time `json:"updated"`
UserID int64 `json:"userId" xorm:"user_id"`
UserLogin string `json:"userLogin"`
UserEmail string `json:"userEmail"`
UserAvatarURL string `json:"userAvatarUrl" xorm:"user_avatar_url"`
TeamID int64 `json:"teamId" xorm:"team_id"`
TeamEmail string `json:"teamEmail"`
TeamAvatarURL string `json:"teamAvatarUrl" xorm:"team_avatar_url"`
Team string `json:"team"`
Role *org.RoleType `json:"role,omitempty"`
Permission models.PermissionType `json:"permission"`
PermissionName string `json:"permissionName"`
UID string `json:"uid" xorm:"uid"`
Title string `json:"title"`
Slug string `json:"slug"`
IsFolder bool `json:"isFolder"`
URL string `json:"url" xorm:"url"`
Inherited bool `json:"inherited"`
}
func (dto *DashboardACLInfoDTO) hasSameRoleAs(other *DashboardACLInfoDTO) bool {
if dto.Role == nil || other.Role == nil {
return false
}
return dto.UserID <= 0 && dto.TeamID <= 0 && dto.UserID == other.UserID && dto.TeamID == other.TeamID && *dto.Role == *other.Role
}
func (dto *DashboardACLInfoDTO) hasSameUserAs(other *DashboardACLInfoDTO) bool {
return dto.UserID > 0 && dto.UserID == other.UserID
}
func (dto *DashboardACLInfoDTO) hasSameTeamAs(other *DashboardACLInfoDTO) bool {
return dto.TeamID > 0 && dto.TeamID == other.TeamID
}
// IsDuplicateOf returns true if other item has same role, same user or same team
func (dto *DashboardACLInfoDTO) IsDuplicateOf(other *DashboardACLInfoDTO) bool {
return dto.hasSameRoleAs(other) || dto.hasSameUserAs(other) || dto.hasSameTeamAs(other)
}
// QUERIES
type GetDashboardACLInfoListQuery struct {
DashboardID int64
OrgID int64
Result []*DashboardACLInfoDTO
}

@ -184,7 +184,7 @@ func (dr *DashboardServiceImpl) BuildSaveDashboardCommand(ctx context.Context, d
return cmd, nil return cmd, nil
} }
func (dr *DashboardServiceImpl) UpdateDashboardACL(ctx context.Context, uid int64, items []*models.DashboardACL) error { func (dr *DashboardServiceImpl) UpdateDashboardACL(ctx context.Context, uid int64, items []*dashboards.DashboardACL) error {
return dr.dashboardStore.UpdateDashboardACL(ctx, uid, items) return dr.dashboardStore.UpdateDashboardACL(ctx, uid, items)
} }
@ -391,7 +391,7 @@ func (dr *DashboardServiceImpl) MakeUserAdmin(ctx context.Context, orgID int64,
rtEditor := org.RoleEditor rtEditor := org.RoleEditor
rtViewer := org.RoleViewer rtViewer := org.RoleViewer
items := []*models.DashboardACL{ items := []*dashboards.DashboardACL{
{ {
OrgID: orgID, OrgID: orgID,
DashboardID: dashboardID, DashboardID: dashboardID,
@ -404,7 +404,7 @@ func (dr *DashboardServiceImpl) MakeUserAdmin(ctx context.Context, orgID int64,
if setViewAndEditPermissions { if setViewAndEditPermissions {
items = append(items, items = append(items,
&models.DashboardACL{ &dashboards.DashboardACL{
OrgID: orgID, OrgID: orgID,
DashboardID: dashboardID, DashboardID: dashboardID,
Role: &rtEditor, Role: &rtEditor,
@ -412,7 +412,7 @@ func (dr *DashboardServiceImpl) MakeUserAdmin(ctx context.Context, orgID int64,
Created: time.Now(), Created: time.Now(),
Updated: time.Now(), Updated: time.Now(),
}, },
&models.DashboardACL{ &dashboards.DashboardACL{
OrgID: orgID, OrgID: orgID,
DashboardID: dashboardID, DashboardID: dashboardID,
Role: &rtViewer, Role: &rtViewer,
@ -598,7 +598,7 @@ func makeQueryResult(query *models.FindPersistedDashboardsQuery, res []dashboard
} }
} }
func (dr *DashboardServiceImpl) GetDashboardACLInfoList(ctx context.Context, query *models.GetDashboardACLInfoListQuery) error { func (dr *DashboardServiceImpl) GetDashboardACLInfoList(ctx context.Context, query *dashboards.GetDashboardACLInfoListQuery) error {
return dr.dashboardStore.GetDashboardACLInfoList(ctx, query) return dr.dashboardStore.GetDashboardACLInfoList(ctx, query)
} }

@ -109,7 +109,7 @@ func TestIntegrationIntegratedDashboardService(t *testing.T) {
assert.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err) assert.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err)
assert.Equal(t, "", sc.dashboardGuardianMock.DashUID) assert.Equal(t, "", sc.dashboardGuardianMock.DashUID)
assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgId) assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgID)
assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID) assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID)
}) })
@ -129,7 +129,7 @@ func TestIntegrationIntegratedDashboardService(t *testing.T) {
require.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err) require.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err)
assert.Equal(t, sc.otherSavedFolder.ID, sc.dashboardGuardianMock.DashID) assert.Equal(t, sc.otherSavedFolder.ID, sc.dashboardGuardianMock.DashID)
assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgId) assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgID)
assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID) assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID)
}) })
@ -149,7 +149,7 @@ func TestIntegrationIntegratedDashboardService(t *testing.T) {
require.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err) require.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err)
assert.Equal(t, sc.savedDashInFolder.UID, sc.dashboardGuardianMock.DashUID) assert.Equal(t, sc.savedDashInFolder.UID, sc.dashboardGuardianMock.DashUID)
assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgId) assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgID)
assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID) assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID)
}) })
@ -170,7 +170,7 @@ func TestIntegrationIntegratedDashboardService(t *testing.T) {
require.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err) require.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err)
assert.Equal(t, sc.savedDashInFolder.UID, sc.dashboardGuardianMock.DashUID) assert.Equal(t, sc.savedDashInFolder.UID, sc.dashboardGuardianMock.DashUID)
assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgId) assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgID)
assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID) assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID)
}) })
@ -191,7 +191,7 @@ func TestIntegrationIntegratedDashboardService(t *testing.T) {
assert.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err) assert.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err)
assert.Equal(t, sc.savedDashInGeneralFolder.UID, sc.dashboardGuardianMock.DashUID) assert.Equal(t, sc.savedDashInGeneralFolder.UID, sc.dashboardGuardianMock.DashUID)
assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgId) assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgID)
assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID) assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID)
}) })
@ -212,7 +212,7 @@ func TestIntegrationIntegratedDashboardService(t *testing.T) {
require.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err) require.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err)
assert.Equal(t, sc.savedDashInFolder.UID, sc.dashboardGuardianMock.DashUID) assert.Equal(t, sc.savedDashInFolder.UID, sc.dashboardGuardianMock.DashUID)
assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgId) assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgID)
assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID) assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID)
}) })
@ -233,7 +233,7 @@ func TestIntegrationIntegratedDashboardService(t *testing.T) {
require.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err) require.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err)
assert.Equal(t, sc.savedDashInGeneralFolder.UID, sc.dashboardGuardianMock.DashUID) assert.Equal(t, sc.savedDashInGeneralFolder.UID, sc.dashboardGuardianMock.DashUID)
assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgId) assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgID)
assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID) assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID)
}) })
@ -254,7 +254,7 @@ func TestIntegrationIntegratedDashboardService(t *testing.T) {
assert.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err) assert.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err)
assert.Equal(t, sc.savedDashInFolder.UID, sc.dashboardGuardianMock.DashUID) assert.Equal(t, sc.savedDashInFolder.UID, sc.dashboardGuardianMock.DashUID)
assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgId) assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgID)
assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID) assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID)
}) })
@ -275,7 +275,7 @@ func TestIntegrationIntegratedDashboardService(t *testing.T) {
require.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err) require.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err)
assert.Equal(t, sc.savedDashInGeneralFolder.UID, sc.dashboardGuardianMock.DashUID) assert.Equal(t, sc.savedDashInGeneralFolder.UID, sc.dashboardGuardianMock.DashUID)
assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgId) assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgID)
assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID) assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID)
}) })
@ -296,7 +296,7 @@ func TestIntegrationIntegratedDashboardService(t *testing.T) {
require.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err) require.Equal(t, dashboards.ErrDashboardUpdateAccessDenied, err)
assert.Equal(t, sc.savedDashInFolder.UID, sc.dashboardGuardianMock.DashUID) assert.Equal(t, sc.savedDashInFolder.UID, sc.dashboardGuardianMock.DashUID)
assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgId) assert.Equal(t, cmd.OrgID, sc.dashboardGuardianMock.OrgID)
assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID) assert.Equal(t, cmd.UserID, sc.dashboardGuardianMock.User.UserID)
}) })
}) })

@ -12,7 +12,6 @@ import (
"github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/components/simplejson"
"github.com/grafana/grafana/pkg/infra/appcontext" "github.com/grafana/grafana/pkg/infra/appcontext"
"github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/dashboards"
"github.com/grafana/grafana/pkg/services/folder" "github.com/grafana/grafana/pkg/services/folder"
"github.com/grafana/grafana/pkg/services/guardian" "github.com/grafana/grafana/pkg/services/guardian"
@ -261,9 +260,9 @@ func TestDashboardService(t *testing.T) {
t.Run("When org user is deleted", func(t *testing.T) { t.Run("When org user is deleted", func(t *testing.T) {
fakeStore := dashboards.FakeDashboardStore{} fakeStore := dashboards.FakeDashboardStore{}
fakeStore.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Return(nil) fakeStore.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Return(nil)
t.Run("Should remove dependent permissions for deleted org user", func(t *testing.T) { t.Run("Should remove dependent permissions for deleted org user", func(t *testing.T) {
permQuery := &models.GetDashboardACLInfoListQuery{DashboardID: 1, OrgID: 1, Result: nil} permQuery := &dashboards.GetDashboardACLInfoListQuery{DashboardID: 1, OrgID: 1, Result: nil}
err := fakeStore.GetDashboardACLInfoList(context.Background(), permQuery) err := fakeStore.GetDashboardACLInfoList(context.Background(), permQuery)
require.NoError(t, err) require.NoError(t, err)
@ -273,8 +272,8 @@ func TestDashboardService(t *testing.T) {
t.Run("Should not remove dashboard permissions for same user in another org", func(t *testing.T) { t.Run("Should not remove dashboard permissions for same user in another org", func(t *testing.T) {
fakeStore := dashboards.FakeDashboardStore{} fakeStore := dashboards.FakeDashboardStore{}
fakeStore.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Return(nil) fakeStore.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Return(nil)
permQuery := &models.GetDashboardACLInfoListQuery{DashboardID: 2, OrgID: 3} permQuery := &dashboards.GetDashboardACLInfoListQuery{DashboardID: 2, OrgID: 3}
err := fakeStore.GetDashboardACLInfoList(context.Background(), permQuery) err := fakeStore.GetDashboardACLInfoList(context.Background(), permQuery)
require.NoError(t, err) require.NoError(t, err)

@ -149,11 +149,11 @@ func (_m *FakeDashboardStore) GetDashboard(ctx context.Context, query *GetDashbo
} }
// GetDashboardACLInfoList provides a mock function with given fields: ctx, query // GetDashboardACLInfoList provides a mock function with given fields: ctx, query
func (_m *FakeDashboardStore) GetDashboardACLInfoList(ctx context.Context, query *models.GetDashboardACLInfoListQuery) error { func (_m *FakeDashboardStore) GetDashboardACLInfoList(ctx context.Context, query *GetDashboardACLInfoListQuery) error {
ret := _m.Called(ctx, query) ret := _m.Called(ctx, query)
var r0 error var r0 error
if rf, ok := ret.Get(0).(func(context.Context, *models.GetDashboardACLInfoListQuery) error); ok { if rf, ok := ret.Get(0).(func(context.Context, *GetDashboardACLInfoListQuery) error); ok {
r0 = rf(ctx, query) r0 = rf(ctx, query)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
@ -390,11 +390,11 @@ func (_m *FakeDashboardStore) UnprovisionDashboard(ctx context.Context, id int64
} }
// UpdateDashboardACL provides a mock function with given fields: ctx, uid, items // UpdateDashboardACL provides a mock function with given fields: ctx, uid, items
func (_m *FakeDashboardStore) UpdateDashboardACL(ctx context.Context, uid int64, items []*models.DashboardACL) error { func (_m *FakeDashboardStore) UpdateDashboardACL(ctx context.Context, uid int64, items []*DashboardACL) error {
ret := _m.Called(ctx, uid, items) ret := _m.Called(ctx, uid, items)
var r0 error var r0 error
if rf, ok := ret.Get(0).(func(context.Context, int64, []*models.DashboardACL) error); ok { if rf, ok := ret.Get(0).(func(context.Context, int64, []*DashboardACL) error); ok {
r0 = rf(ctx, uid, items) r0 = rf(ctx, uid, items)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)

@ -654,7 +654,7 @@ func (s *Service) MakeUserAdmin(ctx context.Context, orgID int64, userID, folder
rtEditor := org.RoleEditor rtEditor := org.RoleEditor
rtViewer := org.RoleViewer rtViewer := org.RoleViewer
items := []*models.DashboardACL{ items := []*dashboards.DashboardACL{
{ {
OrgID: orgID, OrgID: orgID,
DashboardID: folderID, DashboardID: folderID,
@ -667,7 +667,7 @@ func (s *Service) MakeUserAdmin(ctx context.Context, orgID int64, userID, folder
if setViewAndEditPermissions { if setViewAndEditPermissions {
items = append(items, items = append(items,
&models.DashboardACL{ &dashboards.DashboardACL{
OrgID: orgID, OrgID: orgID,
DashboardID: folderID, DashboardID: folderID,
Role: &rtEditor, Role: &rtEditor,
@ -675,7 +675,7 @@ func (s *Service) MakeUserAdmin(ctx context.Context, orgID int64, userID, folder
Created: time.Now(), Created: time.Now(),
Updated: time.Now(), Updated: time.Now(),
}, },
&models.DashboardACL{ &dashboards.DashboardACL{
OrgID: orgID, OrgID: orgID,
DashboardID: folderID, DashboardID: folderID,
Role: &rtViewer, Role: &rtViewer,

@ -233,13 +233,13 @@ func (a *AccessControlDashboardGuardian) evaluate(evaluator accesscontrol.Evalua
return ok, err return ok, err
} }
func (a *AccessControlDashboardGuardian) CheckPermissionBeforeUpdate(permission models.PermissionType, updatePermissions []*models.DashboardACL) (bool, error) { func (a *AccessControlDashboardGuardian) CheckPermissionBeforeUpdate(permission models.PermissionType, updatePermissions []*dashboards.DashboardACL) (bool, error) {
// always true for access control // always true for access control
return true, nil return true, nil
} }
// GetACL translate access control permissions to dashboard acl info // GetACL translate access control permissions to dashboard acl info
func (a *AccessControlDashboardGuardian) GetACL() ([]*models.DashboardACLInfoDTO, error) { func (a *AccessControlDashboardGuardian) GetACL() ([]*dashboards.DashboardACLInfoDTO, error) {
if a.dashboard == nil { if a.dashboard == nil {
return nil, ErrGuardianGetDashboardFailure return nil, ErrGuardianGetDashboardFailure
} }
@ -256,7 +256,7 @@ func (a *AccessControlDashboardGuardian) GetACL() ([]*models.DashboardACLInfoDTO
return nil, err return nil, err
} }
acl := make([]*models.DashboardACLInfoDTO, 0, len(permissions)) acl := make([]*dashboards.DashboardACLInfoDTO, 0, len(permissions))
for _, p := range permissions { for _, p := range permissions {
if !p.IsManaged { if !p.IsManaged {
continue continue
@ -268,26 +268,26 @@ func (a *AccessControlDashboardGuardian) GetACL() ([]*models.DashboardACLInfoDTO
role = &tmp role = &tmp
} }
acl = append(acl, &models.DashboardACLInfoDTO{ acl = append(acl, &dashboards.DashboardACLInfoDTO{
OrgId: a.dashboard.OrgID, OrgID: a.dashboard.OrgID,
DashboardId: a.dashboard.ID, DashboardID: a.dashboard.ID,
FolderId: a.dashboard.FolderID, FolderID: a.dashboard.FolderID,
Created: p.Created, Created: p.Created,
Updated: p.Updated, Updated: p.Updated,
UserId: p.UserId, UserID: p.UserId,
UserLogin: p.UserLogin, UserLogin: p.UserLogin,
UserEmail: p.UserEmail, UserEmail: p.UserEmail,
TeamId: p.TeamId, TeamID: p.TeamId,
TeamEmail: p.TeamEmail, TeamEmail: p.TeamEmail,
Team: p.Team, Team: p.Team,
Role: role, Role: role,
Permission: permissionMap[svc.MapActions(p)], Permission: permissionMap[svc.MapActions(p)],
PermissionName: permissionMap[svc.MapActions(p)].String(), PermissionName: permissionMap[svc.MapActions(p)].String(),
Uid: a.dashboard.UID, UID: a.dashboard.UID,
Title: a.dashboard.Title, Title: a.dashboard.Title,
Slug: a.dashboard.Slug, Slug: a.dashboard.Slug,
IsFolder: a.dashboard.IsFolder, IsFolder: a.dashboard.IsFolder,
Url: a.dashboard.GetURL(), URL: a.dashboard.GetURL(),
Inherited: false, Inherited: false,
}) })
} }
@ -295,12 +295,12 @@ func (a *AccessControlDashboardGuardian) GetACL() ([]*models.DashboardACLInfoDTO
return acl, nil return acl, nil
} }
func (a *AccessControlDashboardGuardian) GetACLWithoutDuplicates() ([]*models.DashboardACLInfoDTO, error) { func (a *AccessControlDashboardGuardian) GetACLWithoutDuplicates() ([]*dashboards.DashboardACLInfoDTO, error) {
return a.GetACL() return a.GetACL()
} }
func (a *AccessControlDashboardGuardian) GetHiddenACL(cfg *setting.Cfg) ([]*models.DashboardACL, error) { func (a *AccessControlDashboardGuardian) GetHiddenACL(cfg *setting.Cfg) ([]*dashboards.DashboardACL, error) {
var hiddenACL []*models.DashboardACL var hiddenACL []*dashboards.DashboardACL
if a.user.IsGrafanaAdmin { if a.user.IsGrafanaAdmin {
return hiddenACL, nil return hiddenACL, nil
} }
@ -316,11 +316,11 @@ func (a *AccessControlDashboardGuardian) GetHiddenACL(cfg *setting.Cfg) ([]*mode
} }
if _, hidden := cfg.HiddenUsers[item.UserLogin]; hidden { if _, hidden := cfg.HiddenUsers[item.UserLogin]; hidden {
hiddenACL = append(hiddenACL, &models.DashboardACL{ hiddenACL = append(hiddenACL, &dashboards.DashboardACL{
OrgID: item.OrgId, OrgID: item.OrgID,
DashboardID: item.DashboardId, DashboardID: item.DashboardID,
UserID: item.UserId, UserID: item.UserID,
TeamID: item.TeamId, TeamID: item.TeamID,
Role: item.Role, Role: item.Role,
Permission: item.Permission, Permission: item.Permission,
Created: item.Created, Created: item.Created,

@ -30,23 +30,23 @@ type DashboardGuardian interface {
CanAdmin() (bool, error) CanAdmin() (bool, error)
CanDelete() (bool, error) CanDelete() (bool, error)
CanCreate(folderID int64, isFolder bool) (bool, error) CanCreate(folderID int64, isFolder bool) (bool, error)
CheckPermissionBeforeUpdate(permission models.PermissionType, updatePermissions []*models.DashboardACL) (bool, error) CheckPermissionBeforeUpdate(permission models.PermissionType, updatePermissions []*dashboards.DashboardACL) (bool, error)
// GetACL returns ACL. // GetACL returns ACL.
GetACL() ([]*models.DashboardACLInfoDTO, error) GetACL() ([]*dashboards.DashboardACLInfoDTO, error)
// GetACLWithoutDuplicates returns ACL and strips any permission // GetACLWithoutDuplicates returns ACL and strips any permission
// that already has an inherited permission with higher or equal // that already has an inherited permission with higher or equal
// permission. // permission.
GetACLWithoutDuplicates() ([]*models.DashboardACLInfoDTO, error) GetACLWithoutDuplicates() ([]*dashboards.DashboardACLInfoDTO, error)
GetHiddenACL(*setting.Cfg) ([]*models.DashboardACL, error) GetHiddenACL(*setting.Cfg) ([]*dashboards.DashboardACL, error)
} }
type dashboardGuardianImpl struct { type dashboardGuardianImpl struct {
user *user.SignedInUser user *user.SignedInUser
dashId int64 dashId int64
orgId int64 orgId int64
acl []*models.DashboardACLInfoDTO acl []*dashboards.DashboardACLInfoDTO
teams []*team.TeamDTO teams []*team.TeamDTO
log log.Logger log log.Logger
ctx context.Context ctx context.Context
@ -205,14 +205,14 @@ func (g *dashboardGuardianImpl) logHasPermissionResult(permission models.Permiss
return hasPermission, err return hasPermission, err
} }
func (g *dashboardGuardianImpl) checkACL(permission models.PermissionType, acl []*models.DashboardACLInfoDTO) (bool, error) { func (g *dashboardGuardianImpl) checkACL(permission models.PermissionType, acl []*dashboards.DashboardACLInfoDTO) (bool, error) {
orgRole := g.user.OrgRole orgRole := g.user.OrgRole
teamACLItems := []*models.DashboardACLInfoDTO{} teamACLItems := []*dashboards.DashboardACLInfoDTO{}
for _, p := range acl { for _, p := range acl {
// user match // user match
if !g.user.IsAnonymous && p.UserId > 0 { if !g.user.IsAnonymous && p.UserID > 0 {
if p.UserId == g.user.UserID && p.Permission >= permission { if p.UserID == g.user.UserID && p.Permission >= permission {
return true, nil return true, nil
} }
} }
@ -225,7 +225,7 @@ func (g *dashboardGuardianImpl) checkACL(permission models.PermissionType, acl [
} }
// remember this rule for later // remember this rule for later
if p.TeamId > 0 { if p.TeamID > 0 {
teamACLItems = append(teamACLItems, p) teamACLItems = append(teamACLItems, p)
} }
} }
@ -244,7 +244,7 @@ func (g *dashboardGuardianImpl) checkACL(permission models.PermissionType, acl [
// evaluate team rules // evaluate team rules
for _, p := range acl { for _, p := range acl {
for _, ug := range teams { for _, ug := range teams {
if ug.ID == p.TeamId && p.Permission >= permission { if ug.ID == p.TeamID && p.Permission >= permission {
return true, nil return true, nil
} }
} }
@ -253,14 +253,14 @@ func (g *dashboardGuardianImpl) checkACL(permission models.PermissionType, acl [
return false, nil return false, nil
} }
func (g *dashboardGuardianImpl) CheckPermissionBeforeUpdate(permission models.PermissionType, updatePermissions []*models.DashboardACL) (bool, error) { func (g *dashboardGuardianImpl) CheckPermissionBeforeUpdate(permission models.PermissionType, updatePermissions []*dashboards.DashboardACL) (bool, error) {
acl := []*models.DashboardACLInfoDTO{} acl := []*dashboards.DashboardACLInfoDTO{}
adminRole := org.RoleAdmin adminRole := org.RoleAdmin
everyoneWithAdminRole := &models.DashboardACLInfoDTO{DashboardId: g.dashId, UserId: 0, TeamId: 0, Role: &adminRole, Permission: models.PERMISSION_ADMIN} everyoneWithAdminRole := &dashboards.DashboardACLInfoDTO{DashboardID: g.dashId, UserID: 0, TeamID: 0, Role: &adminRole, Permission: models.PERMISSION_ADMIN}
// validate that duplicate permissions don't exists // validate that duplicate permissions don't exists
for _, p := range updatePermissions { for _, p := range updatePermissions {
aclItem := &models.DashboardACLInfoDTO{DashboardId: p.DashboardID, UserId: p.UserID, TeamId: p.TeamID, Role: p.Role, Permission: p.Permission} aclItem := &dashboards.DashboardACLInfoDTO{DashboardID: p.DashboardID, UserID: p.UserID, TeamID: p.TeamID, Role: p.Role, Permission: p.Permission}
if aclItem.IsDuplicateOf(everyoneWithAdminRole) { if aclItem.IsDuplicateOf(everyoneWithAdminRole) {
return false, ErrGuardianPermissionExists return false, ErrGuardianPermissionExists
} }
@ -300,12 +300,12 @@ func (g *dashboardGuardianImpl) CheckPermissionBeforeUpdate(permission models.Pe
} }
// GetACL returns dashboard acl // GetACL returns dashboard acl
func (g *dashboardGuardianImpl) GetACL() ([]*models.DashboardACLInfoDTO, error) { func (g *dashboardGuardianImpl) GetACL() ([]*dashboards.DashboardACLInfoDTO, error) {
if g.acl != nil { if g.acl != nil {
return g.acl, nil return g.acl, nil
} }
query := models.GetDashboardACLInfoListQuery{DashboardID: g.dashId, OrgID: g.orgId} query := dashboards.GetDashboardACLInfoListQuery{DashboardID: g.dashId, OrgID: g.orgId}
if err := g.dashboardService.GetDashboardACLInfoList(g.ctx, &query); err != nil { if err := g.dashboardService.GetDashboardACLInfoList(g.ctx, &query); err != nil {
return nil, err return nil, err
} }
@ -313,14 +313,14 @@ func (g *dashboardGuardianImpl) GetACL() ([]*models.DashboardACLInfoDTO, error)
return g.acl, nil return g.acl, nil
} }
func (g *dashboardGuardianImpl) GetACLWithoutDuplicates() ([]*models.DashboardACLInfoDTO, error) { func (g *dashboardGuardianImpl) GetACLWithoutDuplicates() ([]*dashboards.DashboardACLInfoDTO, error) {
acl, err := g.GetACL() acl, err := g.GetACL()
if err != nil { if err != nil {
return nil, err return nil, err
} }
nonInherited := []*models.DashboardACLInfoDTO{} nonInherited := []*dashboards.DashboardACLInfoDTO{}
inherited := []*models.DashboardACLInfoDTO{} inherited := []*dashboards.DashboardACLInfoDTO{}
for _, aclItem := range acl { for _, aclItem := range acl {
if aclItem.Inherited { if aclItem.Inherited {
inherited = append(inherited, aclItem) inherited = append(inherited, aclItem)
@ -329,7 +329,7 @@ func (g *dashboardGuardianImpl) GetACLWithoutDuplicates() ([]*models.DashboardAC
} }
} }
result := []*models.DashboardACLInfoDTO{} result := []*dashboards.DashboardACLInfoDTO{}
for _, nonInheritedACLItem := range nonInherited { for _, nonInheritedACLItem := range nonInherited {
duplicate := false duplicate := false
for _, inheritedACLItem := range inherited { for _, inheritedACLItem := range inherited {
@ -361,8 +361,8 @@ func (g *dashboardGuardianImpl) getTeams() ([]*team.TeamDTO, error) {
return queryResult, err return queryResult, err
} }
func (g *dashboardGuardianImpl) GetHiddenACL(cfg *setting.Cfg) ([]*models.DashboardACL, error) { func (g *dashboardGuardianImpl) GetHiddenACL(cfg *setting.Cfg) ([]*dashboards.DashboardACL, error) {
hiddenACL := make([]*models.DashboardACL, 0) hiddenACL := make([]*dashboards.DashboardACL, 0)
if g.user.IsGrafanaAdmin { if g.user.IsGrafanaAdmin {
return hiddenACL, nil return hiddenACL, nil
} }
@ -378,11 +378,11 @@ func (g *dashboardGuardianImpl) GetHiddenACL(cfg *setting.Cfg) ([]*models.Dashbo
} }
if _, hidden := cfg.HiddenUsers[item.UserLogin]; hidden { if _, hidden := cfg.HiddenUsers[item.UserLogin]; hidden {
hiddenACL = append(hiddenACL, &models.DashboardACL{ hiddenACL = append(hiddenACL, &dashboards.DashboardACL{
OrgID: item.OrgId, OrgID: item.OrgID,
DashboardID: item.DashboardId, DashboardID: item.DashboardID,
UserID: item.UserId, UserID: item.UserID,
TeamID: item.TeamId, TeamID: item.TeamID,
Role: item.Role, Role: item.Role,
Permission: item.Permission, Permission: item.Permission,
Created: item.Created, Created: item.Created,
@ -397,7 +397,7 @@ func (g *dashboardGuardianImpl) GetHiddenACL(cfg *setting.Cfg) ([]*models.Dashbo
type FakeDashboardGuardian struct { type FakeDashboardGuardian struct {
DashID int64 DashID int64
DashUID string DashUID string
OrgId int64 OrgID int64
User *user.SignedInUser User *user.SignedInUser
CanSaveValue bool CanSaveValue bool
CanEditValue bool CanEditValue bool
@ -406,8 +406,8 @@ type FakeDashboardGuardian struct {
HasPermissionValue bool HasPermissionValue bool
CheckPermissionBeforeUpdateValue bool CheckPermissionBeforeUpdateValue bool
CheckPermissionBeforeUpdateError error CheckPermissionBeforeUpdateError error
GetACLValue []*models.DashboardACLInfoDTO GetACLValue []*dashboards.DashboardACLInfoDTO
GetHiddenACLValue []*models.DashboardACL GetHiddenACLValue []*dashboards.DashboardACL
} }
func (g *FakeDashboardGuardian) CanSave() (bool, error) { func (g *FakeDashboardGuardian) CanSave() (bool, error) {
@ -438,40 +438,40 @@ func (g *FakeDashboardGuardian) HasPermission(permission models.PermissionType)
return g.HasPermissionValue, nil return g.HasPermissionValue, nil
} }
func (g *FakeDashboardGuardian) CheckPermissionBeforeUpdate(permission models.PermissionType, updatePermissions []*models.DashboardACL) (bool, error) { func (g *FakeDashboardGuardian) CheckPermissionBeforeUpdate(permission models.PermissionType, updatePermissions []*dashboards.DashboardACL) (bool, error) {
return g.CheckPermissionBeforeUpdateValue, g.CheckPermissionBeforeUpdateError return g.CheckPermissionBeforeUpdateValue, g.CheckPermissionBeforeUpdateError
} }
func (g *FakeDashboardGuardian) GetACL() ([]*models.DashboardACLInfoDTO, error) { func (g *FakeDashboardGuardian) GetACL() ([]*dashboards.DashboardACLInfoDTO, error) {
return g.GetACLValue, nil return g.GetACLValue, nil
} }
func (g *FakeDashboardGuardian) GetACLWithoutDuplicates() ([]*models.DashboardACLInfoDTO, error) { func (g *FakeDashboardGuardian) GetACLWithoutDuplicates() ([]*dashboards.DashboardACLInfoDTO, error) {
return g.GetACL() return g.GetACL()
} }
func (g *FakeDashboardGuardian) GetHiddenACL(cfg *setting.Cfg) ([]*models.DashboardACL, error) { func (g *FakeDashboardGuardian) GetHiddenACL(cfg *setting.Cfg) ([]*dashboards.DashboardACL, error) {
return g.GetHiddenACLValue, nil return g.GetHiddenACLValue, nil
} }
// nolint:unused // nolint:unused
func MockDashboardGuardian(mock *FakeDashboardGuardian) { func MockDashboardGuardian(mock *FakeDashboardGuardian) {
New = func(_ context.Context, dashID int64, orgId int64, user *user.SignedInUser) (DashboardGuardian, error) { New = func(_ context.Context, dashID int64, orgId int64, user *user.SignedInUser) (DashboardGuardian, error) {
mock.OrgId = orgId mock.OrgID = orgId
mock.DashID = dashID mock.DashID = dashID
mock.User = user mock.User = user
return mock, nil return mock, nil
} }
NewByUID = func(_ context.Context, dashUID string, orgId int64, user *user.SignedInUser) (DashboardGuardian, error) { NewByUID = func(_ context.Context, dashUID string, orgId int64, user *user.SignedInUser) (DashboardGuardian, error) {
mock.OrgId = orgId mock.OrgID = orgId
mock.DashUID = dashUID mock.DashUID = dashUID
mock.User = user mock.User = user
return mock, nil return mock, nil
} }
NewByDashboard = func(_ context.Context, dash *dashboards.Dashboard, orgId int64, user *user.SignedInUser) (DashboardGuardian, error) { NewByDashboard = func(_ context.Context, dash *dashboards.Dashboard, orgId int64, user *user.SignedInUser) (DashboardGuardian, error) {
mock.OrgId = orgId mock.OrgID = orgId
mock.DashUID = dash.UID mock.DashUID = dash.UID
mock.DashID = dash.ID mock.DashID = dash.ID
mock.User = user mock.User = user

@ -188,7 +188,7 @@ func (sc *scenarioContext) defaultPermissionScenario(pt permissionType, flag per
_, callerFile, callerLine, _ := runtime.Caller(1) _, callerFile, callerLine, _ := runtime.Caller(1)
sc.callerFile = callerFile sc.callerFile = callerFile
sc.callerLine = callerLine sc.callerLine = callerLine
existingPermissions := []*models.DashboardACLInfoDTO{ existingPermissions := []*dashboards.DashboardACLInfoDTO{
toDto(newEditorRolePermission(defaultDashboardID, models.PERMISSION_EDIT)), toDto(newEditorRolePermission(defaultDashboardID, models.PERMISSION_EDIT)),
toDto(newViewerRolePermission(defaultDashboardID, models.PERMISSION_VIEW)), toDto(newViewerRolePermission(defaultDashboardID, models.PERMISSION_VIEW)),
} }
@ -207,17 +207,17 @@ func (sc *scenarioContext) dashboardPermissionScenario(pt permissionType, permis
_, callerFile, callerLine, _ := runtime.Caller(1) _, callerFile, callerLine, _ := runtime.Caller(1)
sc.callerFile = callerFile sc.callerFile = callerFile
sc.callerLine = callerLine sc.callerLine = callerLine
var existingPermissions []*models.DashboardACLInfoDTO var existingPermissions []*dashboards.DashboardACLInfoDTO
switch pt { switch pt {
case USER: case USER:
existingPermissions = []*models.DashboardACLInfoDTO{{OrgId: orgID, DashboardId: dashboardID, UserId: userID, Permission: permission}} existingPermissions = []*dashboards.DashboardACLInfoDTO{{OrgID: orgID, DashboardID: dashboardID, UserID: userID, Permission: permission}}
case TEAM: case TEAM:
existingPermissions = []*models.DashboardACLInfoDTO{{OrgId: orgID, DashboardId: dashboardID, TeamId: teamID, Permission: permission}} existingPermissions = []*dashboards.DashboardACLInfoDTO{{OrgID: orgID, DashboardID: dashboardID, TeamID: teamID, Permission: permission}}
case EDITOR: case EDITOR:
existingPermissions = []*models.DashboardACLInfoDTO{{OrgId: orgID, DashboardId: dashboardID, Role: &editorRole, Permission: permission}} existingPermissions = []*dashboards.DashboardACLInfoDTO{{OrgID: orgID, DashboardID: dashboardID, Role: &editorRole, Permission: permission}}
case VIEWER: case VIEWER:
existingPermissions = []*models.DashboardACLInfoDTO{{OrgId: orgID, DashboardId: dashboardID, Role: &viewerRole, Permission: permission}} existingPermissions = []*dashboards.DashboardACLInfoDTO{{OrgID: orgID, DashboardID: dashboardID, Role: &viewerRole, Permission: permission}}
} }
permissionScenario(fmt.Sprintf("and %s has permission to %s dashboard", pt.String(), permission.String()), permissionScenario(fmt.Sprintf("and %s has permission to %s dashboard", pt.String(), permission.String()),
@ -234,20 +234,20 @@ func (sc *scenarioContext) parentFolderPermissionScenario(pt permissionType, per
_, callerFile, callerLine, _ := runtime.Caller(1) _, callerFile, callerLine, _ := runtime.Caller(1)
sc.callerFile = callerFile sc.callerFile = callerFile
sc.callerLine = callerLine sc.callerLine = callerLine
var folderPermissionList []*models.DashboardACLInfoDTO var folderPermissionList []*dashboards.DashboardACLInfoDTO
switch pt { switch pt {
case USER: case USER:
folderPermissionList = []*models.DashboardACLInfoDTO{{OrgId: orgID, DashboardId: parentFolderID, folderPermissionList = []*dashboards.DashboardACLInfoDTO{{OrgID: orgID, DashboardID: parentFolderID,
UserId: userID, Permission: permission, Inherited: true}} UserID: userID, Permission: permission, Inherited: true}}
case TEAM: case TEAM:
folderPermissionList = []*models.DashboardACLInfoDTO{{OrgId: orgID, DashboardId: parentFolderID, TeamId: teamID, folderPermissionList = []*dashboards.DashboardACLInfoDTO{{OrgID: orgID, DashboardID: parentFolderID, TeamID: teamID,
Permission: permission, Inherited: true}} Permission: permission, Inherited: true}}
case EDITOR: case EDITOR:
folderPermissionList = []*models.DashboardACLInfoDTO{{OrgId: orgID, DashboardId: parentFolderID, folderPermissionList = []*dashboards.DashboardACLInfoDTO{{OrgID: orgID, DashboardID: parentFolderID,
Role: &editorRole, Permission: permission, Inherited: true}} Role: &editorRole, Permission: permission, Inherited: true}}
case VIEWER: case VIEWER:
folderPermissionList = []*models.DashboardACLInfoDTO{{OrgId: orgID, DashboardId: parentFolderID, folderPermissionList = []*dashboards.DashboardACLInfoDTO{{OrgID: orgID, DashboardID: parentFolderID,
Role: &viewerRole, Permission: permission, Inherited: true}} Role: &viewerRole, Permission: permission, Inherited: true}}
} }
@ -312,7 +312,7 @@ func (sc *scenarioContext) verifyDuplicatePermissionsShouldNotBeAllowed() {
tc := "When updating dashboard permissions with duplicate permission for user should not be allowed" tc := "When updating dashboard permissions with duplicate permission for user should not be allowed"
sc.t.Run(tc, func(t *testing.T) { sc.t.Run(tc, func(t *testing.T) {
p := []*models.DashboardACL{ p := []*dashboards.DashboardACL{
newDefaultUserPermission(dashboardID, models.PERMISSION_VIEW), newDefaultUserPermission(dashboardID, models.PERMISSION_VIEW),
newDefaultUserPermission(dashboardID, models.PERMISSION_ADMIN), newDefaultUserPermission(dashboardID, models.PERMISSION_ADMIN),
} }
@ -327,7 +327,7 @@ func (sc *scenarioContext) verifyDuplicatePermissionsShouldNotBeAllowed() {
tc = "When updating dashboard permissions with duplicate permission for team should not be allowed" tc = "When updating dashboard permissions with duplicate permission for team should not be allowed"
sc.t.Run(tc, func(t *testing.T) { sc.t.Run(tc, func(t *testing.T) {
p := []*models.DashboardACL{ p := []*dashboards.DashboardACL{
newDefaultTeamPermission(dashboardID, models.PERMISSION_VIEW), newDefaultTeamPermission(dashboardID, models.PERMISSION_VIEW),
newDefaultTeamPermission(dashboardID, models.PERMISSION_ADMIN), newDefaultTeamPermission(dashboardID, models.PERMISSION_ADMIN),
} }
@ -341,7 +341,7 @@ func (sc *scenarioContext) verifyDuplicatePermissionsShouldNotBeAllowed() {
tc = "When updating dashboard permissions with duplicate permission for editor role should not be allowed" tc = "When updating dashboard permissions with duplicate permission for editor role should not be allowed"
sc.t.Run(tc, func(t *testing.T) { sc.t.Run(tc, func(t *testing.T) {
p := []*models.DashboardACL{ p := []*dashboards.DashboardACL{
newEditorRolePermission(dashboardID, models.PERMISSION_VIEW), newEditorRolePermission(dashboardID, models.PERMISSION_VIEW),
newEditorRolePermission(dashboardID, models.PERMISSION_ADMIN), newEditorRolePermission(dashboardID, models.PERMISSION_ADMIN),
} }
@ -356,7 +356,7 @@ func (sc *scenarioContext) verifyDuplicatePermissionsShouldNotBeAllowed() {
tc = "When updating dashboard permissions with duplicate permission for viewer role should not be allowed" tc = "When updating dashboard permissions with duplicate permission for viewer role should not be allowed"
sc.t.Run(tc, func(t *testing.T) { sc.t.Run(tc, func(t *testing.T) {
p := []*models.DashboardACL{ p := []*dashboards.DashboardACL{
newViewerRolePermission(dashboardID, models.PERMISSION_VIEW), newViewerRolePermission(dashboardID, models.PERMISSION_VIEW),
newViewerRolePermission(dashboardID, models.PERMISSION_ADMIN), newViewerRolePermission(dashboardID, models.PERMISSION_ADMIN),
} }
@ -370,7 +370,7 @@ func (sc *scenarioContext) verifyDuplicatePermissionsShouldNotBeAllowed() {
tc = "When updating dashboard permissions with duplicate permission for admin role should not be allowed" tc = "When updating dashboard permissions with duplicate permission for admin role should not be allowed"
sc.t.Run(tc, func(t *testing.T) { sc.t.Run(tc, func(t *testing.T) {
p := []*models.DashboardACL{ p := []*dashboards.DashboardACL{
newAdminRolePermission(dashboardID, models.PERMISSION_ADMIN), newAdminRolePermission(dashboardID, models.PERMISSION_ADMIN),
} }
sc.updatePermissions = p sc.updatePermissions = p
@ -390,24 +390,24 @@ func (sc *scenarioContext) verifyUpdateDashboardPermissionsShouldBeAllowed(pt pe
for _, p := range []models.PermissionType{models.PERMISSION_ADMIN, models.PERMISSION_EDIT, models.PERMISSION_VIEW} { for _, p := range []models.PermissionType{models.PERMISSION_ADMIN, models.PERMISSION_EDIT, models.PERMISSION_VIEW} {
tc := fmt.Sprintf("When updating dashboard permissions with %s permissions should be allowed", p.String()) tc := fmt.Sprintf("When updating dashboard permissions with %s permissions should be allowed", p.String())
sc.t.Run(tc, func(t *testing.T) { sc.t.Run(tc, func(t *testing.T) {
permissionList := []*models.DashboardACL{} permissionList := []*dashboards.DashboardACL{}
switch pt { switch pt {
case USER: case USER:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newEditorRolePermission(dashboardID, p), newEditorRolePermission(dashboardID, p),
newViewerRolePermission(dashboardID, p), newViewerRolePermission(dashboardID, p),
newCustomUserPermission(dashboardID, otherUserID, p), newCustomUserPermission(dashboardID, otherUserID, p),
newDefaultTeamPermission(dashboardID, p), newDefaultTeamPermission(dashboardID, p),
} }
case TEAM: case TEAM:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newEditorRolePermission(dashboardID, p), newEditorRolePermission(dashboardID, p),
newViewerRolePermission(dashboardID, p), newViewerRolePermission(dashboardID, p),
newDefaultUserPermission(dashboardID, p), newDefaultUserPermission(dashboardID, p),
newCustomTeamPermission(dashboardID, otherTeamID, p), newCustomTeamPermission(dashboardID, otherTeamID, p),
} }
case EDITOR, VIEWER: case EDITOR, VIEWER:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newEditorRolePermission(dashboardID, p), newEditorRolePermission(dashboardID, p),
newViewerRolePermission(dashboardID, p), newViewerRolePermission(dashboardID, p),
newDefaultUserPermission(dashboardID, p), newDefaultUserPermission(dashboardID, p),
@ -436,18 +436,18 @@ func (sc *scenarioContext) verifyUpdateDashboardPermissionsShouldNotBeAllowed(pt
for _, p := range []models.PermissionType{models.PERMISSION_ADMIN, models.PERMISSION_EDIT, models.PERMISSION_VIEW} { for _, p := range []models.PermissionType{models.PERMISSION_ADMIN, models.PERMISSION_EDIT, models.PERMISSION_VIEW} {
tc := fmt.Sprintf("When updating dashboard permissions with %s permissions should NOT be allowed", p.String()) tc := fmt.Sprintf("When updating dashboard permissions with %s permissions should NOT be allowed", p.String())
sc.t.Run(tc, func(t *testing.T) { sc.t.Run(tc, func(t *testing.T) {
permissionList := []*models.DashboardACL{ permissionList := []*dashboards.DashboardACL{
newEditorRolePermission(dashboardID, p), newEditorRolePermission(dashboardID, p),
newViewerRolePermission(dashboardID, p), newViewerRolePermission(dashboardID, p),
} }
switch pt { switch pt {
case USER: case USER:
permissionList = append(permissionList, []*models.DashboardACL{ permissionList = append(permissionList, []*dashboards.DashboardACL{
newCustomUserPermission(dashboardID, otherUserID, p), newCustomUserPermission(dashboardID, otherUserID, p),
newDefaultTeamPermission(dashboardID, p), newDefaultTeamPermission(dashboardID, p),
}...) }...)
case TEAM: case TEAM:
permissionList = append(permissionList, []*models.DashboardACL{ permissionList = append(permissionList, []*dashboards.DashboardACL{
newDefaultUserPermission(dashboardID, p), newDefaultUserPermission(dashboardID, p),
newCustomTeamPermission(dashboardID, otherTeamID, p), newCustomTeamPermission(dashboardID, otherTeamID, p),
}...) }...)
@ -476,24 +476,24 @@ func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsShouldBeAllowed(
for _, p := range []models.PermissionType{models.PERMISSION_ADMIN, models.PERMISSION_EDIT, models.PERMISSION_VIEW} { for _, p := range []models.PermissionType{models.PERMISSION_ADMIN, models.PERMISSION_EDIT, models.PERMISSION_VIEW} {
tc := fmt.Sprintf("When updating child dashboard permissions with %s permissions should be allowed", p.String()) tc := fmt.Sprintf("When updating child dashboard permissions with %s permissions should be allowed", p.String())
sc.t.Run(tc, func(t *testing.T) { sc.t.Run(tc, func(t *testing.T) {
permissionList := []*models.DashboardACL{} permissionList := []*dashboards.DashboardACL{}
switch pt { switch pt {
case USER: case USER:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newEditorRolePermission(childDashboardID, p), newEditorRolePermission(childDashboardID, p),
newViewerRolePermission(childDashboardID, p), newViewerRolePermission(childDashboardID, p),
newCustomUserPermission(childDashboardID, otherUserID, p), newCustomUserPermission(childDashboardID, otherUserID, p),
newDefaultTeamPermission(childDashboardID, p), newDefaultTeamPermission(childDashboardID, p),
} }
case TEAM: case TEAM:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newEditorRolePermission(childDashboardID, p), newEditorRolePermission(childDashboardID, p),
newViewerRolePermission(childDashboardID, p), newViewerRolePermission(childDashboardID, p),
newDefaultUserPermission(childDashboardID, p), newDefaultUserPermission(childDashboardID, p),
newCustomTeamPermission(childDashboardID, otherTeamID, p), newCustomTeamPermission(childDashboardID, otherTeamID, p),
} }
case EDITOR: case EDITOR:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newViewerRolePermission(childDashboardID, p), newViewerRolePermission(childDashboardID, p),
newDefaultUserPermission(childDashboardID, p), newDefaultUserPermission(childDashboardID, p),
newDefaultTeamPermission(childDashboardID, p), newDefaultTeamPermission(childDashboardID, p),
@ -504,7 +504,7 @@ func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsShouldBeAllowed(
permissionList = append(permissionList, newEditorRolePermission(childDashboardID, p)) permissionList = append(permissionList, newEditorRolePermission(childDashboardID, p))
} }
case VIEWER: case VIEWER:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newEditorRolePermission(childDashboardID, p), newEditorRolePermission(childDashboardID, p),
newDefaultUserPermission(childDashboardID, p), newDefaultUserPermission(childDashboardID, p),
newDefaultTeamPermission(childDashboardID, p), newDefaultTeamPermission(childDashboardID, p),
@ -537,24 +537,24 @@ func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsShouldNotBeAllow
for _, p := range []models.PermissionType{models.PERMISSION_ADMIN, models.PERMISSION_EDIT, models.PERMISSION_VIEW} { for _, p := range []models.PermissionType{models.PERMISSION_ADMIN, models.PERMISSION_EDIT, models.PERMISSION_VIEW} {
tc := fmt.Sprintf("When updating child dashboard permissions with %s permissions should NOT be allowed", p.String()) tc := fmt.Sprintf("When updating child dashboard permissions with %s permissions should NOT be allowed", p.String())
sc.t.Run(tc, func(t *testing.T) { sc.t.Run(tc, func(t *testing.T) {
permissionList := []*models.DashboardACL{} permissionList := []*dashboards.DashboardACL{}
switch pt { switch pt {
case USER: case USER:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newEditorRolePermission(childDashboardID, p), newEditorRolePermission(childDashboardID, p),
newViewerRolePermission(childDashboardID, p), newViewerRolePermission(childDashboardID, p),
newCustomUserPermission(childDashboardID, otherUserID, p), newCustomUserPermission(childDashboardID, otherUserID, p),
newDefaultTeamPermission(childDashboardID, p), newDefaultTeamPermission(childDashboardID, p),
} }
case TEAM: case TEAM:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newEditorRolePermission(childDashboardID, p), newEditorRolePermission(childDashboardID, p),
newViewerRolePermission(childDashboardID, p), newViewerRolePermission(childDashboardID, p),
newDefaultUserPermission(childDashboardID, p), newDefaultUserPermission(childDashboardID, p),
newCustomTeamPermission(childDashboardID, otherTeamID, p), newCustomTeamPermission(childDashboardID, otherTeamID, p),
} }
case EDITOR: case EDITOR:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newViewerRolePermission(childDashboardID, p), newViewerRolePermission(childDashboardID, p),
newDefaultUserPermission(childDashboardID, p), newDefaultUserPermission(childDashboardID, p),
newDefaultTeamPermission(childDashboardID, p), newDefaultTeamPermission(childDashboardID, p),
@ -565,7 +565,7 @@ func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsShouldNotBeAllow
permissionList = append(permissionList, newEditorRolePermission(childDashboardID, p)) permissionList = append(permissionList, newEditorRolePermission(childDashboardID, p))
} }
case VIEWER: case VIEWER:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newEditorRolePermission(childDashboardID, p), newEditorRolePermission(childDashboardID, p),
newDefaultUserPermission(childDashboardID, p), newDefaultUserPermission(childDashboardID, p),
newDefaultTeamPermission(childDashboardID, p), newDefaultTeamPermission(childDashboardID, p),
@ -603,22 +603,22 @@ func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsWithOverrideShou
tc := fmt.Sprintf("When updating child dashboard permissions overriding parent %s permission with %s permission should NOT be allowed", pt.String(), p.String()) tc := fmt.Sprintf("When updating child dashboard permissions overriding parent %s permission with %s permission should NOT be allowed", pt.String(), p.String())
sc.t.Run(tc, func(t *testing.T) { sc.t.Run(tc, func(t *testing.T) {
permissionList := []*models.DashboardACL{} permissionList := []*dashboards.DashboardACL{}
switch pt { switch pt {
case USER: case USER:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newDefaultUserPermission(childDashboardID, p), newDefaultUserPermission(childDashboardID, p),
} }
case TEAM: case TEAM:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newDefaultTeamPermission(childDashboardID, p), newDefaultTeamPermission(childDashboardID, p),
} }
case EDITOR: case EDITOR:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newEditorRolePermission(childDashboardID, p), newEditorRolePermission(childDashboardID, p),
} }
case VIEWER: case VIEWER:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newViewerRolePermission(childDashboardID, p), newViewerRolePermission(childDashboardID, p),
} }
} }
@ -649,22 +649,22 @@ func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsWithOverrideShou
pt.String(), p.String(), pt.String(), p.String(),
) )
sc.t.Run(tc, func(t *testing.T) { sc.t.Run(tc, func(t *testing.T) {
permissionList := []*models.DashboardACL{} permissionList := []*dashboards.DashboardACL{}
switch pt { switch pt {
case USER: case USER:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newDefaultUserPermission(childDashboardID, p), newDefaultUserPermission(childDashboardID, p),
} }
case TEAM: case TEAM:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newDefaultTeamPermission(childDashboardID, p), newDefaultTeamPermission(childDashboardID, p),
} }
case EDITOR: case EDITOR:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newEditorRolePermission(childDashboardID, p), newEditorRolePermission(childDashboardID, p),
} }
case VIEWER: case VIEWER:
permissionList = []*models.DashboardACL{ permissionList = []*dashboards.DashboardACL{
newViewerRolePermission(childDashboardID, p), newViewerRolePermission(childDashboardID, p),
} }
} }
@ -690,12 +690,12 @@ func TestGuardianGetHiddenACL(t *testing.T) {
t.Run("Get hidden ACL tests", func(t *testing.T) { t.Run("Get hidden ACL tests", func(t *testing.T) {
store := dbtest.NewFakeDB() store := dbtest.NewFakeDB()
dashSvc := dashboards.NewFakeDashboardService(t) dashSvc := dashboards.NewFakeDashboardService(t)
dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) { dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) {
q := args.Get(1).(*models.GetDashboardACLInfoListQuery) q := args.Get(1).(*dashboards.GetDashboardACLInfoListQuery)
q.Result = []*models.DashboardACLInfoDTO{ q.Result = []*dashboards.DashboardACLInfoDTO{
{Inherited: false, UserId: 1, UserLogin: "user1", Permission: models.PERMISSION_EDIT}, {Inherited: false, UserID: 1, UserLogin: "user1", Permission: models.PERMISSION_EDIT},
{Inherited: false, UserId: 2, UserLogin: "user2", Permission: models.PERMISSION_ADMIN}, {Inherited: false, UserID: 2, UserLogin: "user2", Permission: models.PERMISSION_ADMIN},
{Inherited: true, UserId: 3, UserLogin: "user3", Permission: models.PERMISSION_VIEW}, {Inherited: true, UserID: 3, UserLogin: "user3", Permission: models.PERMISSION_VIEW},
} }
}).Return(nil) }).Return(nil)
dashSvc.On("GetDashboard", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardQuery")).Run(func(args mock.Arguments) { dashSvc.On("GetDashboard", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardQuery")).Run(func(args mock.Arguments) {
@ -756,17 +756,17 @@ func TestGuardianGetACLWithoutDuplicates(t *testing.T) {
t.Run("Get hidden ACL tests", func(t *testing.T) { t.Run("Get hidden ACL tests", func(t *testing.T) {
store := dbtest.NewFakeDB() store := dbtest.NewFakeDB()
dashSvc := dashboards.NewFakeDashboardService(t) dashSvc := dashboards.NewFakeDashboardService(t)
dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) { dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) {
q := args.Get(1).(*models.GetDashboardACLInfoListQuery) q := args.Get(1).(*dashboards.GetDashboardACLInfoListQuery)
q.Result = []*models.DashboardACLInfoDTO{ q.Result = []*dashboards.DashboardACLInfoDTO{
{Inherited: true, UserId: 3, UserLogin: "user3", Permission: models.PERMISSION_EDIT}, {Inherited: true, UserID: 3, UserLogin: "user3", Permission: models.PERMISSION_EDIT},
{Inherited: false, UserId: 3, UserLogin: "user3", Permission: models.PERMISSION_VIEW}, {Inherited: false, UserID: 3, UserLogin: "user3", Permission: models.PERMISSION_VIEW},
{Inherited: false, UserId: 2, UserLogin: "user2", Permission: models.PERMISSION_ADMIN}, {Inherited: false, UserID: 2, UserLogin: "user2", Permission: models.PERMISSION_ADMIN},
{Inherited: true, UserId: 4, UserLogin: "user4", Permission: models.PERMISSION_ADMIN}, {Inherited: true, UserID: 4, UserLogin: "user4", Permission: models.PERMISSION_ADMIN},
{Inherited: false, UserId: 4, UserLogin: "user4", Permission: models.PERMISSION_ADMIN}, {Inherited: false, UserID: 4, UserLogin: "user4", Permission: models.PERMISSION_ADMIN},
{Inherited: false, UserId: 5, UserLogin: "user5", Permission: models.PERMISSION_EDIT}, {Inherited: false, UserID: 5, UserLogin: "user5", Permission: models.PERMISSION_EDIT},
{Inherited: true, UserId: 6, UserLogin: "user6", Permission: models.PERMISSION_VIEW}, {Inherited: true, UserID: 6, UserLogin: "user6", Permission: models.PERMISSION_VIEW},
{Inherited: false, UserId: 6, UserLogin: "user6", Permission: models.PERMISSION_EDIT}, {Inherited: false, UserID: 6, UserLogin: "user6", Permission: models.PERMISSION_EDIT},
} }
}).Return(nil) }).Return(nil)
dashSvc.On("GetDashboard", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardQuery")).Run(func(args mock.Arguments) { dashSvc.On("GetDashboard", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardQuery")).Run(func(args mock.Arguments) {
@ -791,13 +791,13 @@ func TestGuardianGetACLWithoutDuplicates(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.NotNil(t, acl) require.NotNil(t, acl)
require.Len(t, acl, 6) require.Len(t, acl, 6)
require.ElementsMatch(t, []*models.DashboardACLInfoDTO{ require.ElementsMatch(t, []*dashboards.DashboardACLInfoDTO{
{Inherited: true, UserId: 3, UserLogin: "user3", Permission: models.PERMISSION_EDIT}, {Inherited: true, UserID: 3, UserLogin: "user3", Permission: models.PERMISSION_EDIT},
{Inherited: true, UserId: 4, UserLogin: "user4", Permission: models.PERMISSION_ADMIN}, {Inherited: true, UserID: 4, UserLogin: "user4", Permission: models.PERMISSION_ADMIN},
{Inherited: true, UserId: 6, UserLogin: "user6", Permission: models.PERMISSION_VIEW}, {Inherited: true, UserID: 6, UserLogin: "user6", Permission: models.PERMISSION_VIEW},
{Inherited: false, UserId: 2, UserLogin: "user2", Permission: models.PERMISSION_ADMIN}, {Inherited: false, UserID: 2, UserLogin: "user2", Permission: models.PERMISSION_ADMIN},
{Inherited: false, UserId: 5, UserLogin: "user5", Permission: models.PERMISSION_EDIT}, {Inherited: false, UserID: 5, UserLogin: "user5", Permission: models.PERMISSION_EDIT},
{Inherited: false, UserId: 6, UserLogin: "user6", Permission: models.PERMISSION_EDIT}, {Inherited: false, UserID: 6, UserLogin: "user6", Permission: models.PERMISSION_EDIT},
}, acl) }, acl)
}) })
}) })

@ -27,9 +27,9 @@ type scenarioContext struct {
g DashboardGuardian g DashboardGuardian
givenUser *user.SignedInUser givenUser *user.SignedInUser
givenDashboardID int64 givenDashboardID int64
givenPermissions []*models.DashboardACLInfoDTO givenPermissions []*dashboards.DashboardACLInfoDTO
givenTeams []*team.TeamDTO givenTeams []*team.TeamDTO
updatePermissions []*models.DashboardACL updatePermissions []*dashboards.DashboardACL
expectedFlags permissionFlags expectedFlags permissionFlags
callerFile string callerFile string
callerLine int callerLine int
@ -101,21 +101,21 @@ func apiKeyScenario(desc string, t *testing.T, role org.RoleType, fn scenarioFun
} }
func permissionScenario(desc string, dashboardID int64, sc *scenarioContext, func permissionScenario(desc string, dashboardID int64, sc *scenarioContext,
permissions []*models.DashboardACLInfoDTO, fn scenarioFunc) { permissions []*dashboards.DashboardACLInfoDTO, fn scenarioFunc) {
sc.t.Run(desc, func(t *testing.T) { sc.t.Run(desc, func(t *testing.T) {
store := dbtest.NewFakeDB() store := dbtest.NewFakeDB()
teams := []*team.TeamDTO{} teams := []*team.TeamDTO{}
for _, p := range permissions { for _, p := range permissions {
if p.TeamId > 0 { if p.TeamID > 0 {
teams = append(teams, &team.TeamDTO{ID: p.TeamId}) teams = append(teams, &team.TeamDTO{ID: p.TeamID})
} }
} }
teamSvc := &teamtest.FakeService{ExpectedTeamsByUser: teams} teamSvc := &teamtest.FakeService{ExpectedTeamsByUser: teams}
dashSvc := dashboards.NewFakeDashboardService(t) dashSvc := dashboards.NewFakeDashboardService(t)
dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*models.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) { dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Run(func(args mock.Arguments) {
q := args.Get(1).(*models.GetDashboardACLInfoListQuery) q := args.Get(1).(*dashboards.GetDashboardACLInfoListQuery)
q.Result = permissions q.Result = permissions
}).Return(nil) }).Return(nil)
dashSvc.On("GetDashboard", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardQuery")).Run(func(args mock.Arguments) { dashSvc.On("GetDashboard", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardQuery")).Run(func(args mock.Arguments) {
@ -243,7 +243,7 @@ func (sc *scenarioContext) reportFailure(desc string, expected interface{}, actu
if p.Role != nil { if p.Role != nil {
r = string(*p.Role) r = string(*p.Role)
} }
buf.WriteString(fmt.Sprintf("\n Given permission (%d): dashboardId=%d, userId=%d, teamId=%d, role=%v, permission=%s", i, p.DashboardId, p.UserId, p.TeamId, r, p.Permission.String())) buf.WriteString(fmt.Sprintf("\n Given permission (%d): dashboardId=%d, userId=%d, teamId=%d, role=%v, permission=%s", i, p.DashboardID, p.UserID, p.TeamID, r, p.Permission.String()))
} }
for i, t := range sc.givenTeams { for i, t := range sc.givenTeams {
@ -261,40 +261,40 @@ func (sc *scenarioContext) reportFailure(desc string, expected interface{}, actu
sc.t.Fatalf(buf.String()) sc.t.Fatalf(buf.String())
} }
func newCustomUserPermission(dashboardID int64, userID int64, permission models.PermissionType) *models.DashboardACL { func newCustomUserPermission(dashboardID int64, userID int64, permission models.PermissionType) *dashboards.DashboardACL {
return &models.DashboardACL{OrgID: orgID, DashboardID: dashboardID, UserID: userID, Permission: permission} return &dashboards.DashboardACL{OrgID: orgID, DashboardID: dashboardID, UserID: userID, Permission: permission}
} }
func newDefaultUserPermission(dashboardID int64, permission models.PermissionType) *models.DashboardACL { func newDefaultUserPermission(dashboardID int64, permission models.PermissionType) *dashboards.DashboardACL {
return newCustomUserPermission(dashboardID, userID, permission) return newCustomUserPermission(dashboardID, userID, permission)
} }
func newCustomTeamPermission(dashboardID int64, teamID int64, permission models.PermissionType) *models.DashboardACL { func newCustomTeamPermission(dashboardID int64, teamID int64, permission models.PermissionType) *dashboards.DashboardACL {
return &models.DashboardACL{OrgID: orgID, DashboardID: dashboardID, TeamID: teamID, Permission: permission} return &dashboards.DashboardACL{OrgID: orgID, DashboardID: dashboardID, TeamID: teamID, Permission: permission}
} }
func newDefaultTeamPermission(dashboardID int64, permission models.PermissionType) *models.DashboardACL { func newDefaultTeamPermission(dashboardID int64, permission models.PermissionType) *dashboards.DashboardACL {
return newCustomTeamPermission(dashboardID, teamID, permission) return newCustomTeamPermission(dashboardID, teamID, permission)
} }
func newAdminRolePermission(dashboardID int64, permission models.PermissionType) *models.DashboardACL { func newAdminRolePermission(dashboardID int64, permission models.PermissionType) *dashboards.DashboardACL {
return &models.DashboardACL{OrgID: orgID, DashboardID: dashboardID, Role: &adminRole, Permission: permission} return &dashboards.DashboardACL{OrgID: orgID, DashboardID: dashboardID, Role: &adminRole, Permission: permission}
} }
func newEditorRolePermission(dashboardID int64, permission models.PermissionType) *models.DashboardACL { func newEditorRolePermission(dashboardID int64, permission models.PermissionType) *dashboards.DashboardACL {
return &models.DashboardACL{OrgID: orgID, DashboardID: dashboardID, Role: &editorRole, Permission: permission} return &dashboards.DashboardACL{OrgID: orgID, DashboardID: dashboardID, Role: &editorRole, Permission: permission}
} }
func newViewerRolePermission(dashboardID int64, permission models.PermissionType) *models.DashboardACL { func newViewerRolePermission(dashboardID int64, permission models.PermissionType) *dashboards.DashboardACL {
return &models.DashboardACL{OrgID: orgID, DashboardID: dashboardID, Role: &viewerRole, Permission: permission} return &dashboards.DashboardACL{OrgID: orgID, DashboardID: dashboardID, Role: &viewerRole, Permission: permission}
} }
func toDto(acl *models.DashboardACL) *models.DashboardACLInfoDTO { func toDto(acl *dashboards.DashboardACL) *dashboards.DashboardACLInfoDTO {
return &models.DashboardACLInfoDTO{ return &dashboards.DashboardACLInfoDTO{
OrgId: acl.OrgID, OrgID: acl.OrgID,
DashboardId: acl.DashboardID, DashboardID: acl.DashboardID,
UserId: acl.UserID, UserID: acl.UserID,
TeamId: acl.TeamID, TeamID: acl.TeamID,
Role: acl.Role, Role: acl.Role,
Permission: acl.Permission, Permission: acl.Permission,
PermissionName: acl.Permission.String(), PermissionName: acl.Permission.String(),

@ -334,11 +334,11 @@ func updateFolderACL(t *testing.T, dashboardStore *database.DashboardStore, fold
return return
} }
var aclItems []*models.DashboardACL var aclItems []*dashboards.DashboardACL
for _, item := range items { for _, item := range items {
role := item.roleType role := item.roleType
permission := item.permission permission := item.permission
aclItems = append(aclItems, &models.DashboardACL{ aclItems = append(aclItems, &dashboards.DashboardACL{
DashboardID: folderID, DashboardID: folderID,
Role: &role, Role: &role,
Permission: permission, Permission: permission,

@ -745,11 +745,11 @@ func updateFolderACL(t *testing.T, dashboardStore *database.DashboardStore, fold
return return
} }
var aclItems []*models.DashboardACL var aclItems []*dashboards.DashboardACL
for _, item := range items { for _, item := range items {
role := item.roleType role := item.roleType
permission := item.permission permission := item.permission
aclItems = append(aclItems, &models.DashboardACL{ aclItems = append(aclItems, &dashboards.DashboardACL{
DashboardID: folderID, DashboardID: folderID,
Role: &role, Role: &role,
Permission: permission, Permission: permission,

@ -76,29 +76,29 @@ func (m dashboardPermissionsMigrator) Exec(sess *xorm.Session, migrator *migrato
m.sess = sess m.sess = sess
m.dialect = migrator.Dialect m.dialect = migrator.Dialect
var dashboards []dashboard var dashs []dashboard
if err := m.sess.SQL("SELECT id, is_folder, folder_id, org_id, has_acl FROM dashboard").Find(&dashboards); err != nil { if err := m.sess.SQL("SELECT id, is_folder, folder_id, org_id, has_acl FROM dashboard").Find(&dashs); err != nil {
return fmt.Errorf("failed to list dashboards: %w", err) return fmt.Errorf("failed to list dashboards: %w", err)
} }
var acl []models.DashboardACL var acl []dashboards.DashboardACL
if err := m.sess.Find(&acl); err != nil { if err := m.sess.Find(&acl); err != nil {
return fmt.Errorf("failed to list dashboard ACL: %w", err) return fmt.Errorf("failed to list dashboard ACL: %w", err)
} }
aclMap := make(map[int64][]models.DashboardACL, len(acl)) aclMap := make(map[int64][]dashboards.DashboardACL, len(acl))
for _, p := range acl { for _, p := range acl {
aclMap[p.DashboardID] = append(aclMap[p.DashboardID], p) aclMap[p.DashboardID] = append(aclMap[p.DashboardID], p)
} }
if err := m.migratePermissions(dashboards, aclMap, migrator); err != nil { if err := m.migratePermissions(dashs, aclMap, migrator); err != nil {
return fmt.Errorf("failed to migrate permissions: %w", err) return fmt.Errorf("failed to migrate permissions: %w", err)
} }
return nil return nil
} }
func (m dashboardPermissionsMigrator) migratePermissions(dashboards []dashboard, aclMap map[int64][]models.DashboardACL, migrator *migrator.Migrator) error { func (m dashboardPermissionsMigrator) migratePermissions(dashboards []dashboard, aclMap map[int64][]dashboards.DashboardACL, migrator *migrator.Migrator) error {
permissionMap := map[int64]map[string][]*ac.Permission{} permissionMap := map[int64]map[string][]*ac.Permission{}
for _, d := range dashboards { for _, d := range dashboards {
if d.ID == -1 { if d.ID == -1 {
@ -215,7 +215,7 @@ func (m dashboardPermissionsMigrator) mapPermission(id int64, p models.Permissio
return permissions return permissions
} }
func getRoleName(p models.DashboardACL) string { func getRoleName(p dashboards.DashboardACL) string {
if p.UserID != 0 { if p.UserID != 0 {
return fmt.Sprintf("managed:users:%d:permissions", p.UserID) return fmt.Sprintf("managed:users:%d:permissions", p.UserID)
} }
@ -225,9 +225,9 @@ func getRoleName(p models.DashboardACL) string {
return fmt.Sprintf("managed:builtins:%s:permissions", strings.ToLower(string(*p.Role))) return fmt.Sprintf("managed:builtins:%s:permissions", strings.ToLower(string(*p.Role)))
} }
func deduplicateAcl(acl []models.DashboardACL) []models.DashboardACL { func deduplicateAcl(acl []dashboards.DashboardACL) []dashboards.DashboardACL {
output := make([]models.DashboardACL, 0, len(acl)) output := make([]dashboards.DashboardACL, 0, len(acl))
uniqueACL := map[string]models.DashboardACL{} uniqueACL := map[string]dashboards.DashboardACL{}
for _, item := range acl { for _, item := range acl {
// acl items with userID or teamID is enforced to be unique by sql constraint, so we can skip those // acl items with userID or teamID is enforced to be unique by sql constraint, so we can skip those
if item.UserID > 0 || item.TeamID > 0 { if item.UserID > 0 || item.TeamID > 0 {

@ -300,7 +300,7 @@ func TestIntegrationTeamCommandsAndQueries(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
err = teamSvc.AddTeamMember(userIds[2], testOrgID, groupID, false, 0) err = teamSvc.AddTeamMember(userIds[2], testOrgID, groupID, false, 0)
require.NoError(t, err) require.NoError(t, err)
err = updateDashboardACL(t, sqlStore, 1, &models.DashboardACL{ err = updateDashboardACL(t, sqlStore, 1, &dashboards.DashboardACL{
DashboardID: 1, OrgID: testOrgID, Permission: models.PERMISSION_EDIT, TeamID: groupID, DashboardID: 1, OrgID: testOrgID, Permission: models.PERMISSION_EDIT, TeamID: groupID,
}) })
require.NoError(t, err) require.NoError(t, err)
@ -311,7 +311,7 @@ func TestIntegrationTeamCommandsAndQueries(t *testing.T) {
_, err = teamSvc.GetTeamByID(context.Background(), query) _, err = teamSvc.GetTeamByID(context.Background(), query)
require.Equal(t, err, team.ErrTeamNotFound) require.Equal(t, err, team.ErrTeamNotFound)
permQuery := &models.GetDashboardACLInfoListQuery{DashboardID: 1, OrgID: testOrgID} permQuery := &dashboards.GetDashboardACLInfoListQuery{DashboardID: 1, OrgID: testOrgID}
err = getDashboardACLInfoList(sqlStore, permQuery) err = getDashboardACLInfoList(sqlStore, permQuery)
require.NoError(t, err) require.NoError(t, err)
@ -617,7 +617,7 @@ func hasWildcardScope(user *user.SignedInUser, action string) bool {
} }
// TODO: Use FakeDashboardStore when org has its own service // TODO: Use FakeDashboardStore when org has its own service
func updateDashboardACL(t *testing.T, sqlStore *sqlstore.SQLStore, dashboardID int64, items ...*models.DashboardACL) error { func updateDashboardACL(t *testing.T, sqlStore *sqlstore.SQLStore, dashboardID int64, items ...*dashboards.DashboardACL) error {
t.Helper() t.Helper()
err := sqlStore.WithDbSession(context.Background(), func(sess *db.Session) error { err := sqlStore.WithDbSession(context.Background(), func(sess *db.Session) error {
@ -654,9 +654,9 @@ func updateDashboardACL(t *testing.T, sqlStore *sqlstore.SQLStore, dashboardID i
// This function was copied from pkg/services/dashboards/database to circumvent // This function was copied from pkg/services/dashboards/database to circumvent
// import cycles. When this org-related code is refactored into a service the // import cycles. When this org-related code is refactored into a service the
// tests can the real GetDashboardACLInfoList functions // tests can the real GetDashboardACLInfoList functions
func getDashboardACLInfoList(s *sqlstore.SQLStore, query *models.GetDashboardACLInfoListQuery) error { func getDashboardACLInfoList(s *sqlstore.SQLStore, query *dashboards.GetDashboardACLInfoListQuery) error {
outerErr := s.WithDbSession(context.Background(), func(dbSession *db.Session) error { outerErr := s.WithDbSession(context.Background(), func(dbSession *db.Session) error {
query.Result = make([]*models.DashboardACLInfoDTO, 0) query.Result = make([]*dashboards.DashboardACLInfoDTO, 0)
falseStr := s.GetDialect().BooleanStr(false) falseStr := s.GetDialect().BooleanStr(false)
if query.DashboardID == 0 { if query.DashboardID == 0 {

@ -282,7 +282,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
}) })
require.Nil(t, err) require.Nil(t, err)
err = updateDashboardACL(t, ss, 1, &models.DashboardACL{ err = updateDashboardACL(t, ss, 1, &dashboards.DashboardACL{
DashboardID: 1, OrgID: users[0].OrgID, UserID: users[1].ID, DashboardID: 1, OrgID: users[0].OrgID, UserID: users[1].ID,
Permission: models.PERMISSION_EDIT, Permission: models.PERMISSION_EDIT,
}) })
@ -421,7 +421,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
}) })
require.Nil(t, err) require.Nil(t, err)
err = updateDashboardACL(t, ss, 1, &models.DashboardACL{ err = updateDashboardACL(t, ss, 1, &dashboards.DashboardACL{
DashboardID: 1, OrgID: users[0].OrgID, UserID: users[1].ID, DashboardID: 1, OrgID: users[0].OrgID, UserID: users[1].ID,
Permission: models.PERMISSION_EDIT, Permission: models.PERMISSION_EDIT,
}) })
@ -431,7 +431,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
err = userStore.Delete(context.Background(), users[1].ID) err = userStore.Delete(context.Background(), users[1].ID)
require.Nil(t, err) require.Nil(t, err)
permQuery := &models.GetDashboardACLInfoListQuery{DashboardID: 1, OrgID: users[0].OrgID} permQuery := &dashboards.GetDashboardACLInfoListQuery{DashboardID: 1, OrgID: users[0].OrgID}
err = userStore.getDashboardACLInfoList(permQuery) err = userStore.getDashboardACLInfoList(permQuery)
require.Nil(t, err) require.Nil(t, err)
@ -455,7 +455,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
}) })
require.Nil(t, err) require.Nil(t, err)
err = updateDashboardACL(t, ss, 1, &models.DashboardACL{ err = updateDashboardACL(t, ss, 1, &dashboards.DashboardACL{
DashboardID: 1, OrgID: users[0].OrgID, UserID: users[1].ID, DashboardID: 1, OrgID: users[0].OrgID, UserID: users[1].ID,
Permission: models.PERMISSION_EDIT, Permission: models.PERMISSION_EDIT,
}) })
@ -487,7 +487,7 @@ func TestIntegrationUserDataAccess(t *testing.T) {
err = userStore.Delete(context.Background(), users[1].ID) err = userStore.Delete(context.Background(), users[1].ID)
require.Nil(t, err) require.Nil(t, err)
permQuery = &models.GetDashboardACLInfoListQuery{DashboardID: 1, OrgID: users[0].OrgID} permQuery = &dashboards.GetDashboardACLInfoListQuery{DashboardID: 1, OrgID: users[0].OrgID}
err = userStore.getDashboardACLInfoList(permQuery) err = userStore.getDashboardACLInfoList(permQuery)
require.Nil(t, err) require.Nil(t, err)
@ -818,7 +818,7 @@ func createFiveTestUsers(t *testing.T, svc user.Service, fn func(i int) *user.Cr
} }
// TODO: Use FakeDashboardStore when org has its own service // TODO: Use FakeDashboardStore when org has its own service
func updateDashboardACL(t *testing.T, sqlStore db.DB, dashboardID int64, items ...*models.DashboardACL) error { func updateDashboardACL(t *testing.T, sqlStore db.DB, dashboardID int64, items ...*dashboards.DashboardACL) error {
t.Helper() t.Helper()
err := sqlStore.WithDbSession(context.Background(), func(sess *db.Session) error { err := sqlStore.WithDbSession(context.Background(), func(sess *db.Session) error {
@ -855,9 +855,9 @@ func updateDashboardACL(t *testing.T, sqlStore db.DB, dashboardID int64, items .
// This function was copied from pkg/services/dashboards/database to circumvent // This function was copied from pkg/services/dashboards/database to circumvent
// import cycles. When this org-related code is refactored into a service the // import cycles. When this org-related code is refactored into a service the
// tests can the real GetDashboardACLInfoList functions // tests can the real GetDashboardACLInfoList functions
func (ss *sqlStore) getDashboardACLInfoList(query *models.GetDashboardACLInfoListQuery) error { func (ss *sqlStore) getDashboardACLInfoList(query *dashboards.GetDashboardACLInfoListQuery) error {
outerErr := ss.db.WithDbSession(context.Background(), func(dbSession *db.Session) error { outerErr := ss.db.WithDbSession(context.Background(), func(dbSession *db.Session) error {
query.Result = make([]*models.DashboardACLInfoDTO, 0) query.Result = make([]*dashboards.DashboardACLInfoDTO, 0)
falseStr := ss.dialect.BooleanStr(false) falseStr := ss.dialect.BooleanStr(false)
if query.DashboardID == 0 { if query.DashboardID == 0 {

Loading…
Cancel
Save