dashboard_acl.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package sqlstore
  2. import (
  3. "time"
  4. "github.com/grafana/grafana/pkg/bus"
  5. m "github.com/grafana/grafana/pkg/models"
  6. )
  7. func init() {
  8. bus.AddHandler("sql", SetDashboardAcl)
  9. bus.AddHandler("sql", UpdateDashboardAcl)
  10. bus.AddHandler("sql", RemoveDashboardAcl)
  11. bus.AddHandler("sql", GetDashboardAclInfoList)
  12. bus.AddHandler("sql", GetInheritedDashboardAcl)
  13. }
  14. func UpdateDashboardAcl(cmd *m.UpdateDashboardAclCommand) error {
  15. return inTransaction(func(sess *DBSession) error {
  16. // delete existing items
  17. _, err := sess.Exec("DELETE FROM dashboard_acl WHERE dashboard_id=?", cmd.DashboardId)
  18. if err != nil {
  19. return err
  20. }
  21. for _, item := range cmd.Items {
  22. if item.UserId == 0 && item.UserGroupId == 0 && !item.Role.IsValid() {
  23. return m.ErrDashboardAclInfoMissing
  24. }
  25. if item.DashboardId == 0 {
  26. return m.ErrDashboardPermissionDashboardEmpty
  27. }
  28. sess.Nullable("user_id", "user_group_id")
  29. if _, err := sess.Insert(item); err != nil {
  30. return err
  31. }
  32. }
  33. // Update dashboard HasAcl flag
  34. dashboard := m.Dashboard{HasAcl: true}
  35. if _, err := sess.Cols("has_acl").Where("id=? OR parent_id=?", cmd.DashboardId, cmd.DashboardId).Update(&dashboard); err != nil {
  36. return err
  37. }
  38. return nil
  39. })
  40. }
  41. func SetDashboardAcl(cmd *m.SetDashboardAclCommand) error {
  42. return inTransaction(func(sess *DBSession) error {
  43. if cmd.UserId == 0 && cmd.UserGroupId == 0 {
  44. return m.ErrDashboardAclInfoMissing
  45. }
  46. if cmd.DashboardId == 0 {
  47. return m.ErrDashboardPermissionDashboardEmpty
  48. }
  49. if res, err := sess.Query("SELECT 1 from "+dialect.Quote("dashboard_acl")+" WHERE dashboard_id =? and (user_group_id=? or user_id=?)", cmd.DashboardId, cmd.UserGroupId, cmd.UserId); err != nil {
  50. return err
  51. } else if len(res) == 1 {
  52. entity := m.DashboardAcl{
  53. Permission: cmd.Permission,
  54. Updated: time.Now(),
  55. }
  56. if _, err := sess.Cols("updated", "permission").Where("dashboard_id =? and (user_group_id=? or user_id=?)", cmd.DashboardId, cmd.UserGroupId, cmd.UserId).Update(&entity); err != nil {
  57. return err
  58. }
  59. return nil
  60. }
  61. entity := m.DashboardAcl{
  62. OrgId: cmd.OrgId,
  63. UserGroupId: cmd.UserGroupId,
  64. UserId: cmd.UserId,
  65. Created: time.Now(),
  66. Updated: time.Now(),
  67. DashboardId: cmd.DashboardId,
  68. Permission: cmd.Permission,
  69. }
  70. cols := []string{"org_id", "created", "updated", "dashboard_id", "permission"}
  71. if cmd.UserId != 0 {
  72. cols = append(cols, "user_id")
  73. }
  74. if cmd.UserGroupId != 0 {
  75. cols = append(cols, "user_group_id")
  76. }
  77. _, err := sess.Cols(cols...).Insert(&entity)
  78. if err != nil {
  79. return err
  80. }
  81. cmd.Result = entity
  82. // Update dashboard HasAcl flag
  83. dashboard := m.Dashboard{
  84. HasAcl: true,
  85. }
  86. if _, err := sess.Cols("has_acl").Where("id=? OR parent_id=?", cmd.DashboardId, cmd.DashboardId).Update(&dashboard); err != nil {
  87. return err
  88. }
  89. return nil
  90. })
  91. }
  92. func RemoveDashboardAcl(cmd *m.RemoveDashboardAclCommand) error {
  93. return inTransaction(func(sess *DBSession) error {
  94. var rawSQL = "DELETE FROM " + dialect.Quote("dashboard_acl") + " WHERE org_id =? and id=?"
  95. _, err := sess.Exec(rawSQL, cmd.OrgId, cmd.AclId)
  96. if err != nil {
  97. return err
  98. }
  99. return err
  100. })
  101. }
  102. func GetInheritedDashboardAcl(query *m.GetInheritedDashboardAclQuery) error {
  103. rawSQL := `SELECT
  104. da.id,
  105. da.org_id,
  106. da.dashboard_id,
  107. da.user_id,
  108. da.user_group_id,
  109. da.role,
  110. da.permission,
  111. da.created,
  112. da.updated
  113. FROM dashboard_acl as da
  114. WHERE da.dashboard_id IN (
  115. SELECT id FROM dashboard where id = ?
  116. UNION
  117. SELECT parent_id from dashboard where id = ?
  118. ) AND org_id = ?`
  119. query.Result = make([]*m.DashboardAcl, 0)
  120. return x.SQL(rawSQL, query.DashboardId, query.DashboardId, query.OrgId).Find(&query.Result)
  121. }
  122. func GetDashboardAclInfoList(query *m.GetDashboardAclInfoListQuery) error {
  123. rawSQL := `
  124. SELECT
  125. da.id,
  126. da.org_id,
  127. da.dashboard_id,
  128. da.user_id,
  129. da.user_group_id,
  130. da.permission,
  131. da.role,
  132. da.created,
  133. da.updated,
  134. u.login AS user_login,
  135. u.email AS user_email,
  136. ug.name AS user_group
  137. FROM` + dialect.Quote("dashboard_acl") + ` as da
  138. LEFT OUTER JOIN ` + dialect.Quote("user") + ` AS u ON u.id = da.user_id
  139. LEFT OUTER JOIN user_group ug on ug.id = da.user_group_id
  140. WHERE dashboard_id = ?
  141. -- Also include default permission if has_acl = 0
  142. UNION
  143. SELECT
  144. da.id,
  145. da.org_id,
  146. da.dashboard_id,
  147. da.user_id,
  148. da.user_group_id,
  149. da.permission,
  150. da.role,
  151. da.created,
  152. da.updated,
  153. '' as user_login,
  154. '' as user_email,
  155. '' as user_group
  156. FROM dashboard_acl as da, dashboard as dash
  157. WHERE dash.id = ? AND dash.has_acl = 0 AND da.dashboard_id = -1
  158. `
  159. query.Result = make([]*m.DashboardAclInfoDTO, 0)
  160. err := x.SQL(rawSQL, query.DashboardId, query.DashboardId).Find(&query.Result)
  161. for _, p := range query.Result {
  162. p.PermissionName = p.Permission.String()
  163. }
  164. return err
  165. }