diff --git a/plugins/git4idea/src/git4idea/commands/GitHttpGuiAuthenticator.java b/plugins/git4idea/src/git4idea/commands/GitHttpGuiAuthenticator.java
index 4c4b75fa4d41..c219673bf4f0 100644
--- a/plugins/git4idea/src/git4idea/commands/GitHttpGuiAuthenticator.java
+++ b/plugins/git4idea/src/git4idea/commands/GitHttpGuiAuthenticator.java
@@ -27,6 +27,7 @@ import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.AuthData;
import com.intellij.util.UriUtil;
+import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.io.URLUtil;
import com.intellij.vcsUtil.AuthDialog;
import git4idea.jgit.GitHttpAuthDataProvider;
@@ -34,6 +35,9 @@ import git4idea.remote.GitRememberedInputs;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.Arrays;
+import java.util.List;
+
/**
*
Handles "ask username" and "ask password" requests from Git:
* shows authentication dialog in the GUI, waits for user input and returns the credentials supplied by the user.
@@ -60,6 +64,7 @@ class GitHttpGuiAuthenticator implements GitHttpAuthenticator {
@Nullable private String myUrl;
@Nullable private String myLogin;
private boolean myRememberOnDisk;
+ @Nullable private GitHttpAuthDataProvider myDataProvider;
GitHttpGuiAuthenticator(@NotNull Project project, @Nullable ModalityState modalityState, @NotNull GitCommand command,
@NotNull String url) {
@@ -76,6 +81,14 @@ class GitHttpGuiAuthenticator implements GitHttpAuthenticator {
return myPassword;
}
url = adjustUrl(url);
+ Pair authData = findBestAuthData(url);
+ if (authData != null && authData.second.getPassword() != null) {
+ String password = authData.second.getPassword();
+ myDataProvider = authData.first;
+ myPassword = password;
+ return password;
+ }
+
String prompt = "Enter the password for " + url;
myPasswordKey = url;
String password = PasswordSafePromptDialog.askPassword(myProject, myModalityState, myTitle, prompt, PASS_REQUESTER, url, false, null);
@@ -93,12 +106,13 @@ class GitHttpGuiAuthenticator implements GitHttpAuthenticator {
@NotNull
public String askUsername(@NotNull String url) {
url = adjustUrl(url);
- AuthData authData = getSavedAuthData(myProject, url);
+ Pair authData = findBestAuthData(url);
String login = null;
String password = null;
if (authData != null) {
- login = authData.getLogin();
- password = authData.getPassword();
+ login = authData.second.getLogin();
+ password = authData.second.getPassword();
+ myDataProvider = authData.first;
}
if (login != null && password != null) {
myPassword = password;
@@ -192,37 +206,31 @@ class GitHttpGuiAuthenticator implements GitHttpAuthenticator {
return url;
}
+ // return the first that knows username + password; otherwise return the first that knows just the username
@Nullable
- private static AuthData getSavedAuthData(@NotNull Project project, @NotNull String url) {
- String userName = GitRememberedInputs.getInstance().getUserNameForUrl(url);
- if (userName == null) {
- return trySavedAuthDataFromProviders(url);
- }
- String key = makeKey(url, userName);
- final PasswordSafe passwordSafe = PasswordSafe.getInstance();
- try {
- String password = passwordSafe.getPassword(project, PASS_REQUESTER, key);
- if (password != null) {
- return new AuthData(userName, password);
+ private Pair findBestAuthData(@NotNull String url) {
+ Pair candidate = null;
+ for (GitHttpAuthDataProvider provider : getProviders()) {
+ AuthData data = provider.getAuthData(url);
+ if (data != null) {
+ Pair pair = Pair.create(provider, data);
+ if (data.getPassword() != null) {
+ return pair;
+ }
+ if (candidate == null) {
+ candidate = pair;
+ }
}
- return trySavedAuthDataFromProviders(url);
- }
- catch (PasswordSafeException e) {
- LOG.info("Couldn't get the password for key [" + key + "]", e);
- return null;
}
+ return candidate;
}
-
- @Nullable
- private static AuthData trySavedAuthDataFromProviders(@NotNull String url) {
- GitHttpAuthDataProvider[] extensions = GitHttpAuthDataProvider.EP_NAME.getExtensions();
- for (GitHttpAuthDataProvider provider : extensions) {
- AuthData authData = provider.getAuthData(url);
- if (authData != null) {
- return authData;
- }
- }
- return null;
+
+ @NotNull
+ private List getProviders() {
+ List providers = ContainerUtil.newArrayList();
+ providers.add(new GitDefaultHttpAuthDataProvider(myProject));
+ providers.addAll(Arrays.asList(GitHttpAuthDataProvider.EP_NAME.getExtensions()));
+ return providers;
}
/**
@@ -238,4 +246,33 @@ class GitHttpGuiAuthenticator implements GitHttpAuthenticator {
return login + "@" + url;
}
+ public static class GitDefaultHttpAuthDataProvider implements GitHttpAuthDataProvider {
+
+ @NotNull private final Project myProject;
+
+ public GitDefaultHttpAuthDataProvider(@NotNull Project project) {
+ myProject = project;
+ }
+
+ @Nullable
+ @Override
+ public AuthData getAuthData(@NotNull String url) {
+ String userName = GitRememberedInputs.getInstance().getUserNameForUrl(url);
+ if (userName == null) {
+ return null;
+ }
+ String key = makeKey(url, userName);
+ final PasswordSafe passwordSafe = PasswordSafe.getInstance();
+ try {
+ String password = passwordSafe.getPassword(myProject, PASS_REQUESTER, key);
+ return new AuthData(userName, password);
+ }
+ catch (PasswordSafeException e) {
+ LOG.info("Couldn't get the password for key [" + key + "]", e);
+ return null;
+ }
+ }
+
+ }
+
}