package org.tmatesoft.svn.core.internal.io.svn;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringWriter;
import java.lang.reflect.Method;
import org.tmatesoft.svn.core.internal.wc.SVNFileUtil;
import org.tmatesoft.svn.util.SVNDebugLog;
import org.tmatesoft.svn.util.SVNLogType;
import com.trilead.ssh2.auth.AgentProxy;
import com.trilead.ssh2.crypto.PEMDecoder;
public class SVNSSHPrivateKeyUtil {
private static final String TRILEAD_AGENT_PROXY_CLASS = "com.jcraft.jsch.agentproxy.TrileadAgentProxy";
private static final String CONNECTOR_FACTORY_CLASS = "com.jcraft.jsch.agentproxy.ConnectorFactory";
private static final String CONNECTOR_CLASS = "com.jcraft.jsch.agentproxy.Connector";
public static AgentProxy createOptionalSSHAgentProxy() {
try {
final Class<?> connectorClass = Class.forName(CONNECTOR_CLASS);
final Method connectorFactoryGetDefault = Class.forName(CONNECTOR_FACTORY_CLASS).getMethod("getDefault");
final Method connectorFactoryCreateConnector = Class.forName(CONNECTOR_FACTORY_CLASS).getMethod("createConnector");
final Object connectorFactory = connectorFactoryGetDefault.invoke(null);
final Object connector = connectorFactoryCreateConnector.invoke(connectorFactory);
final Class<?> proxyClass = Class.forName(TRILEAD_AGENT_PROXY_CLASS);
return (AgentProxy) proxyClass.getConstructor(connectorClass).newInstance(connector);
} catch (Throwable th) {
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, "Failed to load TrileadAgentProxy");
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, th);
}
return null;
}
public static char[] readPrivateKey(File privateKey) {
if (privateKey == null || !privateKey.exists() || !privateKey.isFile() || !privateKey.canRead()) {
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, "Can not read private key from '" + privateKey + "'");
return null;
}
Reader reader = null;
StringWriter buffer = new StringWriter();
try {
reader = new BufferedReader(new FileReader(privateKey));
int ch;
while(true) {
ch = reader.read();
if (ch < 0) {
break;
}
buffer.write(ch);
}
} catch (IOException e) {
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, e);
return null;
} finally {
SVNFileUtil.closeFile(reader);
}
return buffer.toString().toCharArray();
}
/**
* @deprecated
*/
public static boolean isValidPrivateKey(char[] privateKey, String passphrase) {
return isValidPrivateKey(privateKey, passphrase != null ? passphrase.toCharArray() : null);
}
public static boolean isValidPrivateKey(char[] privateKey, char[] passphrase) {
try {
PEMDecoder.decode(privateKey, passphrase != null ? new String(passphrase) : null);
} catch (IOException e) {
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, e);
return false;
}
return true;
}
}