Use credentials provider as the URIish password auth is broken
Because of the merged change in JGit [1] that introduces the
ability to use the ~/.netrc credentials, all the JGit commands on
private repositories are broken [2].
In order to get around this problem we need to avoid using the URIish
credentials and explicitly provide a not-null CredentialsProvider
that uses the underlying GitHub OAuth credentials for the HTTP BasicAuth
handshake.
[1] https://git.eclipse.org/r/#/c/22194/
[2] https://groups.google.com/forum/#!topic/repo-discuss/t_yYD2IGYS0
Change-Id: I6723990da79ebeec96e80389d81d6f3233668694
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 464f252..b1302f1 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
@@ -79,6 +79,7 @@
public void doImport(ProgressMonitor progress) throws GitCloneFailedException,
GitDestinationAlreadyExistsException, GitDestinationNotWritableException {
CloneCommand clone = new CloneCommand();
+ clone.setCredentialsProvider(getRepository().getCredentialsProvider());
String sourceUri = getSourceUri();
clone.setURI(sourceUri);
clone.setBare(true);
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitHubRepository.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitHubRepository.java
index a677958..9544984 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitHubRepository.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitHubRepository.java
@@ -17,6 +17,10 @@
import lombok.experimental.Delegate;
+import org.eclipse.jgit.errors.UnsupportedCredentialItem;
+import org.eclipse.jgit.transport.CredentialItem;
+import org.eclipse.jgit.transport.CredentialsProvider;
+import org.eclipse.jgit.transport.URIish;
import org.kohsuke.github.GHRepository;
import com.google.inject.Inject;
@@ -41,8 +45,7 @@
private GHRepository ghRepository;
public String getCloneUrl() {
- return cloneUrl.replace("://", "://" + ghLogin.getMyself().getLogin() + ":"
- + ghLogin.getToken().accessToken + "@");
+ return cloneUrl.replace("://", "://" + ghLogin.getMyself().getLogin() + "@");
}
public String getOrganisation() {
@@ -65,4 +68,56 @@
this.ghRepository =
ghLogin.getHub().getRepository(organisation + "/" + repository);
}
+
+ public CredentialsProvider getCredentialsProvider() {
+ return new CredentialsProvider() {
+
+ @Override
+ public boolean supports(CredentialItem... items) {
+ for (CredentialItem i : items) {
+ if (i instanceof CredentialItem.Username) {
+ continue;
+ } else if (i instanceof CredentialItem.Password) {
+ continue;
+ } else {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean isInteractive() {
+ return false;
+ }
+
+ @Override
+ public boolean get(URIish uri, CredentialItem... items)
+ throws UnsupportedCredentialItem {
+ String username = uri.getUser();
+ if (username == null) {
+ username = ghLogin.getMyself().getLogin();
+ }
+ if (username == null) {
+ return false;
+ }
+
+ String password = ghLogin.getToken().accessToken;
+ if (password == null) {
+ return false;
+ }
+
+ for (CredentialItem i : items) {
+ if (i instanceof CredentialItem.Username) {
+ ((CredentialItem.Username) i).setValue(username);
+ } else if (i instanceof CredentialItem.Password) {
+ ((CredentialItem.Password) i).setValue(password.toCharArray());
+ } else {
+ throw new UnsupportedCredentialItem(uri, i.getPromptText());
+ }
+ }
+ return true;
+ }
+ };
+ }
}
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/PullRequestImportJob.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/PullRequestImportJob.java
index 3f199be..89f3454 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/PullRequestImportJob.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/PullRequestImportJob.java
@@ -246,6 +246,7 @@
fetch.setRefSpecs(new RefSpec("+refs/pull/" + pr.getNumber()
+ "/head:refs/remotes/origin/pr/" + pr.getNumber()));
fetch.setProgressMonitor(this);
+ fetch.setCredentialsProvider(ghRepository.getCredentialsProvider());
fetch.call();
}