Allows self-provisioned accounts to login to Gerrit. When accounts are self-provisioned during a Pull Request import (because they are the owner of the request), generate the gerrit scheme for account_external_ids so that they can log-in using their GitHub credentials. Change-Id: I4834aef2d94f56c6618b83288fa2bce3b9cfb2e1
diff --git a/github-plugin/src/main/java/com/google/gerrit/server/account/AccountImpoter.java b/github-plugin/src/main/java/com/google/gerrit/server/account/AccountImpoter.java index 6f643b9..2ff0137 100644 --- a/github-plugin/src/main/java/com/google/gerrit/server/account/AccountImpoter.java +++ b/github-plugin/src/main/java/com/google/gerrit/server/account/AccountImpoter.java
@@ -14,41 +14,59 @@ package com.google.gerrit.server.account; import java.io.IOException; +import java.util.Arrays; import org.apache.http.HttpStatus; import org.kohsuke.github.GHUser; +import com.google.common.base.Objects; +import com.google.common.collect.Iterables; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.TopLevelResource; import com.google.gerrit.extensions.restapi.UnprocessableEntityException; import com.google.gerrit.reviewdb.client.Account; +import com.google.gerrit.reviewdb.client.Account.Id; +import com.google.gerrit.reviewdb.client.AccountExternalId; +import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.account.CreateAccount.Factory; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import com.google.inject.Provider; public class AccountImpoter { - private Factory createAccountFactory; + private final Factory createAccountFactory; + private final Provider<ReviewDb> schema; @Inject - public AccountImpoter(CreateAccount.Factory createAccountFactory) { + public AccountImpoter(final CreateAccount.Factory createAccountFactory, + final Provider<ReviewDb> schema) { this.createAccountFactory = createAccountFactory; + this.schema = schema; } - public Account.Id importAccount(String login, String name, String email) throws IOException, - BadRequestException, ResourceConflictException, + @SuppressWarnings("unchecked") + public Account.Id importAccount(String login, String name, String email) + throws IOException, BadRequestException, ResourceConflictException, UnprocessableEntityException, OrmException { + ReviewDb db = schema.get(); CreateAccount createAccount = createAccountFactory.create(login); CreateAccount.Input accountInput = new CreateAccount.Input(); accountInput.email = email; - accountInput.name = name; accountInput.username = login; + accountInput.name = Objects.firstNonNull(name, login); Response<AccountInfo> accountResponse = (Response<AccountInfo>) createAccount.apply(TopLevelResource.INSTANCE, accountInput); if (accountResponse.statusCode() == HttpStatus.SC_CREATED) { - return accountResponse.value()._id; + Id accountId = accountResponse.value()._id; + db.accountExternalIds().insert( + Arrays + .asList(new AccountExternalId(accountId, + new AccountExternalId.Key(AccountExternalId.SCHEME_GERRIT, + login)))); + return accountId; } else { throw new IOException("Cannot import GitHub account " + login + ": HTTP Status " + accountResponse.statusCode());
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GuiceHttpModule.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GuiceHttpModule.java index cc00a73..38ae784 100644 --- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GuiceHttpModule.java +++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GuiceHttpModule.java
@@ -19,7 +19,6 @@ import com.google.inject.servlet.ServletModule; import com.googlesource.gerrit.plugins.github.filters.GitHubOAuthFilter; import com.googlesource.gerrit.plugins.github.oauth.GitHubHttpProvider; -import com.googlesource.gerrit.plugins.github.pullsync.PullRequestsServlet; import com.googlesource.gerrit.plugins.github.replication.RemoteSiteUser; import com.googlesource.gerrit.plugins.github.velocity.VelocityStaticServlet; import com.googlesource.gerrit.plugins.github.velocity.VelocityViewServlet; @@ -33,7 +32,6 @@ install(new FactoryModuleBuilder().build(RemoteSiteUser.Factory.class)); install(new GuiceModule()); - serve("/").with(PullRequestsServlet.class); serve("*.css","*.js","*.png","*.jpg","*.woff","*.gif","*.ttf").with(VelocityStaticServlet.class); serve("*.html").with(VelocityViewServlet.class); serve("*.gh").with(VelocityControllerServlet.class);
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/pullsync/PullRequestsServlet.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/pullsync/PullRequestsServlet.java deleted file mode 100644 index eb6f4f9..0000000 --- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/pullsync/PullRequestsServlet.java +++ /dev/null
@@ -1,115 +0,0 @@ -// Copyright (C) 2013 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.github.pullsync; - -import java.io.IOException; -import java.io.PrintWriter; -import java.util.List; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.exception.ParseErrorException; -import org.apache.velocity.exception.ResourceNotFoundException; -import org.apache.velocity.runtime.RuntimeInstance; -import org.kohsuke.github.GHCommitPointer; -import org.kohsuke.github.GHIssueState; -import org.kohsuke.github.GHOrganization; -import org.kohsuke.github.GHPullRequest; -import org.kohsuke.github.GHRepository; -import org.kohsuke.github.GitHub; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.gerrit.reviewdb.client.Project.NameKey; -import com.google.gerrit.server.project.ProjectCache; -import com.google.gerrit.server.project.ProjectState; -import com.google.inject.Inject; -import com.google.inject.Provider; -import com.google.inject.Singleton; -import com.google.inject.name.Named; -import com.googlesource.gerrit.plugins.github.oauth.GitHubLogin; -import com.googlesource.gerrit.plugins.github.replication.GitHubDestinations; - -@Singleton -public class PullRequestsServlet extends HttpServlet { - private static final long serialVersionUID = 3635343057427548273L; - private static final Logger log = LoggerFactory - .getLogger(PullRequestsServlet.class); - private Provider<GitHubLogin> loginProvider; - private GitHubDestinations destinations; - private ProjectCache projects; - private RuntimeInstance velocityRuntime; - - @Inject - public PullRequestsServlet(Provider<GitHubLogin> loginProvider, - GitHubDestinations destinations, ProjectCache projects, - @Named("PluginRuntimeInstance") RuntimeInstance velocityRuntime) { - this.loginProvider = loginProvider; - this.destinations = destinations; - this.projects = projects; - this.velocityRuntime = velocityRuntime; - } - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { - - PrintWriter out = null; - try { - GitHub hub = loginProvider.get().hub; - out = resp.getWriter(); - - for (String orgName : destinations.getOrganisations()) { - GHOrganization org = hub.getOrganization(orgName); - for (GHRepository repo : org.getRepositories().values()) { - String repoName = repo.getName(); - ProjectState project = projects.get(new NameKey(repoName)); - if (project == null) { - log.debug("GitHub repo " + orgName + "/" + repoName - + " does not have a correspondant Gerrit Project: skipped"); - continue; - } - - List<GHPullRequest> pullRequests = - repo.getPullRequests(GHIssueState.OPEN); - for (GHPullRequest pullRequest : pullRequests) { - - GHCommitPointer pullHead = pullRequest.getHead(); - GHCommitPointer pullBase = pullRequest.getBase(); - } - - } - org.getRepositories(); - }; - } catch (ResourceNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ParseErrorException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } finally { - if (out != null) { - out.close(); - } - } - } -}