Java tutorial
/******************************************************************************* * Copyright (c) 2007, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jsch.ui; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jsch.core.IJSchService; import org.eclipse.jsch.internal.ui.*; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import com.jcraft.jsch.*; /** * A {@link UserInfo} prompter implementation that can be used when connecting a * {@link Session}. * <p> * Clients may instantiate or subclass this class. * * @since 1.0 * @see IJSchService#createSession(String, int, String) * @see IJSchService#connect(Session, int, * org.eclipse.core.runtime.IProgressMonitor) */ public class UserInfoPrompter implements UserInfo, UIKeyboardInteractive { private String passphrase; private String password; private final Session session; private int attemptCount; /** * Create a prompter for the given session. This constructor will associate * this prompter with the session using {@link Session#setUserInfo(UserInfo)}. * * @param session * the session */ public UserInfoPrompter(Session session) { super(); this.session = session; session.setUserInfo(this); } /** * Return the session to which this prompter is assigned. * * @return the session to which this prompter is assigned */ public Session getSession() { return session; } /* * (non-Javadoc) * * @see com.jcraft.jsch.UserInfo#getPassphrase() */ public String getPassphrase() { return passphrase; } /* * (non-Javadoc) * * @see com.jcraft.jsch.UserInfo#getPassword() */ public String getPassword() { return password; } /** * Set the pass phrase to be used when connecting the session. Return * <code>null</code> if the pass phrase is not known. * * @param passphrase * the pass phrase to be used when connecting the session or * <code>null</code> */ public void setPassphrase(String passphrase) { this.passphrase = passphrase; } /** * Set the password to be used when connecting the session. Return * <code>null</code> if the password is not known. * * @param password * the password to be used when connecting the session or * <code>null</code> */ public void setPassword(String password) { this.password = password; } /* * (non-Javadoc) * * @see com.jcraft.jsch.UserInfo#promptPassphrase(java.lang.String) */ public boolean promptPassphrase(String message) { String _passphrase = promptSecret(message); if (_passphrase != null) { setPassphrase(_passphrase); } return _passphrase != null; } /* * (non-Javadoc) * * @see com.jcraft.jsch.UserInfo#promptPassword(java.lang.String) */ public boolean promptPassword(String message) { String _password = promptSecret(message); if (_password != null) { setPassword(_password); } return _password != null; } private String promptSecret(final String message) { // ask the user for a password final String[] result = new String[1]; Display display = Display.getCurrent(); if (display != null) { result[0] = promptForPassword(message); } else { // sync exec in default thread Display.getDefault().syncExec(new Runnable() { public void run() { result[0] = promptForPassword(message); } }); } if (result[0] == null) { throw new OperationCanceledException(); } return result[0]; } /* package */String promptForPassword(final String message) { String username = getSession().getUserName(); UserValidationDialog dialog = new UserValidationDialog(null, null, (username == null) ? "" : username, //$NON-NLS-1$ message); dialog.setUsernameMutable(false); dialog.open(); return dialog.getPassword(); } /* * (non-Javadoc) * * @see com.jcraft.jsch.UIKeyboardInteractive#promptKeyboardInteractive(java.lang.String, * java.lang.String, java.lang.String, java.lang.String[], boolean[]) */ public String[] promptKeyboardInteractive(String destination, String name, String instruction, String[] prompt, boolean[] echo) { if (prompt.length == 0) { // No need to prompt, just return an empty String array return new String[0]; } try { if (attemptCount == 0 && password != 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 attemptCount++; return new String[] { password }; } String[] result = promptForKeyboradInteractiveInUI(destination, name, instruction, prompt, echo); if (result == null) return null; // canceled if (result.length == 1 && prompt.length == 1 && prompt[0].trim().equalsIgnoreCase("password:")) { //$NON-NLS-1$ password = result[0]; } attemptCount++; return result; } catch (OperationCanceledException e) { return null; } } private String[] promptForKeyboradInteractiveInUI(final String destination, final String name, final String instruction, final String[] prompt, final boolean[] echo) { final String[][] result = new String[1][]; Display display = Display.getCurrent(); if (display != null) { result[0] = internalPromptForUserInteractive(destination, name, instruction, prompt, echo); } else { // sync exec in default thread Display.getDefault().syncExec(new Runnable() { public void run() { result[0] = internalPromptForUserInteractive(destination, name, instruction, prompt, echo); } }); } return result[0]; } /* package */ String[] internalPromptForUserInteractive(String destination, String name, String instruction, String[] prompt, boolean[] echo) { String domain = null; String userName = getSession().getUserName(); KeyboardInteractiveDialog dialog = new KeyboardInteractiveDialog(null, domain, destination, name, userName, instruction, prompt, echo); dialog.open(); String[] _result = dialog.getResult(); return _result; } /* * (non-Javadoc) * * @see com.jcraft.jsch.UserInfo#promptYesNo(java.lang.String) */ public boolean promptYesNo(String question) { int prompt = prompt(MessageDialog.QUESTION, Messages.UserInfoPrompter_0, question, new int[] { IDialogConstants.YES_ID, IDialogConstants.NO_ID }, 0 // yes // the // default ); return prompt == 0; } /* * (non-Javadoc) * * @see com.jcraft.jsch.UserInfo#showMessage(java.lang.String) */ public void showMessage(String message) { prompt(MessageDialog.INFORMATION, Messages.UserInfoPrompter_1, message, new int[] { IDialogConstants.OK_ID }, 0); } private int prompt(final int promptType, final String title, final String message, final int[] promptResponses, final int defaultResponse) { final Display display = getStandardDisplay(); 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, defaultResponse); retval[0] = dialog.open(); } }); return retval[0]; } private Display getStandardDisplay() { Display display = Display.getCurrent(); if (display == null) { display = Display.getDefault(); } return display; } }