Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn Pearce2011-11-27 00:24:09 +0000
committerCode Review2011-11-27 00:24:09 +0000
commitd497c2ac2da24de8865b0f113e07a559a4af951a (patch)
treecbbeb4dd1839d2af8e59bc1bdce9f31381cdcb1f
parent241e03be9de1251a9e2296c043b21d61bed0fd2e (diff)
parent430395a6690afcc8dedc2a8425f731668f071eaa (diff)
downloadjgit-d497c2ac2da24de8865b0f113e07a559a4af951a.tar.gz
jgit-d497c2ac2da24de8865b0f113e07a559a4af951a.tar.xz
jgit-d497c2ac2da24de8865b0f113e07a559a4af951a.zip
Merge "Reset SSH connection and credentials on "Auth fail""
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialsProvider.java9
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java66
2 files changed, 55 insertions, 20 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialsProvider.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialsProvider.java
index 194268f1f9..464d0f9ee5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialsProvider.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/CredentialsProvider.java
@@ -134,4 +134,13 @@ public abstract class CredentialsProvider {
throws UnsupportedCredentialItem {
return get(uri, items.toArray(new CredentialItem[items.size()]));
}
+
+ /**
+ * Reset the credentials provider for the given URI
+ *
+ * @param uri
+ */
+ public void reset(URIish uri) {
+ // default does nothing
+ }
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java
index b1f23243e4..047ff58677 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java
@@ -106,26 +106,29 @@ public abstract class JschConfigSessionFactory extends SshSessionFactory {
if (user == null)
user = hc.getUser();
- final Session session = createSession(hc, user, host, port, fs);
- if (pass != null)
- session.setPassword(pass);
- final String strictHostKeyCheckingPolicy = hc
- .getStrictHostKeyChecking();
- if (strictHostKeyCheckingPolicy != null)
- session.setConfig("StrictHostKeyChecking",
- strictHostKeyCheckingPolicy);
- final String pauth = hc.getPreferredAuthentications();
- if (pauth != null)
- session.setConfig("PreferredAuthentications", pauth);
- if (credentialsProvider != null
- && (!hc.isBatchMode() || !credentialsProvider.isInteractive())) {
- session.setUserInfo(new CredentialsProviderUserInfo(session,
- credentialsProvider));
- }
- configure(hc, session);
+ Session session = createSession(credentialsProvider, fs, user,
+ pass, host, port, hc);
- if (!session.isConnected())
- session.connect(tms);
+ int retries = 0;
+ while (!session.isConnected() && retries < 3) {
+ try {
+ retries++;
+ session.connect(tms);
+ } catch (JSchException e) {
+ session.disconnect();
+ session = null;
+ // if authentication failed maybe credentials changed at the
+ // remote end therefore reset credentials and retry
+ if (credentialsProvider != null && e.getCause() == null
+ && e.getMessage().equals("Auth fail")) {
+ credentialsProvider.reset(uri);
+ session = createSession(credentialsProvider, fs, user,
+ pass, host, port, hc);
+ } else {
+ throw e;
+ }
+ }
+ }
return new JschSession(session, uri);
@@ -140,9 +143,32 @@ public abstract class JschConfigSessionFactory extends SshSessionFactory {
}
+ private Session createSession(CredentialsProvider credentialsProvider,
+ FS fs, String user, final String pass, String host, int port,
+ final OpenSshConfig.Host hc) throws JSchException {
+ final Session session = createSession(hc, user, host, port, fs);
+ if (pass != null)
+ session.setPassword(pass);
+ final String strictHostKeyCheckingPolicy = hc
+ .getStrictHostKeyChecking();
+ if (strictHostKeyCheckingPolicy != null)
+ session.setConfig("StrictHostKeyChecking",
+ strictHostKeyCheckingPolicy);
+ final String pauth = hc.getPreferredAuthentications();
+ if (pauth != null)
+ session.setConfig("PreferredAuthentications", pauth);
+ if (credentialsProvider != null
+ && (!hc.isBatchMode() || !credentialsProvider.isInteractive())) {
+ session.setUserInfo(new CredentialsProviderUserInfo(session,
+ credentialsProvider));
+ }
+ configure(hc, session);
+ return session;
+ }
+
/**
* Create a new remote session for the requested address.
- *
+ *
* @param hc
* host configuration
* @param user

Back to the top