| 
									
										
										
										
											2017-05-08 21:35:34 +08:00
										 |  |  | package api | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 	"encoding/json" | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2017-05-08 21:35:34 +08:00
										 |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-11 01:19:50 +08:00
										 |  |  | 	"github.com/stretchr/testify/assert" | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/mock" | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/require" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-18 21:30:04 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/api/dtos" | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/api/response" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/api/routing" | 
					
						
							| 
									
										
										
										
											2020-03-04 19:57:20 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/models" | 
					
						
							| 
									
										
										
										
											2022-03-10 19:58:18 +08:00
										 |  |  | 	accesscontrolmock "github.com/grafana/grafana/pkg/services/accesscontrol/mock" | 
					
						
							| 
									
										
										
										
											2022-03-11 01:19:50 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/dashboards" | 
					
						
							| 
									
										
										
										
											2022-05-18 02:52:22 +08:00
										 |  |  | 	dashboardservice "github.com/grafana/grafana/pkg/services/dashboards/service" | 
					
						
							| 
									
										
										
										
											2022-03-03 22:05:47 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/featuremgmt" | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/guardian" | 
					
						
							| 
									
										
										
										
											2022-08-10 17:56:48 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/org" | 
					
						
							| 
									
										
										
										
											2022-02-03 16:20:20 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/sqlstore/mockstore" | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/setting" | 
					
						
							| 
									
										
										
										
											2017-05-08 21:35:34 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | func TestDashboardPermissionAPIEndpoint(t *testing.T) { | 
					
						
							|  |  |  | 	t.Run("Dashboard permissions test", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 		settings := setting.NewCfg() | 
					
						
							| 
									
										
										
										
											2022-03-11 01:19:50 +08:00
										 |  |  | 		dashboardStore := &dashboards.FakeDashboardStore{} | 
					
						
							| 
									
										
										
										
											2022-06-07 17:02:20 +08:00
										 |  |  | 		dashboardStore.On("GetDashboard", mock.Anything, mock.AnythingOfType("*models.GetDashboardQuery")).Return(nil, nil) | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 		defer dashboardStore.AssertExpectations(t) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-10 19:58:18 +08:00
										 |  |  | 		features := featuremgmt.WithFeatures() | 
					
						
							| 
									
										
										
										
											2022-02-07 19:43:43 +08:00
										 |  |  | 		mockSQLStore := mockstore.NewSQLStoreMock() | 
					
						
							| 
									
										
										
										
											2022-06-07 17:02:20 +08:00
										 |  |  | 		ac := accesscontrolmock.New() | 
					
						
							| 
									
										
										
										
											2022-05-10 21:48:47 +08:00
										 |  |  | 		folderPermissions := accesscontrolmock.NewMockedPermissionsService() | 
					
						
							|  |  |  | 		dashboardPermissions := accesscontrolmock.NewMockedPermissionsService() | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-07 19:43:43 +08:00
										 |  |  | 		hs := &HTTPServer{ | 
					
						
							| 
									
										
										
										
											2022-03-10 19:58:18 +08:00
										 |  |  | 			Cfg:      settings, | 
					
						
							|  |  |  | 			SQLStore: mockSQLStore, | 
					
						
							|  |  |  | 			Features: features, | 
					
						
							| 
									
										
										
										
											2022-07-07 02:42:39 +08:00
										 |  |  | 			DashboardService: dashboardservice.ProvideDashboardService( | 
					
						
							| 
									
										
										
										
											2022-06-07 17:02:20 +08:00
										 |  |  | 				settings, dashboardStore, nil, features, folderPermissions, dashboardPermissions, ac, | 
					
						
							| 
									
										
										
										
											2022-03-10 19:58:18 +08:00
										 |  |  | 			), | 
					
						
							| 
									
										
										
										
											2022-04-25 16:42:09 +08:00
										 |  |  | 			AccessControl: accesscontrolmock.New().WithDisabled(), | 
					
						
							| 
									
										
										
										
											2022-02-07 19:43:43 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		t.Run("Given user has no admin permissions", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 			origNewGuardian := guardian.New | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 			t.Cleanup(func() { | 
					
						
							|  |  |  | 				guardian.New = origNewGuardian | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 			guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{CanAdminValue: false}) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 			loggedInUserScenarioWithRole(t, "When calling GET on", "GET", "/api/dashboards/id/1/permissions", | 
					
						
							| 
									
										
										
										
											2022-08-10 17:56:48 +08:00
										 |  |  | 				"/api/dashboards/id/:dashboardId/permissions", org.RoleEditor, func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 					callGetDashboardPermissions(sc, hs) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 					assert.Equal(t, 403, sc.resp.Code) | 
					
						
							| 
									
										
										
										
											2022-02-07 19:43:43 +08:00
										 |  |  | 				}, mockSQLStore) | 
					
						
							| 
									
										
										
										
											2018-02-12 16:26:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 			cmd := dtos.UpdateDashboardACLCommand{ | 
					
						
							|  |  |  | 				Items: []dtos.DashboardACLUpdateItem{ | 
					
						
							| 
									
										
										
										
											2020-11-18 00:09:14 +08:00
										 |  |  | 					{UserID: 1000, Permission: models.PERMISSION_ADMIN}, | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 				}, | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-12 16:26:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 			dashboardStore.On("UpdateDashboardACL", mock.Anything, mock.Anything, mock.Anything).Return(nil).Once() | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 			updateDashboardPermissionScenario(t, updatePermissionContext{ | 
					
						
							|  |  |  | 				desc:         "When calling POST on", | 
					
						
							|  |  |  | 				url:          "/api/dashboards/id/1/permissions", | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 				routePattern: "/api/dashboards/id/:dashboardId/permissions", | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 				cmd:          cmd, | 
					
						
							|  |  |  | 				fn: func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2021-03-17 23:06:10 +08:00
										 |  |  | 					callUpdateDashboardPermissions(t, sc) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 					assert.Equal(t, 403, sc.resp.Code) | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 				}, | 
					
						
							|  |  |  | 			}, hs) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2018-02-12 16:26:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		t.Run("Given user has admin permissions and permissions to update", func(t *testing.T) { | 
					
						
							|  |  |  | 			origNewGuardian := guardian.New | 
					
						
							|  |  |  | 			t.Cleanup(func() { | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 				guardian.New = origNewGuardian | 
					
						
							| 
									
										
										
										
											2018-02-12 16:26:09 +08:00
										 |  |  | 			}) | 
					
						
							| 
									
										
										
										
											2017-05-08 21:35:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 			guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{ | 
					
						
							|  |  |  | 				CanAdminValue:                    true, | 
					
						
							|  |  |  | 				CheckPermissionBeforeUpdateValue: true, | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 				GetACLValue: []*models.DashboardACLInfoDTO{ | 
					
						
							| 
									
										
										
										
											2020-03-04 19:57:20 +08:00
										 |  |  | 					{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: 4, Permission: models.PERMISSION_ADMIN}, | 
					
						
							|  |  |  | 					{OrgId: 1, DashboardId: 1, TeamId: 1, Permission: models.PERMISSION_VIEW}, | 
					
						
							|  |  |  | 					{OrgId: 1, DashboardId: 1, TeamId: 2, Permission: models.PERMISSION_ADMIN}, | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 				}, | 
					
						
							|  |  |  | 			}) | 
					
						
							| 
									
										
										
										
											2017-05-22 16:36:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 			loggedInUserScenarioWithRole(t, "When calling GET on", "GET", "/api/dashboards/id/1/permissions", | 
					
						
							| 
									
										
										
										
											2022-08-10 17:56:48 +08:00
										 |  |  | 				"/api/dashboards/id/:dashboardId/permissions", org.RoleAdmin, func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 					callGetDashboardPermissions(sc, hs) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 					assert.Equal(t, 200, sc.resp.Code) | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 					var resp []*models.DashboardACLInfoDTO | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 					err := json.Unmarshal(sc.resp.Body.Bytes(), &resp) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 					require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					assert.Len(t, resp, 5) | 
					
						
							|  |  |  | 					assert.Equal(t, int64(2), resp[0].UserId) | 
					
						
							|  |  |  | 					assert.Equal(t, models.PERMISSION_VIEW, resp[0].Permission) | 
					
						
							| 
									
										
										
										
											2022-02-07 19:43:43 +08:00
										 |  |  | 				}, mockSQLStore) | 
					
						
							| 
									
										
										
										
											2018-01-18 21:30:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 			cmd := dtos.UpdateDashboardACLCommand{ | 
					
						
							|  |  |  | 				Items: []dtos.DashboardACLUpdateItem{ | 
					
						
							| 
									
										
										
										
											2020-11-18 00:09:14 +08:00
										 |  |  | 					{UserID: 1000, Permission: models.PERMISSION_ADMIN}, | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 				}, | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-01-18 21:30:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 			updateDashboardPermissionScenario(t, updatePermissionContext{ | 
					
						
							|  |  |  | 				desc:         "When calling POST on", | 
					
						
							|  |  |  | 				url:          "/api/dashboards/id/1/permissions", | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 				routePattern: "/api/dashboards/id/:dashboardId/permissions", | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 				cmd:          cmd, | 
					
						
							|  |  |  | 				fn: func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2021-03-17 23:06:10 +08:00
										 |  |  | 					callUpdateDashboardPermissions(t, sc) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 					assert.Equal(t, 200, sc.resp.Code) | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 				}, | 
					
						
							|  |  |  | 			}, hs) | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2018-01-18 21:30:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-14 02:16:58 +08:00
										 |  |  | 		t.Run("When trying to add permissions with both a team and user", func(t *testing.T) { | 
					
						
							|  |  |  | 			origNewGuardian := guardian.New | 
					
						
							|  |  |  | 			t.Cleanup(func() { | 
					
						
							|  |  |  | 				guardian.New = origNewGuardian | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{ | 
					
						
							|  |  |  | 				CanAdminValue:                    true, | 
					
						
							|  |  |  | 				CheckPermissionBeforeUpdateValue: true, | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 			cmd := dtos.UpdateDashboardACLCommand{ | 
					
						
							|  |  |  | 				Items: []dtos.DashboardACLUpdateItem{ | 
					
						
							| 
									
										
										
										
											2021-10-14 02:16:58 +08:00
										 |  |  | 					{UserID: 1000, TeamID: 1, Permission: models.PERMISSION_ADMIN}, | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			updateDashboardPermissionScenario(t, updatePermissionContext{ | 
					
						
							|  |  |  | 				desc:         "When calling POST on", | 
					
						
							|  |  |  | 				url:          "/api/dashboards/id/1/permissions", | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 				routePattern: "/api/dashboards/id/:dashboardId/permissions", | 
					
						
							| 
									
										
										
										
											2021-10-14 02:16:58 +08:00
										 |  |  | 				cmd:          cmd, | 
					
						
							|  |  |  | 				fn: func(sc *scenarioContext) { | 
					
						
							|  |  |  | 					callUpdateDashboardPermissions(t, sc) | 
					
						
							|  |  |  | 					assert.Equal(t, 400, sc.resp.Code) | 
					
						
							|  |  |  | 					respJSON, err := jsonMap(sc.resp.Body.Bytes()) | 
					
						
							|  |  |  | 					require.NoError(t, err) | 
					
						
							|  |  |  | 					assert.Equal(t, models.ErrPermissionsWithUserAndTeamNotAllowed.Error(), respJSON["error"]) | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, hs) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		t.Run("When trying to update permissions with duplicate permissions", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 			origNewGuardian := guardian.New | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 			t.Cleanup(func() { | 
					
						
							|  |  |  | 				guardian.New = origNewGuardian | 
					
						
							|  |  |  | 			}) | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 			guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{ | 
					
						
							|  |  |  | 				CanAdminValue:                    true, | 
					
						
							|  |  |  | 				CheckPermissionBeforeUpdateValue: false, | 
					
						
							| 
									
										
										
										
											2018-02-27 23:03:11 +08:00
										 |  |  | 				CheckPermissionBeforeUpdateError: guardian.ErrGuardianPermissionExists, | 
					
						
							| 
									
										
										
										
											2018-01-18 21:30:04 +08:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 			cmd := dtos.UpdateDashboardACLCommand{ | 
					
						
							|  |  |  | 				Items: []dtos.DashboardACLUpdateItem{ | 
					
						
							| 
									
										
										
										
											2020-11-18 00:09:14 +08:00
										 |  |  | 					{UserID: 1000, Permission: models.PERMISSION_ADMIN}, | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 				}, | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-06-23 05:01:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 			updateDashboardPermissionScenario(t, updatePermissionContext{ | 
					
						
							|  |  |  | 				desc:         "When calling POST on", | 
					
						
							|  |  |  | 				url:          "/api/dashboards/id/1/permissions", | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 				routePattern: "/api/dashboards/id/:dashboardId/permissions", | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 				cmd:          cmd, | 
					
						
							|  |  |  | 				fn: func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2021-03-17 23:06:10 +08:00
										 |  |  | 					callUpdateDashboardPermissions(t, sc) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 					assert.Equal(t, 400, sc.resp.Code) | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 				}, | 
					
						
							|  |  |  | 			}, hs) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2017-06-23 05:01:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-18 22:36:41 +08:00
										 |  |  | 		t.Run("When trying to update team or user permissions with a role", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-08-10 17:56:48 +08:00
										 |  |  | 			role := org.RoleEditor | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 			cmds := []dtos.UpdateDashboardACLCommand{ | 
					
						
							| 
									
										
										
										
											2020-11-18 22:36:41 +08:00
										 |  |  | 				{ | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 					Items: []dtos.DashboardACLUpdateItem{ | 
					
						
							| 
									
										
										
										
											2020-11-18 23:16:58 +08:00
										 |  |  | 						{UserID: 1000, Permission: models.PERMISSION_ADMIN, Role: &role}, | 
					
						
							| 
									
										
										
										
											2020-11-18 22:36:41 +08:00
										 |  |  | 					}, | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				{ | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 					Items: []dtos.DashboardACLUpdateItem{ | 
					
						
							| 
									
										
										
										
											2020-11-18 23:16:58 +08:00
										 |  |  | 						{TeamID: 1000, Permission: models.PERMISSION_ADMIN, Role: &role}, | 
					
						
							| 
									
										
										
										
											2020-11-18 22:36:41 +08:00
										 |  |  | 					}, | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			for _, cmd := range cmds { | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 				updateDashboardPermissionScenario(t, updatePermissionContext{ | 
					
						
							|  |  |  | 					desc:         "When calling POST on", | 
					
						
							|  |  |  | 					url:          "/api/dashboards/id/1/permissions", | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 					routePattern: "/api/dashboards/id/:dashboardId/permissions", | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 					cmd:          cmd, | 
					
						
							|  |  |  | 					fn: func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2021-03-17 23:06:10 +08:00
										 |  |  | 						callUpdateDashboardPermissions(t, sc) | 
					
						
							| 
									
										
										
										
											2020-11-18 22:36:41 +08:00
										 |  |  | 						assert.Equal(t, 400, sc.resp.Code) | 
					
						
							|  |  |  | 						respJSON, err := jsonMap(sc.resp.Body.Bytes()) | 
					
						
							|  |  |  | 						require.NoError(t, err) | 
					
						
							|  |  |  | 						assert.Equal(t, models.ErrPermissionsWithRoleNotAllowed.Error(), respJSON["error"]) | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 					}, | 
					
						
							|  |  |  | 				}, hs) | 
					
						
							| 
									
										
										
										
											2020-11-18 22:36:41 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		t.Run("When trying to override inherited permissions with lower precedence", func(t *testing.T) { | 
					
						
							|  |  |  | 			origNewGuardian := guardian.New | 
					
						
							|  |  |  | 			t.Cleanup(func() { | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 				guardian.New = origNewGuardian | 
					
						
							| 
									
										
										
										
											2017-06-23 05:01:04 +08:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 			guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{ | 
					
						
							|  |  |  | 				CanAdminValue:                    true, | 
					
						
							|  |  |  | 				CheckPermissionBeforeUpdateValue: false, | 
					
						
							| 
									
										
										
										
											2018-02-27 23:03:11 +08:00
										 |  |  | 				CheckPermissionBeforeUpdateError: guardian.ErrGuardianOverride}, | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 			) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 			cmd := dtos.UpdateDashboardACLCommand{ | 
					
						
							|  |  |  | 				Items: []dtos.DashboardACLUpdateItem{ | 
					
						
							| 
									
										
										
										
											2020-11-18 00:09:14 +08:00
										 |  |  | 					{UserID: 1000, Permission: models.PERMISSION_ADMIN}, | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 				}, | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-05-22 16:36:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 			updateDashboardPermissionScenario(t, updatePermissionContext{ | 
					
						
							|  |  |  | 				desc:         "When calling POST on", | 
					
						
							|  |  |  | 				url:          "/api/dashboards/id/1/permissions", | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 				routePattern: "/api/dashboards/id/:dashboardId/permissions", | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 				cmd:          cmd, | 
					
						
							|  |  |  | 				fn: func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2021-03-17 23:06:10 +08:00
										 |  |  | 					callUpdateDashboardPermissions(t, sc) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 					assert.Equal(t, 400, sc.resp.Code) | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 				}, | 
					
						
							|  |  |  | 			}, hs) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		t.Run("Getting and updating dashboard permissions with hidden users", func(t *testing.T) { | 
					
						
							|  |  |  | 			origNewGuardian := guardian.New | 
					
						
							|  |  |  | 			settings.HiddenUsers = map[string]struct{}{ | 
					
						
							|  |  |  | 				"hiddenUser":  {}, | 
					
						
							|  |  |  | 				testUserLogin: {}, | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			t.Cleanup(func() { | 
					
						
							|  |  |  | 				guardian.New = origNewGuardian | 
					
						
							|  |  |  | 				settings.HiddenUsers = make(map[string]struct{}) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-07 19:43:43 +08:00
										 |  |  | 			mockSQLStore := mockstore.NewSQLStoreMock() | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 			var resp []*models.DashboardACLInfoDTO | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 			loggedInUserScenarioWithRole(t, "When calling GET on", "GET", "/api/dashboards/id/1/permissions", | 
					
						
							| 
									
										
										
										
											2022-08-10 17:56:48 +08:00
										 |  |  | 				"/api/dashboards/id/:dashboardId/permissions", org.RoleAdmin, func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 					setUp() | 
					
						
							| 
									
										
										
										
											2022-03-21 17:49:49 +08:00
										 |  |  | 					guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{ | 
					
						
							|  |  |  | 						CanAdminValue:                    true, | 
					
						
							|  |  |  | 						CheckPermissionBeforeUpdateValue: true, | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 						GetACLValue: []*models.DashboardACLInfoDTO{ | 
					
						
							| 
									
										
										
										
											2022-03-21 17:49:49 +08:00
										 |  |  | 							{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: 4, UserLogin: "user_1", Permission: models.PERMISSION_ADMIN}, | 
					
						
							|  |  |  | 						}, | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 						GetHiddenACLValue: []*models.DashboardACL{ | 
					
						
							| 
									
										
										
										
											2022-03-21 17:49:49 +08:00
										 |  |  | 							{OrgID: 1, DashboardID: 1, UserID: 2, Permission: models.PERMISSION_VIEW}, | 
					
						
							|  |  |  | 						}, | 
					
						
							|  |  |  | 					}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 					callGetDashboardPermissions(sc, hs) | 
					
						
							|  |  |  | 					assert.Equal(t, 200, sc.resp.Code) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					err := json.Unmarshal(sc.resp.Body.Bytes(), &resp) | 
					
						
							|  |  |  | 					require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					assert.Len(t, resp, 2) | 
					
						
							|  |  |  | 					assert.Equal(t, int64(3), resp[0].UserId) | 
					
						
							|  |  |  | 					assert.Equal(t, models.PERMISSION_EDIT, resp[0].Permission) | 
					
						
							|  |  |  | 					assert.Equal(t, int64(4), resp[1].UserId) | 
					
						
							|  |  |  | 					assert.Equal(t, models.PERMISSION_ADMIN, resp[1].Permission) | 
					
						
							| 
									
										
										
										
											2022-02-07 19:43:43 +08:00
										 |  |  | 				}, mockSQLStore) | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 			cmd := dtos.UpdateDashboardACLCommand{ | 
					
						
							|  |  |  | 				Items: []dtos.DashboardACLUpdateItem{ | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 					{UserID: 1000, Permission: models.PERMISSION_ADMIN}, | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			for _, acl := range resp { | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 				cmd.Items = append(cmd.Items, dtos.DashboardACLUpdateItem{ | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 					UserID:     acl.UserId, | 
					
						
							|  |  |  | 					Permission: acl.Permission, | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			assert.Len(t, cmd.Items, 3) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 			var numOfItems []*models.DashboardACL | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 			dashboardStore.On("UpdateDashboardACL", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 				items := args.Get(2).([]*models.DashboardACL) | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 				numOfItems = items | 
					
						
							|  |  |  | 			}).Return(nil).Once() | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 			updateDashboardPermissionScenario(t, updatePermissionContext{ | 
					
						
							|  |  |  | 				desc:         "When calling POST on", | 
					
						
							|  |  |  | 				url:          "/api/dashboards/id/1/permissions", | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 				routePattern: "/api/dashboards/id/:dashboardId/permissions", | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 				cmd:          cmd, | 
					
						
							|  |  |  | 				fn: func(sc *scenarioContext) { | 
					
						
							|  |  |  | 					sc.fakeReqWithParams("POST", sc.url, map[string]string{}).exec() | 
					
						
							|  |  |  | 					assert.Equal(t, 200, sc.resp.Code) | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 					assert.Len(t, numOfItems, 4) | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 				}, | 
					
						
							|  |  |  | 			}, hs) | 
					
						
							| 
									
										
										
										
											2017-05-08 21:35:34 +08:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-06-23 05:01:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | func callGetDashboardPermissions(sc *scenarioContext, hs *HTTPServer) { | 
					
						
							|  |  |  | 	sc.handlerFunc = hs.GetDashboardPermissionList | 
					
						
							| 
									
										
										
										
											2018-02-27 03:15:57 +08:00
										 |  |  | 	sc.fakeReqWithParams("GET", sc.url, map[string]string{}).exec() | 
					
						
							| 
									
										
										
										
											2017-06-23 05:01:04 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-01-18 21:30:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-17 23:06:10 +08:00
										 |  |  | func callUpdateDashboardPermissions(t *testing.T, sc *scenarioContext) { | 
					
						
							|  |  |  | 	t.Helper() | 
					
						
							| 
									
										
										
										
											2018-01-18 21:30:04 +08:00
										 |  |  | 	sc.fakeReqWithParams("POST", sc.url, map[string]string{}).exec() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | type updatePermissionContext struct { | 
					
						
							|  |  |  | 	desc         string | 
					
						
							|  |  |  | 	url          string | 
					
						
							|  |  |  | 	routePattern string | 
					
						
							| 
									
										
										
										
											2022-07-18 21:14:58 +08:00
										 |  |  | 	cmd          dtos.UpdateDashboardACLCommand | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 	fn           scenarioFunc | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func updateDashboardPermissionScenario(t *testing.T, ctx updatePermissionContext, hs *HTTPServer) { | 
					
						
							|  |  |  | 	t.Run(fmt.Sprintf("%s %s", ctx.desc, ctx.url), func(t *testing.T) { | 
					
						
							|  |  |  | 		sc := setupScenarioContext(t, ctx.url) | 
					
						
							| 
									
										
										
										
											2018-01-18 21:30:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 		sc.defaultHandler = routing.Wrap(func(c *models.ReqContext) response.Response { | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | 			c.Req.Body = mockRequestBody(ctx.cmd) | 
					
						
							| 
									
										
										
										
											2022-02-09 20:44:38 +08:00
										 |  |  | 			c.Req.Header.Add("Content-Type", "application/json") | 
					
						
							| 
									
										
										
										
											2018-01-18 21:30:04 +08:00
										 |  |  | 			sc.context = c | 
					
						
							| 
									
										
										
										
											2022-08-11 19:28:55 +08:00
										 |  |  | 			sc.context.OrgID = testOrgID | 
					
						
							|  |  |  | 			sc.context.UserID = testUserID | 
					
						
							| 
									
										
										
										
											2018-01-18 21:30:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | 			return hs.UpdateDashboardPermissions(c) | 
					
						
							| 
									
										
										
										
											2018-01-18 21:30:04 +08:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 		sc.m.Post(ctx.routePattern, sc.defaultHandler) | 
					
						
							| 
									
										
										
										
											2018-01-18 21:30:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 		ctx.fn(sc) | 
					
						
							| 
									
										
										
										
											2018-01-18 21:30:04 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | } |