Disallow creating change edits on closed changes
Change-Id: If5aed6dbbc77ea51d83c9aab0cc8afd32b9d1973
This commit is contained in:
@@ -398,6 +398,14 @@ public class ChangeEditModifier {
|
|||||||
if (!currentUser.get().isIdentifiedUser()) {
|
if (!currentUser.get().isIdentifiedUser()) {
|
||||||
throw new AuthException("Authentication required");
|
throw new AuthException("Authentication required");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Change c = notes.getChange();
|
||||||
|
if (!c.getStatus().isOpen()) {
|
||||||
|
throw new ResourceConflictException(
|
||||||
|
String.format(
|
||||||
|
"change %s is %s", c.getChangeId(), c.getStatus().toString().toLowerCase()));
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
permissionBackend
|
permissionBackend
|
||||||
.currentUser()
|
.currentUser()
|
||||||
|
|||||||
@@ -706,6 +706,27 @@ public class ChangeEditIT extends AbstractDaemonTest {
|
|||||||
createEmptyEditFor(r1.getChangeId());
|
createEmptyEditFor(r1.getChangeId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void editCannotBeCreatedOnMergedChange() throws Exception {
|
||||||
|
ChangeInfo change = gApi.changes().id(changeId).get();
|
||||||
|
gApi.changes().id(changeId).current().review(ReviewInput.approve());
|
||||||
|
gApi.changes().id(changeId).current().submit();
|
||||||
|
|
||||||
|
exception.expect(ResourceConflictException.class);
|
||||||
|
exception.expectMessage(String.format("change %s is merged", change._number));
|
||||||
|
createArbitraryEditFor(changeId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void editCannotBeCreatedOnAbandonedChange() throws Exception {
|
||||||
|
ChangeInfo change = gApi.changes().id(changeId).get();
|
||||||
|
gApi.changes().id(changeId).abandon();
|
||||||
|
|
||||||
|
exception.expect(ResourceConflictException.class);
|
||||||
|
exception.expectMessage(String.format("change %s is abandoned", change._number));
|
||||||
|
createArbitraryEditFor(changeId);
|
||||||
|
}
|
||||||
|
|
||||||
private void createArbitraryEditFor(String changeId) throws Exception {
|
private void createArbitraryEditFor(String changeId) throws Exception {
|
||||||
createEmptyEditFor(changeId);
|
createEmptyEditFor(changeId);
|
||||||
arbitrarilyModifyEditOf(changeId);
|
arbitrarilyModifyEditOf(changeId);
|
||||||
|
|||||||
@@ -254,7 +254,7 @@ public class RefAdvertisementIT extends AbstractDaemonTest {
|
|||||||
public void uploadPackSubsetOfBranchesVisibleWithEdit() throws Exception {
|
public void uploadPackSubsetOfBranchesVisibleWithEdit() throws Exception {
|
||||||
allow("refs/heads/master", Permission.READ, REGISTERED_USERS);
|
allow("refs/heads/master", Permission.READ, REGISTERED_USERS);
|
||||||
|
|
||||||
Change c = notesFactory.createChecked(db, project, c1.getId()).getChange();
|
Change c = notesFactory.createChecked(db, project, c3.getId()).getChange();
|
||||||
String changeId = c.getKey().get();
|
String changeId = c.getKey().get();
|
||||||
|
|
||||||
// Admin's edit is not visible.
|
// Admin's edit is not visible.
|
||||||
@@ -273,7 +273,8 @@ public class RefAdvertisementIT extends AbstractDaemonTest {
|
|||||||
r3 + "meta",
|
r3 + "meta",
|
||||||
"refs/heads/master",
|
"refs/heads/master",
|
||||||
"refs/tags/master-tag",
|
"refs/tags/master-tag",
|
||||||
"refs/users/01/1000001/edit-" + c1.getId() + "/1");
|
"refs/tags/branch-tag",
|
||||||
|
"refs/users/01/1000001/edit-" + c3.getId() + "/1");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -281,21 +282,21 @@ public class RefAdvertisementIT extends AbstractDaemonTest {
|
|||||||
allow("refs/heads/master", Permission.READ, REGISTERED_USERS);
|
allow("refs/heads/master", Permission.READ, REGISTERED_USERS);
|
||||||
allow("refs/*", Permission.VIEW_PRIVATE_CHANGES, REGISTERED_USERS);
|
allow("refs/*", Permission.VIEW_PRIVATE_CHANGES, REGISTERED_USERS);
|
||||||
|
|
||||||
Change change1 = notesFactory.createChecked(db, project, c1.getId()).getChange();
|
Change change3 = notesFactory.createChecked(db, project, c3.getId()).getChange();
|
||||||
String changeId1 = change1.getKey().get();
|
String changeId3 = change3.getKey().get();
|
||||||
Change change2 = notesFactory.createChecked(db, project, c2.getId()).getChange();
|
Change change4 = notesFactory.createChecked(db, project, c4.getId()).getChange();
|
||||||
String changeId2 = change2.getKey().get();
|
String changeId4 = change4.getKey().get();
|
||||||
|
|
||||||
// Admin's edit on change1 is visible.
|
// Admin's edit on change3 is visible.
|
||||||
setApiUser(admin);
|
setApiUser(admin);
|
||||||
gApi.changes().id(changeId1).edit().create();
|
gApi.changes().id(changeId3).edit().create();
|
||||||
|
|
||||||
// Admin's edit on change2 is not visible since user cannot see the change.
|
// Admin's edit on change4 is not visible since user cannot see the change.
|
||||||
gApi.changes().id(changeId2).edit().create();
|
gApi.changes().id(changeId4).edit().create();
|
||||||
|
|
||||||
// User's edit is visible.
|
// User's edit is visible.
|
||||||
setApiUser(user);
|
setApiUser(user);
|
||||||
gApi.changes().id(changeId1).edit().create();
|
gApi.changes().id(changeId3).edit().create();
|
||||||
|
|
||||||
assertUploadPackRefs(
|
assertUploadPackRefs(
|
||||||
"HEAD",
|
"HEAD",
|
||||||
@@ -305,8 +306,9 @@ public class RefAdvertisementIT extends AbstractDaemonTest {
|
|||||||
r3 + "meta",
|
r3 + "meta",
|
||||||
"refs/heads/master",
|
"refs/heads/master",
|
||||||
"refs/tags/master-tag",
|
"refs/tags/master-tag",
|
||||||
"refs/users/00/1000000/edit-" + c1.getId() + "/1",
|
"refs/tags/branch-tag",
|
||||||
"refs/users/01/1000001/edit-" + c1.getId() + "/1");
|
"refs/users/00/1000000/edit-" + c3.getId() + "/1",
|
||||||
|
"refs/users/01/1000001/edit-" + c3.getId() + "/1");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -315,7 +317,7 @@ public class RefAdvertisementIT extends AbstractDaemonTest {
|
|||||||
deny("refs/heads/master", Permission.READ, REGISTERED_USERS);
|
deny("refs/heads/master", Permission.READ, REGISTERED_USERS);
|
||||||
allow("refs/heads/branch", Permission.READ, REGISTERED_USERS);
|
allow("refs/heads/branch", Permission.READ, REGISTERED_USERS);
|
||||||
|
|
||||||
String changeId = c1.change().getKey().get();
|
String changeId = c3.change().getKey().get();
|
||||||
setApiUser(admin);
|
setApiUser(admin);
|
||||||
gApi.changes().id(changeId).edit().create();
|
gApi.changes().id(changeId).edit().create();
|
||||||
setApiUser(user);
|
setApiUser(user);
|
||||||
@@ -336,7 +338,7 @@ public class RefAdvertisementIT extends AbstractDaemonTest {
|
|||||||
// See comment in subsetOfBranchesVisibleNotIncludingHead.
|
// See comment in subsetOfBranchesVisibleNotIncludingHead.
|
||||||
"refs/tags/master-tag",
|
"refs/tags/master-tag",
|
||||||
// All edits are visible due to accessDatabase capability.
|
// All edits are visible due to accessDatabase capability.
|
||||||
"refs/users/00/1000000/edit-" + c1.getId() + "/1");
|
"refs/users/00/1000000/edit-" + c3.getId() + "/1");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user