guardian_test.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. package guardian
  2. import (
  3. "fmt"
  4. "runtime"
  5. "testing"
  6. m "github.com/grafana/grafana/pkg/models"
  7. . "github.com/smartystreets/goconvey/convey"
  8. )
  9. var (
  10. orgID = int64(1)
  11. defaultDashboardID = int64(-1)
  12. dashboardID = int64(1)
  13. parentFolderID = int64(2)
  14. childDashboardID = int64(3)
  15. userID = int64(1)
  16. otherUserID = int64(2)
  17. teamID = int64(1)
  18. otherTeamID = int64(2)
  19. adminRole = m.ROLE_ADMIN
  20. editorRole = m.ROLE_EDITOR
  21. viewerRole = m.ROLE_VIEWER
  22. )
  23. func TestGuardianAdmin(t *testing.T) {
  24. Convey("Guardian admin org role tests", t, func() {
  25. orgRoleScenario("Given user has admin org role", t, m.ROLE_ADMIN, func(sc *scenarioContext) {
  26. // dashboard has default permissions
  27. sc.defaultPermissionScenario(USER, m.PERMISSION_ADMIN, FULL_ACCESS)
  28. // dashboard has user with permission
  29. sc.dashboardPermissionScenario(USER, m.PERMISSION_ADMIN, FULL_ACCESS)
  30. sc.dashboardPermissionScenario(USER, m.PERMISSION_EDIT, FULL_ACCESS)
  31. sc.dashboardPermissionScenario(USER, m.PERMISSION_VIEW, FULL_ACCESS)
  32. // dashboard has team with permission
  33. sc.dashboardPermissionScenario(TEAM, m.PERMISSION_ADMIN, FULL_ACCESS)
  34. sc.dashboardPermissionScenario(TEAM, m.PERMISSION_EDIT, FULL_ACCESS)
  35. sc.dashboardPermissionScenario(TEAM, m.PERMISSION_VIEW, FULL_ACCESS)
  36. // dashboard has editor role with permission
  37. sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_ADMIN, FULL_ACCESS)
  38. sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_EDIT, FULL_ACCESS)
  39. sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_VIEW, FULL_ACCESS)
  40. // dashboard has viewer role with permission
  41. sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_ADMIN, FULL_ACCESS)
  42. sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_EDIT, FULL_ACCESS)
  43. sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_VIEW, FULL_ACCESS)
  44. // parent folder has user with permission
  45. sc.parentFolderPermissionScenario(USER, m.PERMISSION_ADMIN, FULL_ACCESS)
  46. sc.parentFolderPermissionScenario(USER, m.PERMISSION_EDIT, FULL_ACCESS)
  47. sc.parentFolderPermissionScenario(USER, m.PERMISSION_VIEW, FULL_ACCESS)
  48. // parent folder has team with permission
  49. sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_ADMIN, FULL_ACCESS)
  50. sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_EDIT, FULL_ACCESS)
  51. sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_VIEW, FULL_ACCESS)
  52. // parent folder has editor role with permission
  53. sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_ADMIN, FULL_ACCESS)
  54. sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_EDIT, FULL_ACCESS)
  55. sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_VIEW, FULL_ACCESS)
  56. // parent folder has viweer role with permission
  57. sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_ADMIN, FULL_ACCESS)
  58. sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_EDIT, FULL_ACCESS)
  59. sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_VIEW, FULL_ACCESS)
  60. })
  61. })
  62. }
  63. func TestGuardianEditor(t *testing.T) {
  64. Convey("Guardian editor org role tests", t, func() {
  65. orgRoleScenario("Given user has editor org role", t, m.ROLE_EDITOR, func(sc *scenarioContext) {
  66. // dashboard has user with permission
  67. sc.dashboardPermissionScenario(USER, m.PERMISSION_ADMIN, FULL_ACCESS)
  68. sc.dashboardPermissionScenario(USER, m.PERMISSION_EDIT, EDITOR_ACCESS)
  69. sc.dashboardPermissionScenario(USER, m.PERMISSION_VIEW, CAN_VIEW)
  70. // dashboard has team with permission
  71. sc.dashboardPermissionScenario(TEAM, m.PERMISSION_ADMIN, FULL_ACCESS)
  72. sc.dashboardPermissionScenario(TEAM, m.PERMISSION_EDIT, EDITOR_ACCESS)
  73. sc.dashboardPermissionScenario(TEAM, m.PERMISSION_VIEW, CAN_VIEW)
  74. // dashboard has editor role with permission
  75. sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_ADMIN, FULL_ACCESS)
  76. sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_EDIT, EDITOR_ACCESS)
  77. sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_VIEW, VIEWER_ACCESS)
  78. // dashboard has viewer role with permission
  79. sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_ADMIN, NO_ACCESS)
  80. sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_EDIT, NO_ACCESS)
  81. sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_VIEW, NO_ACCESS)
  82. // parent folder has user with permission
  83. sc.parentFolderPermissionScenario(USER, m.PERMISSION_ADMIN, FULL_ACCESS)
  84. sc.parentFolderPermissionScenario(USER, m.PERMISSION_EDIT, EDITOR_ACCESS)
  85. sc.parentFolderPermissionScenario(USER, m.PERMISSION_VIEW, VIEWER_ACCESS)
  86. // parent folder has team with permission
  87. sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_ADMIN, FULL_ACCESS)
  88. sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_EDIT, EDITOR_ACCESS)
  89. sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_VIEW, VIEWER_ACCESS)
  90. // parent folder has editor role with permission
  91. sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_ADMIN, FULL_ACCESS)
  92. sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_EDIT, EDITOR_ACCESS)
  93. sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_VIEW, VIEWER_ACCESS)
  94. // parent folder has viweer role with permission
  95. sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_ADMIN, NO_ACCESS)
  96. sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_EDIT, NO_ACCESS)
  97. sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_VIEW, NO_ACCESS)
  98. })
  99. })
  100. }
  101. func TestGuardianViewer(t *testing.T) {
  102. Convey("Guardian viewer org role tests", t, func() {
  103. orgRoleScenario("Given user has viewer org role", t, m.ROLE_VIEWER, func(sc *scenarioContext) {
  104. // dashboard has user with permission
  105. sc.dashboardPermissionScenario(USER, m.PERMISSION_ADMIN, FULL_ACCESS)
  106. sc.dashboardPermissionScenario(USER, m.PERMISSION_EDIT, EDITOR_ACCESS)
  107. sc.dashboardPermissionScenario(USER, m.PERMISSION_VIEW, VIEWER_ACCESS)
  108. // dashboard has team with permission
  109. sc.dashboardPermissionScenario(TEAM, m.PERMISSION_ADMIN, FULL_ACCESS)
  110. sc.dashboardPermissionScenario(TEAM, m.PERMISSION_EDIT, EDITOR_ACCESS)
  111. sc.dashboardPermissionScenario(TEAM, m.PERMISSION_VIEW, VIEWER_ACCESS)
  112. // dashboard has editor role with permission
  113. sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_ADMIN, NO_ACCESS)
  114. sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_EDIT, NO_ACCESS)
  115. sc.dashboardPermissionScenario(EDITOR, m.PERMISSION_VIEW, NO_ACCESS)
  116. // dashboard has viewer role with permission
  117. sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_ADMIN, FULL_ACCESS)
  118. sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_EDIT, EDITOR_ACCESS)
  119. sc.dashboardPermissionScenario(VIEWER, m.PERMISSION_VIEW, VIEWER_ACCESS)
  120. // parent folder has user with permission
  121. sc.parentFolderPermissionScenario(USER, m.PERMISSION_ADMIN, FULL_ACCESS)
  122. sc.parentFolderPermissionScenario(USER, m.PERMISSION_EDIT, EDITOR_ACCESS)
  123. sc.parentFolderPermissionScenario(USER, m.PERMISSION_VIEW, VIEWER_ACCESS)
  124. // parent folder has team with permission
  125. sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_ADMIN, FULL_ACCESS)
  126. sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_EDIT, EDITOR_ACCESS)
  127. sc.parentFolderPermissionScenario(TEAM, m.PERMISSION_VIEW, VIEWER_ACCESS)
  128. // parent folder has editor role with permission
  129. sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_ADMIN, NO_ACCESS)
  130. sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_EDIT, NO_ACCESS)
  131. sc.parentFolderPermissionScenario(EDITOR, m.PERMISSION_VIEW, NO_ACCESS)
  132. // parent folder has viweer role with permission
  133. sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_ADMIN, FULL_ACCESS)
  134. sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_EDIT, EDITOR_ACCESS)
  135. sc.parentFolderPermissionScenario(VIEWER, m.PERMISSION_VIEW, VIEWER_ACCESS)
  136. })
  137. })
  138. }
  139. func (sc *scenarioContext) defaultPermissionScenario(pt permissionType, permission m.PermissionType, flag permissionFlags) {
  140. _, callerFile, callerLine, _ := runtime.Caller(1)
  141. sc.callerFile = callerFile
  142. sc.callerLine = callerLine
  143. existingPermissions := []*m.DashboardAclInfoDTO{
  144. toDto(newEditorRolePermission(defaultDashboardID, m.PERMISSION_EDIT)),
  145. toDto(newViewerRolePermission(defaultDashboardID, m.PERMISSION_VIEW)),
  146. }
  147. 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) {
  148. sc.expectedFlags = flag
  149. sc.verifyExpectedPermissionsFlags()
  150. sc.verifyDuplicatePermissionsShouldNotBeAllowed()
  151. sc.verifyUpdateDashboardPermissionsShouldBeAllowed(pt)
  152. sc.verifyUpdateDashboardPermissionsShouldNotBeAllowed(pt)
  153. })
  154. }
  155. func (sc *scenarioContext) dashboardPermissionScenario(pt permissionType, permission m.PermissionType, flag permissionFlags) {
  156. _, callerFile, callerLine, _ := runtime.Caller(1)
  157. sc.callerFile = callerFile
  158. sc.callerLine = callerLine
  159. var existingPermissions []*m.DashboardAclInfoDTO
  160. switch pt {
  161. case USER:
  162. existingPermissions = []*m.DashboardAclInfoDTO{{OrgId: orgID, DashboardId: dashboardID, UserId: userID, Permission: permission}}
  163. case TEAM:
  164. existingPermissions = []*m.DashboardAclInfoDTO{{OrgId: orgID, DashboardId: dashboardID, TeamId: teamID, Permission: permission}}
  165. case EDITOR:
  166. existingPermissions = []*m.DashboardAclInfoDTO{{OrgId: orgID, DashboardId: dashboardID, Role: &editorRole, Permission: permission}}
  167. case VIEWER:
  168. existingPermissions = []*m.DashboardAclInfoDTO{{OrgId: orgID, DashboardId: dashboardID, Role: &viewerRole, Permission: permission}}
  169. }
  170. permissionScenario(fmt.Sprintf("and %s has permission to %s dashboard", pt.String(), permission.String()), dashboardID, sc, existingPermissions, func(sc *scenarioContext) {
  171. sc.expectedFlags = flag
  172. sc.verifyExpectedPermissionsFlags()
  173. sc.verifyDuplicatePermissionsShouldNotBeAllowed()
  174. sc.verifyUpdateDashboardPermissionsShouldBeAllowed(pt)
  175. sc.verifyUpdateDashboardPermissionsShouldNotBeAllowed(pt)
  176. })
  177. }
  178. func (sc *scenarioContext) parentFolderPermissionScenario(pt permissionType, permission m.PermissionType, flag permissionFlags) {
  179. _, callerFile, callerLine, _ := runtime.Caller(1)
  180. sc.callerFile = callerFile
  181. sc.callerLine = callerLine
  182. var folderPermissionList []*m.DashboardAclInfoDTO
  183. switch pt {
  184. case USER:
  185. folderPermissionList = []*m.DashboardAclInfoDTO{{OrgId: orgID, DashboardId: parentFolderID, UserId: userID, Permission: permission}}
  186. case TEAM:
  187. folderPermissionList = []*m.DashboardAclInfoDTO{{OrgId: orgID, DashboardId: parentFolderID, TeamId: teamID, Permission: permission}}
  188. case EDITOR:
  189. folderPermissionList = []*m.DashboardAclInfoDTO{{OrgId: orgID, DashboardId: parentFolderID, Role: &editorRole, Permission: permission}}
  190. case VIEWER:
  191. folderPermissionList = []*m.DashboardAclInfoDTO{{OrgId: orgID, DashboardId: parentFolderID, Role: &viewerRole, Permission: permission}}
  192. }
  193. permissionScenario(fmt.Sprintf("and parent folder has %s with permission to %s", pt.String(), permission.String()), childDashboardID, sc, folderPermissionList, func(sc *scenarioContext) {
  194. sc.expectedFlags = flag
  195. sc.verifyExpectedPermissionsFlags()
  196. sc.verifyDuplicatePermissionsShouldNotBeAllowed()
  197. sc.verifyUpdateChildDashboardPermissionsShouldBeAllowed(pt, permission)
  198. sc.verifyUpdateChildDashboardPermissionsShouldNotBeAllowed(pt, permission)
  199. sc.verifyUpdateChildDashboardPermissionsWithOverrideShouldBeAllowed(pt, permission)
  200. sc.verifyUpdateChildDashboardPermissionsWithOverrideShouldNotBeAllowed(pt, permission)
  201. })
  202. }
  203. func (sc *scenarioContext) verifyExpectedPermissionsFlags() {
  204. canAdmin, _ := sc.g.CanAdmin()
  205. canEdit, _ := sc.g.CanEdit()
  206. canSave, _ := sc.g.CanSave()
  207. canView, _ := sc.g.CanView()
  208. tc := fmt.Sprintf("should have permissions to %s", sc.expectedFlags.String())
  209. Convey(tc, func() {
  210. var actualFlag permissionFlags
  211. if canAdmin {
  212. actualFlag |= CAN_ADMIN
  213. }
  214. if canEdit {
  215. actualFlag |= CAN_EDIT
  216. }
  217. if canSave {
  218. actualFlag |= CAN_SAVE
  219. }
  220. if canView {
  221. actualFlag |= CAN_VIEW
  222. }
  223. if actualFlag.noAccess() {
  224. actualFlag = NO_ACCESS
  225. }
  226. if sc.expectedFlags&actualFlag != sc.expectedFlags {
  227. sc.reportFailure(tc, sc.expectedFlags.String(), actualFlag.String())
  228. }
  229. sc.reportSuccess()
  230. })
  231. }
  232. func (sc *scenarioContext) verifyDuplicatePermissionsShouldNotBeAllowed() {
  233. if !sc.expectedFlags.canAdmin() {
  234. return
  235. }
  236. tc := "When updating dashboard permissions with duplicate permission for user should not be allowed"
  237. Convey(tc, func() {
  238. p := []*m.DashboardAcl{
  239. newDefaultUserPermission(dashboardID, m.PERMISSION_VIEW),
  240. newDefaultUserPermission(dashboardID, m.PERMISSION_ADMIN),
  241. }
  242. sc.updatePermissions = p
  243. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  244. if err != ErrGuardianPermissionExists {
  245. sc.reportFailure(tc, ErrGuardianPermissionExists, err)
  246. }
  247. sc.reportSuccess()
  248. })
  249. tc = "When updating dashboard permissions with duplicate permission for team should not be allowed"
  250. Convey(tc, func() {
  251. p := []*m.DashboardAcl{
  252. newDefaultTeamPermission(dashboardID, m.PERMISSION_VIEW),
  253. newDefaultTeamPermission(dashboardID, m.PERMISSION_ADMIN),
  254. }
  255. sc.updatePermissions = p
  256. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  257. if err != ErrGuardianPermissionExists {
  258. sc.reportFailure(tc, ErrGuardianPermissionExists, err)
  259. }
  260. sc.reportSuccess()
  261. })
  262. tc = "When updating dashboard permissions with duplicate permission for editor role should not be allowed"
  263. Convey(tc, func() {
  264. p := []*m.DashboardAcl{
  265. newEditorRolePermission(dashboardID, m.PERMISSION_VIEW),
  266. newEditorRolePermission(dashboardID, m.PERMISSION_ADMIN),
  267. }
  268. sc.updatePermissions = p
  269. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  270. if err != ErrGuardianPermissionExists {
  271. sc.reportFailure(tc, ErrGuardianPermissionExists, err)
  272. }
  273. sc.reportSuccess()
  274. })
  275. tc = "When updating dashboard permissions with duplicate permission for viewer role should not be allowed"
  276. Convey(tc, func() {
  277. p := []*m.DashboardAcl{
  278. newViewerRolePermission(dashboardID, m.PERMISSION_VIEW),
  279. newViewerRolePermission(dashboardID, m.PERMISSION_ADMIN),
  280. }
  281. sc.updatePermissions = p
  282. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  283. if err != ErrGuardianPermissionExists {
  284. sc.reportFailure(tc, ErrGuardianPermissionExists, err)
  285. }
  286. sc.reportSuccess()
  287. })
  288. tc = "When updating dashboard permissions with duplicate permission for admin role should not be allowed"
  289. Convey(tc, func() {
  290. p := []*m.DashboardAcl{
  291. newAdminRolePermission(dashboardID, m.PERMISSION_ADMIN),
  292. }
  293. sc.updatePermissions = p
  294. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  295. if err != ErrGuardianPermissionExists {
  296. sc.reportFailure(tc, ErrGuardianPermissionExists, err)
  297. }
  298. sc.reportSuccess()
  299. })
  300. }
  301. func (sc *scenarioContext) verifyUpdateDashboardPermissionsShouldBeAllowed(pt permissionType) {
  302. if !sc.expectedFlags.canAdmin() {
  303. return
  304. }
  305. for _, p := range []m.PermissionType{m.PERMISSION_ADMIN, m.PERMISSION_EDIT, m.PERMISSION_VIEW} {
  306. tc := fmt.Sprintf("When updating dashboard permissions with %s permissions should be allowed", p.String())
  307. Convey(tc, func() {
  308. permissionList := []*m.DashboardAcl{}
  309. switch pt {
  310. case USER:
  311. permissionList = []*m.DashboardAcl{
  312. newEditorRolePermission(dashboardID, p),
  313. newViewerRolePermission(dashboardID, p),
  314. newCustomUserPermission(dashboardID, otherUserID, p),
  315. newDefaultTeamPermission(dashboardID, p),
  316. }
  317. case TEAM:
  318. permissionList = []*m.DashboardAcl{
  319. newEditorRolePermission(dashboardID, p),
  320. newViewerRolePermission(dashboardID, p),
  321. newDefaultUserPermission(dashboardID, p),
  322. newCustomTeamPermission(dashboardID, otherTeamID, p),
  323. }
  324. case EDITOR, VIEWER:
  325. permissionList = []*m.DashboardAcl{
  326. newEditorRolePermission(dashboardID, p),
  327. newViewerRolePermission(dashboardID, p),
  328. newDefaultUserPermission(dashboardID, p),
  329. newDefaultTeamPermission(dashboardID, p),
  330. }
  331. }
  332. sc.updatePermissions = permissionList
  333. ok, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, permissionList)
  334. if err != nil {
  335. sc.reportFailure(tc, nil, err)
  336. }
  337. if !ok {
  338. sc.reportFailure(tc, false, true)
  339. }
  340. sc.reportSuccess()
  341. })
  342. }
  343. }
  344. func (sc *scenarioContext) verifyUpdateDashboardPermissionsShouldNotBeAllowed(pt permissionType) {
  345. if sc.expectedFlags.canAdmin() {
  346. return
  347. }
  348. for _, p := range []m.PermissionType{m.PERMISSION_ADMIN, m.PERMISSION_EDIT, m.PERMISSION_VIEW} {
  349. tc := fmt.Sprintf("When updating dashboard permissions with %s permissions should NOT be allowed", p.String())
  350. Convey(tc, func() {
  351. permissionList := []*m.DashboardAcl{
  352. newEditorRolePermission(dashboardID, p),
  353. newViewerRolePermission(dashboardID, p),
  354. }
  355. switch pt {
  356. case USER:
  357. permissionList = append(permissionList, []*m.DashboardAcl{
  358. newCustomUserPermission(dashboardID, otherUserID, p),
  359. newDefaultTeamPermission(dashboardID, p),
  360. }...)
  361. case TEAM:
  362. permissionList = append(permissionList, []*m.DashboardAcl{
  363. newDefaultUserPermission(dashboardID, p),
  364. newCustomTeamPermission(dashboardID, otherTeamID, p),
  365. }...)
  366. }
  367. sc.updatePermissions = permissionList
  368. ok, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, permissionList)
  369. if err != nil {
  370. sc.reportFailure(tc, nil, err)
  371. }
  372. if ok {
  373. sc.reportFailure(tc, true, false)
  374. }
  375. sc.reportSuccess()
  376. })
  377. }
  378. }
  379. func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsShouldBeAllowed(pt permissionType, parentFolderPermission m.PermissionType) {
  380. if !sc.expectedFlags.canAdmin() {
  381. return
  382. }
  383. for _, p := range []m.PermissionType{m.PERMISSION_ADMIN, m.PERMISSION_EDIT, m.PERMISSION_VIEW} {
  384. tc := fmt.Sprintf("When updating child dashboard permissions with %s permissions should be allowed", p.String())
  385. Convey(tc, func() {
  386. permissionList := []*m.DashboardAcl{}
  387. switch pt {
  388. case USER:
  389. permissionList = []*m.DashboardAcl{
  390. newEditorRolePermission(childDashboardID, p),
  391. newViewerRolePermission(childDashboardID, p),
  392. newCustomUserPermission(childDashboardID, otherUserID, p),
  393. newDefaultTeamPermission(childDashboardID, p),
  394. }
  395. case TEAM:
  396. permissionList = []*m.DashboardAcl{
  397. newEditorRolePermission(childDashboardID, p),
  398. newViewerRolePermission(childDashboardID, p),
  399. newDefaultUserPermission(childDashboardID, p),
  400. newCustomTeamPermission(childDashboardID, otherTeamID, p),
  401. }
  402. case EDITOR:
  403. permissionList = []*m.DashboardAcl{
  404. newViewerRolePermission(childDashboardID, p),
  405. newDefaultUserPermission(childDashboardID, p),
  406. newDefaultTeamPermission(childDashboardID, p),
  407. }
  408. // permission to update is higher than parent folder permission
  409. if p > parentFolderPermission {
  410. permissionList = append(permissionList, newEditorRolePermission(childDashboardID, p))
  411. }
  412. case VIEWER:
  413. permissionList = []*m.DashboardAcl{
  414. newEditorRolePermission(childDashboardID, p),
  415. newDefaultUserPermission(childDashboardID, p),
  416. newDefaultTeamPermission(childDashboardID, p),
  417. }
  418. // permission to update is higher than parent folder permission
  419. if p > parentFolderPermission {
  420. permissionList = append(permissionList, newViewerRolePermission(childDashboardID, p))
  421. }
  422. }
  423. sc.updatePermissions = permissionList
  424. ok, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, permissionList)
  425. if err != nil {
  426. sc.reportFailure(tc, nil, err)
  427. }
  428. if !ok {
  429. sc.reportFailure(tc, false, true)
  430. }
  431. sc.reportSuccess()
  432. })
  433. }
  434. }
  435. func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsShouldNotBeAllowed(pt permissionType, parentFolderPermission m.PermissionType) {
  436. if sc.expectedFlags.canAdmin() {
  437. return
  438. }
  439. for _, p := range []m.PermissionType{m.PERMISSION_ADMIN, m.PERMISSION_EDIT, m.PERMISSION_VIEW} {
  440. tc := fmt.Sprintf("When updating child dashboard permissions with %s permissions should NOT be allowed", p.String())
  441. Convey(tc, func() {
  442. permissionList := []*m.DashboardAcl{}
  443. switch pt {
  444. case USER:
  445. permissionList = []*m.DashboardAcl{
  446. newEditorRolePermission(childDashboardID, p),
  447. newViewerRolePermission(childDashboardID, p),
  448. newCustomUserPermission(childDashboardID, otherUserID, p),
  449. newDefaultTeamPermission(childDashboardID, p),
  450. }
  451. case TEAM:
  452. permissionList = []*m.DashboardAcl{
  453. newEditorRolePermission(childDashboardID, p),
  454. newViewerRolePermission(childDashboardID, p),
  455. newDefaultUserPermission(childDashboardID, p),
  456. newCustomTeamPermission(childDashboardID, otherTeamID, p),
  457. }
  458. case EDITOR:
  459. permissionList = []*m.DashboardAcl{
  460. newViewerRolePermission(childDashboardID, p),
  461. newDefaultUserPermission(childDashboardID, p),
  462. newDefaultTeamPermission(childDashboardID, p),
  463. }
  464. // perminssion to update is higher than parent folder permission
  465. if p > parentFolderPermission {
  466. permissionList = append(permissionList, newEditorRolePermission(childDashboardID, p))
  467. }
  468. case VIEWER:
  469. permissionList = []*m.DashboardAcl{
  470. newEditorRolePermission(childDashboardID, p),
  471. newDefaultUserPermission(childDashboardID, p),
  472. newDefaultTeamPermission(childDashboardID, p),
  473. }
  474. // perminssion to update is higher than parent folder permission
  475. if p > parentFolderPermission {
  476. permissionList = append(permissionList, newViewerRolePermission(childDashboardID, p))
  477. }
  478. }
  479. sc.updatePermissions = permissionList
  480. ok, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, permissionList)
  481. if err != nil {
  482. sc.reportFailure(tc, nil, err)
  483. }
  484. if ok {
  485. sc.reportFailure(tc, true, false)
  486. }
  487. sc.reportSuccess()
  488. })
  489. }
  490. }
  491. func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsWithOverrideShouldBeAllowed(pt permissionType, parentFolderPermission m.PermissionType) {
  492. if !sc.expectedFlags.canAdmin() {
  493. return
  494. }
  495. for _, p := range []m.PermissionType{m.PERMISSION_ADMIN, m.PERMISSION_EDIT, m.PERMISSION_VIEW} {
  496. // perminssion to update is higher tban parent folder permission
  497. if p > parentFolderPermission {
  498. continue
  499. }
  500. tc := fmt.Sprintf("When updating child dashboard permissions overriding parent %s permission with %s permission should NOT be allowed", pt.String(), p.String())
  501. Convey(tc, func() {
  502. permissionList := []*m.DashboardAcl{}
  503. switch pt {
  504. case USER:
  505. permissionList = []*m.DashboardAcl{
  506. newDefaultUserPermission(childDashboardID, p),
  507. }
  508. case TEAM:
  509. permissionList = []*m.DashboardAcl{
  510. newDefaultTeamPermission(childDashboardID, p),
  511. }
  512. case EDITOR:
  513. permissionList = []*m.DashboardAcl{
  514. newEditorRolePermission(childDashboardID, p),
  515. }
  516. case VIEWER:
  517. permissionList = []*m.DashboardAcl{
  518. newViewerRolePermission(childDashboardID, p),
  519. }
  520. }
  521. sc.updatePermissions = permissionList
  522. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, permissionList)
  523. if err != ErrGuardianOverride {
  524. sc.reportFailure(tc, ErrGuardianOverride, err)
  525. }
  526. sc.reportSuccess()
  527. })
  528. }
  529. }
  530. func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsWithOverrideShouldNotBeAllowed(pt permissionType, parentFolderPermission m.PermissionType) {
  531. if !sc.expectedFlags.canAdmin() {
  532. return
  533. }
  534. for _, p := range []m.PermissionType{m.PERMISSION_ADMIN, m.PERMISSION_EDIT, m.PERMISSION_VIEW} {
  535. // perminssion to update is lower than/equal parent folder permission
  536. if p <= parentFolderPermission {
  537. continue
  538. }
  539. tc := fmt.Sprintf("When updating child dashboard permissions overriding parent %s permission with %s permission should be allowed", pt.String(), p.String())
  540. Convey(tc, func() {
  541. permissionList := []*m.DashboardAcl{}
  542. switch pt {
  543. case USER:
  544. permissionList = []*m.DashboardAcl{
  545. newDefaultUserPermission(childDashboardID, p),
  546. }
  547. case TEAM:
  548. permissionList = []*m.DashboardAcl{
  549. newDefaultTeamPermission(childDashboardID, p),
  550. }
  551. case EDITOR:
  552. permissionList = []*m.DashboardAcl{
  553. newEditorRolePermission(childDashboardID, p),
  554. }
  555. case VIEWER:
  556. permissionList = []*m.DashboardAcl{
  557. newViewerRolePermission(childDashboardID, p),
  558. }
  559. }
  560. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, permissionList)
  561. sc.updatePermissions = permissionList
  562. ok, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, permissionList)
  563. if err != nil {
  564. sc.reportFailure(tc, nil, err)
  565. }
  566. if !ok {
  567. sc.reportFailure(tc, false, true)
  568. }
  569. sc.reportSuccess()
  570. })
  571. }
  572. }