guardian.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package guardian
  2. import (
  3. "github.com/grafana/grafana/pkg/bus"
  4. m "github.com/grafana/grafana/pkg/models"
  5. )
  6. // RemoveRestrictedDashboards filters out dashboards from the list that the user does have access to
  7. func RemoveRestrictedDashboards(dashList []int64, orgId int64, userId int64) ([]int64, error) {
  8. user, err := getUser(userId)
  9. if err != nil {
  10. return nil, err
  11. }
  12. if user.IsGrafanaAdmin || user.OrgRole == m.ROLE_ADMIN {
  13. return dashList, nil
  14. }
  15. filteredList, err := getAllowedDashboards(dashList, orgId, userId)
  16. return filteredList, err
  17. }
  18. // CanViewAcl determines if a user has permission to view a dashboard's ACL
  19. func CanViewAcl(dashboardId int64, role m.RoleType, isGrafanaAdmin bool, orgId int64, userId int64) (bool, error) {
  20. if role == m.ROLE_ADMIN || isGrafanaAdmin {
  21. return true, nil
  22. }
  23. filteredList, err := getAllowedDashboards([]int64{dashboardId}, orgId, userId)
  24. if err != nil {
  25. return false, err
  26. }
  27. if len(filteredList) > 0 && filteredList[0] == dashboardId {
  28. return true, nil
  29. }
  30. return false, nil
  31. }
  32. // CanDeleteFromAcl determines if a user has permission to delete from a dashboard's ACL
  33. func CanDeleteFromAcl(dashboardId int64, role m.RoleType, isGrafanaAdmin bool, orgId int64, userId int64) (bool, error) {
  34. if role == m.ROLE_ADMIN || isGrafanaAdmin {
  35. return true, nil
  36. }
  37. permissions, err := getDashboardPermissions(dashboardId)
  38. if err != nil {
  39. return false, err
  40. }
  41. if len(permissions) == 0 {
  42. return true, nil
  43. }
  44. userGroups, err := getUserGroupsByUser(userId)
  45. for _, p := range permissions {
  46. if p.UserId == userId && p.PermissionType == m.PERMISSION_EDIT {
  47. return true, nil
  48. }
  49. for _, ug := range userGroups {
  50. if ug.Id == p.UserGroupId && p.PermissionType == m.PERMISSION_EDIT {
  51. return true, nil
  52. }
  53. }
  54. }
  55. return false, nil
  56. }
  57. func getUser(userId int64) (*m.SignedInUser, error) {
  58. query := m.GetSignedInUserQuery{UserId: userId}
  59. err := bus.Dispatch(&query)
  60. return query.Result, err
  61. }
  62. func getAllowedDashboards(dashList []int64, orgId int64, userId int64) ([]int64, error) {
  63. query := m.GetAllowedDashboardsQuery{UserId: userId, OrgId: orgId, DashList: dashList}
  64. err := bus.Dispatch(&query)
  65. return query.Result, err
  66. }
  67. func getDashboardPermissions(dashboardId int64) ([]*m.DashboardAclInfoDTO, error) {
  68. query := m.GetDashboardPermissionsQuery{DashboardId: dashboardId}
  69. err := bus.Dispatch(&query)
  70. return query.Result, err
  71. }
  72. func getUserGroupsByUser(userId int64) ([]*m.UserGroup, error) {
  73. query := m.GetUserGroupsByUserQuery{UserId: userId}
  74. err := bus.Dispatch(&query)
  75. return query.Result, err
  76. }