mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			46 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
| package sqlstore
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"strings"
 | |
| 
 | |
| 	m "github.com/grafana/grafana/pkg/models"
 | |
| )
 | |
| 
 | |
| type SqlBuilder struct {
 | |
| 	sql    bytes.Buffer
 | |
| 	params []interface{}
 | |
| }
 | |
| 
 | |
| func (sb *SqlBuilder) writeDashboardPermissionFilter(user *m.SignedInUser, permission m.PermissionType) {
 | |
| 
 | |
| 	if user.OrgRole == m.ROLE_ADMIN {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	okRoles := []interface{}{user.OrgRole}
 | |
| 
 | |
| 	if user.OrgRole == m.ROLE_EDITOR {
 | |
| 		okRoles = append(okRoles, m.ROLE_VIEWER)
 | |
| 	}
 | |
| 
 | |
| 	sb.sql.WriteString(` AND
 | |
| 	(
 | |
| 		dashboard.has_acl = ` + dialect.BooleanStr(false) + ` OR
 | |
| 		dashboard.id in (
 | |
| 			SELECT distinct d.id AS DashboardId
 | |
| 			FROM dashboard AS d
 | |
| 				LEFT JOIN dashboard_acl as da on d.folder_id = da.dashboard_id or d.id = da.dashboard_id
 | |
| 				LEFT JOIN team_member as ugm on ugm.team_id =  da.team_id
 | |
| 			WHERE
 | |
| 				d.has_acl = ` + dialect.BooleanStr(true) + ` AND
 | |
| 				d.org_id = ? AND
 | |
| 				da.permission >= ? AND
 | |
| 				(da.user_id = ? or ugm.user_id = ? or da.role IN (?` + strings.Repeat(",?", len(okRoles)-1) + `))
 | |
| 		)
 | |
| 	)`)
 | |
| 
 | |
| 	sb.params = append(sb.params, user.OrgId, permission, user.UserId, user.UserId)
 | |
| 	sb.params = append(sb.params, okRoles...)
 | |
| }
 |