mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-08 10:16:03 +02:00
Bug 424627 - Fix password login with pubkey available
Put password the first in PreferredAuthentications so that password is used when password is selected by the user. Also - remove the "File with private key" field - remove the get/setKeyFile from the JSchConnection - add a link to the network connections preference page - swap the order of the public key/password areas - make public key the default Change-Id: I5aea011e41fd0097aa51b052ab1386d431362ec8
This commit is contained in:
parent
cda4c419d6
commit
b1903767f3
6 changed files with 49 additions and 91 deletions
|
@ -518,10 +518,6 @@ public class JSchConnection implements IRemoteConnection {
|
|||
return fAttributes;
|
||||
}
|
||||
|
||||
public String getKeyFile() {
|
||||
return fAttributes.getAttribute(JSchConnectionAttributes.KEYFILE_ATTR, EMPTY_STRING);
|
||||
}
|
||||
|
||||
public JSchConnectionManager getManager() {
|
||||
return fManager;
|
||||
}
|
||||
|
@ -835,13 +831,13 @@ public class JSchConnection implements IRemoteConnection {
|
|||
private Session newSession(final IUserAuthenticator authenticator, IProgressMonitor monitor) throws RemoteConnectionException {
|
||||
SubMonitor progress = SubMonitor.convert(monitor, 10);
|
||||
try {
|
||||
if (!isPasswordAuth()) {
|
||||
fJSchService.getJSch().addIdentity(getKeyFile());
|
||||
}
|
||||
Session session = fJSchService.createSession(getAddress(), getPort(), getUsername());
|
||||
session.setUserInfo(new JSchUserInfo(authenticator));
|
||||
if (isPasswordAuth()) {
|
||||
session.setConfig("PreferredAuthentications", "password,keyboard-interactive,gssapi-with-mic,publickey"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
session.setPassword(getPassword());
|
||||
} else {
|
||||
session.setConfig("PreferredAuthentications", "publickey,gssapi-with-mic,password,keyboard-interactive"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
if (getProxyCommand().equals(EMPTY_STRING) && getProxyConnectionName().equals(EMPTY_STRING)) {
|
||||
fJSchService.connect(session, getTimeout() * 1000, progress.newChild(10)); // connect without proxy
|
||||
|
|
|
@ -36,7 +36,6 @@ public class JSchConnectionAttributes {
|
|||
public static final String PROXYCOMMAND_ATTR = "JSCH_PROXYCOMMAND_ATTR"; //$NON-NLS-1$
|
||||
public static final String IS_PASSWORD_ATTR = "JSCH_IS_PASSWORD_ATTR"; //$NON-NLS-1$
|
||||
public static final String PASSPHRASE_ATTR = "JSCH_PASSPHRASE_ATTR"; //$NON-NLS-1$
|
||||
public static final String KEYFILE_ATTR = "JSCH_KEYFILE_ATTR"; //$NON-NLS-1$
|
||||
public static final String TIMEOUT_ATTR = "JSCH_TIMEOUT_ATTR"; //$NON-NLS-1$
|
||||
public static final String USE_LOGIN_SHELL_ATTR = "JSCH_USE_LOGIN_SHELL_ATTR"; //$NON-NLS-1$
|
||||
|
||||
|
|
|
@ -53,11 +53,6 @@ public class JSchConnectionWorkingCopy extends JSchConnection implements IRemote
|
|||
return Collections.unmodifiableMap(fWorkingAttributes.getAttributes());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getKeyFile() {
|
||||
return fWorkingAttributes.getAttribute(JSchConnectionAttributes.KEYFILE_ATTR, EMPTY_STRING);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
|
@ -227,11 +222,6 @@ public class JSchConnectionWorkingCopy extends JSchConnection implements IRemote
|
|||
fWorkingAttributes.setAttribute(JSchConnectionAttributes.IS_PASSWORD_ATTR, Boolean.toString(flag));
|
||||
}
|
||||
|
||||
public void setKeyFile(String keyFile) {
|
||||
fIsDirty = true;
|
||||
fWorkingAttributes.setAttribute(JSchConnectionAttributes.KEYFILE_ATTR, keyFile);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
|
|
|
@ -27,6 +27,7 @@ public class Messages extends NLS {
|
|||
public static String JSchConnectionPage_Please_enter_name_for_connection;
|
||||
public static String JSchConnectionPage_Proxy;
|
||||
public static String JSchConnectionPage_Help;
|
||||
public static String JSchConnectionPage_KeysAtSSH2;
|
||||
public static String JSchConnectionPage_SelectCommand;
|
||||
public static String JSchConnectionPage_SelectConnection;
|
||||
public static String JSchConnectionPage_Settings0;
|
||||
|
|
|
@ -14,6 +14,7 @@ JSchConnectionPage_Edit_properties_of_an_existing_connection=Edit properties of
|
|||
JSchConnectionPage_Please_enter_name_for_connection=Please enter a name for the connection
|
||||
JSchConnectionPage_Proxy=SSH Proxy Settings
|
||||
JSchConnectionPage_Help=If 'Local' is selected and proxy command is empty, no proxy is used.\nSee <a>Network Connections</a> for SOCKS and HTTP proxy options.
|
||||
JSchConnectionPage_KeysAtSSH2=Keys are set at <a>Network Connections, SSH2</a>
|
||||
JSchConnectionPage_SelectCommand=Enter a local or remote command such as 'nc %h %p'. Can be empty for an ssh gateway.
|
||||
JSchConnectionPage_SelectConnection=Select 'Remote' for an ssh gateway or a remote proxy command.
|
||||
JSchConnectionPage_Settings0=Connection Settings
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
*/
|
||||
package org.eclipse.remote.internal.jsch.ui.wizards;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
@ -28,7 +27,6 @@ import org.eclipse.remote.internal.jsch.core.JSchConnectionAttributes;
|
|||
import org.eclipse.remote.internal.jsch.core.JSchConnectionWorkingCopy;
|
||||
import org.eclipse.remote.internal.jsch.ui.messages.Messages;
|
||||
import org.eclipse.remote.ui.widgets.RemoteConnectionWidget;
|
||||
import org.eclipse.remote.ui.widgets.RemoteFileWidget;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.events.ModifyEvent;
|
||||
import org.eclipse.swt.events.ModifyListener;
|
||||
|
@ -70,7 +68,6 @@ public class JSchConnectionPage extends WizardPage {
|
|||
private Text fPassphraseText;
|
||||
private Text fPortText;
|
||||
private Text fTimeoutText;
|
||||
private RemoteFileWidget fFileWidget;
|
||||
|
||||
private String fInitialName = "Remote Host"; //$NON-NLS-1$
|
||||
private Set<String> fInvalidConnectionNames;
|
||||
|
@ -133,7 +130,6 @@ public class JSchConnectionPage extends WizardPage {
|
|||
|
||||
Label portLabel = new Label(settingsComp, SWT.NONE);
|
||||
portLabel.setText(Messages.JSchNewConnectionPage_Port);
|
||||
portLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
|
||||
fPortText = new Text(settingsComp, SWT.BORDER | SWT.SINGLE);
|
||||
fPortText.setText(Integer.toString(JSchConnection.DEFAULT_PORT));
|
||||
fPortText.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
|
||||
|
@ -141,7 +137,6 @@ public class JSchConnectionPage extends WizardPage {
|
|||
|
||||
Label timeoutLabel = new Label(settingsComp, SWT.NONE);
|
||||
timeoutLabel.setText(Messages.JSchNewConnectionPage_Timeout);
|
||||
timeoutLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
|
||||
fTimeoutText = new Text(settingsComp, SWT.BORDER | SWT.SINGLE);
|
||||
fTimeoutText.setText(Integer.toString(JSchConnection.DEFAULT_TIMEOUT));
|
||||
fTimeoutText.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
|
||||
|
@ -158,39 +153,18 @@ public class JSchConnectionPage extends WizardPage {
|
|||
|
||||
private void createAuthControls(Composite parent) {
|
||||
Composite controls = new Composite(parent, SWT.NONE);
|
||||
controls.setLayout(new GridLayout(2, false));
|
||||
controls.setLayout(new GridLayout(3, false));
|
||||
controls.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
|
||||
|
||||
Label hostLabel = new Label(controls, SWT.NONE);
|
||||
hostLabel.setText(Messages.JSchNewConnectionPage_Host);
|
||||
hostLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
|
||||
fHostText = new Text(controls, SWT.BORDER | SWT.SINGLE);
|
||||
fHostText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
|
||||
fHostText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
|
||||
|
||||
Label userLabel = new Label(controls, SWT.NONE);
|
||||
userLabel.setText(Messages.JSchNewConnectionPage_User);
|
||||
userLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
|
||||
fUserText = new Text(controls, SWT.BORDER | SWT.SINGLE);
|
||||
fUserText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
|
||||
|
||||
// User option box
|
||||
fPasswordButton = new Button(controls, SWT.RADIO);
|
||||
fPasswordButton.setText(Messages.JSchNewConnectionPage_Password_based_authentication);
|
||||
fPasswordButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
|
||||
fPasswordButton.addSelectionListener(new SelectionAdapter() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
validateFields();
|
||||
updateEnablement();
|
||||
}
|
||||
});
|
||||
|
||||
// Password field
|
||||
Label passwordLabel = new Label(controls, SWT.NONE);
|
||||
passwordLabel.setText(Messages.JSchNewConnectionPage_Password);
|
||||
passwordLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
|
||||
fPasswordText = new Text(controls, SWT.BORDER | SWT.SINGLE | SWT.PASSWORD);
|
||||
fPasswordText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
|
||||
fUserText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
|
||||
|
||||
// Key option box
|
||||
fPublicKeyButton = new Button(controls, SWT.RADIO);
|
||||
|
@ -204,24 +178,53 @@ public class JSchConnectionPage extends WizardPage {
|
|||
}
|
||||
});
|
||||
|
||||
// Key file selection
|
||||
fFileWidget = new RemoteFileWidget(controls, SWT.NONE, 0, null, ""); //$NON-NLS-1$
|
||||
fFileWidget.setConnection(RemoteServices.getLocalServices().getConnectionManager()
|
||||
.getConnection(IRemoteConnectionManager.LOCAL_CONNECTION_NAME));
|
||||
fFileWidget.setLabel(Messages.JSchNewConnectionPage_File_with_private_key);
|
||||
fFileWidget.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
|
||||
Link link = new Link(controls, SWT.WRAP);
|
||||
final GridData linkLayoutData = new GridData(GridData.FILL_HORIZONTAL);
|
||||
link.setLayoutData(linkLayoutData);
|
||||
final String PREFS_PAGE_ID_NET_SSH = "org.eclipse.jsch.ui.SSHPreferences"; //$NON-NLS-1$
|
||||
link.addSelectionListener(new SelectionListener() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
PreferenceDialog dlg = PreferencesUtil.createPreferenceDialogOn(getShell(), PREFS_PAGE_ID_NET_SSH,
|
||||
new String[] { PREFS_PAGE_ID_NET_SSH }, null);
|
||||
dlg.open();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void widgetDefaultSelected(SelectionEvent e) {
|
||||
// ignore
|
||||
}
|
||||
});
|
||||
link.setText(Messages.JSchConnectionPage_KeysAtSSH2);
|
||||
|
||||
// Passphrase field
|
||||
Label passphraseLabel = new Label(controls, SWT.NONE);
|
||||
passphraseLabel.setText(Messages.JSchNewConnectionPage_Passphrase);
|
||||
passphraseLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
|
||||
fPassphraseText = new Text(controls, SWT.BORDER | SWT.SINGLE | SWT.PASSWORD);
|
||||
fPassphraseText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
|
||||
fPassphraseText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
|
||||
|
||||
fPasswordButton.setSelection(true);
|
||||
fPublicKeyButton.setSelection(false);
|
||||
controls.setTabList(new Control[] { fHostText, fUserText, fPasswordButton, fPasswordText, fPublicKeyButton, fFileWidget,
|
||||
fPassphraseText });
|
||||
// User option box
|
||||
fPasswordButton = new Button(controls, SWT.RADIO);
|
||||
fPasswordButton.setText(Messages.JSchNewConnectionPage_Password_based_authentication);
|
||||
fPasswordButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 3, 1));
|
||||
fPasswordButton.addSelectionListener(new SelectionAdapter() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
validateFields();
|
||||
updateEnablement();
|
||||
}
|
||||
});
|
||||
|
||||
// Password field
|
||||
Label passwordLabel = new Label(controls, SWT.NONE);
|
||||
passwordLabel.setText(Messages.JSchNewConnectionPage_Password);
|
||||
fPasswordText = new Text(controls, SWT.BORDER | SWT.SINGLE | SWT.PASSWORD);
|
||||
fPasswordText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
|
||||
|
||||
fPasswordButton.setSelection(false);
|
||||
fPublicKeyButton.setSelection(true);
|
||||
controls.setTabList(new Control[] { fHostText, fUserText, fPublicKeyButton,
|
||||
fPassphraseText, fPasswordButton, fPasswordText });
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -243,7 +246,6 @@ public class JSchConnectionPage extends WizardPage {
|
|||
|
||||
Label label = new Label(topControl, SWT.NONE);
|
||||
label.setText(Messages.JSchNewConnectionPage_Connection_name);
|
||||
label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
|
||||
|
||||
fConnectionName = new Text(topControl, SWT.BORDER | SWT.SINGLE);
|
||||
fConnectionName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
|
||||
|
@ -345,7 +347,6 @@ public class JSchConnectionPage extends WizardPage {
|
|||
fPasswordText.setText(fConnection.getPassword());
|
||||
} else {
|
||||
fPassphraseText.setText(fConnection.getPassphrase());
|
||||
fFileWidget.setLocationPath(fConnection.getKeyFile());
|
||||
}
|
||||
fProxyCommandText.setText(fConnection.getProxyCommand());
|
||||
|
||||
|
@ -380,10 +381,6 @@ public class JSchConnectionPage extends WizardPage {
|
|||
if (passphrase != null) {
|
||||
fPassphraseText.setText(passphrase);
|
||||
}
|
||||
String file = fInitialAttributes.get(JSchConnectionAttributes.KEYFILE_ATTR);
|
||||
if (file != null) {
|
||||
fFileWidget.setLocationPath(file);
|
||||
}
|
||||
fProxyConnectionWidget.setConnection(RemoteServices.getLocalServices().getConnectionManager().getConnection(
|
||||
IRemoteConnectionManager.LOCAL_CONNECTION_NAME));
|
||||
}
|
||||
|
@ -393,7 +390,6 @@ public class JSchConnectionPage extends WizardPage {
|
|||
fConnectionName.addModifyListener(fDataModifyListener);
|
||||
fHostText.addModifyListener(fDataModifyListener);
|
||||
fUserText.addModifyListener(fDataModifyListener);
|
||||
fFileWidget.addModifyListener(fDataModifyListener);
|
||||
fPasswordText.addModifyListener(fDataModifyListener);
|
||||
fPassphraseText.addModifyListener(fDataModifyListener);
|
||||
fPortText.addModifyListener(fDataModifyListener);
|
||||
|
@ -481,9 +477,6 @@ public class JSchConnectionPage extends WizardPage {
|
|||
if (!fConnection.getPassphrase().equals(fPassphraseText.getText().trim())) {
|
||||
fConnection.setPassphrase(fPassphraseText.getText().trim());
|
||||
}
|
||||
if (!fConnection.getKeyFile().equals(fFileWidget.getLocationPath())) {
|
||||
fConnection.setKeyFile(fFileWidget.getLocationPath());
|
||||
}
|
||||
if (fConnection.isPasswordAuth() != fPasswordButton.getSelection()) {
|
||||
fConnection.setIsPasswordAuth(fPasswordButton.getSelection());
|
||||
}
|
||||
|
@ -513,7 +506,6 @@ public class JSchConnectionPage extends WizardPage {
|
|||
boolean isPasswordAuth = fPasswordButton.getSelection();
|
||||
fPasswordText.setEnabled(isPasswordAuth);
|
||||
fPassphraseText.setEnabled(!isPasswordAuth);
|
||||
fFileWidget.setEnabled(!isPasswordAuth);
|
||||
}
|
||||
|
||||
private String validateAdvanced() {
|
||||
|
@ -544,9 +536,6 @@ public class JSchConnectionPage extends WizardPage {
|
|||
} else if (fUserText.getText().trim().length() == 0) {
|
||||
message = Messages.JSchNewConnectionPage_User_name_cannot_be_empty;
|
||||
}
|
||||
if (message == null) {
|
||||
message = validatePasskey();
|
||||
}
|
||||
if (message == null && fProxyConnectionWidget.getConnection() == null) {
|
||||
message = Messages.JSchConnectionPage_selectProxyConnection;
|
||||
}
|
||||
|
@ -558,22 +547,4 @@ public class JSchConnectionPage extends WizardPage {
|
|||
setPageComplete(message == null);
|
||||
}
|
||||
|
||||
private String validatePasskey() {
|
||||
if (!fPasswordButton.getSelection()) {
|
||||
if (fFileWidget.getLocationPath().trim().length() == 0) {
|
||||
return Messages.JSchNewConnectionPage_Private_key_path_cannot_be_empty;
|
||||
}
|
||||
File path = new File(fFileWidget.getLocationPath().trim());
|
||||
if (!path.exists()) {
|
||||
return Messages.JSchNewConnectionPage_Private_key_file_does_not_exist;
|
||||
}
|
||||
if (!path.isFile()) {
|
||||
return Messages.JSchNewConnectionPage_Private_key_file_is_invalid;
|
||||
}
|
||||
if (!path.canRead()) {
|
||||
return Messages.JSchNewConnectionPage_Private_key_file_cannot_be_read;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue