diff options
author | Hugo Arès <hugo.ares@ericsson.com> | 2016-12-23 06:48:13 -0500 |
---|---|---|
committer | Hugo Arès <hugo.ares@ericsson.com> | 2016-12-23 06:49:02 -0500 |
commit | 7658370c786fe4633eea705d4b4c97b9c1cd333c (patch) | |
tree | 93dfe654efda27f64d949a6f0cd04322859dc619 | |
parent | d89b7031314468c451fe722c0bbfc18a82e1eb66 (diff) | |
parent | b21e318bc6ea811b80ae5a14795b6e8f2fbbf065 (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
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); |