dashboard_acl.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. package sqlstore
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/grafana/grafana/pkg/bus"
  6. m "github.com/grafana/grafana/pkg/models"
  7. )
  8. func init() {
  9. bus.AddHandler("sql", SetDashboardAcl)
  10. bus.AddHandler("sql", UpdateDashboardAcl)
  11. bus.AddHandler("sql", RemoveDashboardAcl)
  12. bus.AddHandler("sql", GetDashboardAclInfoList)
  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.TeamId == 0 && !item.Role.IsValid() {
  23. return m.ErrDashboardAclInfoMissing
  24. }
  25. if item.DashboardId == 0 {
  26. return m.ErrDashboardPermissionDashboardEmpty
  27. }
  28. sess.Nullable("user_id", "team_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 folder_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.TeamId == 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 (team_id=? or user_id=?)", cmd.DashboardId, cmd.TeamId, 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 (team_id=? or user_id=?)", cmd.DashboardId, cmd.TeamId, cmd.UserId).Update(&entity); err != nil {
  57. return err
  58. }
  59. return nil
  60. }
  61. entity := m.DashboardAcl{
  62. OrgId: cmd.OrgId,
  63. TeamId: cmd.TeamId,
  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.TeamId != 0 {
  75. cols = append(cols, "team_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 folder_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 GetDashboardAclInfoList(query *m.GetDashboardAclInfoListQuery) error {
  103. var err error
  104. if query.DashboardId == 0 {
  105. sql := `SELECT
  106. da.id,
  107. da.org_id,
  108. da.dashboard_id,
  109. da.user_id,
  110. da.team_id,
  111. da.permission,
  112. da.role,
  113. da.created,
  114. da.updated,
  115. '' as user_login,
  116. '' as user_email,
  117. '' as team
  118. FROM dashboard_acl as da
  119. WHERE da.dashboard_id = -1`
  120. query.Result = make([]*m.DashboardAclInfoDTO, 0)
  121. err = x.SQL(sql).Find(&query.Result)
  122. } else {
  123. dashboardFilter := fmt.Sprintf(`IN (
  124. SELECT %d
  125. UNION
  126. SELECT folder_id from dashboard where id = %d
  127. )`, query.DashboardId, query.DashboardId)
  128. rawSQL := `
  129. SELECT
  130. da.id,
  131. da.org_id,
  132. da.dashboard_id,
  133. da.user_id,
  134. da.team_id,
  135. da.permission,
  136. da.role,
  137. da.created,
  138. da.updated,
  139. u.login AS user_login,
  140. u.email AS user_email,
  141. ug.name AS team
  142. FROM` + dialect.Quote("dashboard_acl") + ` as da
  143. LEFT OUTER JOIN ` + dialect.Quote("user") + ` AS u ON u.id = da.user_id
  144. LEFT OUTER JOIN team ug on ug.id = da.team_id
  145. WHERE dashboard_id ` + dashboardFilter + ` AND da.org_id = ?
  146. -- Also include default permission if has_acl = 0
  147. UNION
  148. SELECT
  149. da.id,
  150. da.org_id,
  151. da.dashboard_id,
  152. da.user_id,
  153. da.team_id,
  154. da.permission,
  155. da.role,
  156. da.created,
  157. da.updated,
  158. '' as user_login,
  159. '' as user_email,
  160. '' as team
  161. FROM dashboard_acl as da,
  162. dashboard as dash
  163. LEFT JOIN dashboard folder on dash.folder_id = folder.id
  164. WHERE
  165. dash.id = ? AND (
  166. dash.has_acl = ` + dialect.BooleanStr(false) + ` or
  167. folder.has_acl = ` + dialect.BooleanStr(false) + `
  168. ) AND
  169. da.dashboard_id = -1
  170. ORDER BY 1 ASC
  171. `
  172. query.Result = make([]*m.DashboardAclInfoDTO, 0)
  173. err = x.SQL(rawSQL, query.OrgId, query.DashboardId).Find(&query.Result)
  174. }
  175. for _, p := range query.Result {
  176. p.PermissionName = p.Permission.String()
  177. }
  178. return err
  179. }