mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-11 18:25:40 +02:00
[417810] - Fix support for specifying private key an passphrase.
Signed-off-by: Greg Watson <g.watson@computer.org>
This commit is contained in:
parent
5315541ca6
commit
c22656936a
2 changed files with 110 additions and 42 deletions
|
@ -24,7 +24,6 @@ import org.eclipse.core.runtime.Path;
|
||||||
import org.eclipse.core.runtime.SubMonitor;
|
import org.eclipse.core.runtime.SubMonitor;
|
||||||
import org.eclipse.internal.remote.jsch.core.commands.ExecCommand;
|
import org.eclipse.internal.remote.jsch.core.commands.ExecCommand;
|
||||||
import org.eclipse.internal.remote.jsch.core.messages.Messages;
|
import org.eclipse.internal.remote.jsch.core.messages.Messages;
|
||||||
import org.eclipse.jsch.core.IJSchLocation;
|
|
||||||
import org.eclipse.jsch.core.IJSchService;
|
import org.eclipse.jsch.core.IJSchService;
|
||||||
import org.eclipse.remote.core.IRemoteConnection;
|
import org.eclipse.remote.core.IRemoteConnection;
|
||||||
import org.eclipse.remote.core.IRemoteConnectionChangeEvent;
|
import org.eclipse.remote.core.IRemoteConnectionChangeEvent;
|
||||||
|
@ -43,12 +42,113 @@ import com.jcraft.jsch.ChannelExec;
|
||||||
import com.jcraft.jsch.ChannelSftp;
|
import com.jcraft.jsch.ChannelSftp;
|
||||||
import com.jcraft.jsch.JSchException;
|
import com.jcraft.jsch.JSchException;
|
||||||
import com.jcraft.jsch.Session;
|
import com.jcraft.jsch.Session;
|
||||||
|
import com.jcraft.jsch.UIKeyboardInteractive;
|
||||||
import com.jcraft.jsch.UserInfo;
|
import com.jcraft.jsch.UserInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 5.0
|
* @since 5.0
|
||||||
*/
|
*/
|
||||||
public class JSchConnection implements IRemoteConnection {
|
public class JSchConnection implements IRemoteConnection {
|
||||||
|
private final boolean logging = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to supply credentials from connection attributes without user interaction.
|
||||||
|
*/
|
||||||
|
private class JSchUserInfo implements UserInfo, UIKeyboardInteractive {
|
||||||
|
private boolean firstTry;
|
||||||
|
private final IUserAuthenticator fAuthenticator;
|
||||||
|
|
||||||
|
public JSchUserInfo(IUserAuthenticator authenticator) {
|
||||||
|
fAuthenticator = authenticator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] promptKeyboardInteractive(String destination, String name, String instruction, String[] prompt,
|
||||||
|
boolean[] echo) {
|
||||||
|
if (logging) {
|
||||||
|
System.out.println("promptKeyboardInteractive:" + destination + ":" + name + ":" + instruction); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
|
||||||
|
for (String p : prompt) {
|
||||||
|
System.out.println(" " + p); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String password;
|
||||||
|
if (!isPasswordAuth()) {
|
||||||
|
password = getPassphrase();
|
||||||
|
} else {
|
||||||
|
password = getPassword();
|
||||||
|
}
|
||||||
|
return new String[] { password };
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassphrase() {
|
||||||
|
if (logging) {
|
||||||
|
System.out.println("getPassphrase"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return JSchConnection.this.getPassphrase();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
if (logging) {
|
||||||
|
System.out.println("getPassword"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return JSchConnection.this.getPassword();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean promptPassword(String message) {
|
||||||
|
if (logging) {
|
||||||
|
System.out.println("promptPassword:" + message); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
if (fAuthenticator != null) {
|
||||||
|
PasswordAuthentication auth = fAuthenticator.prompt(null, message);
|
||||||
|
if (auth == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
fAttributes.setAttribute(JSchConnectionAttributes.USERNAME_ATTR, auth.getUserName());
|
||||||
|
fAttributes.setSecureAttribute(JSchConnectionAttributes.PASSWORD_ATTR, new String(auth.getPassword()));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean promptPassphrase(String message) {
|
||||||
|
if (logging) {
|
||||||
|
System.out.println("promptPassphrase:" + message); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
if (firstTry && !getPassphrase().equals("")) { //$NON-NLS-1$
|
||||||
|
firstTry = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (fAuthenticator != null) {
|
||||||
|
String[] results = fAuthenticator.prompt("", "", message, new String[] { message }, new boolean[] { true }); //$NON-NLS-1$//$NON-NLS-2$
|
||||||
|
if (results == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
fAttributes.setSecureAttribute(JSchConnectionAttributes.PASSPHRASE_ATTR, results[0]);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean promptYesNo(String message) {
|
||||||
|
if (logging) {
|
||||||
|
System.out.println("promptYesNo:" + message); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
if (fAuthenticator != null) {
|
||||||
|
int prompt = fAuthenticator.prompt(IUserAuthenticator.QUESTION, Messages.AuthInfo_Authentication_message, message,
|
||||||
|
new int[] { IUserAuthenticator.YES, IUserAuthenticator.NO }, IUserAuthenticator.YES);
|
||||||
|
return prompt == IUserAuthenticator.YES;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showMessage(String message) {
|
||||||
|
if (logging) {
|
||||||
|
System.out.println("showMessage:" + message); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
if (fAuthenticator != null) {
|
||||||
|
fAuthenticator.prompt(IUserAuthenticator.INFORMATION, Messages.AuthInfo_Authentication_message, message,
|
||||||
|
new int[] { IUserAuthenticator.OK }, IUserAuthenticator.OK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static final int DEFAULT_PORT = 22;
|
public static final int DEFAULT_PORT = 22;
|
||||||
public static final int DEFAULT_TIMEOUT = 5;
|
public static final int DEFAULT_TIMEOUT = 5;
|
||||||
public static final boolean DEFAULT_IS_PASSWORD = true;
|
public static final boolean DEFAULT_IS_PASSWORD = true;
|
||||||
|
@ -632,48 +732,14 @@ public class JSchConnection implements IRemoteConnection {
|
||||||
private Session newSession(final IUserAuthenticator authenticator, IProgressMonitor monitor) throws RemoteConnectionException {
|
private Session newSession(final IUserAuthenticator authenticator, IProgressMonitor monitor) throws RemoteConnectionException {
|
||||||
SubMonitor progress = SubMonitor.convert(monitor, 10);
|
SubMonitor progress = SubMonitor.convert(monitor, 10);
|
||||||
try {
|
try {
|
||||||
final IJSchLocation location = fJSchService.getLocation(getUsername(), getAddress(), getPort());
|
if (!isPasswordAuth()) {
|
||||||
location.setPassword(getPassword());
|
fJSchService.getJSch().addIdentity(getKeyFile());
|
||||||
UserInfo userInfo = null;
|
}
|
||||||
if (authenticator != null) {
|
Session session = fJSchService.createSession(getAddress(), getPort(), getUsername());
|
||||||
userInfo = new UserInfo() {
|
session.setUserInfo(new JSchUserInfo(authenticator));
|
||||||
|
if (isPasswordAuth()) {
|
||||||
public String getPassphrase() {
|
session.setPassword(getPassword());
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPassword() {
|
|
||||||
return location.getPassword();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean promptPassphrase(String message) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean promptPassword(String message) {
|
|
||||||
PasswordAuthentication auth = authenticator.prompt(null, message);
|
|
||||||
if (auth == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
location.setUsername(auth.getUserName());
|
|
||||||
location.setPassword(new String(auth.getPassword()));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean promptYesNo(String message) {
|
|
||||||
int prompt = authenticator.prompt(IUserAuthenticator.QUESTION, Messages.AuthInfo_Authentication_message,
|
|
||||||
message, new int[] { IUserAuthenticator.YES, IUserAuthenticator.NO }, IUserAuthenticator.YES);
|
|
||||||
return prompt == IUserAuthenticator.YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void showMessage(String message) {
|
|
||||||
authenticator.prompt(IUserAuthenticator.INFORMATION, Messages.AuthInfo_Authentication_message, message,
|
|
||||||
new int[] { IUserAuthenticator.OK }, IUserAuthenticator.OK);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
Session session = fJSchService.createSession(location, userInfo);
|
|
||||||
session.setPassword(getPassword());
|
|
||||||
fJSchService.connect(session, 0, progress.newChild(10));
|
fJSchService.connect(session, 0, progress.newChild(10));
|
||||||
if (!progress.isCanceled()) {
|
if (!progress.isCanceled()) {
|
||||||
fSessions.add(session);
|
fSessions.add(session);
|
||||||
|
|
|
@ -326,6 +326,8 @@ public class JSchConnectionPage extends WizardPage {
|
||||||
fHostText.addModifyListener(fDataModifyListener);
|
fHostText.addModifyListener(fDataModifyListener);
|
||||||
fUserText.addModifyListener(fDataModifyListener);
|
fUserText.addModifyListener(fDataModifyListener);
|
||||||
fFileWidget.addModifyListener(fDataModifyListener);
|
fFileWidget.addModifyListener(fDataModifyListener);
|
||||||
|
fPasswordText.addModifyListener(fDataModifyListener);
|
||||||
|
fPassphraseText.addModifyListener(fDataModifyListener);
|
||||||
fPortText.addModifyListener(fDataModifyListener);
|
fPortText.addModifyListener(fDataModifyListener);
|
||||||
fTimeoutText.addModifyListener(fDataModifyListener);
|
fTimeoutText.addModifyListener(fDataModifyListener);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue