mirror of https://github.com/grafana/grafana
The guardian class checks if the user is allowed to get the permissions for a dashboard.pull/9488/head
parent
074ef7ce4e
commit
f1e1da39e3
@ -0,0 +1,31 @@ |
||||
package api |
||||
|
||||
import ( |
||||
"github.com/grafana/grafana/pkg/bus" |
||||
"github.com/grafana/grafana/pkg/middleware" |
||||
m "github.com/grafana/grafana/pkg/models" |
||||
"github.com/grafana/grafana/pkg/services/guardian" |
||||
"github.com/grafana/grafana/pkg/util" |
||||
) |
||||
|
||||
func GetDashboardAcl(c *middleware.Context) Response { |
||||
dashboardId := c.ParamsInt64(":id") |
||||
|
||||
hasPermission, err := guardian.CanViewAcl(dashboardId, c.OrgRole, c.IsGrafanaAdmin, c.OrgId, c.UserId) |
||||
|
||||
if err != nil { |
||||
return ApiError(500, "Failed to get Dashboard ACL", err) |
||||
} |
||||
|
||||
if !hasPermission { |
||||
return Json(403, util.DynMap{"status": "Forbidden", "message": "Does not have access to this Dashboard ACL"}) |
||||
} |
||||
|
||||
query := m.GetDashboardPermissionsQuery{DashboardId: dashboardId} |
||||
|
||||
if err := bus.Dispatch(&query); err != nil { |
||||
return ApiError(500, "Failed to get Dashboard ACL", err) |
||||
} |
||||
|
||||
return Json(200, &query.Result) |
||||
} |
||||
@ -0,0 +1,57 @@ |
||||
package api |
||||
|
||||
import ( |
||||
"testing" |
||||
|
||||
"github.com/grafana/grafana/pkg/bus" |
||||
"github.com/grafana/grafana/pkg/components/simplejson" |
||||
"github.com/grafana/grafana/pkg/models" |
||||
|
||||
. "github.com/smartystreets/goconvey/convey" |
||||
) |
||||
|
||||
func TestDashboardAclApiEndpoint(t *testing.T) { |
||||
Convey("Given a dashboard acl", t, func() { |
||||
mockResult := []*models.DashboardAclInfoDTO{ |
||||
{Id: 1, OrgId: 1, DashboardId: 1, UserId: 2, Permissions: models.PERMISSION_EDIT}, |
||||
{Id: 2, OrgId: 1, DashboardId: 1, UserId: 3, Permissions: models.PERMISSION_VIEW}, |
||||
} |
||||
bus.AddHandler("test", func(query *models.GetDashboardPermissionsQuery) error { |
||||
query.Result = mockResult |
||||
return nil |
||||
}) |
||||
|
||||
Convey("When user is org admin", func() { |
||||
loggedInUserScenarioWithRole("When calling GET on", "/api/dashboard/1/acl", models.ROLE_ADMIN, func(sc *scenarioContext) { |
||||
Convey("Should be able to access ACL", func() { |
||||
sc.handlerFunc = GetDashboardAcl |
||||
sc.fakeReqWithParams("GET", sc.url, map[string]string{}).exec() |
||||
|
||||
So(sc.resp.Code, ShouldEqual, 200) |
||||
|
||||
respJSON, err := simplejson.NewJson(sc.resp.Body.Bytes()) |
||||
So(err, ShouldBeNil) |
||||
So(respJSON.GetIndex(0).Get("userId").MustInt(), ShouldEqual, 2) |
||||
So(respJSON.GetIndex(0).Get("permissions").MustInt(), ShouldEqual, models.PERMISSION_EDIT) |
||||
}) |
||||
}) |
||||
}) |
||||
|
||||
Convey("When user is editor and not in the ACL", func() { |
||||
loggedInUserScenarioWithRole("When calling GET on", "/api/dashboard/1/acl", models.ROLE_EDITOR, func(sc *scenarioContext) { |
||||
|
||||
bus.AddHandler("test2", func(query *models.GetAllowedDashboardsQuery) error { |
||||
query.Result = []int64{1} |
||||
return nil |
||||
}) |
||||
|
||||
Convey("Should not be able to access ACL", func() { |
||||
sc.handlerFunc = GetDashboardAcl |
||||
sc.fakeReqWithParams("GET", sc.url, map[string]string{}).exec() |
||||
|
||||
So(sc.resp.Code, ShouldEqual, 403) |
||||
}) |
||||
}) |
||||
}) |
||||
}) |
||||
} |
||||
Loading…
Reference in new issue