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> and others 7 * 8 * This program and the accompanying materials are made available under the 9 * terms of the Eclipse Distribution License v. 1.0 which is available at 10 * https://www.eclipse.org/org/documents/edl-v10.php. 11 * 12 * SPDX-License-Identifier: BSD-3-Clause 13 */ 14 15 package org.eclipse.jgit.transport; 16 17 import org.eclipse.jgit.errors.TransportException; 18 import org.eclipse.jgit.internal.JGitText; 19 import org.eclipse.jgit.lib.Repository; 20 import org.eclipse.jgit.util.FS; 21 22 /** 23 * The base class for transports that use SSH protocol. This class allows 24 * customizing SSH connection settings. 25 */ 26 public abstract class SshTransport extends TcpTransport { 27 28 private SshSessionFactory sch; 29 30 /** 31 * The open SSH session 32 */ 33 private RemoteSession sock; 34 35 /** 36 * Create a new transport instance. 37 * 38 * @param local 39 * the repository this instance will fetch into, or push out of. 40 * This must be the repository passed to 41 * {@link #open(Repository, URIish)}. 42 * @param uri 43 * the URI used to access the remote repository. This must be the 44 * URI passed to {@link #open(Repository, URIish)}. 45 */ 46 protected SshTransport(Repository local, URIish uri) { 47 super(local, uri); 48 sch = SshSessionFactory.getInstance(); 49 } 50 51 /** 52 * Create a new transport instance without a local repository. 53 * 54 * @param uri the URI used to access the remote repository. This must be the 55 * URI passed to {@link #open(URIish)}. 56 * @since 3.5 57 */ 58 protected SshTransport(URIish uri) { 59 super(uri); 60 sch = SshSessionFactory.getInstance(); 61 } 62 63 /** 64 * Set SSH session factory instead of the default one for this instance of 65 * the transport. 66 * 67 * @param factory 68 * a factory to set, must not be null 69 * @throws java.lang.IllegalStateException 70 * if session has been already created. 71 */ 72 public void setSshSessionFactory(SshSessionFactory factory) { 73 if (factory == null) 74 throw new NullPointerException(JGitText.get().theFactoryMustNotBeNull); 75 if (sock != null) 76 throw new IllegalStateException( 77 JGitText.get().anSSHSessionHasBeenAlreadyCreated); 78 sch = factory; 79 } 80 81 /** 82 * Get the SSH session factory 83 * 84 * @return the SSH session factory that will be used for creating SSH 85 * sessions 86 */ 87 public SshSessionFactory getSshSessionFactory() { 88 return sch; 89 } 90 91 /** 92 * Get the default SSH session 93 * 94 * @return a remote session 95 * @throws org.eclipse.jgit.errors.TransportException 96 * in case of error with opening SSH session 97 */ 98 protected RemoteSession getSession() throws TransportException { 99 if (sock != null) 100 return sock; 101 102 final int tms = getTimeout() > 0 ? getTimeout() * 1000 : 0; 103 104 final FS fs = local == null ? FS.detect() : local.getFS(); 105 106 sock = sch 107 .getSession(uri, getCredentialsProvider(), fs, tms); 108 return sock; 109 } 110 111 /** {@inheritDoc} */ 112 @Override 113 public void close() { 114 if (sock != null) { 115 try { 116 sch.releaseSession(sock); 117 } finally { 118 sock = null; 119 } 120 } 121 } 122 }