| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664 |
- package guardian
- import (
- "fmt"
- "runtime"
- "testing"
- m "github.com/grafana/grafana/pkg/models"
- . "github.com/smartystreets/goconvey/convey"
- )
- var (
- orgID = int64(1)
- defaultDashboardID = int64(-1)
- dashboardID = int64(1)
- parentFolderID = int64(2)
- childDashboardID = int64(3)
- userID = int64(1)
- otherUserID = int64(2)
- teamID = int64(1)
- otherTeamID = int64(2)
- adminRole = m.ROLE_ADMIN
- editorRole = m.ROLE_EDITOR
- viewerRole = m.ROLE_VIEWER
- )
- func TestGuardianAdmin(t *testing.T) {
- Convey("Guardian admin org role tests", t, func() {
- orgRoleScenario("Given user has admin org role", t, m.ROLE_ADMIN, func(sc *scenarioContext) {
- // dashboard has default permissions
- sc.defaultPermissionScenario(USER, m.PERMISSION_ADMIN, FULL_ACCESS)
- // dashboard has user with permission
- sc.dashboardPermissionScenario(USER, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.dashboardPermissionScenario(USER, m.PERMISSION_EDIT, FULL_ACCESS)
- sc.dashboardPermissionScenario(USER, m.PERMISSION_VIEW, FULL_ACCESS)
- // dashboard has team with permission
- sc.dashboardPermissionScenario(TEAM, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.dashboardPermissionScenario(TEAM, m.PERMISSION_EDIT, FULL_ACCESS)
- sc.dashboardPermissionScenario(TEAM, m.PERMISSION_VIEW, FULL_ACCESS)
- // dashboard has editor role with permission
- sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_EDIT, FULL_ACCESS)
- sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_VIEW, FULL_ACCESS)
- // dashboard has viewer role with permission
- sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_EDIT, FULL_ACCESS)
- sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_VIEW, FULL_ACCESS)
- // parent folder has user with permission
- sc.parentFolderPermissionScenario(USER, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.parentFolderPermissionScenario(USER, m.PERMISSION_EDIT, FULL_ACCESS)
- sc.parentFolderPermissionScenario(USER, m.PERMISSION_VIEW, FULL_ACCESS)
- // parent folder has team with permission
- sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_EDIT, FULL_ACCESS)
- sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_VIEW, FULL_ACCESS)
- // parent folder has editor role with permission
- sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_EDIT, FULL_ACCESS)
- sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_VIEW, FULL_ACCESS)
- // parent folder has viweer role with permission
- sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_EDIT, FULL_ACCESS)
- sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_VIEW, FULL_ACCESS)
- })
- })
- }
- func TestGuardianEditor(t *testing.T) {
- Convey("Guardian editor org role tests", t, func() {
- orgRoleScenario("Given user has editor org role", t, m.ROLE_EDITOR, func(sc *scenarioContext) {
- // dashboard has user with permission
- sc.dashboardPermissionScenario(USER, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.dashboardPermissionScenario(USER, m.PERMISSION_EDIT, EDITOR_ACCESS)
- sc.dashboardPermissionScenario(USER, m.PERMISSION_VIEW, CAN_VIEW)
- // dashboard has team with permission
- sc.dashboardPermissionScenario(TEAM, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.dashboardPermissionScenario(TEAM, m.PERMISSION_EDIT, EDITOR_ACCESS)
- sc.dashboardPermissionScenario(TEAM, m.PERMISSION_VIEW, CAN_VIEW)
- // dashboard has editor role with permission
- sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_EDIT, EDITOR_ACCESS)
- sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_VIEW, VIEWER_ACCESS)
- // dashboard has viewer role with permission
- sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_ADMIN, NO_ACCESS)
- sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_EDIT, NO_ACCESS)
- sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_VIEW, NO_ACCESS)
- // parent folder has user with permission
- sc.parentFolderPermissionScenario(USER, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.parentFolderPermissionScenario(USER, m.PERMISSION_EDIT, EDITOR_ACCESS)
- sc.parentFolderPermissionScenario(USER, m.PERMISSION_VIEW, VIEWER_ACCESS)
- // parent folder has team with permission
- sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_EDIT, EDITOR_ACCESS)
- sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_VIEW, VIEWER_ACCESS)
- // parent folder has editor role with permission
- sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_EDIT, EDITOR_ACCESS)
- sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_VIEW, VIEWER_ACCESS)
- // parent folder has viweer role with permission
- sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_ADMIN, NO_ACCESS)
- sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_EDIT, NO_ACCESS)
- sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_VIEW, NO_ACCESS)
- })
- })
- }
- func TestGuardianViewer(t *testing.T) {
- Convey("Guardian viewer org role tests", t, func() {
- orgRoleScenario("Given user has viewer org role", t, m.ROLE_VIEWER, func(sc *scenarioContext) {
- // dashboard has user with permission
- sc.dashboardPermissionScenario(USER, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.dashboardPermissionScenario(USER, m.PERMISSION_EDIT, EDITOR_ACCESS)
- sc.dashboardPermissionScenario(USER, m.PERMISSION_VIEW, VIEWER_ACCESS)
- // dashboard has team with permission
- sc.dashboardPermissionScenario(TEAM, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.dashboardPermissionScenario(TEAM, m.PERMISSION_EDIT, EDITOR_ACCESS)
- sc.dashboardPermissionScenario(TEAM, m.PERMISSION_VIEW, VIEWER_ACCESS)
- // dashboard has editor role with permission
- sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_ADMIN, NO_ACCESS)
- sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_EDIT, NO_ACCESS)
- sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_VIEW, NO_ACCESS)
- // dashboard has viewer role with permission
- sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_EDIT, EDITOR_ACCESS)
- sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_VIEW, VIEWER_ACCESS)
- // parent folder has user with permission
- sc.parentFolderPermissionScenario(USER, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.parentFolderPermissionScenario(USER, m.PERMISSION_EDIT, EDITOR_ACCESS)
- sc.parentFolderPermissionScenario(USER, m.PERMISSION_VIEW, VIEWER_ACCESS)
- // parent folder has team with permission
- sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_EDIT, EDITOR_ACCESS)
- sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_VIEW, VIEWER_ACCESS)
- // parent folder has editor role with permission
- sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_ADMIN, NO_ACCESS)
- sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_EDIT, NO_ACCESS)
- sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_VIEW, NO_ACCESS)
- // parent folder has viweer role with permission
- sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_ADMIN, FULL_ACCESS)
- sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_EDIT, EDITOR_ACCESS)
- sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_VIEW, VIEWER_ACCESS)
- })
- })
- }
- func (sc *scenarioContext) defaultPermissionScenario(pt permissionType, permission m.PermissionType, flag permissionFlags) {
- _, callerFile, callerLine, _ := runtime.Caller(1)
- sc.callerFile = callerFile
- sc.callerLine = callerLine
- existingPermissions := []*m.DashboardAclInfoDTO{
- toDto(newEditorRolePermission(defaultDashboardID, m.PERMISSION_EDIT)),
- toDto(newViewerRolePermission(defaultDashboardID, m.PERMISSION_VIEW)),
- }
- permissionScenario("and existing permissions is the default permissions (everyone with editor role can edit, everyone with viewer role can view)", dashboardID, sc, existingPermissions, func(sc *scenarioContext) {
- sc.expectedFlags = flag
- sc.verifyExpectedPermissionsFlags()
- sc.verifyDuplicatePermissionsShouldNotBeAllowed()
- sc.verifyUpdateDashboardPermissionsShouldBeAllowed(pt)
- sc.verifyUpdateDashboardPermissionsShouldNotBeAllowed(pt)
- })
- }
- func (sc *scenarioContext) dashboardPermissionScenario(pt permissionType, permission m.PermissionType, flag permissionFlags) {
- _, callerFile, callerLine, _ := runtime.Caller(1)
- sc.callerFile = callerFile
- sc.callerLine = callerLine
- var existingPermissions []*m.DashboardAclInfoDTO
- switch pt {
- case USER:
- existingPermissions = []*m.DashboardAclInfoDTO{{OrgId: orgID, DashboardId: dashboardID, UserId: userID, Permission: permission}}
- case TEAM:
- existingPermissions = []*m.DashboardAclInfoDTO{{OrgId: orgID, DashboardId: dashboardID, TeamId: teamID, Permission: permission}}
- case EDITOR:
- existingPermissions = []*m.DashboardAclInfoDTO{{OrgId: orgID, DashboardId: dashboardID, Role: &editorRole, Permission: permission}}
- case VIEWER:
- existingPermissions = []*m.DashboardAclInfoDTO{{OrgId: orgID, DashboardId: dashboardID, Role: &viewerRole, Permission: permission}}
- }
- permissionScenario(fmt.Sprintf("and %s has permission to %s dashboard", pt.String(), permission.String()), dashboardID, sc, existingPermissions, func(sc *scenarioContext) {
- sc.expectedFlags = flag
- sc.verifyExpectedPermissionsFlags()
- sc.verifyDuplicatePermissionsShouldNotBeAllowed()
- sc.verifyUpdateDashboardPermissionsShouldBeAllowed(pt)
- sc.verifyUpdateDashboardPermissionsShouldNotBeAllowed(pt)
- })
- }
- func (sc *scenarioContext) parentFolderPermissionScenario(pt permissionType, permission m.PermissionType, flag permissionFlags) {
- _, callerFile, callerLine, _ := runtime.Caller(1)
- sc.callerFile = callerFile
- sc.callerLine = callerLine
- var folderPermissionList []*m.DashboardAclInfoDTO
- switch pt {
- case USER:
- folderPermissionList = []*m.DashboardAclInfoDTO{{OrgId: orgID, DashboardId: parentFolderID, UserId: userID, Permission: permission}}
- case TEAM:
- folderPermissionList = []*m.DashboardAclInfoDTO{{OrgId: orgID, DashboardId: parentFolderID, TeamId: teamID, Permission: permission}}
- case EDITOR:
- folderPermissionList = []*m.DashboardAclInfoDTO{{OrgId: orgID, DashboardId: parentFolderID, Role: &editorRole, Permission: permission}}
- case VIEWER:
- folderPermissionList = []*m.DashboardAclInfoDTO{{OrgId: orgID, DashboardId: parentFolderID, Role: &viewerRole, Permission: permission}}
- }
- permissionScenario(fmt.Sprintf("and parent folder has %s with permission to %s", pt.String(), permission.String()), childDashboardID, sc, folderPermissionList, func(sc *scenarioContext) {
- sc.expectedFlags = flag
- sc.verifyExpectedPermissionsFlags()
- sc.verifyDuplicatePermissionsShouldNotBeAllowed()
- sc.verifyUpdateChildDashboardPermissionsShouldBeAllowed(pt, permission)
- sc.verifyUpdateChildDashboardPermissionsShouldNotBeAllowed(pt, permission)
- sc.verifyUpdateChildDashboardPermissionsWithOverrideShouldBeAllowed(pt, permission)
- sc.verifyUpdateChildDashboardPermissionsWithOverrideShouldNotBeAllowed(pt, permission)
- })
- }
- func (sc *scenarioContext) verifyExpectedPermissionsFlags() {
- canAdmin, _ := sc.g.CanAdmin()
- canEdit, _ := sc.g.CanEdit()
- canSave, _ := sc.g.CanSave()
- canView, _ := sc.g.CanView()
- tc := fmt.Sprintf("should have permissions to %s", sc.expectedFlags.String())
- Convey(tc, func() {
- var actualFlag permissionFlags
- if canAdmin {
- actualFlag |= CAN_ADMIN
- }
- if canEdit {
- actualFlag |= CAN_EDIT
- }
- if canSave {
- actualFlag |= CAN_SAVE
- }
- if canView {
- actualFlag |= CAN_VIEW
- }
- if actualFlag.noAccess() {
- actualFlag = NO_ACCESS
- }
- if sc.expectedFlags&actualFlag != sc.expectedFlags {
- sc.reportFailure(tc, sc.expectedFlags.String(), actualFlag.String())
- }
- sc.reportSuccess()
- })
- }
- func (sc *scenarioContext) verifyDuplicatePermissionsShouldNotBeAllowed() {
- if !sc.expectedFlags.canAdmin() {
- return
- }
- tc := "When updating dashboard permissions with duplicate permission for user should not be allowed"
- Convey(tc, func() {
- p := []*m.DashboardAcl{
- newDefaultUserPermission(dashboardID, m.PERMISSION_VIEW),
- newDefaultUserPermission(dashboardID, m.PERMISSION_ADMIN),
- }
- sc.updatePermissions = p
- _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
- if err != ErrGuardianPermissionExists {
- sc.reportFailure(tc, ErrGuardianPermissionExists, err)
- }
- sc.reportSuccess()
- })
- tc = "When updating dashboard permissions with duplicate permission for team should not be allowed"
- Convey(tc, func() {
- p := []*m.DashboardAcl{
- newDefaultTeamPermission(dashboardID, m.PERMISSION_VIEW),
- newDefaultTeamPermission(dashboardID, m.PERMISSION_ADMIN),
- }
- sc.updatePermissions = p
- _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
- if err != ErrGuardianPermissionExists {
- sc.reportFailure(tc, ErrGuardianPermissionExists, err)
- }
- sc.reportSuccess()
- })
- tc = "When updating dashboard permissions with duplicate permission for editor role should not be allowed"
- Convey(tc, func() {
- p := []*m.DashboardAcl{
- newEditorRolePermission(dashboardID, m.PERMISSION_VIEW),
- newEditorRolePermission(dashboardID, m.PERMISSION_ADMIN),
- }
- sc.updatePermissions = p
- _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
- if err != ErrGuardianPermissionExists {
- sc.reportFailure(tc, ErrGuardianPermissionExists, err)
- }
- sc.reportSuccess()
- })
- tc = "When updating dashboard permissions with duplicate permission for viewer role should not be allowed"
- Convey(tc, func() {
- p := []*m.DashboardAcl{
- newViewerRolePermission(dashboardID, m.PERMISSION_VIEW),
- newViewerRolePermission(dashboardID, m.PERMISSION_ADMIN),
- }
- sc.updatePermissions = p
- _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
- if err != ErrGuardianPermissionExists {
- sc.reportFailure(tc, ErrGuardianPermissionExists, err)
- }
- sc.reportSuccess()
- })
- tc = "When updating dashboard permissions with duplicate permission for admin role should not be allowed"
- Convey(tc, func() {
- p := []*m.DashboardAcl{
- newAdminRolePermission(dashboardID, m.PERMISSION_ADMIN),
- }
- sc.updatePermissions = p
- _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
- if err != ErrGuardianPermissionExists {
- sc.reportFailure(tc, ErrGuardianPermissionExists, err)
- }
- sc.reportSuccess()
- })
- }
- func (sc *scenarioContext) verifyUpdateDashboardPermissionsShouldBeAllowed(pt permissionType) {
- if !sc.expectedFlags.canAdmin() {
- return
- }
- for _, p := range []m.PermissionType{m.PERMISSION_ADMIN, m.PERMISSION_EDIT, m.PERMISSION_VIEW} {
- tc := fmt.Sprintf("When updating dashboard permissions with %s permissions should be allowed", p.String())
- Convey(tc, func() {
- permissionList := []*m.DashboardAcl{}
- switch pt {
- case USER:
- permissionList = []*m.DashboardAcl{
- newEditorRolePermission(dashboardID, p),
- newViewerRolePermission(dashboardID, p),
- newCustomUserPermission(dashboardID, otherUserID, p),
- newDefaultTeamPermission(dashboardID, p),
- }
- case TEAM:
- permissionList = []*m.DashboardAcl{
- newEditorRolePermission(dashboardID, p),
- newViewerRolePermission(dashboardID, p),
- newDefaultUserPermission(dashboardID, p),
- newCustomTeamPermission(dashboardID, otherTeamID, p),
- }
- case EDITOR, VIEWER:
- permissionList = []*m.DashboardAcl{
- newEditorRolePermission(dashboardID, p),
- newViewerRolePermission(dashboardID, p),
- newDefaultUserPermission(dashboardID, p),
- newDefaultTeamPermission(dashboardID, p),
- }
- }
- sc.updatePermissions = permissionList
- ok, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, permissionList)
- if err != nil {
- sc.reportFailure(tc, nil, err)
- }
- if !ok {
- sc.reportFailure(tc, false, true)
- }
- sc.reportSuccess()
- })
- }
- }
- func (sc *scenarioContext) verifyUpdateDashboardPermissionsShouldNotBeAllowed(pt permissionType) {
- if sc.expectedFlags.canAdmin() {
- return
- }
- for _, p := range []m.PermissionType{m.PERMISSION_ADMIN, m.PERMISSION_EDIT, m.PERMISSION_VIEW} {
- tc := fmt.Sprintf("When updating dashboard permissions with %s permissions should NOT be allowed", p.String())
- Convey(tc, func() {
- permissionList := []*m.DashboardAcl{
- newEditorRolePermission(dashboardID, p),
- newViewerRolePermission(dashboardID, p),
- }
- switch pt {
- case USER:
- permissionList = append(permissionList, []*m.DashboardAcl{
- newCustomUserPermission(dashboardID, otherUserID, p),
- newDefaultTeamPermission(dashboardID, p),
- }...)
- case TEAM:
- permissionList = append(permissionList, []*m.DashboardAcl{
- newDefaultUserPermission(dashboardID, p),
- newCustomTeamPermission(dashboardID, otherTeamID, p),
- }...)
- }
- sc.updatePermissions = permissionList
- ok, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, permissionList)
- if err != nil {
- sc.reportFailure(tc, nil, err)
- }
- if ok {
- sc.reportFailure(tc, true, false)
- }
- sc.reportSuccess()
- })
- }
- }
- func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsShouldBeAllowed(pt permissionType, parentFolderPermission m.PermissionType) {
- if !sc.expectedFlags.canAdmin() {
- return
- }
- for _, p := range []m.PermissionType{m.PERMISSION_ADMIN, m.PERMISSION_EDIT, m.PERMISSION_VIEW} {
- tc := fmt.Sprintf("When updating child dashboard permissions with %s permissions should be allowed", p.String())
- Convey(tc, func() {
- permissionList := []*m.DashboardAcl{}
- switch pt {
- case USER:
- permissionList = []*m.DashboardAcl{
- newEditorRolePermission(childDashboardID, p),
- newViewerRolePermission(childDashboardID, p),
- newCustomUserPermission(childDashboardID, otherUserID, p),
- newDefaultTeamPermission(childDashboardID, p),
- }
- case TEAM:
- permissionList = []*m.DashboardAcl{
- newEditorRolePermission(childDashboardID, p),
- newViewerRolePermission(childDashboardID, p),
- newDefaultUserPermission(childDashboardID, p),
- newCustomTeamPermission(childDashboardID, otherTeamID, p),
- }
- case EDITOR:
- permissionList = []*m.DashboardAcl{
- newViewerRolePermission(childDashboardID, p),
- newDefaultUserPermission(childDashboardID, p),
- newDefaultTeamPermission(childDashboardID, p),
- }
- // permission to update is higher than parent folder permission
- if p > parentFolderPermission {
- permissionList = append(permissionList, newEditorRolePermission(childDashboardID, p))
- }
- case VIEWER:
- permissionList = []*m.DashboardAcl{
- newEditorRolePermission(childDashboardID, p),
- newDefaultUserPermission(childDashboardID, p),
- newDefaultTeamPermission(childDashboardID, p),
- }
- // permission to update is higher than parent folder permission
- if p > parentFolderPermission {
- permissionList = append(permissionList, newViewerRolePermission(childDashboardID, p))
- }
- }
- sc.updatePermissions = permissionList
- ok, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, permissionList)
- if err != nil {
- sc.reportFailure(tc, nil, err)
- }
- if !ok {
- sc.reportFailure(tc, false, true)
- }
- sc.reportSuccess()
- })
- }
- }
- func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsShouldNotBeAllowed(pt permissionType, parentFolderPermission m.PermissionType) {
- if sc.expectedFlags.canAdmin() {
- return
- }
- for _, p := range []m.PermissionType{m.PERMISSION_ADMIN, m.PERMISSION_EDIT, m.PERMISSION_VIEW} {
- tc := fmt.Sprintf("When updating child dashboard permissions with %s permissions should NOT be allowed", p.String())
- Convey(tc, func() {
- permissionList := []*m.DashboardAcl{}
- switch pt {
- case USER:
- permissionList = []*m.DashboardAcl{
- newEditorRolePermission(childDashboardID, p),
- newViewerRolePermission(childDashboardID, p),
- newCustomUserPermission(childDashboardID, otherUserID, p),
- newDefaultTeamPermission(childDashboardID, p),
- }
- case TEAM:
- permissionList = []*m.DashboardAcl{
- newEditorRolePermission(childDashboardID, p),
- newViewerRolePermission(childDashboardID, p),
- newDefaultUserPermission(childDashboardID, p),
- newCustomTeamPermission(childDashboardID, otherTeamID, p),
- }
- case EDITOR:
- permissionList = []*m.DashboardAcl{
- newViewerRolePermission(childDashboardID, p),
- newDefaultUserPermission(childDashboardID, p),
- newDefaultTeamPermission(childDashboardID, p),
- }
- // perminssion to update is higher than parent folder permission
- if p > parentFolderPermission {
- permissionList = append(permissionList, newEditorRolePermission(childDashboardID, p))
- }
- case VIEWER:
- permissionList = []*m.DashboardAcl{
- newEditorRolePermission(childDashboardID, p),
- newDefaultUserPermission(childDashboardID, p),
- newDefaultTeamPermission(childDashboardID, p),
- }
- // perminssion to update is higher than parent folder permission
- if p > parentFolderPermission {
- permissionList = append(permissionList, newViewerRolePermission(childDashboardID, p))
- }
- }
- sc.updatePermissions = permissionList
- ok, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, permissionList)
- if err != nil {
- sc.reportFailure(tc, nil, err)
- }
- if ok {
- sc.reportFailure(tc, true, false)
- }
- sc.reportSuccess()
- })
- }
- }
- func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsWithOverrideShouldBeAllowed(pt permissionType, parentFolderPermission m.PermissionType) {
- if !sc.expectedFlags.canAdmin() {
- return
- }
- for _, p := range []m.PermissionType{m.PERMISSION_ADMIN, m.PERMISSION_EDIT, m.PERMISSION_VIEW} {
- // perminssion to update is higher tban parent folder permission
- if p > parentFolderPermission {
- continue
- }
- tc := fmt.Sprintf("When updating child dashboard permissions overriding parent %s permission with %s permission should NOT be allowed", pt.String(), p.String())
- Convey(tc, func() {
- permissionList := []*m.DashboardAcl{}
- switch pt {
- case USER:
- permissionList = []*m.DashboardAcl{
- newDefaultUserPermission(childDashboardID, p),
- }
- case TEAM:
- permissionList = []*m.DashboardAcl{
- newDefaultTeamPermission(childDashboardID, p),
- }
- case EDITOR:
- permissionList = []*m.DashboardAcl{
- newEditorRolePermission(childDashboardID, p),
- }
- case VIEWER:
- permissionList = []*m.DashboardAcl{
- newViewerRolePermission(childDashboardID, p),
- }
- }
- sc.updatePermissions = permissionList
- _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, permissionList)
- if err != ErrGuardianOverride {
- sc.reportFailure(tc, ErrGuardianOverride, err)
- }
- sc.reportSuccess()
- })
- }
- }
- func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsWithOverrideShouldNotBeAllowed(pt permissionType, parentFolderPermission m.PermissionType) {
- if !sc.expectedFlags.canAdmin() {
- return
- }
- for _, p := range []m.PermissionType{m.PERMISSION_ADMIN, m.PERMISSION_EDIT, m.PERMISSION_VIEW} {
- // perminssion to update is lower than/equal parent folder permission
- if p <= parentFolderPermission {
- continue
- }
- tc := fmt.Sprintf("When updating child dashboard permissions overriding parent %s permission with %s permission should be allowed", pt.String(), p.String())
- Convey(tc, func() {
- permissionList := []*m.DashboardAcl{}
- switch pt {
- case USER:
- permissionList = []*m.DashboardAcl{
- newDefaultUserPermission(childDashboardID, p),
- }
- case TEAM:
- permissionList = []*m.DashboardAcl{
- newDefaultTeamPermission(childDashboardID, p),
- }
- case EDITOR:
- permissionList = []*m.DashboardAcl{
- newEditorRolePermission(childDashboardID, p),
- }
- case VIEWER:
- permissionList = []*m.DashboardAcl{
- newViewerRolePermission(childDashboardID, p),
- }
- }
- _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, permissionList)
- sc.updatePermissions = permissionList
- ok, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, permissionList)
- if err != nil {
- sc.reportFailure(tc, nil, err)
- }
- if !ok {
- sc.reportFailure(tc, false, true)
- }
- sc.reportSuccess()
- })
- }
- }
|