adding public-key authentication support to internal ssh
"Atsuhiko Yamanaka" <[email protected]> Wed, 1 Mar 2006 16:46:05 +0900
| Newsgroups | gmane.comp.java.netbeans.modules.javacvs.devel |
|---|---|
| Message-ID | <[email protected]> |
------=_Part_13663_10771745.1141199165794
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Hi there,
Here is a patch to add public-key authentication support to internal ssh.
Please note following points.
* This patch expects that there exist private keys under
System.getProperty("user.home")+java.io.File.separator + ".ssh" directo=
ry.
There should be some wizard dialog to change this directory.
* If there exist private keys named as 'id_dsa' or 'id_rsa', they will
be loaded.
Those keys must by in OpenSSH format. Putty has used its own format,
but Putty can convert its private-key to in OpenSSH format.
* If private key is encrypted, the given password will be used to decrypt i=
t.
There should be dialog to ask for the pass-phrase.
Sincerely,
--
Atsuhiko Yamanaka
JCraft,Inc.
1-14-20 HONCHO AOBA-KU,
SENDAI, MIYAGI 980-0014 Japan.
Tel +81-22-723-2150
+1-415-578-3454
Fax +81-22-224-8773
Skype callto://jcraft/
------=_Part_13663_10771745.1141199165794
Content-Type: text/plain; name=SSHConnection.java.1.7.2.patch;
charset=us-ascii
Content-Transfer-Encoding: 7bit
X-Attachment-Id: f_ek9cd7t3
Content-Disposition: attachment; filename="SSHConnection.java.1.7.2.patch"
# This patch file was generated by NetBeans IDE
# Following Index: paths are relative to: C:\Documents and Settings\ymnk\nb_all\javacvs\cvsmodule
# This patch can be applied using context Tools: Patch action on respective folder.
# It uses platform neutral UTF-8 encoding and \n newlines.
# Above lines and this line are ignored by the patching process.
Index: src/org/netbeans/modules/versioning/system/cvss/SSHConnection.java
*** C:\Documents and Settings\ymnk\nb_all\javacvs\cvsmodule\src\org\netbeans\modules\versioning\system\cvss\SSHConnection.java Base (1.7)
--- C:\Documents and Settings\ymnk\nb_all\javacvs\cvsmodule\src\org\netbeans\modules\versioning\system\cvss\SSHConnection.java Locally Modified (Based On 1.7)
***************
*** 44,50 ****
private final String username;
private final String password;
! private Session session;
private ChannelExec channel;
/**
--- 44,51 ----
private final String username;
private final String password;
! private JSch jsch;
! private static Hashtable session_pool=new Hashtable();
private ChannelExec channel;
/**
***************
*** 65,86 ****
}
public void open() throws AuthenticationException, CommandAbortedException {
- Properties props = new Properties();
- props.put("StrictHostKeyChecking", "no"); // NOI18N
-
- JSch jsch = new JSch();
try {
- session = jsch.getSession(username, host, port);
- session.setSocketFactory(new SocketFactoryBridge());
- session.setConfig(props);
- session.setUserInfo(new SSHUserInfo());
- session.connect();
- } catch (JSchException e) {
- throw new AuthenticationException(e, NbBundle.getMessage(SSHConnection.class, "BK3001"));
- }
-
- try {
channel = (ChannelExec) session.openChannel("exec"); // NOI18N
channel.setCommand(CVS_SERVER_COMMAND);
setInputStream(new LoggedDataInputStream(new SshChannelInputStream(channel)));
--- 66,77 ----
}
public void open() throws AuthenticationException, CommandAbortedException {
+ Session session=getSession();
try {
channel = (ChannelExec) session.openChannel("exec"); // NOI18N
channel.setCommand(CVS_SERVER_COMMAND);
***************
*** 122,128 ****
}
private void reset() {
- session = null;
channel = null;
setInputStream(null);
setOutputStream(null);
--- 110,115 ----
***************
*** 130,136 ****
public void close() throws IOException {
if (channel != null) channel.disconnect();
- if (session != null) session.disconnect();
reset();
}
--- 117,122 ----
***************
*** 155,161 ****
*/
private class SSHUserInfo implements UserInfo, UIKeyboardInteractive {
public String getPassphrase() {
! return null;
}
public String getPassword() {
--- 141,147 ----
*/
private class SSHUserInfo implements UserInfo, UIKeyboardInteractive {
public String getPassphrase() {
! return password;
}
public String getPassword() {
***************
*** 228,234 ****
--- 214,263 ----
if (exitStatus == 0 || channel.isEOF()) throw new EOFException(NbBundle.getMessage(SSHConnection.class, "BK3007"));
}
}
+
+ private Session getSession() throws AuthenticationException{
+ String key=username+":"+host+":"+port;
+ Session session=null;
+ synchronized(session_pool){
+ session=(Session) session_pool.get(key);
+ if(session!=null && !session.isConnected()){
+ session_pool.remove(key);
+ session=null;
}
+ if(session==null){
+ if(jsch==null){
+ jsch = new JSch();
+ String ssh_home=System.getProperty("user.home")+java.io.File.separator + ".ssh";
+ String[] pkey={"id_rsa", "id_dsa"};
+ for(int i=0;i<pkey.length;i++){
+ java.io.File file = new java.io.File(ssh_home, pkey[i]);
+ if (file.exists()){
+ try{
+ jsch.addIdentity(file.getPath());
+ }
+ catch(JSchException ee){
+ }
+ }
+ }
+ }
+ Properties props = new Properties();
+ props.put("StrictHostKeyChecking", "no"); // NOI18N
+ try {
+ session = jsch.getSession(username, host, port);
+ session.setSocketFactory(new SocketFactoryBridge());
+ session.setConfig(props);
+ session.setUserInfo(new SSHUserInfo());
+ session.connect();
+ } catch (JSchException e) {
+ throw new AuthenticationException(e, NbBundle.getMessage(SSHConnection.class, "BK3001"));
+ }
+ }
+ session_pool.put(key, session);
+ }
+ return session;
+ }
+ }
------=_Part_13663_10771745.1141199165794
Content-Type: text/plain; charset=us-ascii
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
------=_Part_13663_10771745.1141199165794--