| // Copyright (C) 2023 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| package com.googlesource.gerrit.plugins.replication.pull; |
| |
| import static com.googlesource.gerrit.plugins.replication.pull.auth.PullReplicationGroupBackend.INTERNAL_GROUP_NAME; |
| import static com.googlesource.gerrit.plugins.replication.pull.auth.PullReplicationGroupBackend.INTERNAL_GROUP_UUID; |
| |
| import com.google.gerrit.common.data.GlobalCapability; |
| import com.google.gerrit.entities.GroupReference; |
| import com.google.gerrit.extensions.annotations.PluginName; |
| import com.google.gerrit.pgm.init.api.AllProjectsConfig; |
| import com.google.gerrit.pgm.init.api.ConsoleUI; |
| import com.google.gerrit.pgm.init.api.InitStep; |
| import com.google.inject.Inject; |
| import java.io.IOException; |
| import java.util.Arrays; |
| import java.util.stream.Collectors; |
| import org.apache.commons.lang3.ArrayUtils; |
| import org.eclipse.jgit.errors.ConfigInvalidException; |
| import org.eclipse.jgit.lib.Config; |
| |
| public class InitPlugin implements InitStep { |
| |
| private final String pluginName; |
| private final BearerTokenProvider bearerTokenProvider; |
| private final ConsoleUI ui; |
| private final AllProjectsConfig allProjectsConfig; |
| |
| private static final String CAPABILITY_SECTION = "capability"; |
| |
| @Inject |
| InitPlugin( |
| @PluginName String pluginName, |
| BearerTokenProvider bearerTokenProvider, |
| ConsoleUI ui, |
| AllProjectsConfig allProjectsConfig) { |
| this.pluginName = pluginName; |
| this.bearerTokenProvider = bearerTokenProvider; |
| this.ui = ui; |
| this.allProjectsConfig = allProjectsConfig; |
| } |
| |
| @Override |
| public void run() {} |
| |
| @Override |
| public void postRun() throws Exception { |
| ui.header("%s initialization", pluginName); |
| |
| if (!bearerTokenProvider.get().isPresent()) { |
| ui.message( |
| "The %s plugin is not configured to use bearer token. If you are using basic auth, remember to grant the '%s' global capability to all relevant users\n", |
| pluginName, GlobalCapability.ACCESS_DATABASE); |
| return; |
| } |
| |
| ui.message( |
| "Granting '%s' global capability to the '%s' user\n", |
| GlobalCapability.ACCESS_DATABASE, INTERNAL_GROUP_NAME); |
| |
| upsertCapability(); |
| |
| ui.message( |
| "'%s' global capability granted to user '%s'\n", |
| GlobalCapability.ACCESS_DATABASE, INTERNAL_GROUP_NAME); |
| } |
| |
| private void upsertCapability() throws ConfigInvalidException, IOException { |
| String pullReplicationGroup = "group " + INTERNAL_GROUP_NAME; |
| |
| Config cfg = allProjectsConfig.load().getConfig(); |
| String[] groupsWithAccessDatabase = |
| cfg.getStringList(CAPABILITY_SECTION, null, GlobalCapability.ACCESS_DATABASE); |
| |
| if (Arrays.stream(groupsWithAccessDatabase).noneMatch(pullReplicationGroup::equals)) { |
| cfg.setStringList( |
| CAPABILITY_SECTION, |
| null, |
| GlobalCapability.ACCESS_DATABASE, |
| Arrays.stream(ArrayUtils.add(groupsWithAccessDatabase, pullReplicationGroup)) |
| .collect(Collectors.toList())); |
| |
| allProjectsConfig |
| .getGroups() |
| .put( |
| INTERNAL_GROUP_UUID, GroupReference.create(INTERNAL_GROUP_UUID, INTERNAL_GROUP_NAME)); |
| |
| allProjectsConfig.save(pluginName, "Init step"); |
| } |
| } |
| } |