Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

Issue0259Test.java 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. /*
  2. * Copyright 2013 gitblit.com.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.gitblit.tests;
  17. import java.io.File;
  18. import org.junit.Test;
  19. import com.gitblit.ConfigUserService;
  20. import com.gitblit.Constants.AccessPermission;
  21. import com.gitblit.Constants.AccessRestrictionType;
  22. import com.gitblit.models.RepositoryModel;
  23. import com.gitblit.models.TeamModel;
  24. import com.gitblit.models.UserModel;
  25. /**
  26. * https://code.google.com/p/gitblit/issues/detail?id=259
  27. *
  28. * Reported Problem:
  29. * We have an user with RWD access rights, but he can’t push.
  30. *
  31. * @see src/test/resources/issue0259.conf
  32. *
  33. * At the next day he try again and he can push to the project.
  34. *
  35. * @author James Moger
  36. *
  37. */
  38. public class Issue0259Test extends GitblitUnitTest {
  39. RepositoryModel repo(String name, AccessRestrictionType restriction) {
  40. RepositoryModel repo = new RepositoryModel();
  41. repo.name = name;
  42. repo.accessRestriction = restriction;
  43. return repo;
  44. }
  45. /**
  46. * Test the provided users.conf file for expected access permissions.
  47. *
  48. * @throws Exception
  49. */
  50. @Test
  51. public void testFile() throws Exception {
  52. File realmFile = new File("src/test/resources/issue0259.conf");
  53. ConfigUserService service = new ConfigUserService(realmFile);
  54. RepositoryModel test = repo("test.git", AccessRestrictionType.VIEW);
  55. RepositoryModel projects_test = repo("projects/test.git", AccessRestrictionType.VIEW);
  56. UserModel a = service.getUserModel("a");
  57. UserModel b = service.getUserModel("b");
  58. UserModel c = service.getUserModel("c");
  59. // assert RWD or RW+ for projects/test.git
  60. assertEquals(AccessPermission.DELETE, a.getRepositoryPermission(projects_test).permission);
  61. assertEquals(AccessPermission.DELETE, b.getRepositoryPermission(projects_test).permission);
  62. assertEquals(AccessPermission.REWIND, c.getRepositoryPermission(projects_test).permission);
  63. assertTrue(a.canPush(projects_test));
  64. assertTrue(b.canPush(projects_test));
  65. assertTrue(c.canPush(projects_test));
  66. assertTrue(a.canDeleteRef(projects_test));
  67. assertTrue(b.canDeleteRef(projects_test));
  68. assertTrue(c.canDeleteRef(projects_test));
  69. assertFalse(a.canRewindRef(projects_test));
  70. assertFalse(b.canRewindRef(projects_test));
  71. assertTrue(c.canRewindRef(projects_test));
  72. // assert R for test.git
  73. assertEquals(AccessPermission.CLONE, a.getRepositoryPermission(test).permission);
  74. assertEquals(AccessPermission.CLONE, b.getRepositoryPermission(test).permission);
  75. assertEquals(AccessPermission.REWIND, c.getRepositoryPermission(test).permission);
  76. assertTrue(a.canClone(test));
  77. assertTrue(b.canClone(test));
  78. assertFalse(a.canPush(test));
  79. assertFalse(b.canPush(test));
  80. assertTrue(c.canPush(test));
  81. }
  82. @Test
  83. public void testTeamsOrder() throws Exception {
  84. testTeams(false);
  85. }
  86. @Test
  87. public void testTeamsReverseOrder() throws Exception {
  88. testTeams(true);
  89. }
  90. /**
  91. * Tests multiple teams each with a regex permisson that will match. The
  92. * highest matching permission should be used. Order should be irrelevant.
  93. *
  94. * @param reverseOrder
  95. * @throws Exception
  96. */
  97. private void testTeams(boolean reverseOrder) throws Exception {
  98. RepositoryModel test = repo("test.git", AccessRestrictionType.VIEW);
  99. RepositoryModel projects_test = repo("projects/test.git", AccessRestrictionType.VIEW);
  100. TeamModel t1 = new TeamModel("t1");
  101. t1.setRepositoryPermission(".*", AccessPermission.CLONE);
  102. TeamModel t2 = new TeamModel("t2");
  103. t2.setRepositoryPermission("projects/.*", AccessPermission.DELETE);
  104. UserModel a = new UserModel("a");
  105. if (reverseOrder) {
  106. a.teams.add(t2);
  107. a.teams.add(t1);
  108. } else {
  109. a.teams.add(t1);
  110. a.teams.add(t2);
  111. }
  112. // simulate a repository rename
  113. a.setRepositoryPermission("projects/renamed.git", null);
  114. t1.setRepositoryPermission("projects/renamed.git", null);
  115. t2.setRepositoryPermission("projects/renamed.git", null);
  116. assertEquals(AccessPermission.CLONE, a.getRepositoryPermission(test).permission);
  117. assertEquals(AccessPermission.DELETE, a.getRepositoryPermission(projects_test).permission);
  118. assertTrue(a.canClone(test));
  119. assertTrue(a.canClone(projects_test));
  120. assertFalse(a.canDeleteRef(test));
  121. assertTrue(a.canDeleteRef(projects_test));
  122. }
  123. @Test
  124. public void testTeam() throws Exception {
  125. testTeam(false);
  126. }
  127. @Test
  128. public void testTeamReverseOrder() throws Exception {
  129. testTeam(true);
  130. }
  131. /**
  132. * Test a single team that has multiple repository permissions that all match.
  133. * Here defined order IS important. The first permission match wins so it is
  134. * important to define permissions from most-specific match to least-specific
  135. * match.
  136. *
  137. * If the defined permissions are:
  138. * R:.*
  139. * RWD:projects/.*
  140. * then the expected result is R for all repositories because it is first.
  141. *
  142. * But if the defined permissions are:
  143. * RWD:projects/.*
  144. * R:.*
  145. * then the expected result is RWD for projects/test.git and R for test.git
  146. *
  147. * @param reverseOrder
  148. * @throws Exception
  149. */
  150. private void testTeam(boolean reverseOrder) throws Exception {
  151. RepositoryModel test = repo("test.git", AccessRestrictionType.VIEW);
  152. RepositoryModel projects_test = repo("projects/test.git", AccessRestrictionType.VIEW);
  153. TeamModel t1 = new TeamModel("t1");
  154. if (reverseOrder) {
  155. t1.setRepositoryPermission("projects/.*", AccessPermission.DELETE);
  156. t1.setRepositoryPermission(".*", AccessPermission.CLONE);
  157. } else {
  158. t1.setRepositoryPermission(".*", AccessPermission.CLONE);
  159. t1.setRepositoryPermission("projects/.*", AccessPermission.DELETE);
  160. }
  161. UserModel a = new UserModel("a");
  162. a.teams.add(t1);
  163. // simulate a repository rename
  164. a.setRepositoryPermission("projects/renamed.git", null);
  165. t1.setRepositoryPermission("projects/renamed.git", null);
  166. assertEquals(AccessPermission.CLONE, a.getRepositoryPermission(test).permission);
  167. assertTrue(a.canClone(test));
  168. assertFalse(a.canDeleteRef(test));
  169. assertTrue(a.canClone(projects_test));
  170. if (reverseOrder) {
  171. // RWD permission is found first
  172. assertEquals(AccessPermission.DELETE, a.getRepositoryPermission(projects_test).permission);
  173. assertTrue(a.canDeleteRef(projects_test));
  174. } else {
  175. // R permission is found first
  176. assertEquals(AccessPermission.CLONE, a.getRepositoryPermission(projects_test).permission);
  177. assertFalse(a.canDeleteRef(projects_test));
  178. }
  179. }
  180. }