guardian_test.go 25 KB

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