summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHugo Arès <hugo.ares@ericsson.com>2016-12-23 06:48:13 -0500
committerHugo Arès <hugo.ares@ericsson.com>2016-12-23 06:49:02 -0500
commit7658370c786fe4633eea705d4b4c97b9c1cd333c (patch)
tree93dfe654efda27f64d949a6f0cd04322859dc619
parentd89b7031314468c451fe722c0bbfc18a82e1eb66 (diff)
parentb21e318bc6ea811b80ae5a14795b6e8f2fbbf065 (diff)
Merge branch 'stable-2.12' into stable-2.13
* stable-2.12: Do not check visibility of parent when creating project Add test for create project with create-project capability Change-Id: I174133557e057bc64077bba7d6a68eb0de8e5f73
-rw-r--r--gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java37
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java3
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java26
3 files changed, 61 insertions, 5 deletions
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
index b8a0e4b358..d09eeec385 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
@@ -24,6 +24,7 @@ import com.google.common.net.HttpHeaders;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.RestResponse;
import com.google.gerrit.acceptance.UseLocalDisk;
+import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.extensions.api.projects.ProjectInput;
import com.google.gerrit.extensions.client.InheritableBoolean;
import com.google.gerrit.extensions.client.SubmitType;
@@ -244,6 +245,22 @@ public class CreateProjectIT extends AbstractDaemonTest {
}
@Test
+ public void testCreateProjectWithCapability() throws Exception {
+ allowGlobalCapabilities(SystemGroupBackend.REGISTERED_USERS,
+ GlobalCapability.CREATE_PROJECT);
+ try {
+ setApiUser(user);
+ ProjectInput in = new ProjectInput();
+ in.name = name("newProject");
+ ProjectInfo p = gApi.projects().create(in).get();
+ assertThat(p.name).isEqualTo(in.name);
+ } finally {
+ removeGlobalCapabilities(SystemGroupBackend.REGISTERED_USERS,
+ GlobalCapability.CREATE_PROJECT);
+ }
+ }
+
+ @Test
public void testCreateProjectWithoutCapability_Forbidden() throws Exception {
setApiUser(user);
ProjectInput in = new ProjectInput();
@@ -259,6 +276,26 @@ public class CreateProjectIT extends AbstractDaemonTest {
assertCreateFails(in, ResourceConflictException.class);
}
+ @Test
+ public void testCreateProjectWithCreateProjectCapabilityAndParentNotVisible()
+ throws Exception {
+ Project parent = projectCache.get(allProjects).getProject();
+ parent.setState(com.google.gerrit.extensions.client.ProjectState.HIDDEN);
+ allowGlobalCapabilities(SystemGroupBackend.REGISTERED_USERS,
+ GlobalCapability.CREATE_PROJECT);
+ try {
+ setApiUser(user);
+ ProjectInput in = new ProjectInput();
+ in.name = name("newProject");
+ ProjectInfo p = gApi.projects().create(in).get();
+ assertThat(p.name).isEqualTo(in.name);
+ } finally {
+ parent.setState(com.google.gerrit.extensions.client.ProjectState.ACTIVE);
+ removeGlobalCapabilities(SystemGroupBackend.REGISTERED_USERS,
+ GlobalCapability.CREATE_PROJECT);
+ }
+ }
+
private AccountGroup.UUID groupUuid(String groupName) {
return groupCache.get(new AccountGroup.NameKey(groupName)).getGroupUUID();
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java
index 939d8d491b..fd6e22509f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java
@@ -163,7 +163,8 @@ public class CreateProject implements RestModifyView<TopLevelResource, ProjectIn
String parentName = MoreObjects.firstNonNull(
Strings.emptyToNull(input.parent), allProjects.get());
- args.newParent = projectsCollection.get().parse(parentName).getControl();
+ args.newParent =
+ projectsCollection.get().parse(parentName, false).getControl();
args.createEmptyCommit = input.createEmptyCommit;
args.permissionsOnly = input.permissionsOnly;
args.projectDescription = Strings.emptyToNull(input.description);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java
index 0ffbe3e60f..51603fcb25 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java
@@ -63,7 +63,7 @@ public class ProjectsCollection implements
@Override
public ProjectResource parse(TopLevelResource parent, IdString id)
throws ResourceNotFoundException, IOException {
- ProjectResource rsrc = _parse(id.get());
+ ProjectResource rsrc = _parse(id.get(), true);
if (rsrc == null) {
throw new ResourceNotFoundException(id);
}
@@ -81,7 +81,24 @@ public class ProjectsCollection implements
*/
public ProjectResource parse(String id)
throws UnprocessableEntityException, IOException {
- ProjectResource rsrc = _parse(id);
+ return parse(id, true);
+ }
+
+ /**
+ * Parses a project ID from a request body and returns the project.
+ *
+ * @param id ID of the project, can be a project name
+ * @param checkVisibility Whether to check or not that project is visible to
+ * the calling user
+ * @return the project
+ * @throws UnprocessableEntityException thrown if the project ID cannot be
+ * resolved or if the project is not visible to the calling user and
+ * checkVisibility is true.
+ * @throws IOException thrown when there is an error.
+ */
+ public ProjectResource parse(String id, boolean checkVisibility)
+ throws UnprocessableEntityException, IOException {
+ ProjectResource rsrc = _parse(id, checkVisibility);
if (rsrc == null) {
throw new UnprocessableEntityException(String.format(
"Project Not Found: %s", id));
@@ -89,7 +106,8 @@ public class ProjectsCollection implements
return rsrc;
}
- private ProjectResource _parse(String id) throws IOException {
+ private ProjectResource _parse(String id, boolean checkVisibility)
+ throws IOException {
if (id.endsWith(Constants.DOT_GIT_EXT)) {
id = id.substring(0, id.length() - Constants.DOT_GIT_EXT.length());
}
@@ -101,7 +119,7 @@ public class ProjectsCollection implements
} catch (NoSuchProjectException e) {
return null;
}
- if (!ctl.isVisible() && !ctl.isOwner()) {
+ if (checkVisibility && !ctl.isVisible() && !ctl.isOwner()) {
return null;
}
return new ProjectResource(ctl);