dashboard_acl.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package api
  2. import (
  3. "github.com/grafana/grafana/pkg/bus"
  4. "github.com/grafana/grafana/pkg/metrics"
  5. "github.com/grafana/grafana/pkg/middleware"
  6. m "github.com/grafana/grafana/pkg/models"
  7. "github.com/grafana/grafana/pkg/services/guardian"
  8. "github.com/grafana/grafana/pkg/util"
  9. )
  10. func GetDashboardAclList(c *middleware.Context) Response {
  11. dashId := c.ParamsInt64(":dashboardId")
  12. guardian := guardian.NewDashboardGuardian(dashId, c.OrgId, c.SignedInUser)
  13. if canView, err := guardian.CanView(); err != nil || !canView {
  14. return dashboardGuardianResponse(err)
  15. }
  16. query := m.GetDashboardAclInfoListQuery{DashboardId: dashId}
  17. if err := bus.Dispatch(&query); err != nil {
  18. return ApiError(500, "Failed to get Dashboard ACL", err)
  19. }
  20. list := query.Result
  21. hasViewRoleAcl := false
  22. hasEditRoleAcl := false
  23. for _, item := range list {
  24. if item.Role == m.ROLE_EDITOR {
  25. hasEditRoleAcl = true
  26. }
  27. if item.Role == m.ROLE_VIEWER {
  28. hasViewRoleAcl = true
  29. }
  30. }
  31. if !hasEditRoleAcl {
  32. tmpList := append([]*m.DashboardAclInfoDTO{}, &m.DashboardAclInfoDTO{
  33. Id: 0,
  34. Role: m.ROLE_EDITOR,
  35. Permissions: m.PERMISSION_EDIT,
  36. PermissionName: "Edit",
  37. })
  38. list = append(tmpList, list...)
  39. }
  40. if !hasViewRoleAcl {
  41. tmpList := append([]*m.DashboardAclInfoDTO{}, &m.DashboardAclInfoDTO{
  42. Id: 0,
  43. Role: m.ROLE_VIEWER,
  44. Permissions: m.PERMISSION_VIEW,
  45. PermissionName: "View",
  46. })
  47. list = append(tmpList, list...)
  48. }
  49. return Json(200, list)
  50. }
  51. func PostDashboardAcl(c *middleware.Context, cmd m.SetDashboardAclCommand) Response {
  52. dashId := c.ParamsInt64(":dashboardId")
  53. guardian := guardian.NewDashboardGuardian(dashId, c.OrgId, c.SignedInUser)
  54. if canSave, err := guardian.CanSave(); err != nil || !canSave {
  55. return dashboardGuardianResponse(err)
  56. }
  57. cmd.OrgId = c.OrgId
  58. cmd.DashboardId = dashId
  59. if err := bus.Dispatch(&cmd); err != nil {
  60. if err == m.ErrDashboardAclInfoMissing || err == m.ErrDashboardPermissionDashboardEmpty {
  61. return ApiError(409, err.Error(), err)
  62. }
  63. return ApiError(500, "Failed to create permission", err)
  64. }
  65. metrics.M_Api_Dashboard_Acl_Create.Inc(1)
  66. return Json(200, &util.DynMap{
  67. "permissionId": cmd.Result.Id,
  68. "message": "Permission created",
  69. })
  70. }
  71. func DeleteDashboardAcl(c *middleware.Context) Response {
  72. dashId := c.ParamsInt64(":dashboardId")
  73. aclId := c.ParamsInt64(":aclId")
  74. guardian := guardian.NewDashboardGuardian(dashId, c.OrgId, c.SignedInUser)
  75. if canSave, err := guardian.CanSave(); err != nil || !canSave {
  76. return dashboardGuardianResponse(err)
  77. }
  78. cmd := m.RemoveDashboardAclCommand{OrgId: c.OrgId, AclId: aclId}
  79. if err := bus.Dispatch(&cmd); err != nil {
  80. return ApiError(500, "Failed to delete permission for user", err)
  81. }
  82. return Json(200, "")
  83. }