blob: dd7bc1c097fa07e954ec10e29cf09504c69087f3 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.component.file.remote;
import java.io.File;
import java.security.NoSuchAlgorithmException;
import org.apache.camel.util.ObjectHelper;
import org.apache.ftpserver.FtpServerFactory;
import org.apache.ftpserver.listener.ListenerFactory;
import org.apache.ftpserver.ssl.SslConfigurationFactory;
/**
* Abstract base class for unit testing using a secure FTP Server (over SSL/TLS)
*
* @version
*/
public abstract class FtpsServerTestSupport extends FtpServerTestSupport {
protected static final String AUTH_VALUE_SSL = "SSL";
protected static final String AUTH_VALUE_TLS = "TLS";
protected static final File FTPSERVER_KEYSTORE = new File("./src/test/resources/server.jks");
protected static final String FTPSERVER_KEYSTORE_PASSWORD = "password";
@Override
protected FtpServerFactory createFtpServerFactory() throws Exception {
try {
return doCreateFtpServerFactory();
} catch (Exception e) {
// ignore if algorithm is not on the OS
NoSuchAlgorithmException nsae = ObjectHelper.getException(NoSuchAlgorithmException.class, e);
if (nsae != null) {
String name = System.getProperty("os.name");
System.out.println("SunX509 is not avail on this platform [" + name + "] Testing is skipped! Real cause: " + nsae.getMessage());
} else {
// some other error then throw it so the test can fail
throw e;
}
}
return null;
}
protected FtpServerFactory doCreateFtpServerFactory() throws Exception {
assertTrue(FTPSERVER_KEYSTORE.exists());
FtpServerFactory serverFactory = super.createFtpServerFactory();
ListenerFactory listenerFactory = new ListenerFactory(serverFactory.getListener(DEFAULT_LISTENER));
listenerFactory.setImplicitSsl(useImplicit());
listenerFactory.setSslConfiguration(createSslConfiguration().createSslConfiguration());
serverFactory.addListener(DEFAULT_LISTENER, listenerFactory.createListener());
return serverFactory;
}
protected SslConfigurationFactory createSslConfiguration() {
// comment in, if you have trouble with SSL
// System.setProperty("javax.net.debug", "all");
SslConfigurationFactory sslConfigFactory = new SslConfigurationFactory();
sslConfigFactory.setSslProtocol(getAuthValue());
sslConfigFactory.setKeystoreFile(FTPSERVER_KEYSTORE);
sslConfigFactory.setKeystoreType("JKS");
sslConfigFactory.setKeystoreAlgorithm("SunX509");
sslConfigFactory.setKeystorePassword(FTPSERVER_KEYSTORE_PASSWORD);
sslConfigFactory.setKeyPassword(FTPSERVER_KEYSTORE_PASSWORD);
sslConfigFactory.setClientAuthentication(getClientAuth());
if (Boolean.valueOf(getClientAuth())) {
sslConfigFactory.setTruststoreFile(FTPSERVER_KEYSTORE);
sslConfigFactory.setTruststoreType("JKS");
sslConfigFactory.setTruststoreAlgorithm("SunX509");
sslConfigFactory.setTruststorePassword(FTPSERVER_KEYSTORE_PASSWORD);
}
return sslConfigFactory;
}
/**
* Set what client authentication level to use, supported values are "yes"
* or "true" for required authentication, "want" for wanted authentication
* and "false" or "none" for no authentication. Defaults to "none".
*
* @return clientAuthReqd
*/
protected abstract String getClientAuth();
/**
* Should listeners created by this factory automatically be in SSL mode
* automatically or must the client explicitly request to use SSL
*/
protected abstract boolean useImplicit();
/**
* Set the SSL protocol used for this channel. Supported values are "SSL"
* and "TLS".
*/
protected abstract String getAuthValue();
}