You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Issue0259Test.java 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  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.Assert;
  19. import org.junit.Test;
  20. import com.gitblit.ConfigUserService;
  21. import com.gitblit.Constants.AccessPermission;
  22. import com.gitblit.Constants.AccessRestrictionType;
  23. import com.gitblit.models.RepositoryModel;
  24. import com.gitblit.models.TeamModel;
  25. import com.gitblit.models.UserModel;
  26. /**
  27. * https://code.google.com/p/gitblit/issues/detail?id=259
  28. *
  29. * Reported Problem:
  30. * We have an user with RWD access rights, but he can’t push.
  31. *
  32. * @see src/test/resources/issue0259.conf
  33. *
  34. * At the next day he try again and he can push to the project.
  35. *
  36. * @author James Moger
  37. *
  38. */
  39. public class Issue0259Test extends Assert {
  40. RepositoryModel repo(String name, AccessRestrictionType restriction) {
  41. RepositoryModel repo = new RepositoryModel();
  42. repo.name = name;
  43. repo.accessRestriction = restriction;
  44. return repo;
  45. }
  46. /**
  47. * Test the provided users.conf file for expected access permissions.
  48. *
  49. * @throws Exception
  50. */
  51. @Test
  52. public void testFile() throws Exception {
  53. File realmFile = new File("src/test/resources/issue0259.conf");
  54. ConfigUserService service = new ConfigUserService(realmFile);
  55. RepositoryModel test = repo("test.git", AccessRestrictionType.VIEW);
  56. RepositoryModel projects_test = repo("projects/test.git", AccessRestrictionType.VIEW);
  57. UserModel a = service.getUserModel("a");
  58. UserModel b = service.getUserModel("b");
  59. UserModel c = service.getUserModel("c");
  60. // assert RWD or RW+ for projects/test.git
  61. assertEquals(AccessPermission.DELETE, a.getRepositoryPermission(projects_test).permission);
  62. assertEquals(AccessPermission.DELETE, b.getRepositoryPermission(projects_test).permission);
  63. assertEquals(AccessPermission.REWIND, c.getRepositoryPermission(projects_test).permission);
  64. assertTrue(a.canPush(projects_test));
  65. assertTrue(b.canPush(projects_test));
  66. assertTrue(c.canPush(projects_test));
  67. assertTrue(a.canDeleteRef(projects_test));
  68. assertTrue(b.canDeleteRef(projects_test));
  69. assertTrue(c.canDeleteRef(projects_test));
  70. assertFalse(a.canRewindRef(projects_test));
  71. assertFalse(b.canRewindRef(projects_test));
  72. assertTrue(c.canRewindRef(projects_test));
  73. // assert R for test.git
  74. assertEquals(AccessPermission.CLONE, a.getRepositoryPermission(test).permission);
  75. assertEquals(AccessPermission.CLONE, b.getRepositoryPermission(test).permission);
  76. assertEquals(AccessPermission.REWIND, c.getRepositoryPermission(test).permission);
  77. assertTrue(a.canClone(test));
  78. assertTrue(b.canClone(test));
  79. assertFalse(a.canPush(test));
  80. assertFalse(b.canPush(test));
  81. assertTrue(c.canPush(test));
  82. }
  83. @Test
  84. public void testTeamsOrder() throws Exception {
  85. testTeams(false);
  86. }
  87. @Test
  88. public void testTeamsReverseOrder() throws Exception {
  89. testTeams(true);
  90. }
  91. /**
  92. * Tests multiple teams each with a regex permisson that will match. The
  93. * highest matching permission should be used. Order should be irrelevant.
  94. *
  95. * @param reverseOrder
  96. * @throws Exception
  97. */
  98. private void testTeams(boolean reverseOrder) throws Exception {
  99. RepositoryModel test = repo("test.git", AccessRestrictionType.VIEW);
  100. RepositoryModel projects_test = repo("projects/test.git", AccessRestrictionType.VIEW);
  101. TeamModel t1 = new TeamModel("t1");
  102. t1.setRepositoryPermission(".*", AccessPermission.CLONE);
  103. TeamModel t2 = new TeamModel("t2");
  104. t2.setRepositoryPermission("projects/.*", AccessPermission.DELETE);
  105. UserModel a = new UserModel("a");
  106. if (reverseOrder) {
  107. a.teams.add(t2);
  108. a.teams.add(t1);
  109. } else {
  110. a.teams.add(t1);
  111. a.teams.add(t2);
  112. }
  113. assertEquals(AccessPermission.CLONE, a.getRepositoryPermission(test).permission);
  114. assertEquals(AccessPermission.DELETE, a.getRepositoryPermission(projects_test).permission);
  115. assertTrue(a.canClone(test));
  116. assertTrue(a.canClone(projects_test));
  117. assertFalse(a.canDeleteRef(test));
  118. assertTrue(a.canDeleteRef(projects_test));
  119. }
  120. @Test
  121. public void testTeam() throws Exception {
  122. testTeam(false);
  123. }
  124. @Test
  125. public void testTeamReverseOrder() throws Exception {
  126. testTeam(true);
  127. }
  128. /**
  129. * Test a single team that has multiple repository permissions that all match.
  130. * Here defined order IS important. The first permission match wins so it is
  131. * important to define permissions from most-specific match to least-specific
  132. * match.
  133. *
  134. * If the defined permissions are:
  135. * R:.*
  136. * RWD:projects/.*
  137. * then the expected result is R for all repositories because it is first.
  138. *
  139. * But if the defined permissions are:
  140. * RWD:projects/.*
  141. * R:.*
  142. * then the expected result is RWD for projects/test.git and R for test.git
  143. *
  144. * @param reverseOrder
  145. * @throws Exception
  146. */
  147. private void testTeam(boolean reverseOrder) throws Exception {
  148. RepositoryModel test = repo("test.git", AccessRestrictionType.VIEW);
  149. RepositoryModel projects_test = repo("projects/test.git", AccessRestrictionType.VIEW);
  150. TeamModel t1 = new TeamModel("t1");
  151. if (reverseOrder) {
  152. t1.setRepositoryPermission("projects/.*", AccessPermission.DELETE);
  153. t1.setRepositoryPermission(".*", AccessPermission.CLONE);
  154. } else {
  155. t1.setRepositoryPermission(".*", AccessPermission.CLONE);
  156. t1.setRepositoryPermission("projects/.*", AccessPermission.DELETE);
  157. }
  158. UserModel a = new UserModel("a");
  159. a.teams.add(t1);
  160. assertEquals(AccessPermission.CLONE, a.getRepositoryPermission(test).permission);
  161. assertTrue(a.canClone(test));
  162. assertFalse(a.canDeleteRef(test));
  163. assertTrue(a.canClone(projects_test));
  164. if (reverseOrder) {
  165. // RWD permission is found first
  166. assertEquals(AccessPermission.DELETE, a.getRepositoryPermission(projects_test).permission);
  167. assertTrue(a.canDeleteRef(projects_test));
  168. } else {
  169. // R permission is found first
  170. assertEquals(AccessPermission.CLONE, a.getRepositoryPermission(projects_test).permission);
  171. assertFalse(a.canDeleteRef(projects_test));
  172. }
  173. }
  174. }