diff options
Diffstat (limited to 'java/com/google/gerrit/server/project/ProjectConfig.java')
-rw-r--r-- | java/com/google/gerrit/server/project/ProjectConfig.java | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/java/com/google/gerrit/server/project/ProjectConfig.java b/java/com/google/gerrit/server/project/ProjectConfig.java index 8f0b5357a4..c101ddf4e3 100644 --- a/java/com/google/gerrit/server/project/ProjectConfig.java +++ b/java/com/google/gerrit/server/project/ProjectConfig.java @@ -214,7 +214,8 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. projectName, projectName.equals(allProjectsName) ? allProjectsConfigProvider.get(allProjectsName) - : Optional.empty()); + : Optional.empty(), + allProjectsName); } public ProjectConfig read(MetaDataUpdate update) throws IOException, ConfigInvalidException { @@ -240,6 +241,7 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. } private final Optional<StoredConfig> baseConfig; + private final AllProjectsName allProjectsName; private Project project; private AccountsSection accountsSection; @@ -277,7 +279,6 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. .setCheckReceivedObjects(checkReceivedObjects) .setExtensionPanelSections(extensionPanelSections); groupList.byUUID().values().forEach(g -> builder.addGroup(g)); - accessSections.values().forEach(a -> builder.addAccessSection(a)); contributorAgreements.values().forEach(c -> builder.addContributorAgreement(c)); notifySections.values().forEach(n -> builder.addNotifySection(n)); subscribeSections.values().forEach(s -> builder.addSubscribeSection(s)); @@ -290,6 +291,28 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. projectLevelConfigs .entrySet() .forEach(c -> builder.addProjectLevelConfig(c.getKey(), c.getValue().toText())); + + if (projectName.equals(allProjectsName)) { + // Filter out permissions that aren't allowed to be set on All-Projects + accessSections + .values() + .forEach( + a -> { + List<Permission.Builder> copy = new ArrayList<>(); + for (Permission p : a.getPermissions()) { + if (Permission.canBeOnAllProjects(a.getName(), p.getName())) { + copy.add(p.toBuilder()); + } + } + AccessSection section = + AccessSection.builder(a.getName()) + .modifyPermissions(permissions -> permissions.addAll(copy)) + .build(); + builder.addAccessSection(section); + }); + } else { + accessSections.values().forEach(a -> builder.addAccessSection(a)); + } return builder.build(); } @@ -345,9 +368,13 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. requireNonNull(commentLinkSections.remove(name)); } - private ProjectConfig(Project.NameKey projectName, Optional<StoredConfig> baseConfig) { + private ProjectConfig( + Project.NameKey projectName, + Optional<StoredConfig> baseConfig, + AllProjectsName allProjectsName) { this.projectName = projectName; this.baseConfig = baseConfig; + this.allProjectsName = allProjectsName; } public void load(Repository repo) throws IOException, ConfigInvalidException { |