Revert "Prevent mutation of permissions on refs/groups through pushes"
As discussed in change Id18851f503 group owners are no longer defined by
permissions on refs/groups and hence we don't need to prevent
modifications to permissions on this namespace.
This reverts commit 22f6c58aa0.
Change-Id: I2e7d4450c9db14e789e8e9a0d795ae8a66ee83b6
Signed-off-by: Edwin Kempin <ekempin@google.com>
This commit is contained in:
@@ -569,8 +569,7 @@ public class ChangeInserter implements InsertChangeOp {
|
|||||||
new Branch.NameKey(ctx.getProject(), refName),
|
new Branch.NameKey(ctx.getProject(), refName),
|
||||||
ctx.getIdentifiedUser(),
|
ctx.getIdentifiedUser(),
|
||||||
new NoSshInfo(),
|
new NoSshInfo(),
|
||||||
ctx.getRevWalk(),
|
ctx.getRevWalk())
|
||||||
projectState)
|
|
||||||
.validate(event);
|
.validate(event);
|
||||||
}
|
}
|
||||||
} catch (CommitValidationException e) {
|
} catch (CommitValidationException e) {
|
||||||
|
|||||||
@@ -344,8 +344,7 @@ public class PatchSetInserter implements BatchUpdateOp {
|
|||||||
origNotes.getChange().getDest(),
|
origNotes.getChange().getDest(),
|
||||||
ctx.getIdentifiedUser(),
|
ctx.getIdentifiedUser(),
|
||||||
new NoSshInfo(),
|
new NoSshInfo(),
|
||||||
ctx.getRevWalk(),
|
ctx.getRevWalk())
|
||||||
projectCache.checkedGet(ctx.getProject()))
|
|
||||||
.validate(event);
|
.validate(event);
|
||||||
} catch (CommitValidationException e) {
|
} catch (CommitValidationException e) {
|
||||||
throw new ResourceConflictException(e.getFullMessage());
|
throw new ResourceConflictException(e.getFullMessage());
|
||||||
|
|||||||
@@ -21,11 +21,9 @@ import static java.util.stream.Collectors.toList;
|
|||||||
|
|
||||||
import com.google.common.base.CharMatcher;
|
import com.google.common.base.CharMatcher;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.Sets;
|
|
||||||
import com.google.gerrit.common.FooterConstants;
|
import com.google.gerrit.common.FooterConstants;
|
||||||
import com.google.gerrit.common.Nullable;
|
import com.google.gerrit.common.Nullable;
|
||||||
import com.google.gerrit.common.PageLinks;
|
import com.google.gerrit.common.PageLinks;
|
||||||
import com.google.gerrit.common.data.AccessSection;
|
|
||||||
import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo;
|
import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo;
|
||||||
import com.google.gerrit.extensions.registration.DynamicSet;
|
import com.google.gerrit.extensions.registration.DynamicSet;
|
||||||
import com.google.gerrit.extensions.restapi.AuthException;
|
import com.google.gerrit.extensions.restapi.AuthException;
|
||||||
@@ -60,9 +58,7 @@ import java.net.MalformedURLException;
|
|||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import org.eclipse.jgit.errors.ConfigInvalidException;
|
import org.eclipse.jgit.errors.ConfigInvalidException;
|
||||||
import org.eclipse.jgit.lib.Config;
|
import org.eclipse.jgit.lib.Config;
|
||||||
@@ -137,7 +133,7 @@ public class CommitValidators {
|
|||||||
new SignedOffByValidator(user, perm, projectState),
|
new SignedOffByValidator(user, perm, projectState),
|
||||||
new ChangeIdValidator(
|
new ChangeIdValidator(
|
||||||
projectState, user, canonicalWebUrl, installCommitMsgHookCommand, sshInfo),
|
projectState, user, canonicalWebUrl, installCommitMsgHookCommand, sshInfo),
|
||||||
new ConfigValidator(branch, user, rw, allUsers, allProjects, projectState),
|
new ConfigValidator(branch, user, rw, allUsers, allProjects),
|
||||||
new BannedCommitsValidator(rejectCommits),
|
new BannedCommitsValidator(rejectCommits),
|
||||||
new PluginCommitValidationListener(pluginValidators),
|
new PluginCommitValidationListener(pluginValidators),
|
||||||
new ExternalIdUpdateListener(allUsers, externalIdsConsistencyChecker),
|
new ExternalIdUpdateListener(allUsers, externalIdsConsistencyChecker),
|
||||||
@@ -150,8 +146,7 @@ public class CommitValidators {
|
|||||||
Branch.NameKey branch,
|
Branch.NameKey branch,
|
||||||
IdentifiedUser user,
|
IdentifiedUser user,
|
||||||
SshInfo sshInfo,
|
SshInfo sshInfo,
|
||||||
RevWalk rw,
|
RevWalk rw)
|
||||||
ProjectState projectState)
|
|
||||||
throws IOException {
|
throws IOException {
|
||||||
return new CommitValidators(
|
return new CommitValidators(
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
@@ -165,7 +160,7 @@ public class CommitValidators {
|
|||||||
canonicalWebUrl,
|
canonicalWebUrl,
|
||||||
installCommitMsgHookCommand,
|
installCommitMsgHookCommand,
|
||||||
sshInfo),
|
sshInfo),
|
||||||
new ConfigValidator(branch, user, rw, allUsers, allProjects, projectState),
|
new ConfigValidator(branch, user, rw, allUsers, allProjects),
|
||||||
new PluginCommitValidationListener(pluginValidators),
|
new PluginCommitValidationListener(pluginValidators),
|
||||||
new ExternalIdUpdateListener(allUsers, externalIdsConsistencyChecker),
|
new ExternalIdUpdateListener(allUsers, externalIdsConsistencyChecker),
|
||||||
new AccountCommitValidator(allUsers, accountValidator),
|
new AccountCommitValidator(allUsers, accountValidator),
|
||||||
@@ -371,21 +366,18 @@ public class CommitValidators {
|
|||||||
private final RevWalk rw;
|
private final RevWalk rw;
|
||||||
private final AllUsersName allUsers;
|
private final AllUsersName allUsers;
|
||||||
private final AllProjectsName allProjects;
|
private final AllProjectsName allProjects;
|
||||||
private final ProjectState projectState;
|
|
||||||
|
|
||||||
public ConfigValidator(
|
public ConfigValidator(
|
||||||
Branch.NameKey branch,
|
Branch.NameKey branch,
|
||||||
IdentifiedUser user,
|
IdentifiedUser user,
|
||||||
RevWalk rw,
|
RevWalk rw,
|
||||||
AllUsersName allUsers,
|
AllUsersName allUsers,
|
||||||
AllProjectsName allProjects,
|
AllProjectsName allProjects) {
|
||||||
ProjectState projectState) {
|
|
||||||
this.branch = branch;
|
this.branch = branch;
|
||||||
this.user = user;
|
this.user = user;
|
||||||
this.rw = rw;
|
this.rw = rw;
|
||||||
this.allUsers = allUsers;
|
|
||||||
this.allProjects = allProjects;
|
this.allProjects = allProjects;
|
||||||
this.projectState = projectState;
|
this.allUsers = allUsers;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -404,29 +396,6 @@ public class CommitValidators {
|
|||||||
}
|
}
|
||||||
throw new ConfigInvalidException("invalid project configuration");
|
throw new ConfigInvalidException("invalid project configuration");
|
||||||
}
|
}
|
||||||
if (allUsers.equals(receiveEvent.project.getNameKey())
|
|
||||||
|| allProjects.equals(receiveEvent.project.getNameKey())) {
|
|
||||||
// Check if the new config modifies any access sections for refs/groups/. These are
|
|
||||||
// managed by Gerrit and modifications are not allowed.
|
|
||||||
Set<AccessSection> diff =
|
|
||||||
Sets.symmetricDifference(
|
|
||||||
new HashSet<>(projectState.getConfig().getAccessSections()),
|
|
||||||
new HashSet<>(cfg.getAccessSections()));
|
|
||||||
boolean modifiesGroupsAccessSection =
|
|
||||||
diff.stream()
|
|
||||||
.filter(as -> as.getName().startsWith(RefNames.REFS_GROUPS))
|
|
||||||
.findAny()
|
|
||||||
.isPresent();
|
|
||||||
if (modifiesGroupsAccessSection) {
|
|
||||||
addError("Invalid project configuration:", messages);
|
|
||||||
addError(
|
|
||||||
String.format(
|
|
||||||
" permissions on %s are managed by gerrit and cannot be modified",
|
|
||||||
RefNames.REFS_GROUPS),
|
|
||||||
messages);
|
|
||||||
throw new ConfigInvalidException("invalid project configuration");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (allUsers.equals(receiveEvent.project.getNameKey())
|
if (allUsers.equals(receiveEvent.project.getNameKey())
|
||||||
&& !allProjects.equals(cfg.getProject().getParent(allProjects))) {
|
&& !allProjects.equals(cfg.getProject().getParent(allProjects))) {
|
||||||
addError("Invalid project configuration:", messages);
|
addError("Invalid project configuration:", messages);
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ public class SetAccessUtil {
|
|||||||
&& section.getName().startsWith(RefNames.REFS_GROUPS)) {
|
&& section.getName().startsWith(RefNames.REFS_GROUPS)) {
|
||||||
throw new BadRequestException(
|
throw new BadRequestException(
|
||||||
String.format(
|
String.format(
|
||||||
"permissions on %s are managed by gerrit and cannot be modified",
|
"Permissions on %s is managed by Gerrit and cannot be modified",
|
||||||
RefNames.REFS_GROUPS));
|
RefNames.REFS_GROUPS));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS
|
|||||||
import static java.util.stream.Collectors.toList;
|
import static java.util.stream.Collectors.toList;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
import com.google.gerrit.acceptance.AbstractDaemonTest;
|
import com.google.gerrit.acceptance.AbstractDaemonTest;
|
||||||
import com.google.gerrit.acceptance.GerritConfig;
|
import com.google.gerrit.acceptance.GerritConfig;
|
||||||
@@ -34,10 +33,8 @@ import com.google.gerrit.acceptance.PushOneCommit;
|
|||||||
import com.google.gerrit.acceptance.Sandboxed;
|
import com.google.gerrit.acceptance.Sandboxed;
|
||||||
import com.google.gerrit.acceptance.TestAccount;
|
import com.google.gerrit.acceptance.TestAccount;
|
||||||
import com.google.gerrit.common.TimeUtil;
|
import com.google.gerrit.common.TimeUtil;
|
||||||
import com.google.gerrit.common.data.AccessSection;
|
|
||||||
import com.google.gerrit.common.data.GroupReference;
|
import com.google.gerrit.common.data.GroupReference;
|
||||||
import com.google.gerrit.common.data.Permission;
|
import com.google.gerrit.common.data.Permission;
|
||||||
import com.google.gerrit.common.data.PermissionRule;
|
|
||||||
import com.google.gerrit.extensions.api.changes.ReviewInput;
|
import com.google.gerrit.extensions.api.changes.ReviewInput;
|
||||||
import com.google.gerrit.extensions.api.groups.GroupApi;
|
import com.google.gerrit.extensions.api.groups.GroupApi;
|
||||||
import com.google.gerrit.extensions.api.groups.GroupInput;
|
import com.google.gerrit.extensions.api.groups.GroupInput;
|
||||||
@@ -60,7 +57,6 @@ import com.google.gerrit.reviewdb.client.AccountGroup;
|
|||||||
import com.google.gerrit.reviewdb.client.Project;
|
import com.google.gerrit.reviewdb.client.Project;
|
||||||
import com.google.gerrit.reviewdb.client.RefNames;
|
import com.google.gerrit.reviewdb.client.RefNames;
|
||||||
import com.google.gerrit.server.account.GroupIncludeCache;
|
import com.google.gerrit.server.account.GroupIncludeCache;
|
||||||
import com.google.gerrit.server.git.ProjectConfig;
|
|
||||||
import com.google.gerrit.server.group.InternalGroup;
|
import com.google.gerrit.server.group.InternalGroup;
|
||||||
import com.google.gerrit.server.group.SystemGroupBackend;
|
import com.google.gerrit.server.group.SystemGroupBackend;
|
||||||
import com.google.gerrit.server.group.db.Groups;
|
import com.google.gerrit.server.group.db.Groups;
|
||||||
@@ -824,96 +820,6 @@ public class GroupsIT extends AbstractDaemonTest {
|
|||||||
pushToGroupBranchForReviewAndSubmit(project, null);
|
pushToGroupBranchForReviewAndSubmit(project, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void pushGroupsAccessSectionChangeToAllUsersFails() throws Exception {
|
|
||||||
TestRepository<InMemoryRepository> repo = cloneProject(allUsers, RefNames.REFS_CONFIG);
|
|
||||||
|
|
||||||
String config =
|
|
||||||
gApi.projects()
|
|
||||||
.name(allUsers.get())
|
|
||||||
.branch(RefNames.REFS_CONFIG)
|
|
||||||
.file(ProjectConfig.PROJECT_CONFIG)
|
|
||||||
.asString();
|
|
||||||
|
|
||||||
Config cfg = new Config();
|
|
||||||
cfg.fromText(config);
|
|
||||||
cfg.setString("access", RefNames.REFS_GROUPS + "foo", "push", "group Registered Users");
|
|
||||||
config = cfg.toText();
|
|
||||||
|
|
||||||
PushOneCommit.Result r =
|
|
||||||
pushFactory
|
|
||||||
.create(db, admin.getIdent(), repo, "Subject", ProjectConfig.PROJECT_CONFIG, config)
|
|
||||||
.to(RefNames.REFS_CONFIG);
|
|
||||||
r.assertErrorStatus("invalid project configuration");
|
|
||||||
r.assertMessage("permissions on refs/groups/ are managed by gerrit and cannot be modified");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void pushNonGroupsAccessSectionChangeToAllUsersSucceeds() throws Exception {
|
|
||||||
// Add an access section for refs/groups manually to see that mutation other data does not
|
|
||||||
// trigger a validation error.
|
|
||||||
ProjectConfig projectConfig = projectCache.checkedGet(allUsers).getConfig();
|
|
||||||
AccessSection as = new AccessSection(RefNames.REFS_GROUPS + "foo");
|
|
||||||
Permission perm = new Permission("push");
|
|
||||||
perm.add(new PermissionRule(systemGroupBackend.getGroup(ANONYMOUS_USERS)));
|
|
||||||
as.addPermission(perm);
|
|
||||||
projectConfig.replace(as);
|
|
||||||
saveProjectConfig(allUsers, projectConfig);
|
|
||||||
|
|
||||||
TestRepository<InMemoryRepository> repo = cloneProject(allUsers, RefNames.REFS_CONFIG);
|
|
||||||
|
|
||||||
String config =
|
|
||||||
gApi.projects()
|
|
||||||
.name(allUsers.get())
|
|
||||||
.branch(RefNames.REFS_CONFIG)
|
|
||||||
.file(ProjectConfig.PROJECT_CONFIG)
|
|
||||||
.asString();
|
|
||||||
assertThat(config).contains("[access \"refs/groups/foo\"]");
|
|
||||||
|
|
||||||
Config cfg = new Config();
|
|
||||||
cfg.fromText(config);
|
|
||||||
cfg.setString("access", RefNames.REFS_CHANGES + "foo", "push", "group Registered Users");
|
|
||||||
config = cfg.toText();
|
|
||||||
|
|
||||||
PushOneCommit.Result r =
|
|
||||||
pushFactory
|
|
||||||
.create(db, admin.getIdent(), repo, "Subject", ProjectConfig.PROJECT_CONFIG, config)
|
|
||||||
.to(RefNames.REFS_CONFIG);
|
|
||||||
r.assertOkStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void pushGroupsAccessSectionChangeToCustomProjectSucceeds() throws Exception {
|
|
||||||
TestRepository<InMemoryRepository> repo = cloneProject(project, RefNames.REFS_CONFIG);
|
|
||||||
|
|
||||||
String config =
|
|
||||||
gApi.projects()
|
|
||||||
.name(project.get())
|
|
||||||
.branch(RefNames.REFS_CONFIG)
|
|
||||||
.file(ProjectConfig.PROJECT_CONFIG)
|
|
||||||
.asString();
|
|
||||||
|
|
||||||
Config cfg = new Config();
|
|
||||||
cfg.fromText(config);
|
|
||||||
cfg.setString("access", RefNames.REFS_GROUPS + "foo", "push", "group Registered Users");
|
|
||||||
config = cfg.toText();
|
|
||||||
|
|
||||||
PushOneCommit.Result r =
|
|
||||||
pushFactory
|
|
||||||
.create(
|
|
||||||
db,
|
|
||||||
admin.getIdent(),
|
|
||||||
repo,
|
|
||||||
"Subject",
|
|
||||||
ImmutableMap.of(
|
|
||||||
"groups",
|
|
||||||
"global:Registered-Users\tRegistered Users",
|
|
||||||
ProjectConfig.PROJECT_CONFIG,
|
|
||||||
config))
|
|
||||||
.to(RefNames.REFS_CONFIG);
|
|
||||||
r.assertOkStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void pushCustomInheritanceForAllUsersFails() throws Exception {
|
public void pushCustomInheritanceForAllUsersFails() throws Exception {
|
||||||
TestRepository<InMemoryRepository> repo = cloneProject(allUsers, RefNames.REFS_CONFIG);
|
TestRepository<InMemoryRepository> repo = cloneProject(allUsers, RefNames.REFS_CONFIG);
|
||||||
|
|||||||
@@ -531,7 +531,7 @@ public class AccessIT extends AbstractDaemonTest {
|
|||||||
accessInput.add.put(RefNames.REFS_GROUPS + "*", createDefaultAccessSectionInfo());
|
accessInput.add.put(RefNames.REFS_GROUPS + "*", createDefaultAccessSectionInfo());
|
||||||
exception.expect(BadRequestException.class);
|
exception.expect(BadRequestException.class);
|
||||||
exception.expectMessage(
|
exception.expectMessage(
|
||||||
"permissions on refs/groups/ are managed by gerrit and cannot be modified");
|
"Permissions on refs/groups/ is managed by Gerrit and cannot be modified");
|
||||||
gApi.projects().name(allProjects.get()).access(accessInput);
|
gApi.projects().name(allProjects.get()).access(accessInput);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user