Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/CVSSSH2ServerConnection.java')
-rw-r--r--bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/CVSSSH2ServerConnection.java257
1 files changed, 0 insertions, 257 deletions
diff --git a/bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/CVSSSH2ServerConnection.java b/bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/CVSSSH2ServerConnection.java
deleted file mode 100644
index 9f13ed8cc..000000000
--- a/bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/CVSSSH2ServerConnection.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 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:
- * Atsuhiko Yamanaka, JCraft,Inc. - initial API and implementation.
- * IBM Corporation - ongoing maintenance
- *******************************************************************************/
-package org.eclipse.team.internal.ccvs.ssh2;
-import java.io.FilterInputStream;
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.net.NoRouteToHostException;
-import java.net.UnknownHostException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.team.internal.ccvs.core.ICVSRepositoryLocation;
-import org.eclipse.team.internal.ccvs.core.IServerConnection;
-import org.eclipse.team.internal.ccvs.core.connection.CVSAuthenticationException;
-import org.eclipse.team.internal.core.streams.PollingInputStream;
-import org.eclipse.team.internal.core.streams.PollingOutputStream;
-import org.eclipse.team.internal.core.streams.TimeoutInputStream;
-import org.eclipse.team.internal.core.streams.TimeoutOutputStream;
-
-import com.jcraft.jsch.Channel;
-import com.jcraft.jsch.ChannelExec;
-import com.jcraft.jsch.JSchException;
-
-/**
- * SSH2 connection method. Has the property of defaulting to SSH1 if the server
- * doesn't support SSH2.
- */
-public class CVSSSH2ServerConnection implements IServerConnection {
-
- private static final String SSH1_COMPATIBILITY_CLASS = "org.eclipse.team.internal.ccvs.ssh.SSHServerConnection"; //$NON-NLS-1$
-
- private final class SSH2IOException extends IOException {
- private static final long serialVersionUID = 1L;
-
- private final JSchException e;
-
- SSH2IOException(String s, JSchException e) {
- super(s);
- this.e = e;
- }
-
- public Throwable getCause() {
- return e;
- }
- }
- private static final String COMMAND = "cvs server"; //$NON-NLS-1$
- private ICVSRepositoryLocation location;
- private String password;
- private InputStream inputStream;
- private OutputStream outputStream;
- private JSchSession session;
- private Channel channel;
- private IServerConnection ssh1;
-
- protected CVSSSH2ServerConnection(ICVSRepositoryLocation location, String password) {
- this.location = location;
- this.password = password;
- }
- public void close() throws IOException {
- if (ssh1 != null) {
- ssh1.close();
- ssh1 = null;
- return;
- }
- try {
- if (inputStream != null) {
- try {
- inputStream.close();
- } catch (IOException e) {
- // Ignore I/O Exception on close
- }
- }
- } finally {
- try {
- if (outputStream != null) {
- try {
- outputStream.close();
- } catch (IOException e) {
- // Ignore I/O Exception on close
- }
- }
- } finally {
- if (channel != null)
- channel.disconnect();
- }
- }
- }
- public InputStream getInputStream() {
- if (ssh1 != null) {
- return ssh1.getInputStream();
- }
- return inputStream;
- }
- public OutputStream getOutputStream() {
- if (ssh1 != null) {
- return ssh1.getOutputStream();
- }
- return outputStream;
- }
- public void open(IProgressMonitor monitor) throws IOException, CVSAuthenticationException {
- if (ssh1 != null) {
- ssh1.open(monitor);
- return;
- }
- monitor.subTask(NLS.bind(CVSSSH2Messages.CVSSSH2ServerConnection_open, new String[] { location.getHost() }));
- monitor.worked(1);
- internalOpen(monitor);
- }
- /**
- * @param monitor
- * @throws IOException
- * @throws CVSAuthenticationException
- */
- private void internalOpen(IProgressMonitor monitor) throws IOException, CVSAuthenticationException {
- try {
- OutputStream channel_out = null;
- InputStream channel_in = null;
- boolean firstTime = true;
- boolean tryAgain = false;
- while (firstTime || tryAgain) {
- tryAgain = false; // reset the try again flag
- session = JSchSession.getSession(location, location.getUsername(), password, location.getHost(), location.getPort(), monitor);
- channel = session.getSession().openChannel("exec"); //$NON-NLS-1$
- ((ChannelExec) channel).setCommand(COMMAND);
- channel_out = channel.getOutputStream();
- channel_in = channel.getInputStream();
- try {
- channel.connect();
- } catch (JSchException ee) {
- // This strange logic is here due to how the JSch client shares sessions.
- // It is possible that we have obtained a session that thinks it is connected
- // but is not. Channel connection only works if the session is connected so the
- // above channel connect may fail because the session is down. For this reason,
- // we want to retry if the connection fails.
- try {
- if (firstTime && (isSessionDownError(ee) || isChannelNotOpenError(ee))) {
- tryAgain = true;
- }
- if (!tryAgain) {
- throw ee;
- }
- } finally {
- // Always dispose of the current session when a failure occurs so we can start from scratch
- session.dispose();
- }
- }
- firstTime = false; // the first time is done
- }
- int timeout = location.getTimeout();
- inputStream = new PollingInputStream(new TimeoutInputStream(new FilterInputStream(channel_in) {
- public void close() {
- // Don't close the underlying stream as it belongs to the session
- }
- },
- 8192 /*bufferSize*/, (timeout>0 ? 1000 : 0) /*readTimeout*/, -1 /*closeTimeout*/, true /* growWhenFull */), timeout > 0 ? timeout : 1, monitor);
- outputStream = new PollingOutputStream(new TimeoutOutputStream(new FilterOutputStream(channel_out) {
- public void close() {
- // Don't close the underlying stream as it belongs to the session
- }
- },
- 8192 /*buffersize*/, (timeout>0 ? 1000 : 0) /*writeTimeout*/, (timeout>0 ? 1000 : 0) /*closeTimeout*/), timeout > 0 ? timeout : 1, monitor);
- } catch (final JSchException e) {
- if (isSSH2Unsupported(e)) {
- ssh1 = createSSH1Connection();
- if (ssh1 == null) {
- throw new SSH2IOException(
- CVSSSH2Messages.CVSSSH2ServerConnection_4, e);
- }
- ssh1.open(monitor);
- } else {
- String message = e.getMessage();
- if (JSchSession.isAuthenticationFailure(e)) {
- // Do not retry as the Jsh library has it's own retry logic
- throw new CVSAuthenticationException(CVSSSH2Messages.CVSSSH2ServerConnection_0, CVSAuthenticationException.NO_RETRY,location, e);
- } else if (message.startsWith("Session.connect: ")) { //$NON-NLS-1$
- // Jsh has messages formatted like "Session.connect: java.net.NoRouteToHostException: ..."
- // Strip of the exception and try to convert it to a more meaningfull string
- int start = message.indexOf(": ") + 1; //$NON-NLS-1$
- if (start != -1) {
- int end = message.indexOf(": ", start); //$NON-NLS-1$
- if (end != -1) {
- String exception = message.substring(start, end).trim();
- if (exception.indexOf("NoRouteToHostException") != -1) { //$NON-NLS-1$
- message = NLS.bind(CVSSSH2Messages.CVSSSH2ServerConnection_1, new String[] { location.getHost() });
- throw new NoRouteToHostException(message);
- } else if (exception.indexOf("java.net.UnknownHostException") != -1) { //$NON-NLS-1$
- throw new UnknownHostException(location.getHost());
- } else {
- message = message.substring(end + 1).trim();
- }
- }
- }
- }
- throw new SSH2IOException(message, e);
- }
- }
- }
-
- /**
- * Returns SSH-1 connection.
- *
- * @return a connection or <code>null</code>, if SSH-1 is not supported
- */
- private IServerConnection createSSH1Connection() {
- try {
- return (IServerConnection) Class.forName(SSH1_COMPATIBILITY_CLASS)
- .getConstructor(
- new Class[] { ICVSRepositoryLocation.class,
- String.class }).newInstance(
- new Object[] { location, password });
- } catch (IllegalArgumentException e1) {
- if (Policy.DEBUG)
- e1.printStackTrace();
- } catch (SecurityException e1) {
- if (Policy.DEBUG)
- e1.printStackTrace();
- } catch (InstantiationException e1) {
- if (Policy.DEBUG)
- e1.printStackTrace();
- } catch (IllegalAccessException e1) {
- if (Policy.DEBUG)
- e1.printStackTrace();
- } catch (InvocationTargetException e1) {
- if (Policy.DEBUG)
- e1.printStackTrace();
- } catch (NoSuchMethodException e1) {
- if (Policy.DEBUG)
- e1.printStackTrace();
- } catch (ClassNotFoundException e1) {
- if (Policy.DEBUG)
- e1.printStackTrace();
- }
- return null;
- }
-
- private boolean isChannelNotOpenError(JSchException ee) {
- return ee.getMessage().indexOf("channel is not opened") != -1; //$NON-NLS-1$
- }
- private boolean isSessionDownError(JSchException ee) {
- return ee.getMessage().equals("session is down"); //$NON-NLS-1$
- }
- private boolean isSSH2Unsupported(JSchException e) {
- return e.toString().indexOf("invalid server's version string") != -1; //$NON-NLS-1$
- }
-}

Back to the top