sqlbuilder.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package sqlstore
  2. import (
  3. "bytes"
  4. "strings"
  5. m "github.com/grafana/grafana/pkg/models"
  6. )
  7. type SqlBuilder struct {
  8. sql bytes.Buffer
  9. params []interface{}
  10. }
  11. func (sb *SqlBuilder) Write(sql string, params ...interface{}) {
  12. sb.sql.WriteString(sql)
  13. if len(params) > 0 {
  14. sb.params = append(sb.params, params...)
  15. }
  16. }
  17. func (sb *SqlBuilder) GetSqlString() string {
  18. return sb.sql.String()
  19. }
  20. func (sb *SqlBuilder) AddParams(params ...interface{}) {
  21. sb.params = append(sb.params, params...)
  22. }
  23. func (sb *SqlBuilder) writeDashboardPermissionFilter(user *m.SignedInUser, permission m.PermissionType) {
  24. if user.OrgRole == m.ROLE_ADMIN {
  25. return
  26. }
  27. okRoles := []interface{}{user.OrgRole}
  28. if user.OrgRole == m.ROLE_EDITOR {
  29. okRoles = append(okRoles, m.ROLE_VIEWER)
  30. }
  31. falseStr := dialect.BooleanStr(false)
  32. sb.sql.WriteString(` AND
  33. (
  34. dashboard.id IN (
  35. SELECT distinct DashboardId from (
  36. SELECT d.id AS DashboardId
  37. FROM dashboard AS d
  38. LEFT JOIN dashboard AS folder on folder.id = d.folder_id
  39. LEFT JOIN dashboard_acl AS da ON
  40. da.dashboard_id = d.id OR
  41. da.dashboard_id = d.folder_id
  42. LEFT JOIN team_member as ugm on ugm.team_id = da.team_id
  43. WHERE
  44. d.org_id = ? AND
  45. da.permission >= ? AND
  46. (
  47. da.user_id = ? OR
  48. ugm.user_id = ? OR
  49. da.role IN (?` + strings.Repeat(",?", len(okRoles)-1) + `)
  50. )
  51. UNION
  52. SELECT d.id AS DashboardId
  53. FROM dashboard AS d
  54. LEFT JOIN dashboard AS folder on folder.id = d.folder_id
  55. LEFT JOIN dashboard_acl AS da ON
  56. (
  57. -- include default permissions -->
  58. da.org_id = -1 AND (
  59. (folder.id IS NOT NULL AND folder.has_acl = ` + falseStr + `) OR
  60. (folder.id IS NULL AND d.has_acl = ` + falseStr + `)
  61. )
  62. )
  63. WHERE
  64. d.org_id = ? AND
  65. da.permission >= ? AND
  66. (
  67. da.user_id = ? OR
  68. da.role IN (?` + strings.Repeat(",?", len(okRoles)-1) + `)
  69. )
  70. ) AS a
  71. )
  72. )`)
  73. sb.params = append(sb.params, user.OrgId, permission, user.UserId, user.UserId)
  74. sb.params = append(sb.params, okRoles...)
  75. sb.params = append(sb.params, user.OrgId, permission, user.UserId)
  76. sb.params = append(sb.params, okRoles...)
  77. }