package fitnesse.socketservice;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocketFactory;
public class SslParameters {
private String keyStoreFilename;
private String keyStorePassword;
private String trustStoreFilename;
private String keyStoreFilenameOld;
private String keyStorePasswordOld;
private String trustStoreFilenameOld;
protected void setKeyStoreFilename(String filename) {
if(filename != null) this.keyStoreFilename = filename;
}
protected void setKeyStorePassword(String value) {
if(value != null) this.keyStorePassword = value;
}
protected void setTrustStoreFilename(String filename) {
if(filename != null) this.trustStoreFilename = filename;
}
private void setProperty(String tag, String value, String defaultValue) {
if ( value == null) value = defaultValue;
if (value == null){
System.clearProperty(tag);
}
else{
System.setProperty(tag, value);
}
}
protected SslParameters(){
}
protected SslParameters(String keyStoreFilename, String keyStorePassword, String trustStoreFilename){
setKeyStoreFilename(keyStoreFilename);
setKeyStorePassword(keyStorePassword);
setTrustStoreFilename(trustStoreFilename);
}
protected void prepareGlobalConfiguration(){
// Save the current values so that they can be restored
keyStoreFilenameOld = System.getProperty("javax.net.ssl.keyStore" );
keyStorePasswordOld = System.getProperty("javax.net.ssl.keyStorePassword");
trustStoreFilenameOld= System.getProperty("javax.net.ssl.trustStore");
setProperty("javax.net.ssl.keyStore", keyStoreFilename, "fitnesse.jks" );
setProperty("javax.net.ssl.keyStorePassword", keyStorePassword, "FitNesse42");
setProperty("javax.net.ssl.trustStore", trustStoreFilename, "fitnesse.jks");
}
protected void restorePreviousConfiguration(){
setProperty("javax.net.ssl.keyStore", keyStoreFilenameOld, keyStoreFilenameOld );
setProperty("javax.net.ssl.keyStorePassword", keyStorePasswordOld, keyStorePasswordOld);
setProperty("javax.net.ssl.trustStore", trustStoreFilenameOld, trustStoreFilenameOld);
}
public static SslParameters setSslParameters(String sslParameterClassName) {
Class<? extends SslParameters> sslParametersInstance;
if (sslParameterClassName == null || "true".equalsIgnoreCase(sslParameterClassName)) {
sslParametersInstance= SslParameters.class;
}else{
try {
sslParametersInstance= Class.forName(sslParameterClassName).asSubclass(SslParameters.class);
} catch (ClassNotFoundException e) {
throw new RuntimeException("Preparing SSL Parameters with Class " + sslParameterClassName + " failed. Class Not Found.", e);
}
}
try{
return sslParametersInstance.newInstance();
}catch (Exception e) {
throw new RuntimeException("Preparing SSL Parameters with Class " + sslParameterClassName + " failed.", e);
}
}
public SSLServerSocketFactory createSSLServerSocketFactory(){
SSLServerSocketFactory ssf;
prepareGlobalConfiguration();
try{
ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
}finally{
restorePreviousConfiguration();
}
return ssf;
}
public SSLSocketFactory createSSLSocketFactory(){
SSLSocketFactory ssf;
prepareGlobalConfiguration();
try{
ssf = (SSLSocketFactory) SSLSocketFactory.getDefault();
}finally{
restorePreviousConfiguration();
}
return ssf;
}
}