guardian.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package guardian
  2. import (
  3. "github.com/grafana/grafana/pkg/bus"
  4. m "github.com/grafana/grafana/pkg/models"
  5. )
  6. // FilterRestrictedDashboards filters out dashboards from the list that the user does have access to
  7. func FilterRestrictedDashboards(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. minimumPermission := m.PERMISSION_EDIT
  45. return checkPermission(minimumPermission, permissions, userId)
  46. }
  47. // CheckDashboardPermissions determines if a user has permission to view, edit or save a dashboard
  48. func CheckDashboardPermissions(dashboardId int64, role m.RoleType, isGrafanaAdmin bool, userId int64) (bool, bool, bool, error) {
  49. if role == m.ROLE_ADMIN || isGrafanaAdmin {
  50. return true, true, true, nil
  51. }
  52. permissions, err := getDashboardPermissions(dashboardId)
  53. if err != nil {
  54. return false, false, false, err
  55. }
  56. if len(permissions) == 0 {
  57. return false, false, false, nil
  58. }
  59. minimumPermission := m.PERMISSION_VIEW
  60. canView, err := checkPermission(minimumPermission, permissions, userId)
  61. if err != nil {
  62. return false, false, false, err
  63. }
  64. minimumPermission = m.PERMISSION_READ_ONLY_EDIT
  65. canEdit, err := checkPermission(minimumPermission, permissions, userId)
  66. if err != nil {
  67. return false, false, false, err
  68. }
  69. minimumPermission = m.PERMISSION_EDIT
  70. canSave, err := checkPermission(minimumPermission, permissions, userId)
  71. if err != nil {
  72. return false, false, false, err
  73. }
  74. return canView, canEdit, canSave, nil
  75. }
  76. func checkPermission(minimumPermission m.PermissionType, permissions []*m.DashboardAclInfoDTO, userId int64) (bool, error) {
  77. userGroups, err := getUserGroupsByUser(userId)
  78. if err != nil {
  79. return false, err
  80. }
  81. for _, p := range permissions {
  82. if p.UserId == userId && p.PermissionType >= minimumPermission {
  83. return true, nil
  84. }
  85. for _, ug := range userGroups {
  86. if ug.Id == p.UserGroupId && p.PermissionType >= minimumPermission {
  87. return true, nil
  88. }
  89. }
  90. }
  91. return false, nil
  92. }
  93. func getUser(userId int64) (*m.SignedInUser, error) {
  94. query := m.GetSignedInUserQuery{UserId: userId}
  95. err := bus.Dispatch(&query)
  96. return query.Result, err
  97. }
  98. func getAllowedDashboards(dashList []int64, orgId int64, userId int64) ([]int64, error) {
  99. query := m.GetAllowedDashboardsQuery{UserId: userId, OrgId: orgId, DashList: dashList}
  100. err := bus.Dispatch(&query)
  101. return query.Result, err
  102. }
  103. func getDashboardPermissions(dashboardId int64) ([]*m.DashboardAclInfoDTO, error) {
  104. query := m.GetDashboardPermissionsQuery{DashboardId: dashboardId}
  105. err := bus.Dispatch(&query)
  106. return query.Result, err
  107. }
  108. func getUserGroupsByUser(userId int64) ([]*m.UserGroup, error) {
  109. query := m.GetUserGroupsByUserQuery{UserId: userId}
  110. err := bus.Dispatch(&query)
  111. return query.Result, err
  112. }