Fetch GitHub full name and e-mail from the plugin profile screen Allows a user to select his details from the GitHub profile displayed at /plugins/github-plugin/static/account.html It is particularly useful when switching from a public identity (e.g. when using GitHub plugin for OpenSource projects) to a private use within a company. You can go to the account.html page and select an alternative e-mail address and Gerrit will be automatically updated. Change-Id: Ib4ac50194c65336e64d2ef12e8463eccd42ad8e5
diff --git a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/GitHubLogin.java b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/GitHubLogin.java index bb2554c..1b9d536 100644 --- a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/GitHubLogin.java +++ b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/GitHubLogin.java
@@ -197,7 +197,12 @@ } private String getScopesKeyFromCookie(HttpServletRequest request) { - for(Cookie cookie : request.getCookies()) { + Cookie[] cookies = request.getCookies(); + if(cookies == null) { + return null; + } + + for(Cookie cookie : cookies) { if(cookie.getName().equalsIgnoreCase("scope")) { return cookie.getValue(); }
diff --git a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/GitHubOAuthConfig.java b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/GitHubOAuthConfig.java index 085125a..2ed144c 100644 --- a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/GitHubOAuthConfig.java +++ b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/GitHubOAuthConfig.java
@@ -47,8 +47,6 @@ public final String gitHubClientSecret; public final String logoutRedirectUrl; public final String httpHeader; - public final String httpDisplaynameHeader; - public final String httpEmailHeader; public final String gitHubOAuthUrl; public final String oAuthFinalRedirectUrl; public final String gitHubOAuthAccessTokenUrl; @@ -61,8 +59,6 @@ public GitHubOAuthConfig(CompositeConfig config) throws MalformedURLException { httpHeader = config.getString("auth", null, "httpHeader"); - httpDisplaynameHeader = config.getString("auth", null, "httpDisplaynameHeader"); - httpEmailHeader = config.getString("auth", null, "httpEmailHeader"); gitHubUrl = dropTrailingSlash( Objects.firstNonNull(config.getString(CONF_SECTION, null, "url"), GITHUB_URL));
diff --git a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/OAuthWebFilter.java b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/OAuthWebFilter.java index 10985fd..bc64fde 100644 --- a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/OAuthWebFilter.java +++ b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/OAuthWebFilter.java
@@ -119,9 +119,7 @@ HttpServletRequest httpRequest, OAuthCookie authCookie) { httpRequest = authCookie == null ? httpRequest : new AuthenticatedHttpRequest( - httpRequest, config.httpHeader, authCookie.user, - config.httpDisplaynameHeader, authCookie.fullName, - config.httpEmailHeader, authCookie.email); + httpRequest, config.httpHeader, authCookie.user); return httpRequest; }
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/wizard/AccountController.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/wizard/AccountController.java index 20fb53b..1c5b250 100644 --- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/wizard/AccountController.java +++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/wizard/AccountController.java
@@ -16,6 +16,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -34,12 +35,23 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.gerrit.extensions.restapi.RawInput; +import com.google.gerrit.extensions.restapi.ResourceNotFoundException; +import com.google.gerrit.extensions.restapi.Response; +import com.google.gerrit.reviewdb.client.Account; +import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.IdentifiedUser; +import com.google.gerrit.server.account.AccountCache; +import com.google.gerrit.server.account.AccountException; +import com.google.gerrit.server.account.AccountManager; import com.google.gerrit.server.account.AccountResource; import com.google.gerrit.server.account.AddSshKey; +import com.google.gerrit.server.account.AuthRequest; import com.google.gerrit.server.account.GetSshKeys; +import com.google.gerrit.server.account.PutPreferred; import com.google.gerrit.server.account.GetSshKeys.SshKeyInfo; +import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import com.google.inject.Provider; import com.googlesource.gerrit.plugins.github.oauth.GitHubLogin; public class AccountController implements VelocityController { @@ -48,17 +60,46 @@ .getLogger(VelocityControllerServlet.class); private final AddSshKey restAddSshKey; private final GetSshKeys restGetSshKeys; + private final AccountManager accountManager; + private final Provider<ReviewDb> dbProvider; + private final AccountCache accountCache; @Inject public AccountController(final AddSshKey restAddSshKey, - final GetSshKeys restGetSshKeys) { + final GetSshKeys restGetSshKeys, final AccountManager accountManager, + final Provider<ReviewDb> dbProvider, final AccountCache accountCache) { this.restAddSshKey = restAddSshKey; this.restGetSshKeys = restGetSshKeys; + this.accountManager = accountManager; + this.dbProvider = dbProvider; + this.accountCache = accountCache; } public void doAction(IdentifiedUser user, GitHubLogin hubLogin, HttpServletRequest req, HttpServletResponse resp, ControllerErrors errors) throws ServletException, IOException { + setAccountIdentity(user, req); + setAccoutPublicKeys(user, hubLogin, req); + } + + private void setAccountIdentity(IdentifiedUser user, HttpServletRequest req) throws ServletException { + String fullName = req.getParameter("fullname"); + String email = req.getParameter("email"); + try { + accountManager.link(user.getAccountId(), AuthRequest.forEmail(email)); + Account a = dbProvider.get().accounts().get(user.getAccountId()); + a.setPreferredEmail(email); + a.setFullName(fullName); + dbProvider.get().accounts().update(Collections.singleton(a)); + accountCache.evict(user.getAccountId()); + } catch (AccountException | OrmException e) { + throw new ServletException("Cannot associated email '" + email + + "' to current user '" + user + "'", e); + } + } + + private void setAccoutPublicKeys(IdentifiedUser user, GitHubLogin hubLogin, + HttpServletRequest req) throws IOException { GHMyself myself = hubLogin.getMyself(); List<GHVerifiedKey> githubKeys = myself.getPublicVerifiedKeys(); HashSet<String> gerritKeys = Sets.newHashSet(getCurrentGerritSshKeys(user)); @@ -74,7 +115,8 @@ } } - private List<String> getCurrentGerritSshKeys(final IdentifiedUser user) throws IOException { + private List<String> getCurrentGerritSshKeys(final IdentifiedUser user) + throws IOException { AccountResource res = new AccountResource(user); try { List<SshKeyInfo> keysInfo = restGetSshKeys.apply(res);
diff --git a/github-plugin/src/main/resources/static/account.html b/github-plugin/src/main/resources/static/account.html index ed51218..e352ebd 100644 --- a/github-plugin/src/main/resources/static/account.html +++ b/github-plugin/src/main/resources/static/account.html
@@ -51,7 +51,15 @@ value="$!myself.name" readonly="readonly" /></li> <li><label for="eMail">e-Mail:</label> - <input maxlength="50" value="$!myself.email" type="text" name="email" readonly="readonly" /></li> + <select id="email" name="email"> + #foreach ( $email in $myself.emails ) + #if ( $email == $!myself.email ) + <option selected="selected">$email</option> + #else + <option>$email</option> + #end + #end + </select> </ul> <h5>Import GitHub SSH Public Keys</h5>