1 /* 2 * Copyright (C) 2009, Constantine Plotnikov <constantine.plotnikov@gmail.com> 3 * Copyright (C) 2009, Google Inc. 4 * Copyright (C) 2009, JetBrains s.r.o. 5 * Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com> 6 * Copyright (C) 2008-2009, Shawn O. Pearce <spearce@spearce.org> 7 * and other copyright owners as documented in the project's IP log. 8 * 9 * This program and the accompanying materials are made available 10 * under the terms of the Eclipse Distribution License v1.0 which 11 * accompanies this distribution, is reproduced below, and is 12 * available at http://www.eclipse.org/org/documents/edl-v10.php 13 * 14 * All rights reserved. 15 * 16 * Redistribution and use in source and binary forms, with or 17 * without modification, are permitted provided that the following 18 * conditions are met: 19 * 20 * - Redistributions of source code must retain the above copyright 21 * notice, this list of conditions and the following disclaimer. 22 * 23 * - Redistributions in binary form must reproduce the above 24 * copyright notice, this list of conditions and the following 25 * disclaimer in the documentation and/or other materials provided 26 * with the distribution. 27 * 28 * - Neither the name of the Eclipse Foundation, Inc. nor the 29 * names of its contributors may be used to endorse or promote 30 * products derived from this software without specific prior 31 * written permission. 32 * 33 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 34 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 35 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 36 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 37 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 38 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 39 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 40 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 41 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 42 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 43 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 44 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 45 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 46 */ 47 48 package org.eclipse.jgit.transport; 49 50 import org.eclipse.jgit.errors.TransportException; 51 import org.eclipse.jgit.internal.JGitText; 52 import org.eclipse.jgit.lib.Repository; 53 import org.eclipse.jgit.util.FS; 54 55 /** 56 * The base class for transports that use SSH protocol. This class allows 57 * customizing SSH connection settings. 58 */ 59 public abstract class SshTransport extends TcpTransport { 60 61 private SshSessionFactory sch; 62 63 /** 64 * The open SSH session 65 */ 66 private RemoteSession sock; 67 68 /** 69 * Create a new transport instance. 70 * 71 * @param local 72 * the repository this instance will fetch into, or push out of. 73 * This must be the repository passed to 74 * {@link #open(Repository, URIish)}. 75 * @param uri 76 * the URI used to access the remote repository. This must be the 77 * URI passed to {@link #open(Repository, URIish)}. 78 */ 79 protected SshTransport(Repository local, URIish uri) { 80 super(local, uri); 81 sch = SshSessionFactory.getInstance(); 82 } 83 84 /** 85 * Create a new transport instance without a local repository. 86 * 87 * @param uri the URI used to access the remote repository. This must be the 88 * URI passed to {@link #open(URIish)}. 89 * @since 3.5 90 */ 91 protected SshTransport(URIish uri) { 92 super(uri); 93 sch = SshSessionFactory.getInstance(); 94 } 95 96 /** 97 * Set SSH session factory instead of the default one for this instance of 98 * the transport. 99 * 100 * @param factory 101 * a factory to set, must not be null 102 * @throws java.lang.IllegalStateException 103 * if session has been already created. 104 */ 105 public void setSshSessionFactory(SshSessionFactory factory) { 106 if (factory == null) 107 throw new NullPointerException(JGitText.get().theFactoryMustNotBeNull); 108 if (sock != null) 109 throw new IllegalStateException( 110 JGitText.get().anSSHSessionHasBeenAlreadyCreated); 111 sch = factory; 112 } 113 114 /** 115 * Get the SSH session factory 116 * 117 * @return the SSH session factory that will be used for creating SSH 118 * sessions 119 */ 120 public SshSessionFactory getSshSessionFactory() { 121 return sch; 122 } 123 124 /** 125 * Get the default SSH session 126 * 127 * @return a remote session 128 * @throws org.eclipse.jgit.errors.TransportException 129 * in case of error with opening SSH session 130 */ 131 protected RemoteSession getSession() throws TransportException { 132 if (sock != null) 133 return sock; 134 135 final int tms = getTimeout() > 0 ? getTimeout() * 1000 : 0; 136 137 final FS fs = local == null ? FS.detect() : local.getFS(); 138 139 sock = sch 140 .getSession(uri, getCredentialsProvider(), fs, tms); 141 return sock; 142 } 143 144 /** {@inheritDoc} */ 145 @Override 146 public void close() { 147 if (sock != null) { 148 try { 149 sch.releaseSession(sock); 150 } finally { 151 sock = null; 152 } 153 } 154 } 155 }