guardian_test.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711
  1. package guardian
  2. import (
  3. "fmt"
  4. "testing"
  5. "github.com/grafana/grafana/pkg/bus"
  6. m "github.com/grafana/grafana/pkg/models"
  7. . "github.com/smartystreets/goconvey/convey"
  8. )
  9. func TestGuardian(t *testing.T) {
  10. Convey("Guardian permission tests", t, func() {
  11. orgRoleScenario("Given user has admin org role", m.ROLE_ADMIN, func(sc *scenarioContext) {
  12. canAdmin, _ := sc.g.CanAdmin()
  13. canEdit, _ := sc.g.CanEdit()
  14. canSave, _ := sc.g.CanSave()
  15. canView, _ := sc.g.CanView()
  16. So(canAdmin, ShouldBeTrue)
  17. So(canEdit, ShouldBeTrue)
  18. So(canSave, ShouldBeTrue)
  19. So(canView, ShouldBeTrue)
  20. Convey("When trying to update permissions", func() {
  21. Convey("With duplicate user permissions should return error", func() {
  22. p := []*m.DashboardAcl{
  23. {OrgId: 1, DashboardId: 1, UserId: 1, Permission: m.PERMISSION_VIEW},
  24. {OrgId: 1, DashboardId: 1, UserId: 1, Permission: m.PERMISSION_ADMIN},
  25. }
  26. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  27. So(err, ShouldEqual, ErrGuardianPermissionExists)
  28. })
  29. Convey("With duplicate team permissions should return error", func() {
  30. p := []*m.DashboardAcl{
  31. {OrgId: 1, DashboardId: 1, TeamId: 1, Permission: m.PERMISSION_VIEW},
  32. {OrgId: 1, DashboardId: 1, TeamId: 1, Permission: m.PERMISSION_ADMIN},
  33. }
  34. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  35. So(err, ShouldEqual, ErrGuardianPermissionExists)
  36. })
  37. Convey("With duplicate everyone with editor role permission should return error", func() {
  38. r := m.ROLE_EDITOR
  39. p := []*m.DashboardAcl{
  40. {OrgId: 1, DashboardId: 1, Role: &r, Permission: m.PERMISSION_VIEW},
  41. {OrgId: 1, DashboardId: 1, Role: &r, Permission: m.PERMISSION_ADMIN},
  42. }
  43. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  44. So(err, ShouldEqual, ErrGuardianPermissionExists)
  45. })
  46. Convey("With duplicate everyone with viewer role permission should return error", func() {
  47. r := m.ROLE_VIEWER
  48. p := []*m.DashboardAcl{
  49. {OrgId: 1, DashboardId: 1, Role: &r, Permission: m.PERMISSION_VIEW},
  50. {OrgId: 1, DashboardId: 1, Role: &r, Permission: m.PERMISSION_ADMIN},
  51. }
  52. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  53. So(err, ShouldEqual, ErrGuardianPermissionExists)
  54. })
  55. Convey("With everyone with admin role permission should return error", func() {
  56. r := m.ROLE_ADMIN
  57. p := []*m.DashboardAcl{
  58. {OrgId: 1, DashboardId: 1, Role: &r, Permission: m.PERMISSION_ADMIN},
  59. }
  60. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  61. So(err, ShouldEqual, ErrGuardianPermissionExists)
  62. })
  63. })
  64. Convey("Given default permissions", func() {
  65. editor := m.ROLE_EDITOR
  66. viewer := m.ROLE_VIEWER
  67. existingPermissions := []*m.DashboardAclInfoDTO{
  68. {OrgId: 1, DashboardId: -1, Role: &editor, Permission: m.PERMISSION_EDIT},
  69. {OrgId: 1, DashboardId: -1, Role: &viewer, Permission: m.PERMISSION_VIEW},
  70. }
  71. bus.AddHandler("test", func(query *m.GetDashboardAclInfoListQuery) error {
  72. query.Result = existingPermissions
  73. return nil
  74. })
  75. Convey("When trying to update dashboard permissions without everyone with role editor can edit should be allowed", func() {
  76. r := m.ROLE_VIEWER
  77. p := []*m.DashboardAcl{
  78. {OrgId: 1, DashboardId: 1, Role: &r, Permission: m.PERMISSION_VIEW},
  79. }
  80. ok, _ := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  81. So(ok, ShouldBeTrue)
  82. })
  83. Convey("When trying to update dashboard permissions without everyone with role viewer can view should be allowed", func() {
  84. r := m.ROLE_EDITOR
  85. p := []*m.DashboardAcl{
  86. {OrgId: 1, DashboardId: 1, Role: &r, Permission: m.PERMISSION_EDIT},
  87. }
  88. ok, _ := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  89. So(ok, ShouldBeTrue)
  90. })
  91. })
  92. Convey("Given parent folder has user admin permission", func() {
  93. existingPermissions := []*m.DashboardAclInfoDTO{
  94. {OrgId: 1, DashboardId: 2, UserId: 1, Permission: m.PERMISSION_ADMIN},
  95. }
  96. bus.AddHandler("test", func(query *m.GetDashboardAclInfoListQuery) error {
  97. query.Result = existingPermissions
  98. return nil
  99. })
  100. Convey("When trying to update dashboard permissions with admin user permission should return error", func() {
  101. p := []*m.DashboardAcl{
  102. {OrgId: 1, DashboardId: 3, UserId: 1, Permission: m.PERMISSION_ADMIN},
  103. }
  104. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  105. So(err, ShouldEqual, ErrGuardianOverride)
  106. })
  107. Convey("When trying to update dashboard permissions with edit user permission should return error", func() {
  108. p := []*m.DashboardAcl{
  109. {OrgId: 1, DashboardId: 3, UserId: 1, Permission: m.PERMISSION_EDIT},
  110. }
  111. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  112. So(err, ShouldEqual, ErrGuardianOverride)
  113. })
  114. Convey("When trying to update dashboard permissions with view user permission should return error", func() {
  115. p := []*m.DashboardAcl{
  116. {OrgId: 1, DashboardId: 3, UserId: 1, Permission: m.PERMISSION_VIEW},
  117. }
  118. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  119. So(err, ShouldEqual, ErrGuardianOverride)
  120. })
  121. })
  122. Convey("Given parent folder has user edit permission", func() {
  123. existingPermissions := []*m.DashboardAclInfoDTO{
  124. {OrgId: 1, DashboardId: 2, UserId: 1, Permission: m.PERMISSION_EDIT},
  125. }
  126. bus.AddHandler("test", func(query *m.GetDashboardAclInfoListQuery) error {
  127. query.Result = existingPermissions
  128. return nil
  129. })
  130. Convey("When trying to update dashboard permissions with admin user permission should be allowed", func() {
  131. p := []*m.DashboardAcl{
  132. {OrgId: 1, DashboardId: 3, UserId: 1, Permission: m.PERMISSION_ADMIN},
  133. }
  134. ok, _ := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  135. So(ok, ShouldBeTrue)
  136. })
  137. Convey("When trying to update dashboard permissions with edit user permission should return error", func() {
  138. p := []*m.DashboardAcl{
  139. {OrgId: 1, DashboardId: 3, UserId: 1, Permission: m.PERMISSION_EDIT},
  140. }
  141. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  142. So(err, ShouldEqual, ErrGuardianOverride)
  143. })
  144. Convey("When trying to update dashboard permissions with view user permission should return error", func() {
  145. p := []*m.DashboardAcl{
  146. {OrgId: 1, DashboardId: 3, UserId: 1, Permission: m.PERMISSION_VIEW},
  147. }
  148. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  149. So(err, ShouldEqual, ErrGuardianOverride)
  150. })
  151. })
  152. Convey("Given parent folder has user view permission", func() {
  153. existingPermissions := []*m.DashboardAclInfoDTO{
  154. {OrgId: 1, DashboardId: 2, UserId: 1, Permission: m.PERMISSION_VIEW},
  155. }
  156. bus.AddHandler("test", func(query *m.GetDashboardAclInfoListQuery) error {
  157. query.Result = existingPermissions
  158. return nil
  159. })
  160. Convey("When trying to update dashboard permissions with admin user permission should be allowed", func() {
  161. p := []*m.DashboardAcl{
  162. {OrgId: 1, DashboardId: 3, UserId: 1, Permission: m.PERMISSION_ADMIN},
  163. }
  164. ok, _ := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  165. So(ok, ShouldBeTrue)
  166. })
  167. Convey("When trying to update dashboard permissions with edit user permission should be allowed", func() {
  168. p := []*m.DashboardAcl{
  169. {OrgId: 1, DashboardId: 3, UserId: 1, Permission: m.PERMISSION_EDIT},
  170. }
  171. ok, _ := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  172. So(ok, ShouldBeTrue)
  173. })
  174. Convey("When trying to update dashboard permissions with view user permission should return error", func() {
  175. p := []*m.DashboardAcl{
  176. {OrgId: 1, DashboardId: 3, UserId: 1, Permission: m.PERMISSION_VIEW},
  177. }
  178. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  179. So(err, ShouldEqual, ErrGuardianOverride)
  180. })
  181. })
  182. Convey("Given parent folder has team admin permission", func() {
  183. existingPermissions := []*m.DashboardAclInfoDTO{
  184. {OrgId: 1, DashboardId: 2, TeamId: 1, Permission: m.PERMISSION_ADMIN},
  185. }
  186. bus.AddHandler("test", func(query *m.GetDashboardAclInfoListQuery) error {
  187. query.Result = existingPermissions
  188. return nil
  189. })
  190. Convey("When trying to update dashboard permissions with admin team permission should return error", func() {
  191. p := []*m.DashboardAcl{
  192. {OrgId: 1, DashboardId: 3, TeamId: 1, Permission: m.PERMISSION_ADMIN},
  193. }
  194. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  195. So(err, ShouldEqual, ErrGuardianOverride)
  196. })
  197. Convey("When trying to update dashboard permissions with edit team permission should return error", func() {
  198. p := []*m.DashboardAcl{
  199. {OrgId: 1, DashboardId: 3, TeamId: 1, Permission: m.PERMISSION_EDIT},
  200. }
  201. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  202. So(err, ShouldEqual, ErrGuardianOverride)
  203. })
  204. Convey("When trying to update dashboard permissions with view team permission should return error", func() {
  205. p := []*m.DashboardAcl{
  206. {OrgId: 1, DashboardId: 3, TeamId: 1, Permission: m.PERMISSION_VIEW},
  207. }
  208. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  209. So(err, ShouldEqual, ErrGuardianOverride)
  210. })
  211. })
  212. Convey("Given parent folder has team edit permission", func() {
  213. existingPermissions := []*m.DashboardAclInfoDTO{
  214. {OrgId: 1, DashboardId: 2, TeamId: 1, Permission: m.PERMISSION_EDIT},
  215. }
  216. bus.AddHandler("test", func(query *m.GetDashboardAclInfoListQuery) error {
  217. query.Result = existingPermissions
  218. return nil
  219. })
  220. Convey("When trying to update dashboard permissions with admin team permission should be allowed", func() {
  221. p := []*m.DashboardAcl{
  222. {OrgId: 1, DashboardId: 3, TeamId: 1, Permission: m.PERMISSION_ADMIN},
  223. }
  224. ok, _ := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  225. So(ok, ShouldBeTrue)
  226. })
  227. Convey("When trying to update dashboard permissions with edit team permission should return error", func() {
  228. p := []*m.DashboardAcl{
  229. {OrgId: 1, DashboardId: 3, TeamId: 1, Permission: m.PERMISSION_EDIT},
  230. }
  231. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  232. So(err, ShouldEqual, ErrGuardianOverride)
  233. })
  234. Convey("When trying to update dashboard permissions with view team permission should return error", func() {
  235. p := []*m.DashboardAcl{
  236. {OrgId: 1, DashboardId: 3, TeamId: 1, Permission: m.PERMISSION_VIEW},
  237. }
  238. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  239. So(err, ShouldEqual, ErrGuardianOverride)
  240. })
  241. })
  242. Convey("Given parent folder has team view permission", func() {
  243. existingPermissions := []*m.DashboardAclInfoDTO{
  244. {OrgId: 1, DashboardId: 2, TeamId: 1, Permission: m.PERMISSION_VIEW},
  245. }
  246. bus.AddHandler("test", func(query *m.GetDashboardAclInfoListQuery) error {
  247. query.Result = existingPermissions
  248. return nil
  249. })
  250. Convey("When trying to update dashboard permissions with admin team permission should be allowed", func() {
  251. p := []*m.DashboardAcl{
  252. {OrgId: 1, DashboardId: 3, TeamId: 1, Permission: m.PERMISSION_ADMIN},
  253. }
  254. ok, _ := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  255. So(ok, ShouldBeTrue)
  256. })
  257. Convey("When trying to update dashboard permissions with edit team permission should be allowed", func() {
  258. p := []*m.DashboardAcl{
  259. {OrgId: 1, DashboardId: 3, TeamId: 1, Permission: m.PERMISSION_EDIT},
  260. }
  261. ok, _ := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  262. So(ok, ShouldBeTrue)
  263. })
  264. Convey("When trying to update dashboard permissions with view team permission should return error", func() {
  265. p := []*m.DashboardAcl{
  266. {OrgId: 1, DashboardId: 3, TeamId: 1, Permission: m.PERMISSION_VIEW},
  267. }
  268. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  269. So(err, ShouldEqual, ErrGuardianOverride)
  270. })
  271. })
  272. Convey("Given parent folder has editor role with edit permission", func() {
  273. r := m.ROLE_EDITOR
  274. existingPermissions := []*m.DashboardAclInfoDTO{
  275. {OrgId: 1, DashboardId: 2, Role: &r, Permission: m.PERMISSION_EDIT},
  276. }
  277. bus.AddHandler("test", func(query *m.GetDashboardAclInfoListQuery) error {
  278. query.Result = existingPermissions
  279. return nil
  280. })
  281. Convey("When trying to update dashboard permissions with everyone with editor role can admin permission should be allowed", func() {
  282. p := []*m.DashboardAcl{
  283. {OrgId: 1, DashboardId: 3, Role: &r, Permission: m.PERMISSION_ADMIN},
  284. }
  285. ok, _ := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  286. So(ok, ShouldBeTrue)
  287. })
  288. Convey("When trying to update dashboard permissions with everyone with editor role can edit permission should return error", func() {
  289. p := []*m.DashboardAcl{
  290. {OrgId: 1, DashboardId: 3, Role: &r, Permission: m.PERMISSION_EDIT},
  291. }
  292. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  293. So(err, ShouldEqual, ErrGuardianOverride)
  294. })
  295. Convey("When trying to update dashboard permissions with everyone with editor role can view permission should return error", func() {
  296. p := []*m.DashboardAcl{
  297. {OrgId: 1, DashboardId: 3, Role: &r, Permission: m.PERMISSION_VIEW},
  298. }
  299. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  300. So(err, ShouldEqual, ErrGuardianOverride)
  301. })
  302. })
  303. Convey("Given parent folder has editor role with view permission", func() {
  304. r := m.ROLE_EDITOR
  305. existingPermissions := []*m.DashboardAclInfoDTO{
  306. {OrgId: 1, DashboardId: 2, Role: &r, Permission: m.PERMISSION_VIEW},
  307. }
  308. bus.AddHandler("test", func(query *m.GetDashboardAclInfoListQuery) error {
  309. query.Result = existingPermissions
  310. return nil
  311. })
  312. Convey("When trying to update dashboard permissions with everyone with viewer role can admin permission should be allowed", func() {
  313. p := []*m.DashboardAcl{
  314. {OrgId: 1, DashboardId: 3, Role: &r, Permission: m.PERMISSION_ADMIN},
  315. }
  316. ok, _ := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  317. So(ok, ShouldBeTrue)
  318. })
  319. Convey("When trying to update dashboard permissions with everyone with viewer role can edit permission should be allowed", func() {
  320. p := []*m.DashboardAcl{
  321. {OrgId: 1, DashboardId: 3, Role: &r, Permission: m.PERMISSION_EDIT},
  322. }
  323. ok, _ := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  324. So(ok, ShouldBeTrue)
  325. })
  326. Convey("When trying to update dashboard permissions with everyone with viewer role can view permission should return error", func() {
  327. p := []*m.DashboardAcl{
  328. {OrgId: 1, DashboardId: 3, Role: &r, Permission: m.PERMISSION_VIEW},
  329. }
  330. _, err := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  331. So(err, ShouldEqual, ErrGuardianOverride)
  332. })
  333. })
  334. })
  335. orgRoleScenario("Given user has editor org role", m.ROLE_EDITOR, func(sc *scenarioContext) {
  336. everyoneWithRoleScenario(m.ROLE_EDITOR, m.PERMISSION_ADMIN, sc, func(sc *scenarioContext) {
  337. canAdmin, _ := sc.g.CanAdmin()
  338. canEdit, _ := sc.g.CanEdit()
  339. canSave, _ := sc.g.CanSave()
  340. canView, _ := sc.g.CanView()
  341. So(canAdmin, ShouldBeTrue)
  342. So(canEdit, ShouldBeTrue)
  343. So(canSave, ShouldBeTrue)
  344. So(canView, ShouldBeTrue)
  345. })
  346. everyoneWithRoleScenario(m.ROLE_EDITOR, m.PERMISSION_EDIT, sc, func(sc *scenarioContext) {
  347. canAdmin, _ := sc.g.CanAdmin()
  348. canEdit, _ := sc.g.CanEdit()
  349. canSave, _ := sc.g.CanSave()
  350. canView, _ := sc.g.CanView()
  351. So(canAdmin, ShouldBeFalse)
  352. So(canEdit, ShouldBeTrue)
  353. So(canSave, ShouldBeTrue)
  354. So(canView, ShouldBeTrue)
  355. })
  356. everyoneWithRoleScenario(m.ROLE_EDITOR, m.PERMISSION_VIEW, sc, func(sc *scenarioContext) {
  357. canAdmin, _ := sc.g.CanAdmin()
  358. canEdit, _ := sc.g.CanEdit()
  359. canSave, _ := sc.g.CanSave()
  360. canView, _ := sc.g.CanView()
  361. So(canAdmin, ShouldBeFalse)
  362. So(canEdit, ShouldBeFalse)
  363. So(canSave, ShouldBeFalse)
  364. So(canView, ShouldBeTrue)
  365. })
  366. everyoneWithRoleScenario(m.ROLE_VIEWER, m.PERMISSION_ADMIN, sc, func(sc *scenarioContext) {
  367. canAdmin, _ := sc.g.CanAdmin()
  368. canEdit, _ := sc.g.CanEdit()
  369. canSave, _ := sc.g.CanSave()
  370. canView, _ := sc.g.CanView()
  371. So(canAdmin, ShouldBeFalse)
  372. So(canEdit, ShouldBeFalse)
  373. So(canSave, ShouldBeFalse)
  374. So(canView, ShouldBeFalse)
  375. })
  376. everyoneWithRoleScenario(m.ROLE_VIEWER, m.PERMISSION_EDIT, sc, func(sc *scenarioContext) {
  377. canAdmin, _ := sc.g.CanAdmin()
  378. canEdit, _ := sc.g.CanEdit()
  379. canSave, _ := sc.g.CanSave()
  380. canView, _ := sc.g.CanView()
  381. So(canAdmin, ShouldBeFalse)
  382. So(canEdit, ShouldBeFalse)
  383. So(canSave, ShouldBeFalse)
  384. So(canView, ShouldBeFalse)
  385. })
  386. everyoneWithRoleScenario(m.ROLE_VIEWER, m.PERMISSION_VIEW, sc, func(sc *scenarioContext) {
  387. canAdmin, _ := sc.g.CanAdmin()
  388. canEdit, _ := sc.g.CanEdit()
  389. canSave, _ := sc.g.CanSave()
  390. canView, _ := sc.g.CanView()
  391. So(canAdmin, ShouldBeFalse)
  392. So(canEdit, ShouldBeFalse)
  393. So(canSave, ShouldBeFalse)
  394. So(canView, ShouldBeFalse)
  395. })
  396. userWithPermissionScenario(m.PERMISSION_ADMIN, sc, func(sc *scenarioContext) {
  397. canAdmin, _ := sc.g.CanAdmin()
  398. canEdit, _ := sc.g.CanEdit()
  399. canSave, _ := sc.g.CanSave()
  400. canView, _ := sc.g.CanView()
  401. So(canAdmin, ShouldBeTrue)
  402. So(canEdit, ShouldBeTrue)
  403. So(canSave, ShouldBeTrue)
  404. So(canView, ShouldBeTrue)
  405. })
  406. userWithPermissionScenario(m.PERMISSION_EDIT, sc, func(sc *scenarioContext) {
  407. canAdmin, _ := sc.g.CanAdmin()
  408. canEdit, _ := sc.g.CanEdit()
  409. canSave, _ := sc.g.CanSave()
  410. canView, _ := sc.g.CanView()
  411. So(canAdmin, ShouldBeFalse)
  412. So(canEdit, ShouldBeTrue)
  413. So(canSave, ShouldBeTrue)
  414. So(canView, ShouldBeTrue)
  415. })
  416. userWithPermissionScenario(m.PERMISSION_VIEW, sc, func(sc *scenarioContext) {
  417. canAdmin, _ := sc.g.CanAdmin()
  418. canEdit, _ := sc.g.CanEdit()
  419. canSave, _ := sc.g.CanSave()
  420. canView, _ := sc.g.CanView()
  421. So(canAdmin, ShouldBeFalse)
  422. So(canEdit, ShouldBeFalse)
  423. So(canSave, ShouldBeFalse)
  424. So(canView, ShouldBeTrue)
  425. })
  426. teamWithPermissionScenario(m.PERMISSION_ADMIN, sc, func(sc *scenarioContext) {
  427. canAdmin, _ := sc.g.CanAdmin()
  428. canEdit, _ := sc.g.CanEdit()
  429. canSave, _ := sc.g.CanSave()
  430. canView, _ := sc.g.CanView()
  431. So(canAdmin, ShouldBeTrue)
  432. So(canEdit, ShouldBeTrue)
  433. So(canSave, ShouldBeTrue)
  434. So(canView, ShouldBeTrue)
  435. })
  436. teamWithPermissionScenario(m.PERMISSION_EDIT, sc, func(sc *scenarioContext) {
  437. canAdmin, _ := sc.g.CanAdmin()
  438. canEdit, _ := sc.g.CanEdit()
  439. canSave, _ := sc.g.CanSave()
  440. canView, _ := sc.g.CanView()
  441. So(canAdmin, ShouldBeFalse)
  442. So(canEdit, ShouldBeTrue)
  443. So(canSave, ShouldBeTrue)
  444. So(canView, ShouldBeTrue)
  445. })
  446. teamWithPermissionScenario(m.PERMISSION_VIEW, sc, func(sc *scenarioContext) {
  447. canAdmin, _ := sc.g.CanAdmin()
  448. canEdit, _ := sc.g.CanEdit()
  449. canSave, _ := sc.g.CanSave()
  450. canView, _ := sc.g.CanView()
  451. So(canAdmin, ShouldBeFalse)
  452. So(canEdit, ShouldBeFalse)
  453. So(canSave, ShouldBeFalse)
  454. So(canView, ShouldBeTrue)
  455. })
  456. Convey("When trying to update permissions should return false", func() {
  457. p := []*m.DashboardAcl{
  458. {OrgId: 1, DashboardId: 1, UserId: 1, Permission: m.PERMISSION_VIEW},
  459. {OrgId: 1, DashboardId: 1, UserId: 1, Permission: m.PERMISSION_ADMIN},
  460. }
  461. ok, _ := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  462. So(ok, ShouldBeFalse)
  463. })
  464. })
  465. orgRoleScenario("Given user has viewer org role", m.ROLE_VIEWER, func(sc *scenarioContext) {
  466. everyoneWithRoleScenario(m.ROLE_EDITOR, m.PERMISSION_ADMIN, sc, func(sc *scenarioContext) {
  467. canAdmin, _ := sc.g.CanAdmin()
  468. canEdit, _ := sc.g.CanEdit()
  469. canSave, _ := sc.g.CanSave()
  470. canView, _ := sc.g.CanView()
  471. So(canAdmin, ShouldBeFalse)
  472. So(canEdit, ShouldBeFalse)
  473. So(canSave, ShouldBeFalse)
  474. So(canView, ShouldBeFalse)
  475. })
  476. everyoneWithRoleScenario(m.ROLE_EDITOR, m.PERMISSION_EDIT, sc, func(sc *scenarioContext) {
  477. canAdmin, _ := sc.g.CanAdmin()
  478. canEdit, _ := sc.g.CanEdit()
  479. canSave, _ := sc.g.CanSave()
  480. canView, _ := sc.g.CanView()
  481. So(canAdmin, ShouldBeFalse)
  482. So(canEdit, ShouldBeFalse)
  483. So(canSave, ShouldBeFalse)
  484. So(canView, ShouldBeFalse)
  485. })
  486. everyoneWithRoleScenario(m.ROLE_EDITOR, m.PERMISSION_VIEW, sc, func(sc *scenarioContext) {
  487. canAdmin, _ := sc.g.CanAdmin()
  488. canEdit, _ := sc.g.CanEdit()
  489. canSave, _ := sc.g.CanSave()
  490. canView, _ := sc.g.CanView()
  491. So(canAdmin, ShouldBeFalse)
  492. So(canEdit, ShouldBeFalse)
  493. So(canSave, ShouldBeFalse)
  494. So(canView, ShouldBeFalse)
  495. })
  496. everyoneWithRoleScenario(m.ROLE_VIEWER, m.PERMISSION_ADMIN, sc, func(sc *scenarioContext) {
  497. canAdmin, _ := sc.g.CanAdmin()
  498. canEdit, _ := sc.g.CanEdit()
  499. canSave, _ := sc.g.CanSave()
  500. canView, _ := sc.g.CanView()
  501. So(canAdmin, ShouldBeTrue)
  502. So(canEdit, ShouldBeTrue)
  503. So(canSave, ShouldBeTrue)
  504. So(canView, ShouldBeTrue)
  505. })
  506. everyoneWithRoleScenario(m.ROLE_VIEWER, m.PERMISSION_EDIT, sc, func(sc *scenarioContext) {
  507. canAdmin, _ := sc.g.CanAdmin()
  508. canEdit, _ := sc.g.CanEdit()
  509. canSave, _ := sc.g.CanSave()
  510. canView, _ := sc.g.CanView()
  511. So(canAdmin, ShouldBeFalse)
  512. So(canEdit, ShouldBeTrue)
  513. So(canSave, ShouldBeTrue)
  514. So(canView, ShouldBeTrue)
  515. })
  516. everyoneWithRoleScenario(m.ROLE_VIEWER, m.PERMISSION_VIEW, sc, func(sc *scenarioContext) {
  517. canAdmin, _ := sc.g.CanAdmin()
  518. canEdit, _ := sc.g.CanEdit()
  519. canSave, _ := sc.g.CanSave()
  520. canView, _ := sc.g.CanView()
  521. So(canAdmin, ShouldBeFalse)
  522. So(canEdit, ShouldBeFalse)
  523. So(canSave, ShouldBeFalse)
  524. So(canView, ShouldBeTrue)
  525. })
  526. userWithPermissionScenario(m.PERMISSION_ADMIN, sc, func(sc *scenarioContext) {
  527. canAdmin, _ := sc.g.CanAdmin()
  528. canEdit, _ := sc.g.CanEdit()
  529. canSave, _ := sc.g.CanSave()
  530. canView, _ := sc.g.CanView()
  531. So(canAdmin, ShouldBeTrue)
  532. So(canEdit, ShouldBeTrue)
  533. So(canSave, ShouldBeTrue)
  534. So(canView, ShouldBeTrue)
  535. })
  536. userWithPermissionScenario(m.PERMISSION_EDIT, sc, func(sc *scenarioContext) {
  537. canAdmin, _ := sc.g.CanAdmin()
  538. canEdit, _ := sc.g.CanEdit()
  539. canSave, _ := sc.g.CanSave()
  540. canView, _ := sc.g.CanView()
  541. So(canAdmin, ShouldBeFalse)
  542. So(canEdit, ShouldBeTrue)
  543. So(canSave, ShouldBeTrue)
  544. So(canView, ShouldBeTrue)
  545. })
  546. userWithPermissionScenario(m.PERMISSION_VIEW, sc, func(sc *scenarioContext) {
  547. canAdmin, _ := sc.g.CanAdmin()
  548. canEdit, _ := sc.g.CanEdit()
  549. canSave, _ := sc.g.CanSave()
  550. canView, _ := sc.g.CanView()
  551. So(canAdmin, ShouldBeFalse)
  552. So(canEdit, ShouldBeFalse)
  553. So(canSave, ShouldBeFalse)
  554. So(canView, ShouldBeTrue)
  555. })
  556. Convey("When trying to update permissions should return false", func() {
  557. p := []*m.DashboardAcl{
  558. {OrgId: 1, DashboardId: 1, UserId: 1, Permission: m.PERMISSION_VIEW},
  559. {OrgId: 1, DashboardId: 1, UserId: 1, Permission: m.PERMISSION_ADMIN},
  560. }
  561. ok, _ := sc.g.CheckPermissionBeforeUpdate(m.PERMISSION_ADMIN, p)
  562. So(ok, ShouldBeFalse)
  563. })
  564. })
  565. })
  566. }
  567. type scenarioContext struct {
  568. g DashboardGuardian
  569. }
  570. type scenarioFunc func(c *scenarioContext)
  571. func orgRoleScenario(desc string, role m.RoleType, fn scenarioFunc) {
  572. user := &m.SignedInUser{
  573. UserId: 1,
  574. OrgId: 1,
  575. OrgRole: role,
  576. }
  577. guard := New(1, 1, user)
  578. sc := &scenarioContext{
  579. g: guard,
  580. }
  581. Convey(desc, func() {
  582. fn(sc)
  583. })
  584. }
  585. func permissionScenario(desc string, sc *scenarioContext, permissions []*m.DashboardAclInfoDTO, fn scenarioFunc) {
  586. bus.ClearBusHandlers()
  587. bus.AddHandler("test", func(query *m.GetDashboardAclInfoListQuery) error {
  588. query.Result = permissions
  589. return nil
  590. })
  591. teams := []*m.Team{}
  592. for _, p := range permissions {
  593. if p.TeamId > 0 {
  594. teams = append(teams, &m.Team{Id: p.TeamId})
  595. }
  596. }
  597. bus.AddHandler("test", func(query *m.GetTeamsByUserQuery) error {
  598. query.Result = teams
  599. return nil
  600. })
  601. Convey(desc, func() {
  602. fn(sc)
  603. })
  604. }
  605. func userWithPermissionScenario(permission m.PermissionType, sc *scenarioContext, fn scenarioFunc) {
  606. p := []*m.DashboardAclInfoDTO{
  607. {OrgId: 1, DashboardId: 1, UserId: 1, Permission: permission},
  608. }
  609. permissionScenario(fmt.Sprintf("and user has permission to %s item", permission), sc, p, fn)
  610. }
  611. func teamWithPermissionScenario(permission m.PermissionType, sc *scenarioContext, fn scenarioFunc) {
  612. p := []*m.DashboardAclInfoDTO{
  613. {OrgId: 1, DashboardId: 1, TeamId: 1, Permission: permission},
  614. }
  615. permissionScenario(fmt.Sprintf("and team has permission to %s item", permission), sc, p, fn)
  616. }
  617. func everyoneWithRoleScenario(role m.RoleType, permission m.PermissionType, sc *scenarioContext, fn scenarioFunc) {
  618. p := []*m.DashboardAclInfoDTO{
  619. {OrgId: 1, DashboardId: 1, UserId: -1, Role: &role, Permission: permission},
  620. }
  621. permissionScenario(fmt.Sprintf("and everyone with %s role can %s item", role, permission), sc, p, fn)
  622. }