2017-04-28 14:22:53 -05:00
package sqlstore
import (
2017-06-22 14:16:41 -05:00
"fmt"
2017-04-28 14:22:53 -05:00
"time"
"github.com/grafana/grafana/pkg/bus"
m "github.com/grafana/grafana/pkg/models"
)
func init ( ) {
2017-06-19 16:15:25 -05:00
bus . AddHandler ( "sql" , SetDashboardAcl )
2017-06-21 18:02:03 -05:00
bus . AddHandler ( "sql" , UpdateDashboardAcl )
2017-06-19 16:15:25 -05:00
bus . AddHandler ( "sql" , RemoveDashboardAcl )
2017-06-19 16:30:54 -05:00
bus . AddHandler ( "sql" , GetDashboardAclInfoList )
2017-04-28 14:22:53 -05:00
}
2017-06-21 18:02:03 -05:00
func UpdateDashboardAcl ( cmd * m . UpdateDashboardAclCommand ) error {
return inTransaction ( func ( sess * DBSession ) error {
// delete existing items
_ , err := sess . Exec ( "DELETE FROM dashboard_acl WHERE dashboard_id=?" , cmd . DashboardId )
if err != nil {
return err
}
for _ , item := range cmd . Items {
2017-12-08 09:25:45 -06:00
if item . UserId == 0 && item . TeamId == 0 && ! item . Role . IsValid ( ) {
2017-06-21 18:02:03 -05:00
return m . ErrDashboardAclInfoMissing
}
if item . DashboardId == 0 {
return m . ErrDashboardPermissionDashboardEmpty
}
2017-12-08 09:25:45 -06:00
sess . Nullable ( "user_id" , "team_id" )
2017-06-21 18:02:03 -05:00
if _ , err := sess . Insert ( item ) ; err != nil {
return err
}
}
// Update dashboard HasAcl flag
dashboard := m . Dashboard { HasAcl : true }
2017-06-23 15:00:26 -05:00
if _ , err := sess . Cols ( "has_acl" ) . Where ( "id=? OR folder_id=?" , cmd . DashboardId , cmd . DashboardId ) . Update ( & dashboard ) ; err != nil {
2017-06-21 18:02:03 -05:00
return err
}
return nil
} )
}
2017-06-19 16:15:25 -05:00
func SetDashboardAcl ( cmd * m . SetDashboardAclCommand ) error {
2017-05-24 09:19:21 -05:00
return inTransaction ( func ( sess * DBSession ) error {
2017-12-08 09:25:45 -06:00
if cmd . UserId == 0 && cmd . TeamId == 0 {
2017-06-19 17:19:58 -05:00
return m . ErrDashboardAclInfoMissing
2017-06-14 16:45:30 -05:00
}
2017-06-19 17:34:25 -05:00
if cmd . DashboardId == 0 {
return m . ErrDashboardPermissionDashboardEmpty
}
2017-12-08 09:25:45 -06:00
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 {
2017-04-28 14:22:53 -05:00
return err
} else if len ( res ) == 1 {
2017-06-21 13:11:16 -05:00
2017-04-28 14:22:53 -05:00
entity := m . DashboardAcl {
2017-06-21 13:11:16 -05:00
Permission : cmd . Permission ,
Updated : time . Now ( ) ,
2017-04-28 14:22:53 -05:00
}
2017-06-21 13:11:16 -05:00
2017-12-08 09:25:45 -06:00
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 {
2017-04-28 14:22:53 -05:00
return err
}
return nil
}
entity := m . DashboardAcl {
OrgId : cmd . OrgId ,
2017-12-11 10:46:05 -06:00
TeamId : cmd . TeamId ,
2017-04-28 14:22:53 -05:00
UserId : cmd . UserId ,
Created : time . Now ( ) ,
Updated : time . Now ( ) ,
DashboardId : cmd . DashboardId ,
2017-06-21 13:11:16 -05:00
Permission : cmd . Permission ,
2017-04-28 14:22:53 -05:00
}
2017-06-21 13:11:16 -05:00
cols := [ ] string { "org_id" , "created" , "updated" , "dashboard_id" , "permission" }
2017-04-28 14:22:53 -05:00
if cmd . UserId != 0 {
cols = append ( cols , "user_id" )
}
2017-12-08 09:25:45 -06:00
if cmd . TeamId != 0 {
cols = append ( cols , "team_id" )
2017-04-28 14:22:53 -05:00
}
2017-06-21 13:11:16 -05:00
_ , err := sess . Cols ( cols ... ) . Insert ( & entity )
2017-04-28 14:22:53 -05:00
if err != nil {
return err
}
2017-06-21 13:11:16 -05:00
2017-06-09 14:56:13 -05:00
cmd . Result = entity
2017-04-28 14:22:53 -05:00
2017-06-09 14:56:13 -05:00
// Update dashboard HasAcl flag
2017-04-28 14:22:53 -05:00
dashboard := m . Dashboard {
HasAcl : true ,
}
2017-06-17 17:24:38 -05:00
2017-06-23 15:00:26 -05:00
if _ , err := sess . Cols ( "has_acl" ) . Where ( "id=? OR folder_id=?" , cmd . DashboardId , cmd . DashboardId ) . Update ( & dashboard ) ; err != nil {
2017-04-28 14:22:53 -05:00
return err
}
return nil
} )
}
2017-06-19 16:15:25 -05:00
func RemoveDashboardAcl ( cmd * m . RemoveDashboardAclCommand ) error {
2017-05-24 09:19:21 -05:00
return inTransaction ( func ( sess * DBSession ) error {
2017-06-19 17:11:30 -05:00
var rawSQL = "DELETE FROM " + dialect . Quote ( "dashboard_acl" ) + " WHERE org_id =? and id=?"
_ , err := sess . Exec ( rawSQL , cmd . OrgId , cmd . AclId )
2017-05-03 04:32:21 -05:00
if err != nil {
return err
}
return err
} )
}
2017-06-19 16:30:54 -05:00
func GetDashboardAclInfoList ( query * m . GetDashboardAclInfoListQuery ) error {
2017-06-22 14:16:41 -05:00
dashboardFilter := fmt . Sprintf ( ` IN (
2017-06-22 16:10:43 -05:00
SELECT % d
2017-06-22 14:16:41 -05:00
UNION
2017-06-23 15:00:26 -05:00
SELECT folder_id from dashboard where id = % d
2017-06-22 14:16:41 -05:00
) ` , query . DashboardId , query . DashboardId )
2017-06-21 13:11:16 -05:00
rawSQL := `
SELECT
da . id ,
da . org_id ,
da . dashboard_id ,
da . user_id ,
2017-12-08 09:25:45 -06:00
da . team_id ,
2017-06-21 13:11:16 -05:00
da . permission ,
da . role ,
da . created ,
da . updated ,
u . login AS user_login ,
u . email AS user_email ,
2017-12-08 09:25:45 -06:00
ug . name AS team
2017-05-08 08:35:34 -05:00
FROM ` + dialect.Quote("dashboard_acl") + ` as da
2017-06-21 13:11:16 -05:00
LEFT OUTER JOIN ` + dialect.Quote("user") + ` AS u ON u . id = da . user_id
2017-12-08 09:25:45 -06:00
LEFT OUTER JOIN team ug on ug . id = da . team_id
2017-06-22 16:10:43 -05:00
WHERE dashboard_id ` + dashboardFilter + ` AND da . org_id = ?
2017-06-21 13:11:16 -05:00
-- Also include default permission if has_acl = 0
UNION
SELECT
da . id ,
da . org_id ,
da . dashboard_id ,
da . user_id ,
2017-12-08 09:25:45 -06:00
da . team_id ,
2017-06-21 13:11:16 -05:00
da . permission ,
da . role ,
da . created ,
da . updated ,
' ' as user_login ,
' ' as user_email ,
2017-12-08 09:25:45 -06:00
' ' as team
2017-06-23 20:50:22 -05:00
FROM dashboard_acl as da ,
dashboard as dash
LEFT JOIN dashboard folder on dash . folder_id = folder . id
2017-12-20 05:15:49 -06:00
WHERE
dash . id = ? AND (
dash . has_acl = ` + dialect.BooleanStr(false) + ` or
folder . has_acl = ` + dialect.BooleanStr(false) + `
) AND
da . dashboard_id = - 1
2017-06-21 13:11:16 -05:00
`
2017-05-08 08:35:34 -05:00
query . Result = make ( [ ] * m . DashboardAclInfoDTO , 0 )
2017-06-22 16:10:43 -05:00
err := x . SQL ( rawSQL , query . OrgId , query . DashboardId ) . Find ( & query . Result )
2017-05-08 08:35:34 -05:00
2017-06-08 03:39:17 -05:00
for _ , p := range query . Result {
2017-06-21 13:11:16 -05:00
p . PermissionName = p . Permission . String ( )
2017-06-08 03:39:17 -05:00
}
2017-05-08 08:35:34 -05:00
return err
2017-04-28 14:22:53 -05:00
}