dashboard_permission_test.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. package api
  2. import (
  3. "testing"
  4. "github.com/grafana/grafana/pkg/api/dtos"
  5. "github.com/grafana/grafana/pkg/bus"
  6. "github.com/grafana/grafana/pkg/components/simplejson"
  7. m "github.com/grafana/grafana/pkg/models"
  8. "github.com/grafana/grafana/pkg/services/guardian"
  9. . "github.com/smartystreets/goconvey/convey"
  10. )
  11. func TestDashboardPermissionApiEndpoint(t *testing.T) {
  12. Convey("Dashboard permissions test", t, func() {
  13. Convey("Given dashboard not exists", func() {
  14. bus.AddHandler("test", func(query *m.GetDashboardQuery) error {
  15. return m.ErrDashboardNotFound
  16. })
  17. loggedInUserScenarioWithRole("When calling GET on", "GET", "/api/dashboards/id/1/permissions", "/api/dashboards/id/:id/permissions", m.ROLE_EDITOR, func(sc *scenarioContext) {
  18. callGetDashboardPermissions(sc)
  19. So(sc.resp.Code, ShouldEqual, 404)
  20. })
  21. cmd := dtos.UpdateDashboardAclCommand{
  22. Items: []dtos.DashboardAclUpdateItem{
  23. {UserId: 1000, Permission: m.PERMISSION_ADMIN},
  24. },
  25. }
  26. updateDashboardPermissionScenario("When calling POST on", "/api/dashboards/id/1/permissions", "/api/dashboards/id/:id/permissions", cmd, func(sc *scenarioContext) {
  27. callUpdateDashboardPermissions(sc)
  28. So(sc.resp.Code, ShouldEqual, 404)
  29. })
  30. })
  31. Convey("Given user has no admin permissions", func() {
  32. origNewGuardian := guardian.New
  33. guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{CanAdminValue: false})
  34. getDashboardQueryResult := m.NewDashboard("Dash")
  35. bus.AddHandler("test", func(query *m.GetDashboardQuery) error {
  36. query.Result = getDashboardQueryResult
  37. return nil
  38. })
  39. loggedInUserScenarioWithRole("When calling GET on", "GET", "/api/dashboards/id/1/permissions", "/api/dashboards/id/:id/permissions", m.ROLE_EDITOR, func(sc *scenarioContext) {
  40. callGetDashboardPermissions(sc)
  41. So(sc.resp.Code, ShouldEqual, 403)
  42. })
  43. cmd := dtos.UpdateDashboardAclCommand{
  44. Items: []dtos.DashboardAclUpdateItem{
  45. {UserId: 1000, Permission: m.PERMISSION_ADMIN},
  46. },
  47. }
  48. updateDashboardPermissionScenario("When calling POST on", "/api/dashboards/id/1/permissions", "/api/dashboards/id/:id/permissions", cmd, func(sc *scenarioContext) {
  49. callUpdateDashboardPermissions(sc)
  50. So(sc.resp.Code, ShouldEqual, 403)
  51. })
  52. Reset(func() {
  53. guardian.New = origNewGuardian
  54. })
  55. })
  56. Convey("Given user has admin permissions and permissions to update", func() {
  57. origNewGuardian := guardian.New
  58. guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{
  59. CanAdminValue: true,
  60. CheckPermissionBeforeUpdateValue: true,
  61. GetAclValue: []*m.DashboardAclInfoDTO{
  62. {OrgId: 1, DashboardId: 1, UserId: 2, Permission: m.PERMISSION_VIEW},
  63. {OrgId: 1, DashboardId: 1, UserId: 3, Permission: m.PERMISSION_EDIT},
  64. {OrgId: 1, DashboardId: 1, UserId: 4, Permission: m.PERMISSION_ADMIN},
  65. {OrgId: 1, DashboardId: 1, TeamId: 1, Permission: m.PERMISSION_VIEW},
  66. {OrgId: 1, DashboardId: 1, TeamId: 2, Permission: m.PERMISSION_ADMIN},
  67. },
  68. })
  69. getDashboardQueryResult := m.NewDashboard("Dash")
  70. bus.AddHandler("test", func(query *m.GetDashboardQuery) error {
  71. query.Result = getDashboardQueryResult
  72. return nil
  73. })
  74. loggedInUserScenarioWithRole("When calling GET on", "GET", "/api/dashboards/id/1/permissions", "/api/dashboards/id/:id/permissions", m.ROLE_ADMIN, func(sc *scenarioContext) {
  75. callGetDashboardPermissions(sc)
  76. So(sc.resp.Code, ShouldEqual, 200)
  77. respJSON, err := simplejson.NewJson(sc.resp.Body.Bytes())
  78. So(err, ShouldBeNil)
  79. So(len(respJSON.MustArray()), ShouldEqual, 5)
  80. So(respJSON.GetIndex(0).Get("userId").MustInt(), ShouldEqual, 2)
  81. So(respJSON.GetIndex(0).Get("permission").MustInt(), ShouldEqual, m.PERMISSION_VIEW)
  82. })
  83. cmd := dtos.UpdateDashboardAclCommand{
  84. Items: []dtos.DashboardAclUpdateItem{
  85. {UserId: 1000, Permission: m.PERMISSION_ADMIN},
  86. },
  87. }
  88. updateDashboardPermissionScenario("When calling POST on", "/api/dashboards/id/1/permissions", "/api/dashboards/id/:id/permissions", cmd, func(sc *scenarioContext) {
  89. callUpdateDashboardPermissions(sc)
  90. So(sc.resp.Code, ShouldEqual, 200)
  91. })
  92. Reset(func() {
  93. guardian.New = origNewGuardian
  94. })
  95. })
  96. Convey("When trying to update permissions with duplicate permissions", func() {
  97. origNewGuardian := guardian.New
  98. guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{
  99. CanAdminValue: true,
  100. CheckPermissionBeforeUpdateValue: false,
  101. CheckPermissionBeforeUpdateError: guardian.ErrGuardianPermissionExists,
  102. })
  103. getDashboardQueryResult := m.NewDashboard("Dash")
  104. bus.AddHandler("test", func(query *m.GetDashboardQuery) error {
  105. query.Result = getDashboardQueryResult
  106. return nil
  107. })
  108. cmd := dtos.UpdateDashboardAclCommand{
  109. Items: []dtos.DashboardAclUpdateItem{
  110. {UserId: 1000, Permission: m.PERMISSION_ADMIN},
  111. },
  112. }
  113. updateDashboardPermissionScenario("When calling POST on", "/api/dashboards/id/1/permissions", "/api/dashboards/id/:id/permissions", cmd, func(sc *scenarioContext) {
  114. callUpdateDashboardPermissions(sc)
  115. So(sc.resp.Code, ShouldEqual, 400)
  116. })
  117. Reset(func() {
  118. guardian.New = origNewGuardian
  119. })
  120. })
  121. Convey("When trying to override inherited permissions with lower presedence", func() {
  122. origNewGuardian := guardian.New
  123. guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{
  124. CanAdminValue: true,
  125. CheckPermissionBeforeUpdateValue: false,
  126. CheckPermissionBeforeUpdateError: guardian.ErrGuardianOverride},
  127. )
  128. getDashboardQueryResult := m.NewDashboard("Dash")
  129. bus.AddHandler("test", func(query *m.GetDashboardQuery) error {
  130. query.Result = getDashboardQueryResult
  131. return nil
  132. })
  133. cmd := dtos.UpdateDashboardAclCommand{
  134. Items: []dtos.DashboardAclUpdateItem{
  135. {UserId: 1000, Permission: m.PERMISSION_ADMIN},
  136. },
  137. }
  138. updateDashboardPermissionScenario("When calling POST on", "/api/dashboards/id/1/permissions", "/api/dashboards/id/:id/permissions", cmd, func(sc *scenarioContext) {
  139. callUpdateDashboardPermissions(sc)
  140. So(sc.resp.Code, ShouldEqual, 400)
  141. })
  142. Reset(func() {
  143. guardian.New = origNewGuardian
  144. })
  145. })
  146. })
  147. }
  148. func callGetDashboardPermissions(sc *scenarioContext) {
  149. sc.handlerFunc = GetDashboardPermissionList
  150. sc.fakeReqWithParams("GET", sc.url, map[string]string{}).exec()
  151. }
  152. func callUpdateDashboardPermissions(sc *scenarioContext) {
  153. bus.AddHandler("test", func(cmd *m.UpdateDashboardAclCommand) error {
  154. return nil
  155. })
  156. sc.fakeReqWithParams("POST", sc.url, map[string]string{}).exec()
  157. }
  158. func updateDashboardPermissionScenario(desc string, url string, routePattern string, cmd dtos.UpdateDashboardAclCommand, fn scenarioFunc) {
  159. Convey(desc+" "+url, func() {
  160. defer bus.ClearBusHandlers()
  161. sc := setupScenarioContext(url)
  162. sc.defaultHandler = wrap(func(c *m.ReqContext) Response {
  163. sc.context = c
  164. sc.context.OrgId = TestOrgID
  165. sc.context.UserId = TestUserID
  166. return UpdateDashboardPermissions(c, cmd)
  167. })
  168. sc.m.Post(routePattern, sc.defaultHandler)
  169. fn(sc)
  170. })
  171. }