// Copyright � 2002-2005 Canoo Engineering AG, Switzerland.
package com.canoo.webtest.security;
import com.canoo.webtest.engine.Configuration;
import com.canoo.webtest.interfaces.IConnectionInitializer;
import org.apache.log4j.Logger;
import java.security.Provider;
import java.security.Security;
/**
* @author Carsten Seibert, Dierk Koenig
*/
public abstract class AbstractConnectionInitializer extends SecurityConstants implements IConnectionInitializer {
private static final Logger LOG = Logger.getLogger(AbstractConnectionInitializer.class);
protected static final String SUN_JSSE_PROVIDER_CLASS = "com.sun.net.ssl.internal.ssl.Provider";
protected static final String SUN_SSL_PROTOCOL_HANDLER_PACKAGE = "com.sun.net.ssl.internal.www.protocol";
protected static final String PROTOCOL_HANDLER_KEY = "java.protocol.handler.pkgs";
protected static final String TRUST_STORE_KEY = "javax.net.ssl.trustStore";
protected static final String TRUST_STORE_PASSWORD_KEY = "javax.net.ssl.trustStorePassword";
public static String getExternalProperty(final Configuration config, final String propertyName) {
return config.getExternalProperty(propertyName);
}
protected static void logProperty(final Configuration config, final String propertyName) {
LOG.debug("Ext property: " + propertyName + "=" + getExternalProperty(config, propertyName));
}
public static boolean isProtocolHttps(final Configuration config) {
return Configuration.PROTOCOL_HTTPS.equals(config.getProtocol());
}
protected static boolean hasProvider(final Class providerClass) {
LOG.debug("Looking for provider class " + providerClass);
final Provider[] list = Security.getProviders();
for (int i = 0; i < list.length; i++) {
final Provider provider = list[i];
LOG.debug("Checking: " + providerInfoString(provider));
if (provider.getClass().equals(providerClass)) {
return true;
}
}
return false;
}
static void logSecurityProviders() {
Provider[] providers = Security.getProviders();
for (int i = 0; i < providers.length; i++) {
LOG.info("Security Provider " + i + ": " + providerInfoString(providers[i]));
}
}
private static String providerInfoString(final Provider provider) {
StringBuffer sb = new StringBuffer();
sb.append(provider.getName());
sb.append("\n\t").append(provider.getInfo());
sb.append("\n\t").append(provider.getClass().getName());
sb.append("\n\tversion: ").append(provider.getVersion());
return sb.toString();
}
protected static void installJsseProviderIfRequired(final String providerClassName) throws ConnectionInitializationException {
Class providerClass;
try {
providerClass = Class.forName(providerClassName);
} catch (ClassNotFoundException e) {
throw new ConnectionInitializationException("Class " + providerClassName + "not found! Is JSSE correctly installed?");
}
if (!hasProvider(providerClass)) {
try {
LOG.info(providerClassName + " not present. Current Providers are:");
logSecurityProviders();
Security.addProvider((Provider) providerClass.newInstance());
LOG.info(providerClassName + " added. Providers are now:");
logSecurityProviders();
} catch (Exception e) {
String message = "Can not instantiate class " + providerClassName + "!";
LOG.info(message, e);
throw new ConnectionInitializationException(message);
}
}
}
protected static void setSystemProperty(final String key, final String value) {
LOG.debug("Set " + key + " to " + value + ", was " + System.setProperty(key, value));
}
}