Index: src/main/java/org/apache/maven/wagon/providers/ssh/jsch/AbstractJschWagon.java =================================================================== --- src/main/java/org/apache/maven/wagon/providers/ssh/jsch/AbstractJschWagon.java (revision 713374) +++ src/main/java/org/apache/maven/wagon/providers/ssh/jsch/AbstractJschWagon.java (working copy) @@ -72,11 +72,20 @@ File privateKey = getPrivateKey(); + // username and password will be given via UserInfo interface. + UserInfo ui = new WagonUserInfo( authenticationInfo, interactiveUserInfo ); + if ( privateKey != null && privateKey.exists() ) { try { - sch.addIdentity( privateKey.getAbsolutePath(), authenticationInfo.getPassphrase() ); + if( authenticationInfo.getPassphrase().length() < 1 ) + { + ui.promptPassphrase( "Passphrase for " + privateKey.getName() ); + authenticationInfo.setPassphrase( ui.getPassphrase() ); + } + + sch.addIdentity( privateKey.getAbsolutePath(), authenticationInfo.getPassphrase()); } catch ( JSchException e ) { @@ -120,9 +129,6 @@ session.setProxy( null ); } - // username and password will be given via UserInfo interface. - UserInfo ui = new WagonUserInfo( authenticationInfo, interactiveUserInfo ); - if ( uIKeyboardInteractive != null ) { ui = new UserInfoUIKeyboardInteractiveProxy( ui, uIKeyboardInteractive ); Index: src/main/java/org/apache/maven/wagon/providers/ssh/jsch/interactive/PasswordPrompter.java =================================================================== --- src/main/java/org/apache/maven/wagon/providers/ssh/jsch/interactive/PasswordPrompter.java (revision 0) +++ src/main/java/org/apache/maven/wagon/providers/ssh/jsch/interactive/PasswordPrompter.java (revision 0) @@ -0,0 +1,40 @@ +package org.apache.maven.wagon.providers.ssh.jsch.interactive; + +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; + +import javax.swing.JDialog; +import javax.swing.JOptionPane; +import javax.swing.JPasswordField; + +public class PasswordPrompter +{ + public static String promptForPassword(String prompt) + { + final JPasswordField jpf = new JPasswordField(); + JOptionPane jop = new JOptionPane(jpf, + JOptionPane.QUESTION_MESSAGE, + JOptionPane.OK_CANCEL_OPTION); + JDialog dialog = jop.createDialog( null, prompt ); + dialog.addComponentListener( + new ComponentAdapter() + { + public void componentShown(ComponentEvent e) + { + jpf.requestFocusInWindow(); + } + } + ); + dialog.setVisible(true); + Integer result = (Integer)jop.getValue(); + dialog.dispose(); + char[] password = null; + if(result.intValue() == JOptionPane.OK_OPTION ) + { + password = jpf.getPassword(); + } + + return new String(password); + } + +} Index: src/main/java/org/apache/maven/wagon/providers/ssh/jsch/interactive/UserInfoUIKeyboardInteractiveProxy.java =================================================================== --- src/main/java/org/apache/maven/wagon/providers/ssh/jsch/interactive/UserInfoUIKeyboardInteractiveProxy.java (revision 713374) +++ src/main/java/org/apache/maven/wagon/providers/ssh/jsch/interactive/UserInfoUIKeyboardInteractiveProxy.java (working copy) @@ -69,7 +69,7 @@ */ public boolean promptPassword( String arg0 ) { - return userInfo.promptPassword( arg0 ); + return userInfo.promptPassword( arg0 ); } /** Index: src/main/java/org/apache/maven/wagon/providers/ssh/jsch/WagonUserInfo.java =================================================================== --- src/main/java/org/apache/maven/wagon/providers/ssh/jsch/WagonUserInfo.java (revision 713374) +++ src/main/java/org/apache/maven/wagon/providers/ssh/jsch/WagonUserInfo.java (working copy) @@ -19,6 +19,7 @@ import com.jcraft.jsch.UserInfo; import org.apache.maven.wagon.authentication.AuthenticationInfo; import org.apache.maven.wagon.providers.ssh.interactive.InteractiveUserInfo; +import org.apache.maven.wagon.providers.ssh.jsch.interactive.PasswordPrompter; class WagonUserInfo implements UserInfo @@ -50,9 +51,9 @@ public boolean promptPassphrase( String message ) { - if ( passphrase == null && userInfo != null ) + if ( passphrase.length() < 1 && userInfo != null ) { - passphrase = userInfo.promptPassphrase( message ); + passphrase = PasswordPrompter.promptForPassword( message ); } return passphrase != null; } @@ -61,7 +62,7 @@ { if ( password == null && userInfo != null ) { - password = userInfo.promptPassword( message ); + password = PasswordPrompter.promptForPassword( message ); } return password != null; }