Merge "PostReviewers: Fail if designated reviewer cannot see the change"
This commit is contained in:
@@ -28,6 +28,7 @@ import static com.google.gerrit.server.project.Util.blockLabel;
|
|||||||
import static com.google.gerrit.server.project.Util.category;
|
import static com.google.gerrit.server.project.Util.category;
|
||||||
import static com.google.gerrit.server.project.Util.value;
|
import static com.google.gerrit.server.project.Util.value;
|
||||||
import static java.util.concurrent.TimeUnit.SECONDS;
|
import static java.util.concurrent.TimeUnit.SECONDS;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
@@ -63,6 +64,7 @@ import com.google.gerrit.extensions.common.RevisionInfo;
|
|||||||
import com.google.gerrit.extensions.restapi.AuthException;
|
import com.google.gerrit.extensions.restapi.AuthException;
|
||||||
import com.google.gerrit.extensions.restapi.ResourceConflictException;
|
import com.google.gerrit.extensions.restapi.ResourceConflictException;
|
||||||
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
|
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
|
||||||
|
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
|
||||||
import com.google.gerrit.reviewdb.client.Account;
|
import com.google.gerrit.reviewdb.client.Account;
|
||||||
import com.google.gerrit.reviewdb.client.AccountGroup;
|
import com.google.gerrit.reviewdb.client.AccountGroup;
|
||||||
import com.google.gerrit.reviewdb.client.Change;
|
import com.google.gerrit.reviewdb.client.Change;
|
||||||
@@ -535,6 +537,45 @@ public class ChangeIT extends AbstractDaemonTest {
|
|||||||
.rebase(ri);
|
.rebase(ri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addReviewerThatCannotSeeChange() throws Exception {
|
||||||
|
// create hidden project that is only visible to administrators
|
||||||
|
Project.NameKey p = createProject("p");
|
||||||
|
ProjectConfig cfg = projectCache.checkedGet(p).getConfig();
|
||||||
|
Util.allow(cfg,
|
||||||
|
Permission.READ,
|
||||||
|
groupCache.get(new AccountGroup.NameKey("Administrators"))
|
||||||
|
.getGroupUUID(),
|
||||||
|
"refs/*");
|
||||||
|
Util.block(cfg, Permission.READ, REGISTERED_USERS, "refs/*");
|
||||||
|
saveProjectConfig(p, cfg);
|
||||||
|
|
||||||
|
// create change
|
||||||
|
TestRepository<InMemoryRepository> repo = cloneProject(p, admin);
|
||||||
|
PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo);
|
||||||
|
PushOneCommit.Result result = push.to("refs/for/master");
|
||||||
|
result.assertOkStatus();
|
||||||
|
|
||||||
|
// check the user cannot see the change
|
||||||
|
setApiUser(user);
|
||||||
|
try {
|
||||||
|
gApi.changes().id(result.getChangeId()).get();
|
||||||
|
fail("Expected ResourceNotFoundException");
|
||||||
|
} catch (ResourceNotFoundException e) {
|
||||||
|
// Expected.
|
||||||
|
}
|
||||||
|
|
||||||
|
// try to add user as reviewer
|
||||||
|
setApiUser(admin);
|
||||||
|
AddReviewerInput in = new AddReviewerInput();
|
||||||
|
in.reviewer = user.email;
|
||||||
|
exception.expect(UnprocessableEntityException.class);
|
||||||
|
exception.expectMessage("Change not visible to " + user.email);
|
||||||
|
gApi.changes()
|
||||||
|
.id(result.getChangeId())
|
||||||
|
.addReviewer(in);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void addReviewer() throws Exception {
|
public void addReviewer() throws Exception {
|
||||||
TestTimeUtil.resetWithClockStep(1, SECONDS);
|
TestTimeUtil.resetWithClockStep(1, SECONDS);
|
||||||
|
@@ -161,10 +161,9 @@ public class PostReviewers
|
|||||||
|
|
||||||
public Addition prepareApplication(ChangeResource rsrc, AddReviewerInput input)
|
public Addition prepareApplication(ChangeResource rsrc, AddReviewerInput input)
|
||||||
throws OrmException, RestApiException, IOException {
|
throws OrmException, RestApiException, IOException {
|
||||||
|
Account.Id accountId;
|
||||||
try {
|
try {
|
||||||
Account.Id accountId = accounts.parse(input.reviewer).getAccountId();
|
accountId = accounts.parse(input.reviewer).getAccountId();
|
||||||
return putAccount(input.reviewer, reviewerFactory.create(rsrc, accountId),
|
|
||||||
input.state());
|
|
||||||
} catch (UnprocessableEntityException e) {
|
} catch (UnprocessableEntityException e) {
|
||||||
try {
|
try {
|
||||||
return putGroup(rsrc, input);
|
return putGroup(rsrc, input);
|
||||||
@@ -173,17 +172,19 @@ public class PostReviewers
|
|||||||
.format(ChangeMessages.get().reviewerNotFound, input.reviewer));
|
.format(ChangeMessages.get().reviewerNotFound, input.reviewer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return putAccount(input.reviewer, reviewerFactory.create(rsrc, accountId),
|
||||||
|
input.state());
|
||||||
}
|
}
|
||||||
|
|
||||||
private Addition putAccount(String reviewer, ReviewerResource rsrc,
|
private Addition putAccount(String reviewer, ReviewerResource rsrc,
|
||||||
ReviewerState state) {
|
ReviewerState state) throws UnprocessableEntityException {
|
||||||
Account member = rsrc.getReviewerUser().getAccount();
|
Account member = rsrc.getReviewerUser().getAccount();
|
||||||
ChangeControl control = rsrc.getReviewerControl();
|
ChangeControl control = rsrc.getReviewerControl();
|
||||||
if (isValidReviewer(member, control)) {
|
if (isValidReviewer(member, control)) {
|
||||||
return new Addition(reviewer, rsrc.getChangeResource(),
|
return new Addition(reviewer, rsrc.getChangeResource(),
|
||||||
ImmutableMap.of(member.getId(), control), state);
|
ImmutableMap.of(member.getId(), control), state);
|
||||||
}
|
}
|
||||||
return new Addition(reviewer);
|
throw new UnprocessableEntityException("Change not visible to " + reviewer);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Addition putGroup(ChangeResource rsrc, AddReviewerInput input)
|
private Addition putGroup(ChangeResource rsrc, AddReviewerInput input)
|
||||||
|
Reference in New Issue
Block a user