1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-16 13:35:22 +02:00

Fix ssh keyboard-interactive authentication (on SuSE 10.0).

Fix forwarding RSE password information into ssh authentication.
This commit is contained in:
Martin Oberhuber 2006-05-30 13:58:40 +00:00
parent d6b97765f8
commit a0fcc91d6a

View file

@ -19,6 +19,7 @@ import java.net.UnknownHostException;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.IPreferenceStore;
@ -30,6 +31,7 @@ import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin;
import org.eclipse.team.internal.ccvs.core.util.Util; import org.eclipse.team.internal.ccvs.core.util.Util;
import org.eclipse.team.internal.ccvs.ssh2.CVSSSH2Plugin; import org.eclipse.team.internal.ccvs.ssh2.CVSSSH2Plugin;
import org.eclipse.team.internal.ccvs.ssh2.ISSHContants; import org.eclipse.team.internal.ccvs.ssh2.ISSHContants;
import org.eclipse.team.internal.ccvs.ui.KeyboardInteractiveDialog;
import org.eclipse.team.internal.ccvs.ui.UserValidationDialog; import org.eclipse.team.internal.ccvs.ui.UserValidationDialog;
import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSch;
@ -39,6 +41,7 @@ import com.jcraft.jsch.ProxyHTTP;
import com.jcraft.jsch.ProxySOCKS5; import com.jcraft.jsch.ProxySOCKS5;
import com.jcraft.jsch.Session; import com.jcraft.jsch.Session;
import com.jcraft.jsch.SocketFactory; import com.jcraft.jsch.SocketFactory;
import com.jcraft.jsch.UIKeyboardInteractive;
import com.jcraft.jsch.UserInfo; import com.jcraft.jsch.UserInfo;
/** /**
@ -238,13 +241,16 @@ public class SshConnectorService extends AbstractConnectorService implements ISs
session.setProxy(proxy); session.setProxy(proxy);
} }
session.setTimeout(getSshTimeoutInMillis()); session.setTimeout(getSshTimeoutInMillis());
session.setPassword(getPasswordInformation().getPassword()); String password = getPasswordInformation().getPassword();
session.setUserInfo(new MyUserInfo(user)); session.setPassword(password);
MyUserInfo ui = new MyUserInfo(user, password);
session.setUserInfo(ui);
session.setSocketFactory(new ResponsiveSocketFacory(monitor)); session.setSocketFactory(new ResponsiveSocketFacory(monitor));
//java.util.Hashtable config=new java.util.Hashtable(); //java.util.Hashtable config=new java.util.Hashtable();
//config.put("StrictHostKeyChecking", "no"); //config.put("StrictHostKeyChecking", "no");
//session.setConfig(config); //session.setConfig(config);
ui.aboutToConnect();
try { try {
Activator.trace("connecting..."); //$NON-NLS-1$ Activator.trace("connecting..."); //$NON-NLS-1$
session.connect(); session.connect();
@ -255,6 +261,7 @@ public class SshConnectorService extends AbstractConnectorService implements ISs
session.disconnect(); session.disconnect();
throw e; throw e;
} }
ui.connectionMade();
} }
public void internalDisconnect(IProgressMonitor monitor) public void internalDisconnect(IProgressMonitor monitor)
@ -283,13 +290,15 @@ public class SshConnectorService extends AbstractConnectorService implements ISs
return display; return display;
} }
private static class MyUserInfo implements UserInfo { private static class MyUserInfo implements UserInfo, UIKeyboardInteractive {
String fPassphrase; private String fPassphrase;
String fPassword; private String fPassword;
final String fUser; private int fAttemptCount;
private final String fUser;
public MyUserInfo(String user) { public MyUserInfo(String user, String password) {
fUser = user; fUser = user;
fPassword = password;
} }
public String getPassword() { public String getPassword() {
return fPassword; return fPassword;
@ -304,7 +313,7 @@ public class SshConnectorService extends AbstractConnectorService implements ISs
}); });
return retval[0]; return retval[0];
} }
private String promptString(final String message) { private String promptSecret(final String message) {
final String[] retval = new String[1]; final String[] retval = new String[1];
getStandardDisplay().syncExec(new Runnable() { getStandardDisplay().syncExec(new Runnable() {
public void run() { public void run() {
@ -325,12 +334,16 @@ public class SshConnectorService extends AbstractConnectorService implements ISs
return fPassphrase; return fPassphrase;
} }
public boolean promptPassphrase(String message) { public boolean promptPassphrase(String message) {
fPassphrase = promptString(message); fPassphrase = promptSecret(message);
return (fPassphrase!=null); return (fPassphrase!=null);
} }
public boolean promptPassword(final String message) { public boolean promptPassword(final String message) {
fPassword = promptString(message); String _password = promptSecret(message);
return (fPassphrase!=null); if (_password!=null) {
fPassword=_password;
return true;
}
return false;
} }
public void showMessage(final String message) { public void showMessage(final String message) {
getStandardDisplay().syncExec(new Runnable() { getStandardDisplay().syncExec(new Runnable() {
@ -339,6 +352,55 @@ public class SshConnectorService extends AbstractConnectorService implements ISs
} }
}); });
} }
public String[] promptKeyboardInteractive(final String destination,
final String name, final String instruction,
final String[] prompt, final boolean[] echo)
{
if (prompt.length == 0) {
// No need to prompt, just return an empty String array
return new String[0];
}
try{
if (fAttemptCount == 0 && fPassword != null && prompt.length == 1 && prompt[0].trim().equalsIgnoreCase("password:")) { //$NON-NLS-1$
// Return the provided password the first time but always prompt on subsequent tries
fAttemptCount++;
return new String[] { fPassword };
}
final String[][] finResult = new String[1][];
getStandardDisplay().syncExec(new Runnable() {
public void run() {
KeyboardInteractiveDialog dialog = new KeyboardInteractiveDialog(null,
null, destination, name, instruction, prompt, echo);
dialog.open();
finResult[0]=dialog.getResult();
}
});
String[] result=finResult[0];
if (result == null)
return null; // canceled
if (result.length == 1 && prompt.length == 1 && prompt[0].trim().equalsIgnoreCase("password:")) { //$NON-NLS-1$
fPassword = result[0];
}
fAttemptCount++;
return result;
}
catch(OperationCanceledException e){
return null;
}
}
/**
* Callback to indicate that a connection is about to be attempted
*/
public void aboutToConnect() {
fAttemptCount = 0;
}
/**
* Callback to indicate that a connection was made
*/
public void connectionMade() {
fAttemptCount = 0;
}
} }
public boolean isConnected() { public boolean isConnected() {