permission.spec.ts 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  1. import {
  2. isPermitted,
  3. isPermittedToCreate,
  4. modifyRolesData,
  5. } from 'lib/permissions';
  6. import { Action, ResourceType } from 'generated-sources';
  7. describe('Permission Helpers', () => {
  8. const clusterName1 = 'local';
  9. const clusterName2 = 'dev';
  10. const userPermissionsMock = [
  11. {
  12. clusters: [clusterName1],
  13. resource: ResourceType.TOPIC,
  14. actions: [Action.VIEW, Action.CREATE],
  15. value: '.*',
  16. },
  17. {
  18. clusters: [clusterName1],
  19. resource: ResourceType.KSQL,
  20. actions: [Action.EXECUTE],
  21. },
  22. {
  23. clusters: [clusterName1, clusterName2],
  24. resource: ResourceType.SCHEMA,
  25. actions: [Action.VIEW],
  26. value: '.*',
  27. },
  28. {
  29. clusters: [clusterName1, clusterName2],
  30. resource: ResourceType.CONNECT,
  31. actions: [Action.VIEW],
  32. value: '.*',
  33. },
  34. {
  35. clusters: [clusterName1],
  36. resource: ResourceType.APPLICATIONCONFIG,
  37. actions: [Action.EDIT],
  38. },
  39. {
  40. clusters: [clusterName1],
  41. resource: ResourceType.CLUSTERCONFIG,
  42. actions: [Action.EDIT],
  43. },
  44. {
  45. clusters: [clusterName1],
  46. resource: ResourceType.CONSUMER,
  47. actions: [Action.DELETE],
  48. value: '.*',
  49. },
  50. {
  51. clusters: [clusterName1],
  52. resource: ResourceType.SCHEMA,
  53. actions: [Action.EDIT, Action.DELETE, Action.CREATE],
  54. value: '123.*',
  55. },
  56. {
  57. clusters: [clusterName1],
  58. resource: ResourceType.ACL,
  59. actions: [Action.VIEW],
  60. },
  61. {
  62. clusters: [clusterName1],
  63. resource: ResourceType.AUDIT,
  64. actions: [Action.VIEW],
  65. },
  66. {
  67. clusters: [clusterName1, clusterName2],
  68. resource: ResourceType.TOPIC,
  69. value: 'test.*',
  70. actions: [Action.MESSAGES_DELETE],
  71. },
  72. {
  73. clusters: [clusterName1, clusterName2],
  74. resource: ResourceType.TOPIC,
  75. value: '.*',
  76. actions: [Action.EDIT, Action.DELETE],
  77. },
  78. {
  79. clusters: [clusterName1, clusterName2],
  80. resource: ResourceType.TOPIC,
  81. value: 'bobross.*',
  82. actions: [Action.VIEW, Action.MESSAGES_READ],
  83. },
  84. ];
  85. const roles = modifyRolesData(userPermissionsMock);
  86. describe('modifyRoles', () => {
  87. it('should check if it transforms the data in a correct format to normal keys', () => {
  88. const result = modifyRolesData(userPermissionsMock);
  89. expect(result.keys()).toContain(clusterName1);
  90. expect(result.keys()).toContain(clusterName2);
  91. const cluster1Map = result.get(clusterName1);
  92. const cluster2Map = result.get(clusterName2);
  93. expect(cluster1Map).toBeDefined();
  94. expect(cluster2Map).toBeDefined();
  95. // first cluster
  96. expect(cluster1Map?.has(ResourceType.CLUSTERCONFIG)).toBeTruthy();
  97. expect(cluster1Map?.has(ResourceType.CLUSTERCONFIG)).toBeTruthy();
  98. expect(cluster1Map?.has(ResourceType.CONSUMER)).toBeTruthy();
  99. expect(cluster1Map?.has(ResourceType.CONNECT)).toBeTruthy();
  100. expect(cluster1Map?.has(ResourceType.KSQL)).toBeTruthy();
  101. expect(cluster1Map?.has(ResourceType.TOPIC)).toBeTruthy();
  102. // second cluster
  103. expect(cluster2Map?.has(ResourceType.SCHEMA)).toBeTruthy();
  104. expect(cluster2Map?.has(ResourceType.CONNECT)).toBeTruthy();
  105. expect(cluster2Map?.has(ResourceType.TOPIC)).toBeTruthy();
  106. expect(cluster2Map?.has(ResourceType.CLUSTERCONFIG)).toBeFalsy();
  107. expect(cluster2Map?.has(ResourceType.CONSUMER)).toBeFalsy();
  108. expect(cluster2Map?.has(ResourceType.KSQL)).toBeFalsy();
  109. });
  110. it('should check if it transforms the data length in keys are correct', () => {
  111. const result = modifyRolesData(userPermissionsMock);
  112. const cluster1Map = result.get(clusterName1);
  113. const cluster2Map = result.get(clusterName2);
  114. expect(result.size).toBe(2);
  115. expect(cluster1Map?.size).toBe(9);
  116. expect(cluster2Map?.size).toBe(3);
  117. // clusterMap1
  118. expect(cluster1Map?.get(ResourceType.TOPIC)).toHaveLength(4);
  119. expect(cluster1Map?.get(ResourceType.SCHEMA)).toHaveLength(2);
  120. expect(cluster1Map?.get(ResourceType.CONSUMER)).toHaveLength(1);
  121. expect(cluster1Map?.get(ResourceType.CLUSTERCONFIG)).toHaveLength(1);
  122. expect(cluster1Map?.get(ResourceType.CONNECT)).toHaveLength(1);
  123. expect(cluster1Map?.get(ResourceType.CLUSTERCONFIG)).toHaveLength(1);
  124. // clusterMap2
  125. expect(cluster2Map?.get(ResourceType.SCHEMA)).toHaveLength(1);
  126. });
  127. });
  128. describe('isPermitted', () => {
  129. it('should check if the isPermitted returns the correct when there is no roles or clusters', () => {
  130. expect(
  131. isPermitted({
  132. clusterName: clusterName1,
  133. resource: ResourceType.TOPIC,
  134. action: Action.VIEW,
  135. rbacFlag: true,
  136. })
  137. ).toBeFalsy();
  138. expect(
  139. isPermitted({
  140. clusterName: 'unFoundCluster',
  141. resource: ResourceType.TOPIC,
  142. action: Action.VIEW,
  143. rbacFlag: true,
  144. })
  145. ).toBeFalsy();
  146. expect(
  147. isPermitted({
  148. roles,
  149. clusterName: 'unFoundCluster',
  150. resource: ResourceType.TOPIC,
  151. action: Action.VIEW,
  152. rbacFlag: true,
  153. })
  154. ).toBeFalsy();
  155. expect(
  156. isPermitted({
  157. roles,
  158. clusterName: '',
  159. resource: ResourceType.TOPIC,
  160. action: Action.VIEW,
  161. rbacFlag: true,
  162. })
  163. ).toBeFalsy();
  164. expect(
  165. isPermitted({
  166. roles: new Map(),
  167. clusterName: 'unFoundCluster',
  168. resource: ResourceType.TOPIC,
  169. action: Action.VIEW,
  170. rbacFlag: true,
  171. })
  172. ).toBeFalsy();
  173. expect(
  174. isPermitted({
  175. roles: new Map(),
  176. clusterName: clusterName1,
  177. resource: ResourceType.TOPIC,
  178. action: Action.VIEW,
  179. rbacFlag: true,
  180. })
  181. ).toBeFalsy();
  182. });
  183. it('should check if the isPermitted returns the correct value without resource values (exempt list)', () => {
  184. expect(
  185. isPermitted({
  186. roles,
  187. clusterName: clusterName1,
  188. resource: ResourceType.KSQL,
  189. action: Action.EXECUTE,
  190. rbacFlag: true,
  191. })
  192. ).toBeTruthy();
  193. expect(
  194. isPermitted({
  195. roles,
  196. clusterName: clusterName1,
  197. resource: ResourceType.CLUSTERCONFIG,
  198. action: Action.EDIT,
  199. rbacFlag: true,
  200. })
  201. ).toBeTruthy();
  202. expect(
  203. isPermitted({
  204. roles,
  205. clusterName: clusterName1,
  206. resource: ResourceType.APPLICATIONCONFIG,
  207. action: Action.EDIT,
  208. rbacFlag: true,
  209. })
  210. ).toBeTruthy();
  211. expect(
  212. isPermitted({
  213. roles,
  214. clusterName: clusterName1,
  215. resource: ResourceType.ACL,
  216. action: Action.VIEW,
  217. rbacFlag: true,
  218. })
  219. ).toBeTruthy();
  220. expect(
  221. isPermitted({
  222. roles,
  223. clusterName: clusterName1,
  224. resource: ResourceType.AUDIT,
  225. action: Action.VIEW,
  226. rbacFlag: true,
  227. })
  228. ).toBeTruthy();
  229. expect(
  230. isPermitted({
  231. roles,
  232. clusterName: clusterName1,
  233. resource: ResourceType.TOPIC,
  234. action: Action.VIEW,
  235. rbacFlag: true,
  236. })
  237. ).toBeFalsy();
  238. expect(
  239. isPermitted({
  240. roles,
  241. clusterName: clusterName1,
  242. resource: ResourceType.SCHEMA,
  243. action: Action.VIEW,
  244. rbacFlag: true,
  245. })
  246. ).toBeFalsy();
  247. expect(
  248. isPermitted({
  249. roles,
  250. clusterName: clusterName1,
  251. resource: ResourceType.CONSUMER,
  252. action: Action.VIEW,
  253. rbacFlag: true,
  254. })
  255. ).toBeFalsy();
  256. expect(
  257. isPermitted({
  258. roles,
  259. clusterName: clusterName1,
  260. resource: ResourceType.CONNECT,
  261. action: Action.VIEW,
  262. rbacFlag: true,
  263. })
  264. ).toBeFalsy();
  265. });
  266. it('should check if the isPermitted returns the correct value with name values', () => {
  267. expect(
  268. isPermitted({
  269. roles,
  270. clusterName: clusterName1,
  271. resource: ResourceType.SCHEMA,
  272. action: Action.EDIT,
  273. value: '123456',
  274. rbacFlag: true,
  275. })
  276. ).toBeTruthy();
  277. expect(
  278. isPermitted({
  279. roles,
  280. clusterName: clusterName1,
  281. resource: ResourceType.SCHEMA,
  282. action: Action.EDIT,
  283. value: '123',
  284. rbacFlag: true,
  285. })
  286. ).toBeTruthy();
  287. expect(
  288. isPermitted({
  289. roles,
  290. clusterName: clusterName1,
  291. resource: ResourceType.SCHEMA,
  292. action: Action.EDIT,
  293. value: 'some_wrong_value',
  294. rbacFlag: true,
  295. })
  296. ).toBeFalsy();
  297. expect(
  298. isPermitted({
  299. roles,
  300. clusterName: clusterName2,
  301. resource: ResourceType.TOPIC,
  302. action: Action.MESSAGES_DELETE,
  303. value: 'test_something',
  304. rbacFlag: true,
  305. })
  306. ).toBeTruthy();
  307. expect(
  308. isPermitted({
  309. roles,
  310. clusterName: clusterName1,
  311. resource: ResourceType.TOPIC,
  312. action: Action.MESSAGES_DELETE,
  313. value: 'test_something',
  314. rbacFlag: true,
  315. })
  316. ).toBeTruthy();
  317. expect(
  318. isPermitted({
  319. roles,
  320. clusterName: clusterName2,
  321. resource: ResourceType.TOPIC,
  322. action: Action.EDIT,
  323. value: 'any_text',
  324. rbacFlag: true,
  325. })
  326. ).toBeTruthy();
  327. expect(
  328. isPermitted({
  329. roles,
  330. clusterName: clusterName2,
  331. resource: ResourceType.TOPIC,
  332. action: Action.EDIT,
  333. value: 'any_text',
  334. rbacFlag: true,
  335. })
  336. ).toBeTruthy();
  337. expect(
  338. isPermitted({
  339. roles,
  340. clusterName: clusterName1,
  341. resource: ResourceType.TOPIC,
  342. action: Action.DELETE,
  343. value: 'some_other',
  344. rbacFlag: true,
  345. })
  346. ).toBeTruthy();
  347. expect(
  348. isPermitted({
  349. roles,
  350. clusterName: clusterName2,
  351. resource: ResourceType.TOPIC,
  352. action: Action.DELETE,
  353. value: 'some_other',
  354. rbacFlag: true,
  355. })
  356. ).toBeTruthy();
  357. });
  358. it('should test the algorithmic worse case when the input is multiple actions', () => {
  359. expect(
  360. isPermitted({
  361. roles,
  362. clusterName: clusterName1,
  363. resource: ResourceType.SCHEMA,
  364. action: [Action.EDIT, Action.DELETE],
  365. value: '123456',
  366. rbacFlag: true,
  367. })
  368. ).toBeTruthy();
  369. expect(
  370. isPermitted({
  371. roles,
  372. clusterName: clusterName1,
  373. resource: ResourceType.SCHEMA,
  374. action: [Action.EDIT],
  375. value: '123456',
  376. rbacFlag: true,
  377. })
  378. ).toBeTruthy();
  379. expect(
  380. isPermitted({
  381. roles,
  382. clusterName: clusterName1,
  383. resource: ResourceType.SCHEMA,
  384. action: [Action.EDIT],
  385. value: '123456',
  386. rbacFlag: true,
  387. })
  388. ).toBeTruthy();
  389. expect(
  390. isPermitted({
  391. roles,
  392. clusterName: clusterName1,
  393. resource: ResourceType.SCHEMA,
  394. action: [Action.DELETE],
  395. value: '123456',
  396. rbacFlag: true,
  397. })
  398. ).toBeTruthy();
  399. expect(
  400. isPermitted({
  401. roles,
  402. clusterName: clusterName1,
  403. resource: ResourceType.SCHEMA,
  404. action: [Action.DELETE, Action.EDIT],
  405. value: '123456',
  406. rbacFlag: true,
  407. })
  408. ).toBeTruthy();
  409. expect(
  410. isPermitted({
  411. roles,
  412. clusterName: clusterName1,
  413. resource: ResourceType.SCHEMA,
  414. action: [Action.EDIT, Action.VIEW],
  415. value: '123456',
  416. rbacFlag: true,
  417. })
  418. ).toBeTruthy();
  419. expect(
  420. isPermitted({
  421. roles,
  422. clusterName: clusterName1,
  423. resource: ResourceType.SCHEMA,
  424. action: [Action.EDIT, Action.VIEW],
  425. value: 'notFound',
  426. rbacFlag: true,
  427. })
  428. ).toBeFalsy();
  429. expect(
  430. isPermitted({
  431. roles,
  432. clusterName: clusterName1,
  433. resource: ResourceType.SCHEMA,
  434. action: [],
  435. value: '123456',
  436. rbacFlag: true,
  437. })
  438. ).toBeTruthy();
  439. expect(
  440. isPermitted({
  441. roles,
  442. clusterName: clusterName1,
  443. resource: ResourceType.TOPIC,
  444. action: [Action.MESSAGES_READ],
  445. value: 'bobross-test',
  446. rbacFlag: true,
  447. })
  448. ).toBeTruthy();
  449. });
  450. it('should check the rbac flag and works with permissions accordingly', () => {
  451. expect(
  452. isPermitted({
  453. roles,
  454. clusterName: clusterName1,
  455. resource: ResourceType.SCHEMA,
  456. action: [],
  457. value: '123456',
  458. rbacFlag: false,
  459. })
  460. ).toBeTruthy();
  461. expect(
  462. isPermitted({
  463. roles,
  464. clusterName: clusterName1,
  465. resource: ResourceType.SCHEMA,
  466. action: [Action.EDIT, Action.VIEW],
  467. value: '123456',
  468. rbacFlag: false,
  469. })
  470. ).toBeTruthy();
  471. expect(
  472. isPermitted({
  473. roles,
  474. clusterName: clusterName1,
  475. resource: ResourceType.SCHEMA,
  476. action: [Action.EDIT, Action.VIEW],
  477. value: 'notFound',
  478. rbacFlag: false,
  479. })
  480. ).toBeTruthy();
  481. expect(
  482. isPermitted({
  483. roles: new Map(),
  484. clusterName: clusterName1,
  485. resource: ResourceType.SCHEMA,
  486. action: [Action.EDIT, Action.VIEW],
  487. value: 'notFound',
  488. rbacFlag: false,
  489. })
  490. ).toBeTruthy();
  491. });
  492. });
  493. describe('isPermittedToCreate', () => {
  494. it('should check if the isPermitted returns the correct when there is no roles or clusters', () => {
  495. expect(
  496. isPermittedToCreate({
  497. roles,
  498. clusterName: clusterName1,
  499. resource: ResourceType.TOPIC,
  500. rbacFlag: true,
  501. })
  502. ).toBeTruthy();
  503. expect(
  504. isPermittedToCreate({
  505. roles,
  506. clusterName: clusterName2,
  507. resource: ResourceType.TOPIC,
  508. rbacFlag: true,
  509. })
  510. ).toBeFalsy();
  511. expect(
  512. isPermittedToCreate({
  513. roles,
  514. clusterName: clusterName1,
  515. resource: ResourceType.TOPIC,
  516. rbacFlag: false,
  517. })
  518. ).toBeTruthy();
  519. expect(
  520. isPermittedToCreate({
  521. roles,
  522. clusterName: clusterName2,
  523. resource: ResourceType.TOPIC,
  524. rbacFlag: false,
  525. })
  526. ).toBeTruthy();
  527. expect(
  528. isPermittedToCreate({
  529. roles,
  530. clusterName: clusterName1,
  531. resource: ResourceType.SCHEMA,
  532. rbacFlag: true,
  533. })
  534. ).toBeTruthy();
  535. expect(
  536. isPermittedToCreate({
  537. roles,
  538. clusterName: clusterName1,
  539. resource: ResourceType.CONNECT,
  540. rbacFlag: true,
  541. })
  542. ).toBeFalsy();
  543. expect(
  544. isPermittedToCreate({
  545. roles: new Map(),
  546. clusterName: 'unFoundCluster',
  547. resource: ResourceType.TOPIC,
  548. rbacFlag: true,
  549. })
  550. ).toBeFalsy();
  551. expect(
  552. isPermittedToCreate({
  553. roles,
  554. clusterName: 'unFoundCluster',
  555. resource: ResourceType.TOPIC,
  556. rbacFlag: true,
  557. })
  558. ).toBeFalsy();
  559. expect(
  560. isPermittedToCreate({
  561. roles: new Map(),
  562. clusterName: clusterName1,
  563. resource: ResourceType.TOPIC,
  564. rbacFlag: true,
  565. })
  566. ).toBeFalsy();
  567. });
  568. });
  569. });