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