/ToMigrate/Raven.Tests.Bundles/Authorization/CanHandleAuthQuestions.cs

https://github.com/fitzchak/ravendb · C# · 650 lines · 563 code · 82 blank · 5 comment · 0 complexity · fdad314c4b0ccf092cdab559e3aa6f53 MD5 · raw file

  1. //-----------------------------------------------------------------------
  2. // <copyright file="CanHandleAuthQuestions.cs" company="Hibernating Rhinos LTD">
  3. // Copyright (c) Hibernating Rhinos LTD. All rights reserved.
  4. // </copyright>
  5. //-----------------------------------------------------------------------
  6. extern alias client;
  7. using Raven.Bundles.Authorization;
  8. using Xunit;
  9. namespace Raven.Tests.Bundles.Authorization
  10. {
  11. public class CanHandleAuthQuestions : AuthorizationTest
  12. {
  13. private readonly AuthorizationDecisions authorizationDecisions;
  14. const string userId = "Authorization/Users/Ayende";
  15. private const string operation = "Company/Solicit";
  16. public CanHandleAuthQuestions()
  17. {
  18. authorizationDecisions = new AuthorizationDecisions(Database);
  19. }
  20. [Fact]
  21. public void WhenGivingPermissionOnDocumentRoleAndAssociatingUserWithRoleWillAllow()
  22. {
  23. var company = new Company
  24. {
  25. Name = "Hibernating Rhinos"
  26. };
  27. using (var s = store.OpenSession(DatabaseName))
  28. {
  29. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationUser
  30. {
  31. Id = userId,
  32. Name = "Ayende Rahien",
  33. Roles = { "Authorization/Roles/Managers" }
  34. });
  35. s.Store(company);
  36. client::Raven.Client.Authorization.AuthorizationClientExtensions.SetAuthorizationFor(s, company, new client::Raven.Bundles.Authorization.Model.DocumentAuthorization
  37. {
  38. Permissions =
  39. {
  40. new client::Raven.Bundles.Authorization.Model.DocumentPermission
  41. {
  42. Allow = true,
  43. Operation = operation,
  44. Role = "Authorization/Roles/Managers"
  45. }
  46. }
  47. });
  48. s.SaveChanges();
  49. }
  50. var jsonDocument = Database.Documents.Get(company.Id, null);
  51. var isAllowed = authorizationDecisions.IsAllowed(userId, operation, company.Id, jsonDocument.Metadata, null);
  52. Assert.True(isAllowed);
  53. }
  54. [Fact]
  55. public void GivingPermissionToRoleOnTagAssociatedWithRoleWillAllow()
  56. {
  57. var company = new Company
  58. {
  59. Name = "Hibernating Rhinos"
  60. };
  61. using (var s = store.OpenSession(DatabaseName))
  62. {
  63. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationUser
  64. {
  65. Id = userId,
  66. Name = "Ayende Rahien",
  67. Roles = { "Authorization/Roles/Managers" }
  68. });
  69. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationRole
  70. {
  71. Id = "Authorization/Roles/Managers",
  72. Permissions =
  73. {
  74. new client::Raven.Bundles.Authorization.Model.OperationPermission
  75. {
  76. Allow = true,
  77. Operation = operation,
  78. Tags = { "Fortune 500" }
  79. }
  80. }
  81. });
  82. s.Store(company);
  83. client::Raven.Client.Authorization.AuthorizationClientExtensions.SetAuthorizationFor(s, company, new client::Raven.Bundles.Authorization.Model.DocumentAuthorization
  84. {
  85. Tags = { "Fortune 500" }
  86. });
  87. s.SaveChanges();
  88. }
  89. var jsonDocument = Database.Documents.Get(company.Id, null);
  90. var isAllowed = authorizationDecisions.IsAllowed(userId, operation, company.Id, jsonDocument.Metadata, null);
  91. Assert.True(isAllowed);
  92. }
  93. [Fact]
  94. public void GivingPermissionToRoleOnMultiTagsAssociatedWithRoleWithMultiTagsOnDocumentWillAllow()
  95. {
  96. var company = new Company
  97. {
  98. Name = "Hibernating Rhinos"
  99. };
  100. using (var s = store.OpenSession(DatabaseName))
  101. {
  102. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationUser
  103. {
  104. Id = userId,
  105. Name = "Ayende Rahien",
  106. Roles = { "Authorization/Roles/Managers" }
  107. });
  108. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationRole
  109. {
  110. Id = "Authorization/Roles/Managers",
  111. Permissions =
  112. {
  113. new client::Raven.Bundles.Authorization.Model.OperationPermission
  114. {
  115. Allow = true,
  116. Operation = operation,
  117. Tags = { "Fortune 500", "Technology" }
  118. }
  119. }
  120. });
  121. s.Store(company);
  122. client::Raven.Client.Authorization.AuthorizationClientExtensions.SetAuthorizationFor(s, company, new client::Raven.Bundles.Authorization.Model.DocumentAuthorization
  123. {
  124. Tags = { "Fortune 500", "Technology/Application Software" }
  125. });
  126. s.SaveChanges();
  127. }
  128. var jsonDocument = Database.Documents.Get(company.Id, null);
  129. var isAllowed = authorizationDecisions.IsAllowed(userId, operation, company.Id, jsonDocument.Metadata, null);
  130. Assert.True(isAllowed);
  131. }
  132. [Fact]
  133. public void GivingPermissionToRoleOnMultiTagsAssociatedWithRoleWithoutMultiTagsOnDocumentWillDeny()
  134. {
  135. var company = new Company
  136. {
  137. Name = "Hibernating Rhinos"
  138. };
  139. using (var s = store.OpenSession(DatabaseName))
  140. {
  141. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationUser
  142. {
  143. Id = userId,
  144. Name = "Ayende Rahien",
  145. Roles = { "Authorization/Roles/Managers" }
  146. });
  147. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationRole
  148. {
  149. Id = "Authorization/Roles/Managers",
  150. Permissions =
  151. {
  152. new client::Raven.Bundles.Authorization.Model.OperationPermission
  153. {
  154. Allow = true,
  155. Operation = operation,
  156. Tags = { "Fortune 500", "Technology" }
  157. }
  158. }
  159. });
  160. s.Store(company);
  161. client::Raven.Client.Authorization.AuthorizationClientExtensions.SetAuthorizationFor(s, company, new client::Raven.Bundles.Authorization.Model.DocumentAuthorization
  162. {
  163. Tags = { "Fortune 500" }
  164. });
  165. s.SaveChanges();
  166. }
  167. var jsonDocument = Database.Documents.Get(company.Id, null);
  168. var isAllowed = authorizationDecisions.IsAllowed(userId, operation, company.Id, jsonDocument.Metadata, null);
  169. Assert.False(isAllowed);
  170. }
  171. [Fact]
  172. public void GivingPermissionToRoleOnMultiTagsAssociatedWithRoleWithMoreGeneralTagsOnDocumentWillDeny()
  173. {
  174. var company = new Company
  175. {
  176. Name = "Hibernating Rhinos"
  177. };
  178. using (var s = store.OpenSession(DatabaseName))
  179. {
  180. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationUser
  181. {
  182. Id = userId,
  183. Name = "Ayende Rahien",
  184. Roles = { "Authorization/Roles/Managers" }
  185. });
  186. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationRole
  187. {
  188. Id = "Authorization/Roles/Managers",
  189. Permissions =
  190. {
  191. new client::Raven.Bundles.Authorization.Model.OperationPermission
  192. {
  193. Allow = true,
  194. Operation = operation,
  195. Tags = { "Fortune 500", "Technology/Application Software" }
  196. }
  197. }
  198. });
  199. s.Store(company);
  200. client::Raven.Client.Authorization.AuthorizationClientExtensions.SetAuthorizationFor(s, company, new client::Raven.Bundles.Authorization.Model.DocumentAuthorization
  201. {
  202. Tags = { "Fortune 500", "Technology" }
  203. });
  204. s.SaveChanges();
  205. }
  206. var jsonDocument = Database.Documents.Get(company.Id, null);
  207. var isAllowed = authorizationDecisions.IsAllowed(userId, operation, company.Id, jsonDocument.Metadata, null);
  208. Assert.False(isAllowed);
  209. }
  210. [Fact]
  211. public void GivingPermissionToRoleOnTagAssociatedWithRoleWillAllow_OnClient()
  212. {
  213. var company = new Company
  214. {
  215. Name = "Hibernating Rhinos"
  216. };
  217. using (var s = store.OpenSession(DatabaseName))
  218. {
  219. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationUser
  220. {
  221. Id = userId,
  222. Name = "Ayende Rahien",
  223. Roles = { "Authorization/Roles/Managers" }
  224. });
  225. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationRole
  226. {
  227. Id = "Authorization/Roles/Managers",
  228. Permissions =
  229. {
  230. new client::Raven.Bundles.Authorization.Model.OperationPermission
  231. {
  232. Allow = true,
  233. Operation = operation,
  234. Tags = { "Fortune 500" }
  235. }
  236. }
  237. });
  238. s.Store(company);
  239. client::Raven.Client.Authorization.AuthorizationClientExtensions.SetAuthorizationFor(s, company, new client::Raven.Bundles.Authorization.Model.DocumentAuthorization
  240. {
  241. Tags = { "Fortune 500" }
  242. });
  243. s.SaveChanges();
  244. }
  245. using (var s = store.OpenSession(DatabaseName))
  246. {
  247. var authorizationUser = s.Load<client::Raven.Bundles.Authorization.Model.AuthorizationUser>(userId);
  248. Assert.True(client::Raven.Client.Authorization.AuthorizationClientExtensions.IsAllowed(s, authorizationUser, operation));
  249. }
  250. }
  251. [Fact]
  252. public void GivingDenyPermissionWillReturnFalse_OnClient()
  253. {
  254. using (var s = store.OpenSession(DatabaseName))
  255. {
  256. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationUser
  257. {
  258. Id = userId,
  259. Name = "Ayende Rahien",
  260. Roles = { "Authorization/Roles/Managers" },
  261. Permissions =
  262. {
  263. new client::Raven.Bundles.Authorization.Model.OperationPermission
  264. {
  265. Allow = false,
  266. Operation = operation,
  267. Tags = { "Important" }
  268. }
  269. }
  270. });
  271. s.SaveChanges();
  272. }
  273. using (var s = store.OpenSession(DatabaseName))
  274. {
  275. var authorizationUser = s.Load<client::Raven.Bundles.Authorization.Model.AuthorizationUser>(userId);
  276. Assert.False(client::Raven.Client.Authorization.AuthorizationClientExtensions.IsAllowed(s, authorizationUser, operation));
  277. }
  278. }
  279. [Fact]
  280. public void GivingPermissionOnRoleWorks_OnClient()
  281. {
  282. using (var s = store.OpenSession(DatabaseName))
  283. {
  284. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationUser
  285. {
  286. Id = userId,
  287. Name = "Ayende Rahien",
  288. Roles = { "Authorization/Roles/Managers" },
  289. });
  290. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationRole
  291. {
  292. Id = "Authorization/Roles/Managers",
  293. Permissions =
  294. {
  295. new client::Raven.Bundles.Authorization.Model.OperationPermission
  296. {
  297. Allow = true,
  298. Operation = operation,
  299. Tags = { "/Important" }
  300. }
  301. }
  302. });
  303. s.SaveChanges();
  304. }
  305. using (var s = store.OpenSession(DatabaseName))
  306. {
  307. var authorizationUser = s.Load<client::Raven.Bundles.Authorization.Model.AuthorizationUser>(userId);
  308. Assert.True(client::Raven.Client.Authorization.AuthorizationClientExtensions.IsAllowed(s, authorizationUser, operation));
  309. }
  310. }
  311. [Fact]
  312. public void GivingPermissionForAllowAndDenyOnSameLevelWithReturnDeny()
  313. {
  314. var company = new Company
  315. {
  316. Name = "Hibernating Rhinos"
  317. };
  318. using (var s = store.OpenSession(DatabaseName))
  319. {
  320. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationUser
  321. {
  322. Id = userId,
  323. Name = "Ayende Rahien",
  324. Roles = { "Authorization/Roles/Managers" },
  325. Permissions =
  326. {
  327. new client::Raven.Bundles.Authorization.Model.OperationPermission
  328. {
  329. Allow = false,
  330. Operation = operation,
  331. Tags = { "Important" }
  332. }
  333. }
  334. });
  335. s.Store(company);
  336. client::Raven.Client.Authorization.AuthorizationClientExtensions.SetAuthorizationFor(s, company, new client::Raven.Bundles.Authorization.Model.DocumentAuthorization
  337. {
  338. Tags = { "Important" },
  339. Permissions =
  340. {
  341. new client::Raven.Bundles.Authorization.Model.DocumentPermission
  342. {
  343. Allow = true,
  344. Operation = operation,
  345. Role = "Authorization/Roles/Managers"
  346. }
  347. }
  348. });
  349. s.SaveChanges();
  350. }
  351. var jsonDocument = Database.Documents.Get(company.Id, null);
  352. var isAllowed = authorizationDecisions.IsAllowed(userId, operation, company.Id, jsonDocument.Metadata, null);
  353. Assert.False(isAllowed);
  354. }
  355. [Fact]
  356. public void WhenGivingPermissionOnDocumentRoleAndAssociatingUserWithChildRoleWillAllow()
  357. {
  358. var company = new Company
  359. {
  360. Name = "Hibernating Rhinos"
  361. };
  362. using (var s = store.OpenSession(DatabaseName))
  363. {
  364. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationUser
  365. {
  366. Id = userId,
  367. Name = "Ayende Rahien",
  368. Roles = { "Authorization/Roles/Managers/Supreme" }
  369. });
  370. s.Store(company);
  371. client::Raven.Client.Authorization.AuthorizationClientExtensions.SetAuthorizationFor(s, company, new client::Raven.Bundles.Authorization.Model.DocumentAuthorization
  372. {
  373. Permissions =
  374. {
  375. new client::Raven.Bundles.Authorization.Model.DocumentPermission
  376. {
  377. Allow = true,
  378. Operation = operation,
  379. Role = "Authorization/Roles/Managers"
  380. }
  381. }
  382. });
  383. s.SaveChanges();
  384. }
  385. var jsonDocument = Database.Documents.Get(company.Id, null);
  386. var isAllowed = authorizationDecisions.IsAllowed(userId, operation, company.Id, jsonDocument.Metadata, null);
  387. Assert.True(isAllowed);
  388. }
  389. [Fact]
  390. public void WhenGivingUserPermissionForTagAndTaggingDocumentWillAllow()
  391. {
  392. var company = new Company
  393. {
  394. Name = "Hibernating Rhinos"
  395. };
  396. using (var s = store.OpenSession(DatabaseName))
  397. {
  398. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationUser
  399. {
  400. Id = userId,
  401. Name = "Ayende Rahien",
  402. Permissions =
  403. {
  404. new client::Raven.Bundles.Authorization.Model.OperationPermission
  405. {
  406. Allow = true,
  407. Operation = operation,
  408. Tags = { "Companies/Important" }
  409. }
  410. }
  411. });
  412. s.Store(company);
  413. client::Raven.Client.Authorization.AuthorizationClientExtensions.SetAuthorizationFor(s, company, new client::Raven.Bundles.Authorization.Model.DocumentAuthorization
  414. {
  415. Tags = { "Companies/Important" }
  416. });
  417. s.SaveChanges();
  418. }
  419. var jsonDocument = Database.Documents.Get(company.Id, null);
  420. var isAllowed = authorizationDecisions.IsAllowed(userId, operation, company.Id, jsonDocument.Metadata, null);
  421. Assert.True(isAllowed);
  422. }
  423. [Fact]
  424. public void WhenGivingUserPermissionForParentTagAndTaggingDocumentWillAllow()
  425. {
  426. var company = new Company
  427. {
  428. Name = "Hibernating Rhinos"
  429. };
  430. using (var s = store.OpenSession(DatabaseName))
  431. {
  432. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationUser
  433. {
  434. Id = userId,
  435. Name = "Ayende Rahien",
  436. Permissions =
  437. {
  438. new client::Raven.Bundles.Authorization.Model.OperationPermission
  439. {
  440. Allow = true,
  441. Operation = operation,
  442. Tags = { "Companies" }
  443. }
  444. }
  445. });
  446. s.Store(company);
  447. client::Raven.Client.Authorization.AuthorizationClientExtensions.SetAuthorizationFor(s, company, new client::Raven.Bundles.Authorization.Model.DocumentAuthorization
  448. {
  449. Tags = { "Companies/Important" }
  450. });
  451. s.SaveChanges();
  452. }
  453. var jsonDocument = Database.Documents.Get(company.Id, null);
  454. var isAllowed = authorizationDecisions.IsAllowed(userId, operation, company.Id, jsonDocument.Metadata, null);
  455. Assert.True(isAllowed);
  456. }
  457. [Fact]
  458. public void CanGiveUserExplicitPermissionOnDoc()
  459. {
  460. var company = new Company
  461. {
  462. Name = "Hibernating Rhinos"
  463. };
  464. using (var s = store.OpenSession(DatabaseName))
  465. {
  466. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationUser
  467. {
  468. Id = userId,
  469. Name = "Ayende Rahien",
  470. });
  471. s.Store(company);
  472. client::Raven.Client.Authorization.AuthorizationClientExtensions.SetAuthorizationFor(s, company, new client::Raven.Bundles.Authorization.Model.DocumentAuthorization
  473. {
  474. Permissions =
  475. {
  476. new client::Raven.Bundles.Authorization.Model.DocumentPermission
  477. {
  478. Allow = true,
  479. Operation = operation,
  480. User = userId
  481. }
  482. }
  483. });
  484. s.SaveChanges();
  485. }
  486. var jsonDocument = Database.Documents.Get(company.Id, null);
  487. var isAllowed = authorizationDecisions.IsAllowed(userId, operation, company.Id, jsonDocument.Metadata, null);
  488. Assert.True(isAllowed);
  489. }
  490. [Fact]
  491. public void WhenThereIsNoPermissionButThereIsAuthorizationWillDeny()
  492. {
  493. var company = new Company
  494. {
  495. Name = "Hibernating Rhinos"
  496. };
  497. using (var s = store.OpenSession(DatabaseName))
  498. {
  499. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationUser
  500. {
  501. Id = userId,
  502. Name = "Ayende Rahien",
  503. });
  504. s.Store(company);
  505. client::Raven.Client.Authorization.AuthorizationClientExtensions.SetAuthorizationFor(s, company, new client::Raven.Bundles.Authorization.Model.DocumentAuthorization());
  506. s.SaveChanges();
  507. }
  508. var jsonDocument = Database.Documents.Get(company.Id, null);
  509. var isAllowed = authorizationDecisions.IsAllowed(userId, operation, company.Id, jsonDocument.Metadata, null);
  510. Assert.False(isAllowed);
  511. }
  512. [Fact]
  513. public void WhenThereIsNoAuthorizationWillAllow()
  514. {
  515. var company = new Company
  516. {
  517. Name = "Hibernating Rhinos"
  518. };
  519. using (var s = store.OpenSession(DatabaseName))
  520. {
  521. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationUser
  522. {
  523. Id = userId,
  524. Name = "Ayende Rahien",
  525. });
  526. s.Store(company);
  527. s.SaveChanges();
  528. }
  529. var jsonDocument = Database.Documents.Get(company.Id, null);
  530. var isAllowed = authorizationDecisions.IsAllowed(userId, operation, company.Id, jsonDocument.Metadata, null);
  531. Assert.True(isAllowed);
  532. }
  533. [Fact]
  534. public void WhenGivingUserPermissionForTagStartingWithSameNameAndTaggingDocumentWillFail()
  535. {
  536. var company = new Company
  537. {
  538. Name = "Hibernating Rhinos"
  539. };
  540. using (var s = store.OpenSession(DatabaseName))
  541. {
  542. s.Store(new client::Raven.Bundles.Authorization.Model.AuthorizationUser
  543. {
  544. Id = userId,
  545. Name = "Ayende Rahien",
  546. Permissions =
  547. {
  548. new client::Raven.Bundles.Authorization.Model.OperationPermission
  549. {
  550. Allow = true,
  551. Operation = operation,
  552. Tags = { "Companies/Imp" }
  553. }
  554. }
  555. });
  556. s.Store(company);
  557. client::Raven.Client.Authorization.AuthorizationClientExtensions.SetAuthorizationFor(s, company, new client::Raven.Bundles.Authorization.Model.DocumentAuthorization
  558. {
  559. Tags = { "Companies/Important" }
  560. });
  561. s.SaveChanges();
  562. }
  563. var jsonDocument = Database.Documents.Get(company.Id, null);
  564. var isAllowed = authorizationDecisions.IsAllowed(userId, operation, company.Id, jsonDocument.Metadata, null);
  565. Assert.False(isAllowed);
  566. }
  567. }
  568. }