mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-28 19:35:36 +02:00
Add UI prompting for password/passphrase.
Signed-off-by: Greg Watson <g.watson@computer.org>
This commit is contained in:
parent
ec96e61198
commit
2369f72979
4 changed files with 122 additions and 0 deletions
|
@ -11,6 +11,7 @@ Require-Bundle: org.eclipse.core.runtime,
|
||||||
org.eclipse.remote.ui,
|
org.eclipse.remote.ui,
|
||||||
org.eclipse.remote.jsch.core,
|
org.eclipse.remote.jsch.core,
|
||||||
org.eclipse.jsch.core,
|
org.eclipse.jsch.core,
|
||||||
|
org.eclipse.jsch.ui,
|
||||||
com.jcraft.jsch,
|
com.jcraft.jsch,
|
||||||
org.eclipse.ui.forms,
|
org.eclipse.ui.forms,
|
||||||
org.eclipse.ui.ide,
|
org.eclipse.ui.ide,
|
||||||
|
|
|
@ -10,14 +10,100 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.internal.remote.jsch.ui;
|
package org.eclipse.internal.remote.jsch.ui;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.net.PasswordAuthentication;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
import org.eclipse.internal.remote.jsch.core.JSchConnectionManager;
|
import org.eclipse.internal.remote.jsch.core.JSchConnectionManager;
|
||||||
|
import org.eclipse.internal.remote.jsch.ui.messages.Messages;
|
||||||
import org.eclipse.internal.remote.jsch.ui.wizards.JSchConnectionWizard;
|
import org.eclipse.internal.remote.jsch.ui.wizards.JSchConnectionWizard;
|
||||||
|
import org.eclipse.jface.dialogs.ErrorDialog;
|
||||||
|
import org.eclipse.jface.dialogs.IDialogConstants;
|
||||||
|
import org.eclipse.jface.dialogs.MessageDialog;
|
||||||
|
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
|
||||||
|
import org.eclipse.jface.operation.IRunnableContext;
|
||||||
|
import org.eclipse.jface.operation.IRunnableWithProgress;
|
||||||
|
import org.eclipse.jsch.ui.UserInfoPrompter;
|
||||||
|
import org.eclipse.remote.core.IRemoteConnection;
|
||||||
import org.eclipse.remote.core.IRemoteServices;
|
import org.eclipse.remote.core.IRemoteServices;
|
||||||
|
import org.eclipse.remote.core.IUserAuthenticator;
|
||||||
|
import org.eclipse.remote.core.exception.RemoteConnectionException;
|
||||||
import org.eclipse.remote.ui.AbstractRemoteUIConnectionManager;
|
import org.eclipse.remote.ui.AbstractRemoteUIConnectionManager;
|
||||||
import org.eclipse.remote.ui.IRemoteUIConnectionWizard;
|
import org.eclipse.remote.ui.IRemoteUIConnectionWizard;
|
||||||
|
import org.eclipse.swt.widgets.Display;
|
||||||
import org.eclipse.swt.widgets.Shell;
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
|
||||||
|
import com.jcraft.jsch.JSch;
|
||||||
|
import com.jcraft.jsch.JSchException;
|
||||||
|
|
||||||
public class JSchUIConnectionManager extends AbstractRemoteUIConnectionManager {
|
public class JSchUIConnectionManager extends AbstractRemoteUIConnectionManager {
|
||||||
|
private class RemoteAuthenticator implements IUserAuthenticator {
|
||||||
|
UserInfoPrompter prompter;
|
||||||
|
|
||||||
|
public RemoteAuthenticator(IRemoteConnection conn) {
|
||||||
|
try {
|
||||||
|
prompter = new UserInfoPrompter(new JSch().getSession(conn.getUsername(), conn.getAddress()));
|
||||||
|
} catch (JSchException e) {
|
||||||
|
// Not allowed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public PasswordAuthentication prompt(String username, String message) {
|
||||||
|
if (prompter.promptPassword(message)) {
|
||||||
|
PasswordAuthentication auth = new PasswordAuthentication(username, prompter.getPassword().toCharArray());
|
||||||
|
return auth;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] prompt(String destination, String name, String message, String[] prompt, boolean[] echo) {
|
||||||
|
return prompter.promptKeyboardInteractive(destination, name, message, prompt, echo);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int prompt(final int promptType, final String title, final String message, final int[] promptResponses,
|
||||||
|
final int defaultResponseIndex) {
|
||||||
|
final Display display = getDisplay();
|
||||||
|
final int[] retval = new int[1];
|
||||||
|
final String[] buttons = new String[promptResponses.length];
|
||||||
|
for (int i = 0; i < promptResponses.length; i++) {
|
||||||
|
int prompt = promptResponses[i];
|
||||||
|
switch (prompt) {
|
||||||
|
case IDialogConstants.OK_ID:
|
||||||
|
buttons[i] = IDialogConstants.OK_LABEL;
|
||||||
|
break;
|
||||||
|
case IDialogConstants.CANCEL_ID:
|
||||||
|
buttons[i] = IDialogConstants.CANCEL_LABEL;
|
||||||
|
break;
|
||||||
|
case IDialogConstants.NO_ID:
|
||||||
|
buttons[i] = IDialogConstants.NO_LABEL;
|
||||||
|
break;
|
||||||
|
case IDialogConstants.YES_ID:
|
||||||
|
buttons[i] = IDialogConstants.YES_LABEL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
display.syncExec(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
final MessageDialog dialog = new MessageDialog(new Shell(display), title, null /* title image */, message,
|
||||||
|
promptType, buttons, defaultResponseIndex);
|
||||||
|
retval[0] = dialog.open();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return retval[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Display getDisplay() {
|
||||||
|
Display display = Display.getCurrent();
|
||||||
|
if (display == null) {
|
||||||
|
display = Display.getDefault();
|
||||||
|
}
|
||||||
|
return display;
|
||||||
|
}
|
||||||
|
|
||||||
private final JSchConnectionManager fConnMgr;
|
private final JSchConnectionManager fConnMgr;
|
||||||
|
|
||||||
public JSchUIConnectionManager(IRemoteServices services) {
|
public JSchUIConnectionManager(IRemoteServices services) {
|
||||||
|
@ -32,4 +118,35 @@ public class JSchUIConnectionManager extends AbstractRemoteUIConnectionManager {
|
||||||
public IRemoteUIConnectionWizard getConnectionWizard(Shell shell) {
|
public IRemoteUIConnectionWizard getConnectionWizard(Shell shell) {
|
||||||
return new JSchConnectionWizard(shell, fConnMgr);
|
return new JSchConnectionWizard(shell, fConnMgr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void openConnectionWithProgress(Shell shell, IRunnableContext context, final IRemoteConnection connection) {
|
||||||
|
if (!connection.isOpen()) {
|
||||||
|
IRunnableWithProgress op = new IRunnableWithProgress() {
|
||||||
|
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
|
||||||
|
try {
|
||||||
|
connection.open(new RemoteAuthenticator(connection), monitor);
|
||||||
|
} catch (RemoteConnectionException e) {
|
||||||
|
throw new InvocationTargetException(e);
|
||||||
|
}
|
||||||
|
if (monitor.isCanceled()) {
|
||||||
|
throw new InterruptedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
if (context != null) {
|
||||||
|
context.run(true, true, op);
|
||||||
|
} else {
|
||||||
|
new ProgressMonitorDialog(shell).run(true, true, op);
|
||||||
|
}
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
ErrorDialog.openError(shell, Messages.JSchUIConnectionManager_Connection_Error, Messages.JSchUIConnectionManager_Could_not_open_connection,
|
||||||
|
new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), e.getCause().getMessage()));
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
ErrorDialog.openError(shell, Messages.JSchUIConnectionManager_Connection_Error, Messages.JSchUIConnectionManager_Could_not_open_connection,
|
||||||
|
new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), e.getMessage()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,4 +53,6 @@ public class Messages extends NLS {
|
||||||
public static String JSchNewConnectionPage_Timeout_is_not_valid;
|
public static String JSchNewConnectionPage_Timeout_is_not_valid;
|
||||||
public static String JSchNewConnectionPage_User;
|
public static String JSchNewConnectionPage_User;
|
||||||
public static String JSchNewConnectionPage_User_name_cannot_be_empty;
|
public static String JSchNewConnectionPage_User_name_cannot_be_empty;
|
||||||
|
public static String JSchUIConnectionManager_Connection_Error;
|
||||||
|
public static String JSchUIConnectionManager_Could_not_open_connection;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,3 +36,5 @@ JSchNewConnectionPage_Timeout=Timeout:
|
||||||
JSchNewConnectionPage_Timeout_is_not_valid=Timeout is not valid
|
JSchNewConnectionPage_Timeout_is_not_valid=Timeout is not valid
|
||||||
JSchNewConnectionPage_User=User:
|
JSchNewConnectionPage_User=User:
|
||||||
JSchNewConnectionPage_User_name_cannot_be_empty=User name cannot be empty
|
JSchNewConnectionPage_User_name_cannot_be_empty=User name cannot be empty
|
||||||
|
JSchUIConnectionManager_Connection_Error=Connection Error
|
||||||
|
JSchUIConnectionManager_Could_not_open_connection=Could not open connection
|
||||||
|
|
Loading…
Add table
Reference in a new issue