Merge changes I6be4658b,Iece1e1ac
* changes: Don't store a reference to ProjectApi in AccessIT Make ProjectPermission.READ_CONFIG check if the user can READ r/m/c
This commit is contained in:
		@@ -24,6 +24,7 @@ import com.google.gerrit.reviewdb.client.AccountGroup;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Branch;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Change;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Project;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.RefNames;
 | 
			
		||||
import com.google.gerrit.reviewdb.server.ReviewDb;
 | 
			
		||||
import com.google.gerrit.server.CurrentUser;
 | 
			
		||||
import com.google.gerrit.server.account.GroupMembership;
 | 
			
		||||
@@ -418,9 +419,11 @@ class ProjectControl {
 | 
			
		||||
        case PUSH_AT_LEAST_ONE_REF:
 | 
			
		||||
          return canPushToAtLeastOneRef();
 | 
			
		||||
 | 
			
		||||
        case READ_CONFIG:
 | 
			
		||||
          return controlForRef(RefNames.REFS_CONFIG).isVisible();
 | 
			
		||||
 | 
			
		||||
        case BAN_COMMIT:
 | 
			
		||||
        case READ_REFLOG:
 | 
			
		||||
        case READ_CONFIG:
 | 
			
		||||
        case WRITE_CONFIG:
 | 
			
		||||
          return isOwner();
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@ package com.google.gerrit.acceptance.rest.project;
 | 
			
		||||
import static com.google.common.truth.Truth.assertThat;
 | 
			
		||||
import static com.google.common.truth.Truth8.assertThat;
 | 
			
		||||
import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
 | 
			
		||||
import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.acceptance.AbstractDaemonTest;
 | 
			
		||||
import com.google.gerrit.acceptance.GitUtil;
 | 
			
		||||
@@ -69,20 +70,18 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
 | 
			
		||||
  private static final String LABEL_CODE_REVIEW = "Code-Review";
 | 
			
		||||
 | 
			
		||||
  private String newProjectName;
 | 
			
		||||
  private ProjectApi pApi;
 | 
			
		||||
  private Project.NameKey newProjectName;
 | 
			
		||||
 | 
			
		||||
  @Inject private DynamicSet<FileHistoryWebLink> fileHistoryWebLinkDynamicSet;
 | 
			
		||||
 | 
			
		||||
  @Before
 | 
			
		||||
  public void setUp() throws Exception {
 | 
			
		||||
    newProjectName = createProject(PROJECT_NAME).get();
 | 
			
		||||
    pApi = gApi.projects().name(newProjectName);
 | 
			
		||||
    newProjectName = createProject(PROJECT_NAME);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void getDefaultInheritance() throws Exception {
 | 
			
		||||
    String inheritedName = pApi.access().inheritsFrom.name;
 | 
			
		||||
    String inheritedName = pApi().access().inheritsFrom.name;
 | 
			
		||||
    assertThat(inheritedName).isEqualTo(AllProjectsNameProvider.DEFAULT);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -99,7 +98,7 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
              }
 | 
			
		||||
            });
 | 
			
		||||
    try {
 | 
			
		||||
      ProjectAccessInfo info = pApi.access();
 | 
			
		||||
      ProjectAccessInfo info = pApi().access();
 | 
			
		||||
      assertThat(info.configWebLinks).hasSize(1);
 | 
			
		||||
      assertThat(info.configWebLinks.get(0).url)
 | 
			
		||||
          .isEqualTo("http://view/" + newProjectName + "/project.config");
 | 
			
		||||
@@ -120,13 +119,13 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
                    "name", "imageURL", "http://view/" + projectName + "/" + fileName);
 | 
			
		||||
              }
 | 
			
		||||
            });
 | 
			
		||||
    try (Repository repo = repoManager.openRepository(new Project.NameKey(newProjectName))) {
 | 
			
		||||
    try (Repository repo = repoManager.openRepository(newProjectName)) {
 | 
			
		||||
      RefUpdate u = repo.updateRef(RefNames.REFS_CONFIG);
 | 
			
		||||
      u.setForceUpdate(true);
 | 
			
		||||
      assertThat(u.delete()).isEqualTo(Result.FORCED);
 | 
			
		||||
 | 
			
		||||
      // This should not crash.
 | 
			
		||||
      pApi.access();
 | 
			
		||||
      pApi().access();
 | 
			
		||||
    } finally {
 | 
			
		||||
      handle.remove();
 | 
			
		||||
    }
 | 
			
		||||
@@ -134,34 +133,34 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void addAccessSection() throws Exception {
 | 
			
		||||
    Project.NameKey p = new Project.NameKey(newProjectName);
 | 
			
		||||
    RevCommit initialHead = getRemoteHead(p, RefNames.REFS_CONFIG);
 | 
			
		||||
    RevCommit initialHead = getRemoteHead(newProjectName, RefNames.REFS_CONFIG);
 | 
			
		||||
 | 
			
		||||
    ProjectAccessInput accessInput = newProjectAccessInput();
 | 
			
		||||
    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
 | 
			
		||||
 | 
			
		||||
    accessInput.add.put(REFS_HEADS, accessSectionInfo);
 | 
			
		||||
    pApi.access(accessInput);
 | 
			
		||||
    pApi().access(accessInput);
 | 
			
		||||
 | 
			
		||||
    assertThat(pApi.access().local).isEqualTo(accessInput.add);
 | 
			
		||||
    assertThat(pApi().access().local).isEqualTo(accessInput.add);
 | 
			
		||||
 | 
			
		||||
    RevCommit updatedHead = getRemoteHead(p, RefNames.REFS_CONFIG);
 | 
			
		||||
    RevCommit updatedHead = getRemoteHead(newProjectName, RefNames.REFS_CONFIG);
 | 
			
		||||
    eventRecorder.assertRefUpdatedEvents(
 | 
			
		||||
        p.get(), RefNames.REFS_CONFIG, null, initialHead, initialHead, updatedHead);
 | 
			
		||||
        newProjectName.get(), RefNames.REFS_CONFIG, null, initialHead, initialHead, updatedHead);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void createAccessChangeNop() throws Exception {
 | 
			
		||||
    ProjectAccessInput accessInput = newProjectAccessInput();
 | 
			
		||||
    exception.expect(BadRequestException.class);
 | 
			
		||||
    pApi.accessChange(accessInput);
 | 
			
		||||
    pApi().accessChange(accessInput);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void createAccessChange() throws Exception {
 | 
			
		||||
    allow(newProjectName, RefNames.REFS_CONFIG, Permission.READ, REGISTERED_USERS);
 | 
			
		||||
    // User can see the branch
 | 
			
		||||
    setApiUser(user);
 | 
			
		||||
    gApi.projects().name(newProjectName).branch("refs/heads/master").get();
 | 
			
		||||
    pApi().branch("refs/heads/master").get();
 | 
			
		||||
 | 
			
		||||
    ProjectAccessInput accessInput = newProjectAccessInput();
 | 
			
		||||
 | 
			
		||||
@@ -176,9 +175,9 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
    accessInput.add.put(REFS_HEADS, accessSection);
 | 
			
		||||
 | 
			
		||||
    setApiUser(user);
 | 
			
		||||
    ChangeInfo out = pApi.accessChange(accessInput);
 | 
			
		||||
    ChangeInfo out = pApi().accessChange(accessInput);
 | 
			
		||||
 | 
			
		||||
    assertThat(out.project).isEqualTo(newProjectName);
 | 
			
		||||
    assertThat(out.project).isEqualTo(newProjectName.get());
 | 
			
		||||
    assertThat(out.branch).isEqualTo(RefNames.REFS_CONFIG);
 | 
			
		||||
    assertThat(out.status).isEqualTo(ChangeStatus.NEW);
 | 
			
		||||
    assertThat(out.submitted).isNull();
 | 
			
		||||
@@ -196,7 +195,7 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
    // check that the change took effect.
 | 
			
		||||
    setApiUser(user);
 | 
			
		||||
    try {
 | 
			
		||||
      BranchInfo info = gApi.projects().name(newProjectName).branch("refs/heads/master").get();
 | 
			
		||||
      BranchInfo info = pApi().branch("refs/heads/master").get();
 | 
			
		||||
      fail("wanted failure, got " + newGson().toJson(info));
 | 
			
		||||
    } catch (ResourceNotFoundException e) {
 | 
			
		||||
      // OK.
 | 
			
		||||
@@ -207,17 +206,15 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
    accessInput.remove.put(REFS_HEADS, accessSection);
 | 
			
		||||
    setApiUser(user);
 | 
			
		||||
 | 
			
		||||
    pApi.accessChange(accessInput);
 | 
			
		||||
 | 
			
		||||
    setApiUser(admin);
 | 
			
		||||
    out = pApi.accessChange(accessInput);
 | 
			
		||||
    out = pApi().accessChange(accessInput);
 | 
			
		||||
 | 
			
		||||
    gApi.changes().id(out._number).current().review(reviewIn);
 | 
			
		||||
    gApi.changes().id(out._number).current().submit();
 | 
			
		||||
 | 
			
		||||
    // Now it works again.
 | 
			
		||||
    setApiUser(user);
 | 
			
		||||
    gApi.projects().name(newProjectName).branch("refs/heads/master").get();
 | 
			
		||||
    pApi().branch("refs/heads/master").get();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
@@ -227,7 +224,7 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
 | 
			
		||||
 | 
			
		||||
    accessInput.add.put(REFS_HEADS, accessSectionInfo);
 | 
			
		||||
    pApi.access(accessInput);
 | 
			
		||||
    pApi().access(accessInput);
 | 
			
		||||
 | 
			
		||||
    // Remove specific permission
 | 
			
		||||
    AccessSectionInfo accessSectionToRemove = newAccessSectionInfo();
 | 
			
		||||
@@ -235,13 +232,13 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
        Permission.LABEL + LABEL_CODE_REVIEW, newPermissionInfo());
 | 
			
		||||
    ProjectAccessInput removal = newProjectAccessInput();
 | 
			
		||||
    removal.remove.put(REFS_HEADS, accessSectionToRemove);
 | 
			
		||||
    pApi.access(removal);
 | 
			
		||||
    pApi().access(removal);
 | 
			
		||||
 | 
			
		||||
    // Remove locally
 | 
			
		||||
    accessInput.add.get(REFS_HEADS).permissions.remove(Permission.LABEL + LABEL_CODE_REVIEW);
 | 
			
		||||
 | 
			
		||||
    // Check
 | 
			
		||||
    assertThat(pApi.access().local).isEqualTo(accessInput.add);
 | 
			
		||||
    assertThat(pApi().access().local).isEqualTo(accessInput.add);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
@@ -251,7 +248,7 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
 | 
			
		||||
 | 
			
		||||
    accessInput.add.put(REFS_HEADS, accessSectionInfo);
 | 
			
		||||
    pApi.access(accessInput);
 | 
			
		||||
    pApi().access(accessInput);
 | 
			
		||||
 | 
			
		||||
    // Remove specific permission rule
 | 
			
		||||
    AccessSectionInfo accessSectionToRemove = newAccessSectionInfo();
 | 
			
		||||
@@ -262,7 +259,7 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
    accessSectionToRemove.permissions.put(Permission.LABEL + LABEL_CODE_REVIEW, codeReview);
 | 
			
		||||
    ProjectAccessInput removal = newProjectAccessInput();
 | 
			
		||||
    removal.remove.put(REFS_HEADS, accessSectionToRemove);
 | 
			
		||||
    pApi.access(removal);
 | 
			
		||||
    pApi().access(removal);
 | 
			
		||||
 | 
			
		||||
    // Remove locally
 | 
			
		||||
    accessInput
 | 
			
		||||
@@ -274,7 +271,7 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
        .remove(SystemGroupBackend.REGISTERED_USERS.get());
 | 
			
		||||
 | 
			
		||||
    // Check
 | 
			
		||||
    assertThat(pApi.access().local).isEqualTo(accessInput.add);
 | 
			
		||||
    assertThat(pApi().access().local).isEqualTo(accessInput.add);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
@@ -284,7 +281,7 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
 | 
			
		||||
 | 
			
		||||
    accessInput.add.put(REFS_HEADS, accessSectionInfo);
 | 
			
		||||
    pApi.access(accessInput);
 | 
			
		||||
    pApi().access(accessInput);
 | 
			
		||||
 | 
			
		||||
    // Remove specific permission rules
 | 
			
		||||
    AccessSectionInfo accessSectionToRemove = newAccessSectionInfo();
 | 
			
		||||
@@ -297,13 +294,13 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
    accessSectionToRemove.permissions.put(Permission.LABEL + LABEL_CODE_REVIEW, codeReview);
 | 
			
		||||
    ProjectAccessInput removal = newProjectAccessInput();
 | 
			
		||||
    removal.remove.put(REFS_HEADS, accessSectionToRemove);
 | 
			
		||||
    pApi.access(removal);
 | 
			
		||||
    pApi().access(removal);
 | 
			
		||||
 | 
			
		||||
    // Remove locally
 | 
			
		||||
    accessInput.add.get(REFS_HEADS).permissions.remove(Permission.LABEL + LABEL_CODE_REVIEW);
 | 
			
		||||
 | 
			
		||||
    // Check
 | 
			
		||||
    assertThat(pApi.access().local).isEqualTo(accessInput.add);
 | 
			
		||||
    assertThat(pApi().access().local).isEqualTo(accessInput.add);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
@@ -314,11 +311,11 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
 | 
			
		||||
    // Disallow READ
 | 
			
		||||
    accessInput.add.put(REFS_ALL, accessSectionInfo);
 | 
			
		||||
    pApi.access(accessInput);
 | 
			
		||||
    pApi().access(accessInput);
 | 
			
		||||
 | 
			
		||||
    setApiUser(user);
 | 
			
		||||
    exception.expect(ResourceNotFoundException.class);
 | 
			
		||||
    gApi.projects().name(newProjectName).access();
 | 
			
		||||
    pApi().access();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
@@ -329,7 +326,7 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
 | 
			
		||||
    // Disallow READ
 | 
			
		||||
    accessInput.add.put(REFS_ALL, accessSectionInfo);
 | 
			
		||||
    pApi.access(accessInput);
 | 
			
		||||
    pApi().access(accessInput);
 | 
			
		||||
 | 
			
		||||
    // Create a change to apply
 | 
			
		||||
    ProjectAccessInput accessInfoToApply = newProjectAccessInput();
 | 
			
		||||
@@ -338,7 +335,7 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
 | 
			
		||||
    setApiUser(user);
 | 
			
		||||
    exception.expect(ResourceNotFoundException.class);
 | 
			
		||||
    gApi.projects().name(newProjectName).access();
 | 
			
		||||
    pApi().access();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
@@ -358,7 +355,7 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
    accessSection.permissions.put(Permission.READ, read);
 | 
			
		||||
 | 
			
		||||
    accessInput.add.put(REFS_ALL, accessSection);
 | 
			
		||||
    ProjectAccessInfo result = pApi.access(accessInput);
 | 
			
		||||
    ProjectAccessInfo result = pApi().access(accessInput);
 | 
			
		||||
    assertThat(result.groups.keySet())
 | 
			
		||||
        .containsExactly(
 | 
			
		||||
            SystemGroupBackend.PROJECT_OWNERS.get(), SystemGroupBackend.ANONYMOUS_USERS.get());
 | 
			
		||||
@@ -371,7 +368,7 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
    assertThat(result.groups.get(SystemGroupBackend.PROJECT_OWNERS.get()).id).isNull();
 | 
			
		||||
 | 
			
		||||
    // Get call returns groups too.
 | 
			
		||||
    ProjectAccessInfo loggedInResult = pApi.access();
 | 
			
		||||
    ProjectAccessInfo loggedInResult = pApi().access();
 | 
			
		||||
    assertThat(loggedInResult.groups.keySet())
 | 
			
		||||
        .containsExactly(
 | 
			
		||||
            SystemGroupBackend.PROJECT_OWNERS.get(), SystemGroupBackend.ANONYMOUS_USERS.get());
 | 
			
		||||
@@ -384,7 +381,7 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
 | 
			
		||||
    // PROJECT_OWNERS is invisible to anonymous user, but GetAccess disregards visibility.
 | 
			
		||||
    setApiUserAnonymous();
 | 
			
		||||
    ProjectAccessInfo anonResult = pApi.access();
 | 
			
		||||
    ProjectAccessInfo anonResult = pApi().access();
 | 
			
		||||
    assertThat(anonResult.groups.keySet())
 | 
			
		||||
        .containsExactly(
 | 
			
		||||
            SystemGroupBackend.PROJECT_OWNERS.get(), SystemGroupBackend.ANONYMOUS_USERS.get());
 | 
			
		||||
@@ -402,7 +399,7 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
    setApiUser(user);
 | 
			
		||||
    exception.expect(AuthException.class);
 | 
			
		||||
    exception.expectMessage("administrate server not permitted");
 | 
			
		||||
    gApi.projects().name(newProjectName).access(accessInput);
 | 
			
		||||
    pApi().access(accessInput);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
@@ -414,9 +411,9 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
    ProjectAccessInput accessInput = newProjectAccessInput();
 | 
			
		||||
    accessInput.parent = newParentProjectName;
 | 
			
		||||
 | 
			
		||||
    gApi.projects().name(newProjectName).access(accessInput);
 | 
			
		||||
    pApi().access(accessInput);
 | 
			
		||||
 | 
			
		||||
    assertThat(pApi.access().inheritsFrom.name).isEqualTo(newParentProjectName);
 | 
			
		||||
    assertThat(pApi().access().inheritsFrom.name).isEqualTo(newParentProjectName);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
@@ -457,7 +454,7 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
    accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo);
 | 
			
		||||
 | 
			
		||||
    exception.expect(BadRequestException.class);
 | 
			
		||||
    pApi.access(accessInput);
 | 
			
		||||
    pApi().access(accessInput);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
@@ -632,6 +629,10 @@ public class AccessIT extends AbstractDaemonTest {
 | 
			
		||||
    assertThat(permissions2.keySet()).containsExactly(Permission.READ);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private ProjectApi pApi() throws Exception {
 | 
			
		||||
    return gApi.projects().name(newProjectName.get());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private ProjectAccessInput newProjectAccessInput() {
 | 
			
		||||
    ProjectAccessInput p = new ProjectAccessInput();
 | 
			
		||||
    p.add = new HashMap<>();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user