dashboard_acl.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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 GetDashboardAcl(c *middleware.Context) Response {
  11. dashboardId := c.ParamsInt64(":id")
  12. hasPermission, err := guardian.CanViewAcl(dashboardId, c.OrgRole, c.IsGrafanaAdmin, c.OrgId, c.UserId)
  13. if err != nil {
  14. return ApiError(500, "Failed to get Dashboard ACL", err)
  15. }
  16. if !hasPermission {
  17. return Json(403, util.DynMap{"status": "Forbidden", "message": "Does not have access to this Dashboard ACL"})
  18. }
  19. query := m.GetDashboardPermissionsQuery{DashboardId: dashboardId}
  20. if err := bus.Dispatch(&query); err != nil {
  21. return ApiError(500, "Failed to get Dashboard ACL", err)
  22. }
  23. return Json(200, &query.Result)
  24. }
  25. func PostDashboardAcl(c *middleware.Context, cmd m.AddOrUpdateDashboardPermissionCommand) Response {
  26. cmd.OrgId = c.OrgId
  27. cmd.DashboardId = c.ParamsInt64(":id")
  28. if err := bus.Dispatch(&cmd); err != nil {
  29. if err == m.ErrDashboardPermissionUserOrUserGroupEmpty {
  30. return ApiError(409, err.Error(), err)
  31. }
  32. return ApiError(500, "Failed to create permission", err)
  33. }
  34. metrics.M_Api_Dashboard_Acl_Create.Inc(1)
  35. return Json(200, &util.DynMap{
  36. "permissionId": cmd.Result.Id,
  37. "message": "Permission created",
  38. })
  39. }
  40. func DeleteDashboardAclByUser(c *middleware.Context) Response {
  41. dashboardId := c.ParamsInt64(":id")
  42. userId := c.ParamsInt64(":userId")
  43. cmd := m.RemoveDashboardPermissionCommand{DashboardId: dashboardId, UserId: userId, OrgId: c.OrgId}
  44. hasPermission, err := guardian.CanDeleteFromAcl(dashboardId, c.OrgRole, c.IsGrafanaAdmin, c.OrgId, c.UserId)
  45. if err != nil {
  46. return ApiError(500, "Failed to delete from Dashboard ACL", err)
  47. }
  48. if !hasPermission {
  49. return Json(403, util.DynMap{"status": "Forbidden", "message": "Does not have access to this Dashboard ACL"})
  50. }
  51. if err := bus.Dispatch(&cmd); err != nil {
  52. return ApiError(500, "Failed to delete permission for user", err)
  53. }
  54. return Json(200, "")
  55. }
  56. func DeleteDashboardAclByUserGroup(c *middleware.Context) Response {
  57. dashboardId := c.ParamsInt64(":id")
  58. userGroupId := c.ParamsInt64(":userGroupId")
  59. cmd := m.RemoveDashboardPermissionCommand{DashboardId: dashboardId, UserGroupId: userGroupId, OrgId: c.OrgId}
  60. hasPermission, err := guardian.CanDeleteFromAcl(dashboardId, c.OrgRole, c.IsGrafanaAdmin, c.OrgId, c.UserId)
  61. if err != nil {
  62. return ApiError(500, "Failed to delete from Dashboard ACL", err)
  63. }
  64. if !hasPermission {
  65. return Json(403, util.DynMap{"status": "Forbidden", "message": "Does not have access to this Dashboard ACL"})
  66. }
  67. if err := bus.Dispatch(&cmd); err != nil {
  68. return ApiError(500, "Failed to delete permission for user", err)
  69. }
  70. return Json(200, "")
  71. }