in core/src/main/java/org/apache/ftpserver/impl/IODataConnectionFactory.java [149:205]
public synchronized InetSocketAddress initPassiveDataConnection() throws DataConnectionException {
LOG.debug("Initiating passive data connection");
// close old sockets if any
closeDataConnection();
// get the passive port
int passivePort = session.getListener().getDataConnectionConfiguration().requestPassivePort();
if (passivePort == -1) {
servSoc = null;
throw new DataConnectionException("Cannot find an available passive port.");
}
// open passive server socket and get parameters
try {
DataConnectionConfiguration dataCfg = session.getListener().getDataConnectionConfiguration();
String passiveAddress = dataCfg.getPassiveAddress();
if (passiveAddress == null) {
address = serverControlAddress;
} else {
address = resolveAddress(dataCfg.getPassiveAddress());
}
if (secure) {
LOG.debug("Opening SSL passive data connection on address \"{}\" and port {}", address, passivePort);
SslConfiguration ssl = getSslConfiguration();
if (ssl == null) {
throw new DataConnectionException("Data connection SSL required but not configured.");
}
// this method does not actually create the SSL socket, due to a JVM bug
// (https://issues.apache.org/jira/browse/FTPSERVER-241).
// Instead, it creates a regular
// ServerSocket that will be wrapped as a SSL socket in createDataSocket()
servSoc = new ServerSocket(passivePort, 0, address);
LOG.debug("SSL Passive data connection created on address \"{}\" and port {}", address, passivePort);
} else {
LOG.debug("Opening passive data connection on address \"{}\" and port {}", address, passivePort);
servSoc = new ServerSocket(passivePort, 0, address);
LOG.debug("Passive data connection created on address \"{}\" and port {}", address, passivePort);
}
port = servSoc.getLocalPort();
servSoc.setSoTimeout(dataCfg.getIdleTime() * 1000);
// set different state variables
passive = true;
requestTime = System.currentTimeMillis();
return new InetSocketAddress(address, port);
} catch (Exception ex) {
closeDataConnection();
throw new DataConnectionException("Failed to initate passive data connection: " + ex.getMessage(), ex);
}
}