?? jschsession.java
字號:
/* -*-mode:java; c-basic-offset:2; -*- *//******************************************************************************* * Copyright (c) 2003, Atsuhiko Yamanaka, JCraft,Inc. and others. All rights * reserved. This program and the accompanying materials are made available * under the terms of the Common Public License v1.0 which accompanies this * distribution, and is available at http://www.eclipse.org/legal/cpl-v10.html * * Contributors: Atsuhiko Yamanaka, JCraft,Inc. - initial API and * implementation. ******************************************************************************/package org.eclipse.team.ccvs.ssh2;import java.io.*;import java.net.Socket;import java.net.UnknownHostException;import java.util.Enumeration;import org.eclipse.core.boot.BootLoader;import org.eclipse.core.runtime.IProgressMonitor;import org.eclipse.core.runtime.NullProgressMonitor;import org.eclipse.jface.preference.IPreferenceStore;import org.eclipse.team.internal.ccvs.core.*;import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation;import org.eclipse.team.internal.ccvs.core.util.Util;import org.eclipse.swt.widgets.Display;import org.eclipse.swt.widgets.Shell;import org.eclipse.swt.SWT;import org.eclipse.swt.widgets.MessageBox;import com.jcraft.jsch.*;class JSchSession { private static final int SSH_DEFAULT_PORT = 22; private static JSch jsch=new JSch(); private static java.util.Hashtable pool = new java.util.Hashtable(); static String default_ssh_home = null; static { String ssh_dir_name = ".ssh"; //$NON-NLS-1$ // Windows doesn't like files or directories starting with a dot. if (BootLoader.getOS().equals(BootLoader.OS_WIN32)) { ssh_dir_name = "ssh"; //$NON-NLS-1$ } default_ssh_home = System.getProperty("user.home"); //$NON-NLS-1$ if (default_ssh_home != null) { default_ssh_home = default_ssh_home + java.io.File.separator + ssh_dir_name; } else { } } private static String current_ssh_home = null; public static class SimpleSocketFactory implements SocketFactory { InputStream in = null; OutputStream out = null; public Socket createSocket(String host, int port) throws IOException, UnknownHostException { Socket socket = null; socket = new Socket(host, port); return socket; } public InputStream getInputStream(Socket socket) throws IOException { if (in == null) in = socket.getInputStream(); return in; } public OutputStream getOutputStream(Socket socket) throws IOException { if (out == null) out = socket.getOutputStream(); return out; } } public static class ResponsiveSocketFacory extends SimpleSocketFactory { private IProgressMonitor monitor; public ResponsiveSocketFacory(IProgressMonitor monitor) { this.monitor = monitor; } public Socket createSocket(String host, int port) throws IOException, UnknownHostException { Socket socket = null; socket = Util.createSocket(host, port, monitor); // Null out the monitor so we don't hold onto anything // (i.e. the SSH2 session will keep a handle to the socket factory around monitor = new NullProgressMonitor(); // Set the socket timeout socket.setSoTimeout(CVSProviderPlugin.getPlugin().getTimeout() * 1000); return socket; } } private static class MyUserInfo implements UserInfo, UIKeyboardInteractive{ private String username; private String password; private String passphrase; private ICVSRepositoryLocation location; MyUserInfo(String username, ICVSRepositoryLocation location){ this.username=username; this.location=location; } public String getPassword(){ return password; } public String getPassphrase(){ return passphrase; } public boolean promptYesNo(String str){ YesNoPrompt prompt=new YesNoPrompt(str); Display.getDefault().syncExec(prompt); return prompt.getResult()==SWT.YES; } public boolean promptPassphrase(String message){ PassphrasePrompt prompt=new PassphrasePrompt(message); Display.getDefault().syncExec(prompt); String _passphrase=prompt.getPassphrase(); if(_passphrase!=null)passphrase=_passphrase; return _passphrase!=null; } public boolean promptPassword(String message){ PasswordPrompt prompt=new PasswordPrompt(message); Display.getDefault().syncExec(prompt); String _password=prompt.getPassword(); if(_password!=null){ password=_password; if(location!=null){ ((CVSRepositoryLocation)location).setPassword(password); } } return _password!=null; } public void showMessage(final String foo){ final Display display=Display.getCurrent(); display.syncExec(new Runnable(){ public void run(){ Shell shell=new Shell(display); MessageBox box=new MessageBox(shell,SWT.OK); box.setMessage(foo); box.open(); shell.dispose(); } }); } public String[] promptKeyboardInteractive(String destination, String name, String instruction, String[] prompt, boolean[] echo){ KeyboardInteractivePrompt _prompt=new KeyboardInteractivePrompt(destination, name, instruction, prompt, echo); Display.getDefault().syncExec(_prompt); String[] result=_prompt.getResult(); return result; } private class YesNoPrompt implements Runnable{ private String prompt; private int result; YesNoPrompt(String prompt){ this.prompt=prompt; } public void run(){ Display display=Display.getCurrent(); Shell shell=new Shell(display); MessageBox box=new MessageBox(shell,SWT.YES|SWT.NO); box.setMessage(prompt); result=box.open(); shell.dispose(); } public int getResult(){ return result; } } private class PasswordPrompt implements Runnable{ private String message; private String password; PasswordPrompt(String message){ this.message=message; } public void run(){ Display display=Display.getCurrent(); Shell shell=new Shell(display); PasswordDialog dialog=new PasswordDialog(shell, message); dialog.open(); shell.dispose(); password=dialog.getPassword(); } public String getPassword(){ return password; } } private class PassphrasePrompt implements Runnable{ private String message; private String passphrase; PassphrasePrompt(String message){ this.message=message; } public void run(){ Display display=Display.getCurrent(); Shell shell=new Shell(display); PassphraseDialog dialog=new PassphraseDialog(shell, message); dialog.open(); shell.dispose(); passphrase=dialog.getPassphrase(); } public String getPassphrase(){ return passphrase; } } private class KeyboardInteractivePrompt implements Runnable{ private String destination; private String name; private String instruction; private String[] prompt; private boolean[] echo; private String[] result; KeyboardInteractivePrompt(String destination, String name, String instruction, String[] prompt, boolean[] echo){ this.destination=destination; this.name=name; this.instruction=instruction; this.prompt=prompt; this.echo=echo; } public void run(){ Display display=Display.getCurrent(); Shell shell=new Shell(display); KeyboardInteractiveDialog dialog=new KeyboardInteractiveDialog(shell, destination, name, instruction, prompt, echo); dialog.open(); shell.dispose(); result=dialog.getResult(); } public String[] getResult(){ return result; } } } static Session getSession(ICVSRepositoryLocation location, String username, String password, String hostname, int port, SocketFactory socketFactory) throws JSchException { if (port == 0) port = SSH_DEFAULT_PORT; IPreferenceStore store = CVSSSH2Plugin.getDefault().getPreferenceStore(); String ssh_home = store.getString(CVSSSH2PreferencePage.KEY_SSH2HOME); if (current_ssh_home == null || !current_ssh_home.equals(ssh_home)) { current_ssh_home = ssh_home; if (ssh_home.length() == 0) ssh_home = default_ssh_home; try { loadKnownHosts(); java.io.File file; String pkeys=store.getString(CVSSSH2PreferencePage.KEY_PRIVATEKEY); //String[] pkey=pkeys.split(","); //$NON-NLS-1$ String[] pkey=split(pkeys, ","); //$NON-NLS-1$ for(int i=0; i<pkey.length;i++){ file = new java.io.File(ssh_home, pkey[i]); if (file.exists()) jsch.addIdentity(file.getPath()); } } catch (Exception e) { } } String key = username + "@" + hostname + ":" + port; //$NON-NLS-1$ //$NON-NLS-2$ try { Session session = (Session) pool.get(key); if (session != null && !session.isConnected()) { pool.remove(key); session = null; } if (session == null) { session = jsch.getSession(username, hostname, port); boolean useProxy = store.getString(CVSSSH2PreferencePage.KEY_PROXY).equals("true"); //$NON-NLS-1$ if (useProxy) { String _type = store.getString(CVSSSH2PreferencePage.KEY_PROXY_TYPE); String _host = store.getString(CVSSSH2PreferencePage.KEY_PROXY_HOST); String _port = store.getString(CVSSSH2PreferencePage.KEY_PROXY_PORT); boolean useAuth = store.getString(CVSSSH2PreferencePage.KEY_PROXY_AUTH).equals("true"); //$NON-NLS-1$ String _user = store.getString(CVSSSH2PreferencePage.KEY_PROXY_USER); String _pass = store.getString(CVSSSH2PreferencePage.KEY_PROXY_PASS); Proxy proxy = null; String proxyhost = _host + ":" + _port; //$NON-NLS-1$ if (_type.equals(CVSSSH2PreferencePage.HTTP)) { proxy = new ProxyHTTP(proxyhost); if (useAuth) { ((ProxyHTTP) proxy).setUserPasswd(_user, _pass); } } else if (_type.equals(CVSSSH2PreferencePage.SOCKS5)) { proxy = new ProxySOCKS5(proxyhost); if (useAuth) { ((ProxySOCKS5) proxy).setUserPasswd(_user, _pass); } } else { proxy = null; } if (proxy != null) { session.setProxy(proxy); } } session.setPassword(password); UserInfo ui = new MyUserInfo(username, location); session.setUserInfo(ui); session.setSocketFactory(socketFactory); session.connect(); pool.put(key, session); } return session; } catch (JSchException e) { pool.remove(key); throw e; } } static void loadKnownHosts(){ IPreferenceStore store = CVSSSH2Plugin.getDefault().getPreferenceStore(); String ssh_home = store.getString(CVSSSH2PreferencePage.KEY_SSH2HOME); if (ssh_home.length() == 0) ssh_home = default_ssh_home; try { java.io.File file; file=new java.io.File(ssh_home, "known_hosts"); //$NON-NLS-1$ jsch.setKnownHosts(file.getPath()); } catch (Exception e) { } } static void shutdown() { if (jsch != null && pool.size() > 0) { for (Enumeration e = pool.elements(); e.hasMoreElements(); ) { Session session = (Session) (e.nextElement()); try { session.disconnect(); } catch (Exception ee) { } } pool.clear(); } } static JSch getJSch(){ return jsch; } private static String[] split(String foo, String split){ byte[] buf=foo.getBytes(); java.util.Vector bar=new java.util.Vector(); int start=0; int index; while(true){ index=foo.indexOf(split, start); if(index>=0){ bar.addElement(new String(buf, start, index-start)); start=index+1; continue; } bar.addElement(new String(buf, start, buf.length-start)); break; } String[] result=new String[bar.size()]; for(int i=0; i<result.length; i++){ result[i]=(String)(bar.elementAt(i)); } return result; }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -