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
This commit is contained in:
Hugo Arès
2016-12-23 06:48:13 -05:00
3 changed files with 61 additions and 5 deletions

View File

@@ -24,6 +24,7 @@ import com.google.common.net.HttpHeaders;
import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.acceptance.RestResponse;
import com.google.gerrit.acceptance.UseLocalDisk; 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.api.projects.ProjectInput;
import com.google.gerrit.extensions.client.InheritableBoolean; import com.google.gerrit.extensions.client.InheritableBoolean;
import com.google.gerrit.extensions.client.SubmitType; import com.google.gerrit.extensions.client.SubmitType;
@@ -243,6 +244,22 @@ public class CreateProjectIT extends AbstractDaemonTest {
"refs/heads/release"); "refs/heads/release");
} }
@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 @Test
public void testCreateProjectWithoutCapability_Forbidden() throws Exception { public void testCreateProjectWithoutCapability_Forbidden() throws Exception {
setApiUser(user); setApiUser(user);
@@ -259,6 +276,26 @@ public class CreateProjectIT extends AbstractDaemonTest {
assertCreateFails(in, ResourceConflictException.class); 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) { private AccountGroup.UUID groupUuid(String groupName) {
return groupCache.get(new AccountGroup.NameKey(groupName)).getGroupUUID(); return groupCache.get(new AccountGroup.NameKey(groupName)).getGroupUUID();
} }

View File

@@ -163,7 +163,8 @@ public class CreateProject implements RestModifyView<TopLevelResource, ProjectIn
String parentName = MoreObjects.firstNonNull( String parentName = MoreObjects.firstNonNull(
Strings.emptyToNull(input.parent), allProjects.get()); 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.createEmptyCommit = input.createEmptyCommit;
args.permissionsOnly = input.permissionsOnly; args.permissionsOnly = input.permissionsOnly;
args.projectDescription = Strings.emptyToNull(input.description); args.projectDescription = Strings.emptyToNull(input.description);

View File

@@ -63,7 +63,7 @@ public class ProjectsCollection implements
@Override @Override
public ProjectResource parse(TopLevelResource parent, IdString id) public ProjectResource parse(TopLevelResource parent, IdString id)
throws ResourceNotFoundException, IOException { throws ResourceNotFoundException, IOException {
ProjectResource rsrc = _parse(id.get()); ProjectResource rsrc = _parse(id.get(), true);
if (rsrc == null) { if (rsrc == null) {
throw new ResourceNotFoundException(id); throw new ResourceNotFoundException(id);
} }
@@ -81,7 +81,24 @@ public class ProjectsCollection implements
*/ */
public ProjectResource parse(String id) public ProjectResource parse(String id)
throws UnprocessableEntityException, IOException { 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) { if (rsrc == null) {
throw new UnprocessableEntityException(String.format( throw new UnprocessableEntityException(String.format(
"Project Not Found: %s", id)); "Project Not Found: %s", id));
@@ -89,7 +106,8 @@ public class ProjectsCollection implements
return rsrc; 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)) { if (id.endsWith(Constants.DOT_GIT_EXT)) {
id = id.substring(0, id.length() - Constants.DOT_GIT_EXT.length()); id = id.substring(0, id.length() - Constants.DOT_GIT_EXT.length());
} }
@@ -101,7 +119,7 @@ public class ProjectsCollection implements
} catch (NoSuchProjectException e) { } catch (NoSuchProjectException e) {
return null; return null;
} }
if (!ctl.isVisible() && !ctl.isOwner()) { if (checkVisibility && !ctl.isVisible() && !ctl.isOwner()) {
return null; return null;
} }
return new ProjectResource(ctl); return new ProjectResource(ctl);