Impersonate a privileged user when importing repos
Use the local admin user when creating a new repository for the purpose
of importing existing GitHub repositories.
Allow to import repositories without having to grant the create project
permission.
Change-Id: Id7447d9e78759d8b85153028c45c9e5be9c6072a
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GitHubConfig.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GitHubConfig.java
index a6646b1..5ba6d6d 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GitHubConfig.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GitHubConfig.java
@@ -16,6 +16,7 @@
import com.google.common.base.MoreObjects;
import com.google.common.collect.Maps;
import com.google.gerrit.httpd.CanonicalWebUrl;
+import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.server.config.AllProjectsNameProvider;
import com.google.gerrit.server.config.AuthConfig;
import com.google.gerrit.server.config.GerritServerConfig;
@@ -44,6 +45,7 @@
private static final String CONF_PRIVATE_BASE_PROJECT = "privateBaseProject";
private static final String CONF_WEBHOOK_SECRET = "webhookSecret";
private static final String CONF_WEBHOOK_USER = "webhookUser";
+ private static final String CONF_IMPORT_ACCOUNT_ID = "importAccountId";
public final Path gitDir;
public final int jobPoolLimit;
@@ -56,6 +58,7 @@
public final String allProjectsName;
public final String webhookSecret;
public final String webhookUser;
+ public final Account.Id importAccountId;
public static class NextPage {
public final String uri;
@@ -103,6 +106,7 @@
allProjectsName = allProjectsNameProvider.get().toString();
webhookSecret = config.getString(CONF_SECTION, null, CONF_WEBHOOK_SECRET);
webhookUser = config.getString(CONF_SECTION, null, CONF_WEBHOOK_USER);
+ importAccountId = new Account.Id(config.getInt(CONF_SECTION, CONF_IMPORT_ACCOUNT_ID, 1000000));
}
private String getSeparator(boolean redirect) {
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/CreateProjectStep.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/CreateProjectStep.java
index e67fcd4..22387b9 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/CreateProjectStep.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/CreateProjectStep.java
@@ -28,6 +28,8 @@
import com.google.gerrit.server.git.MetaDataUpdate.User;
import com.google.gerrit.server.git.ProjectConfig;
import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.util.ManualRequestContext;
+import com.google.gerrit.server.util.OneOffRequestContext;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import com.googlesource.gerrit.plugins.github.GitHubConfig;
@@ -42,6 +44,7 @@
private static final String TAGS_REFS = "refs/tags/*";
private static final String CODE_REVIEW_LABEL = "Code-Review";
private static final String VERIFIED_LABEL = "Verified";
+ private final OneOffRequestContext context;
private final String organisation;
private final String repository;
@@ -70,6 +73,7 @@
ProjectCache projectCache,
GitHubRepository.Factory ghRepoFactory,
GitHubConfig gitHubConfig,
+ OneOffRequestContext context,
@Assisted("organisation") String organisation,
@Assisted("name") String repository,
@Assisted("description") String description,
@@ -85,6 +89,7 @@
this.projectCache = projectCache;
this.username = username;
this.config = gitHubConfig;
+ this.context = context;
}
private void setProjectPermissions() {
@@ -153,7 +158,7 @@
@Override
public void doImport(ProgressMonitor progress) throws Exception {
MetaDataUpdate md = null;
- try {
+ try (ManualRequestContext requestContext = context.openAs(config.importAccountId)) {
md = metaDataUpdateFactory.create(getProjectNameKey());
projectConfig = ProjectConfig.read(md);
progress.beginTask("Configure Gerrit project", 2);
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitCloneStep.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitCloneStep.java
index 5fe6017..bcfc117 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitCloneStep.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitCloneStep.java
@@ -35,6 +35,7 @@
public class GitCloneStep extends ImportStep {
private static final Logger LOG = LoggerFactory.getLogger(GitImporter.class);
+ private final GitHubConfig config;
private final File gitDir;
private final GerritApi gerritApi;
private final OneOffRequestContext context;
@@ -49,30 +50,30 @@
@Inject
public GitCloneStep(
- GitHubConfig gitConfig,
+ GitHubConfig config,
GitHubRepository.Factory gitHubRepoFactory,
GerritApi gerritApi,
OneOffRequestContext context,
@Assisted("organisation") String organisation,
@Assisted("name") String repository)
throws GitException {
- super(gitConfig.gitHubUrl, organisation, repository, gitHubRepoFactory);
+ super(config.gitHubUrl, organisation, repository, gitHubRepoFactory);
LOG.debug("GitHub Clone " + organisation + "/" + repository);
- this.gitDir = gitConfig.gitDir.toFile();
+ this.config = config;
+ this.gitDir = config.gitDir.toFile();
this.gerritApi = gerritApi;
this.context = context;
this.organisation = organisation;
this.repository = repository;
- this.destinationDirectory =
- prepareTargetGitDirectory(gitDir, organisation, repository);
+ this.destinationDirectory = prepareTargetGitDirectory(gitDir, organisation, repository);
}
private static File prepareTargetGitDirectory(File gitDir, String organisation, String repository)
throws GitException {
String projectName = organisation + "/" + repository;
File repositoryDir = new File(gitDir, projectName + ".git");
- if(repositoryDir.exists()) {
+ if (repositoryDir.exists()) {
throw new GitDestinationAlreadyExistsException(projectName);
}
return repositoryDir;
@@ -80,14 +81,15 @@
private void createNewProject() throws GitException {
String projectName = organisation + "/" + repository;
- try (ManualRequestContext requestContext = context.open()) {
+ try (ManualRequestContext requestContext = context.openAs(config.importAccountId)) {
gerritApi.projects().create(projectName).get();
} catch (ResourceConflictException e) {
throw new GitDestinationAlreadyExistsException(projectName);
} catch (RestApiException e) {
throw new GitException("Unable to create repository " + projectName, e);
} catch (OrmException e) {
- throw new GitException("Unable to create request context to create a new project " + projectName, e);
+ throw new GitException(
+ "Unable to create request context to create a new project " + projectName, e);
}
}