/* * ==================================================================== * Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://svnkit.com/license.html * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * ==================================================================== */ package org.tmatesoft.svn.core.auth; import com.trilead.ssh2.auth.AgentProxy; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.util.SVNEncodingUtil; import java.io.File; /** * The <b>SVNSSHAuthentication</b> class represents a kind of credentials used * to authenticate a user over an SSH tunnel. * * <p> * To obtain an ssh user credential, specify the {@link ISVNAuthenticationManager#SSH SSH} * kind to credentials getter method of <b>ISVNAuthenticationManager</b>: * {@link ISVNAuthenticationManager#getFirstAuthentication(String, String, org.tmatesoft.svn.core.SVNURL) getFirstAuthentication()}, * {@link ISVNAuthenticationManager#getNextAuthentication(String, String, org.tmatesoft.svn.core.SVNURL) getNextAuthentication()}. * * @version 1.3 * @author TMate Software Ltd. * @since 1.2 * @see ISVNAuthenticationManager */ public class SVNSSHAuthentication extends SVNAuthentication { /** * Creates a user credential object for authenticating over an ssh tunnel. * * @param userName the name of a user to authenticate * @param password the user's password * @param portNumber the number of a port to establish an ssh tunnel over * @param storageAllowed if <span class="javakeyword">true</span> then * this credential is allowed to be stored in the * global auth cache, otherwise not * @param url url these credentials are applied to * * @since 1.8.9 */ public static SVNSSHAuthentication newInstance(String userName, char[] password, int portNumber, boolean storageAllowed, SVNURL url, boolean isPartial) { return new SVNSSHAuthentication(userName, password, null, null, null, null, portNumber, storageAllowed, url, isPartial); } /** * Creates a user credential object for authenticating over an ssh tunnel. * * @param userName the name of a user to authenticate * @param keyFile the user's ssh private key file * @param passphrase a password to the ssh private key * @param portNumber the number of a port to establish an ssh tunnel over * @param storageAllowed if <span class="javakeyword">true</span> then * this credential is allowed to be stored in the * global auth cache, otherwise not * @param url url these credentials are applied to * * @since 1.8.9 */ public static SVNSSHAuthentication newInstance(String userName, File keyFile, char[] passphrase, int portNumber, boolean storageAllowed, SVNURL url, boolean isPartial) { return new SVNSSHAuthentication(userName, null, keyFile, null, passphrase, null, portNumber, storageAllowed, url, isPartial); } /** * Creates a user credential object for authenticating over an ssh tunnel. * * @param userName the name of a user to authenticate * @param privateKey the user's ssh private key * @param passphrase a password to the ssh private key * @param portNumber the number of a port to establish an ssh tunnel over * @param storageAllowed if <span class="javakeyword">true</span> then * this credential is allowed to be stored in the * global auth cache, otherwise not * @param url url these credentials are applied to * * @since 1.8.9 */ public static SVNSSHAuthentication newInstance(String userName, char[] keyValue, char[] passphrase, int portNumber, boolean storageAllowed, SVNURL url, boolean isPartial) { return new SVNSSHAuthentication(userName, null, null, keyValue, passphrase, null, portNumber, storageAllowed, url, isPartial); } /** * Creates a user credential object for authenticating over an ssh tunnel. * * @param userName the name of a user to authenticate * @param agentProxy SSH agent proxy * @param portNumber the number of a port to establish an ssh tunnel over * @param url url these credentials are applied to * * @since 1.8.9 */ public static SVNSSHAuthentication newInstance(String userName, AgentProxy agentProxy, int portNumber, SVNURL url, boolean isPartial) { return new SVNSSHAuthentication(userName, null, null, null, null, agentProxy, portNumber, false, url, isPartial); } private char[] myPassword; private char[] myPassphrase; private File myPrivateKeyFile; private AgentProxy myAgentProxy; private int myPortNumber; private char[] myPrivateKeyValue; /** * @deprecated Use {@link #newInstance(String, char[], int, boolean, SVNURL, boolean)} method */ public SVNSSHAuthentication(String userName, String password, int portNumber, boolean storageAllowed) { this(userName, password == null ? new char[0] : password.toCharArray(), null, null, null, null, portNumber, storageAllowed, null, false); } /** * @deprecated Use {@link #newInstance(String, char[], int, boolean, SVNURL, boolean)} method * * @since 1.3.1 */ public SVNSSHAuthentication(String userName, String password, int portNumber, boolean storageAllowed, SVNURL url, boolean isPartial) { this(userName, password == null ? new char[0] : password.toCharArray(), null, null, null, null, portNumber, storageAllowed, url, isPartial); } /** * @deprecated Use {@link #newInstance(String, File, char[], int, boolean, SVNURL, boolean) method */ public SVNSSHAuthentication(String userName, File keyFile, String passphrase, int portNumber, boolean storageAllowed) { this(userName, null, keyFile, passphrase != null ? passphrase.toCharArray() : null, null, null, portNumber, storageAllowed, null, false); } /** * @deprecated Use {@link #newInstance(String, File, char[], int, boolean, SVNURL, boolean) method * * @since 1.3.1 */ public SVNSSHAuthentication(String userName, File keyFile, String passphrase, int portNumber, boolean storageAllowed, SVNURL url, boolean isPartial) { this(userName, null, keyFile, null, passphrase != null ? passphrase.toCharArray() : null, null, portNumber, storageAllowed, url, isPartial); } /** * @deprecated Use {@link #newInstance(String, char[], char[], int, boolean, SVNURL, boolean) method */ public SVNSSHAuthentication(String userName, char[] privateKey, String passphrase, int portNumber, boolean storageAllowed) { this(userName, null, null, privateKey, passphrase != null ? passphrase.toCharArray() : null, null, portNumber, storageAllowed, null, false); } /** * @deprecated Use {@link #newInstance(String, char[], char[], int, boolean, SVNURL, boolean) method * * @since 1.3.1 */ public SVNSSHAuthentication(String userName, char[] privateKey, String passphrase, int portNumber, boolean storageAllowed, SVNURL url, boolean isPartial) { this(userName, null, null, privateKey, passphrase != null ? passphrase.toCharArray() : null, null, portNumber, storageAllowed, url, isPartial); } /** * @deprecated Use {@link #newInstance(String, AgentProxy, int, SVNURL, boolean) method */ public SVNSSHAuthentication(String userName, AgentProxy agentProxy, int portNumber, SVNURL url, boolean isPartial) { this(userName, null, null, null, null, agentProxy, portNumber, false, url, isPartial); } private SVNSSHAuthentication(String userName, char[] password, File keyFile, char[] keyValue, char[] passphrase, AgentProxy agentProxy, int portNumber, boolean storageAllowed, SVNURL url, boolean isPartial) { super(ISVNAuthenticationManager.SSH, userName, storageAllowed, url, isPartial); myAgentProxy = agentProxy; myPassword = password; myPassphrase = passphrase; myPrivateKeyFile = keyFile; myPrivateKeyValue = keyValue; myPortNumber = portNumber; } /** * Returns password. This is used when an ssh private key is not used. * * @deprecated Use {@link #getPasswordValue()} method * @return the user's password */ public String getPassword() { return myPassword != null ? new String(myPassword) : null; } /** * Returns password. This is used when an ssh private key is not used. * * @since 1.8.9 * @return password */ public char[] getPasswordValue() { return myPassword; } /** * Returns the password to the ssh private key. * * @deprecated Use {@link #getPassphraseValue()} method * * @return the password to the private key * @see #getPrivateKeyFile() */ public String getPassphrase() { return myPassphrase != null ? new String(myPassphrase) : null; } /** * Returns the password to the ssh private key. * * @since 1.8.9 * @return the password to the private key * @see #getPrivateKeyFile() */ public char[] getPassphraseValue() { return myPassphrase; } /** * Returns the File representation referring to the file with the * user's ssh private key. If the private key is encrypted with a * passphrase, it should have been provided to an appropriate constructor. * * @return the user's private key file */ public File getPrivateKeyFile() { return myPrivateKeyFile; } /** * Returns ssh private key. If the private key is encrypted with a * passphrase, it should have been provided to an appropriate constructor. * * @return the user's private key file */ public char[] getPrivateKey() { return myPrivateKeyValue; } /** * Returns the number of the port across which an ssh tunnel * is established. * * @return the port number to establish an ssh tunnel over */ public int getPortNumber() { return myPortNumber; } /** * Tells whether this authentication object contains a user's private key. * @return <span class="javakeyword">true</span> if either {@link #getPrivateKey()} or * {@link #getPrivateKeyFile()} returns non-<span class="javakeyword">null</span> * @since 1.2.0 */ public boolean hasPrivateKey() { return myPrivateKeyFile != null || myPrivateKeyValue != null; } /** * Tells whether this authentication object has a SSH agent connection */ public AgentProxy getAgentProxy() { return myAgentProxy; } @Override public void dismissSensitiveData() { super.dismissSensitiveData(); SVNEncodingUtil.clearArray(myPassphrase); SVNEncodingUtil.clearArray(myPassword); SVNEncodingUtil.clearArray(myPrivateKeyValue); } @Override public SVNAuthentication copy() { return new SVNSSHAuthentication(getUserName(), copyOf(myPassword), myPrivateKeyFile, copyOf(myPrivateKeyValue), copyOf(myPassphrase), myAgentProxy, myPortNumber, isStorageAllowed(), getURL(), isPartial()); } }