Author: ngn
Date: Fri Dec 26 02:09:07 2008
New Revision: 729474
URL: http://svn.apache.org/viewvc?rev=729474&view=rev
Log:
Add support for implicit SSL for data connections, mostly based on the patch
provided by Kevin Conaway (FTPSERVER-247)
Added:
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ssl/MinaImplicitDataChannelTest.java
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DataConnectionConfiguration.java
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DataConnectionConfigurationFactory.java
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/config/spring/ListenerBeanDefinitionParser.java
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/DefaultDataConnectionConfiguration.java
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/IODataConnectionFactory.java
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/config/spring/ftpserver-1.0.xsd
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/ClientTestTemplate.java
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/config/spring/SpringConfigTest.java
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ssl/ExplicitSecurityTestTemplate.java
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ssl/SSLTestTemplate.java
mina/ftpserver/trunk/core/src/test/resources/spring-config/config-spring-1.xml
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DataConnectionConfiguration.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DataConnectionConfiguration.java?rev=729474&r1=729473&r2=729474&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DataConnectionConfiguration.java
(original)
+++
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DataConnectionConfiguration.java
Fri Dec 26 02:09:07 2008
@@ -110,4 +110,9 @@
* @return The {...@link SslConfiguration}
*/
SslConfiguration getSslConfiguration();
+
+ /**
+ * @return True if SSL is mandatory for the data channel
+ */
+ boolean isImplicitSsl();
}
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DataConnectionConfigurationFactory.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DataConnectionConfigurationFactory.java?rev=729474&r1=729473&r2=729474&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DataConnectionConfigurationFactory.java
(original)
+++
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DataConnectionConfigurationFactory.java
Fri Dec 26 02:09:07 2008
@@ -46,6 +46,7 @@
private String passiveAddress;
private String passiveExternalAddress;
private PassivePorts passivePorts = new PassivePorts(new int[] { 0 });
+ private boolean implicitSsl;
/**
* Default constructor
@@ -70,7 +71,7 @@
ssl, activeEnabled, activeIpCheck,
activeLocalAddress, activeLocalPort,
passiveAddress, passivePorts,
- passiveExternalAddress);
+ passiveExternalAddress, implicitSsl);
}
/*
* (Non-Javadoc)
@@ -285,4 +286,19 @@
public void setSslConfiguration(SslConfiguration ssl) {
this.ssl = ssl;
}
+
+ /**
+ * @return True if ssl is mandatory for the data connection
+ */
+ public boolean isImplicitSsl() {
+ return implicitSsl;
+ }
+
+ /**
+ * Set whether ssl is required for the data connection
+ * @param sslMandatory True if ssl is mandatory for the data connection
+ */
+ public void setImplicitSsl(boolean implicitSsl) {
+ this.implicitSsl = implicitSsl;
+ }
}
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/config/spring/ListenerBeanDefinitionParser.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/config/spring/ListenerBeanDefinitionParser.java?rev=729474&r1=729473&r2=729474&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/config/spring/ListenerBeanDefinitionParser.java
(original)
+++
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/config/spring/ListenerBeanDefinitionParser.java
Fri Dec 26 02:09:07 2008
@@ -251,6 +251,9 @@
DataConnectionConfigurationFactory dc = new
DataConnectionConfigurationFactory();
if (element != null) {
+
+ dc.setImplicitSsl(SpringUtil.parseBoolean(element, "implicit-ssl",
false));
+
// data con config element available
SslConfiguration ssl = parseSsl(element);
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/DefaultDataConnectionConfiguration.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/DefaultDataConnectionConfiguration.java?rev=729474&r1=729473&r2=729474&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/DefaultDataConnectionConfiguration.java
(original)
+++
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/DefaultDataConnectionConfiguration.java
Fri Dec 26 02:09:07 2008
@@ -19,12 +19,8 @@
package org.apache.ftpserver.impl;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
import org.apache.ftpserver.DataConnectionConfiguration;
import org.apache.ftpserver.DataConnectionConfigurationFactory;
-import org.apache.ftpserver.DataConnectionException;
import org.apache.ftpserver.ssl.SslConfiguration;
/**
@@ -50,6 +46,8 @@
private String passiveAddress;
private String passiveExternalAddress;
private PassivePorts passivePorts;
+
+ private final boolean implicitSsl;
/**
* Internal constructor, do not use directly. Use {...@link
DataConnectionConfigurationFactory} instead.
@@ -58,7 +56,7 @@
SslConfiguration ssl, boolean activeEnabled, boolean activeIpCheck,
String activeLocalAddress, int activeLocalPort,
String passiveAddress, PassivePorts passivePorts,
- String passiveExternalAddress) {
+ String passiveExternalAddress, boolean implicitSsl) {
this.idleTime = idleTime;
this.ssl = ssl;
this.activeEnabled = activeEnabled;
@@ -68,6 +66,7 @@
this.passiveAddress = passiveAddress;
this.passivePorts = passivePorts;
this.passiveExternalAddress = passiveExternalAddress;
+ this.implicitSsl = implicitSsl;
}
/**
@@ -169,4 +168,11 @@
public SslConfiguration getSslConfiguration() {
return ssl;
}
+
+ /**
+ * @see org.apache.ftpserver.DataConnectionConfiguration#isImplicitSsl()
+ */
+ public boolean isImplicitSsl() {
+ return implicitSsl;
+ }
}
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/IODataConnectionFactory.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/IODataConnectionFactory.java?rev=729474&r1=729473&r2=729474&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/IODataConnectionFactory.java
(original)
+++
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/IODataConnectionFactory.java
Fri Dec 26 02:09:07 2008
@@ -28,8 +28,6 @@
import java.security.GeneralSecurityException;
import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLServerSocket;
-import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
@@ -82,7 +80,9 @@
final FtpIoSession session) {
this.session = session;
this.serverContext = serverContext;
-
+ if
(session.getListener().getDataConnectionConfiguration().isImplicitSsl()) {
+ secure = true;
+ }
}
/**
@@ -276,6 +276,7 @@
if (!passive) {
int localPort = dataConfig.getActiveLocalPort();
if (secure) {
+ LOG.debug("Opening secure active data connection");
SslConfiguration ssl = getSslConfiguration();
if (ssl == null) {
throw new FtpException(
@@ -291,6 +292,7 @@
localPort, false);
}
} else {
+ LOG.debug("Opening active data connection");
if (localPort == 0) {
dataSoc = new Socket(address, port);
} else {
@@ -301,9 +303,9 @@
}
}
} else {
- LOG.debug("Opening passive data connection");
if(secure) {
+ LOG.debug("Opening secure passive data connection");
// this is where we wrap the unsecured socket as a
SSLSocket. This is
// due to the JVM bug described in FTPSERVER-241.
@@ -332,7 +334,9 @@
}
dataSoc = sslSocket;
- } else {
+ } else {
+ LOG.debug("Opening passive data connection");
+
dataSoc = servSoc.accept();
}
LOG.debug("Passive data connection opened");
Modified:
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/config/spring/ftpserver-1.0.xsd
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/config/spring/ftpserver-1.0.xsd?rev=729474&r1=729473&r2=729474&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/config/spring/ftpserver-1.0.xsd
(original)
+++
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/config/spring/ftpserver-1.0.xsd
Fri Dec 26 02:09:07 2008
@@ -125,6 +125,7 @@
</xs:element>
</xs:sequence>
<xs:attribute
name="idle-timeout" type="xs:int" />
+ <xs:attribute name="implicit-ssl" type="xs:boolean" />
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="blacklist"
type="xs:string" />
Modified:
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/ClientTestTemplate.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/ClientTestTemplate.java?rev=729474&r1=729473&r2=729474&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/ClientTestTemplate.java
(original)
+++
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/ClientTestTemplate.java
Fri Dec 26 02:09:07 2008
@@ -30,6 +30,7 @@
import org.apache.commons.net.ftp.FTPConnectionClosedException;
import org.apache.ftpserver.FtpServerFactory;
import org.apache.ftpserver.impl.DefaultFtpServer;
+import org.apache.ftpserver.impl.FtpIoSession;
import org.apache.ftpserver.listener.ListenerFactory;
import org.apache.ftpserver.test.TestUtil;
import org.apache.ftpserver.usermanager.ClearTextPasswordEncryptor;
@@ -197,6 +198,11 @@
IoUtils.delete(TEST_TMP_DIR);
}
}
+
+ protected FtpIoSession getActiveSession() {
+ return server.getListener("default").getActiveSessions().iterator()
+ .next();
+ }
/*
* (non-Javadoc)
Modified:
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/config/spring/SpringConfigTest.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/config/spring/SpringConfigTest.java?rev=729474&r1=729473&r2=729474&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/config/spring/SpringConfigTest.java
(original)
+++
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/config/spring/SpringConfigTest.java
Fri Dec 26 02:09:07 2008
@@ -69,8 +69,11 @@
.getServerAddress()));
assertEquals(100, ((NioListener) listener)
.getDataConnectionConfiguration().getIdleTime());
- assertEquals(true, ((NioListener) listener)
+ assertTrue(((NioListener) listener)
.getDataConnectionConfiguration().isActiveEnabled());
+ assertTrue(((NioListener) listener)
+ .getDataConnectionConfiguration().isImplicitSsl());
+
assertEquals(InetAddress.getByName("1.2.3.4"),
InetAddress.getByName(((NioListener) listener)
.getDataConnectionConfiguration().getActiveLocalAddress()) );
assertEquals("123-125", ((NioListener) listener)
Modified:
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ssl/ExplicitSecurityTestTemplate.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ssl/ExplicitSecurityTestTemplate.java?rev=729474&r1=729473&r2=729474&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ssl/ExplicitSecurityTestTemplate.java
(original)
+++
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ssl/ExplicitSecurityTestTemplate.java
Fri Dec 26 02:09:07 2008
@@ -25,7 +25,6 @@
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.net.ftp.FTPSClient;
-import org.apache.ftpserver.impl.FtpIoSession;
import org.apache.ftpserver.util.IoUtils;
/**
@@ -36,11 +35,11 @@
*/
public abstract class ExplicitSecurityTestTemplate extends SSLTestTemplate {
- private static final File TEST_FILE1 = new File(ROOT_DIR, "test1.txt");
+ protected static final File TEST_FILE1 = new File(ROOT_DIR, "test1.txt");
- private static final File TEST_FILE2 = new File(ROOT_DIR, "test2.txt");
+ protected static final File TEST_FILE2 = new File(ROOT_DIR, "test2.txt");
- private static final byte[] TEST_DATA = "TESTDATA".getBytes();
+ protected static final byte[] TEST_DATA = "TESTDATA".getBytes();
protected void setUp() throws Exception {
super.setUp();
@@ -48,11 +47,6 @@
client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
}
- private FtpIoSession getActiveSession() {
- return server.getListener("default").getActiveSessions().iterator()
- .next();
- }
-
/**
* Tests that we can send command over the command channel. This is, in
fact
* already tested by login in setup but an explicit test is good anyways.
Added:
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ssl/MinaImplicitDataChannelTest.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ssl/MinaImplicitDataChannelTest.java?rev=729474&view=auto
==============================================================================
---
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ssl/MinaImplicitDataChannelTest.java
(added)
+++
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ssl/MinaImplicitDataChannelTest.java
Fri Dec 26 02:09:07 2008
@@ -0,0 +1,131 @@
+/*
+ * 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.ftpserver.ssl;
+
+import java.io.ByteArrayInputStream;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLServerSocketFactory;
+import javax.net.ssl.TrustManager;
+
+import org.apache.commons.net.ftp.FTPSClient;
+import org.apache.commons.net.ftp.FTPSSocketFactory;
+import org.apache.ftpserver.DataConnectionConfigurationFactory;
+import org.apache.ftpserver.impl.ServerDataConnectionFactory;
+
+/**
+* @author The Apache MINA Project ([email protected])
+* @version $Rev$, $Date$
+ */
+public class MinaImplicitDataChannelTest extends ImplicitSecurityTestTemplate {
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ protected String getAuthValue() {
+ return "SSL";
+ }
+
+ protected DataConnectionConfigurationFactory
createDataConnectionConfiguration() {
+ DataConnectionConfigurationFactory result = super
+ .createDataConnectionConfiguration();
+ result.setImplicitSsl(true);
+ return result;
+ }
+
+ protected boolean useImplicit() {
+ return true;
+ }
+
+ /**
+ * Simple test that the {...@link ServerDataConnectionFactory#isSecure()}
+ * works as expected
+ */
+ public void testThatDataChannelIsSecure() {
+ assertTrue(getActiveSession().getDataConnection().isSecure());
+ }
+
+ /**
+ * Test that implicit SSL data connections works with clients that
+ * use implicit SSL for the data connection, without sending PROT P.
+ * In this case in active mode.
+ *
+ * The inherited tests from {...@link ExplicitSecurityTestTemplate}
ensures that
+ * data transfers work when using PROT P
+ */
+ public void testStoreWithoutProtPInActiveMode() throws Exception {
+ secureClientDataConnection();
+
+ // Do not send PROT P
+
+ // make sure we use a implicit SSL data connection
+ assertTrue(getActiveSession().getDataConnection().isSecure());
+
+ client.storeFile(TEST_FILE1.getName(), new ByteArrayInputStream(
+ TEST_DATA));
+
+ assertTrue(TEST_FILE1.exists());
+ assertEquals(TEST_DATA.length, TEST_FILE1.length());
+ }
+
+ /**
+ * Test that implicit SSL data connections works with clients that
+ * use implicit SSL for the data connection, without sending PROT P.
+ * In this case in active mode.
+ */
+ public void testStoreWithProtPInPassiveMode() throws Exception {
+ secureClientDataConnection();
+ client.setRemoteVerificationEnabled(false);
+ client.enterLocalPassiveMode();
+
+ // Do not send PROT P
+
+ // make sure we use a implicit SSL data connection
+ assertTrue(getActiveSession().getDataConnection().isSecure());
+
+ client.storeFile(TEST_FILE1.getName(), new ByteArrayInputStream(
+ TEST_DATA));
+
+ assertTrue(TEST_FILE1.exists());
+ assertEquals(TEST_DATA.length, TEST_FILE1.length());
+ }
+
+
+ private void secureClientDataConnection() throws NoSuchAlgorithmException,
+ KeyManagementException {
+
+ // FTPSClient does not support implicit data connections, so we hack
it ourselves
+ FTPSClient sclient = (FTPSClient) client;
+ SSLContext context = SSLContext.getInstance("TLS");
+
+ // these are the same key and trust managers that we initialize the
client with
+ context.init(new KeyManager[] { clientKeyManager },
+ new TrustManager[] { clientTrustManager }, null);
+ sclient.setSocketFactory(new FTPSSocketFactory(context));
+ SSLServerSocketFactory ssf = context.getServerSocketFactory();
+ sclient.setServerSocketFactory(ssf);
+
+ // FTPClient should not use SSL secured sockets for the data
connection
+ }
+}
Modified:
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ssl/SSLTestTemplate.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ssl/SSLTestTemplate.java?rev=729474&r1=729473&r2=729474&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ssl/SSLTestTemplate.java
(original)
+++
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ssl/SSLTestTemplate.java
Fri Dec 26 02:09:07 2008
@@ -25,7 +25,9 @@
import java.io.IOException;
import java.security.KeyStore;
+import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import org.apache.commons.net.ftp.FTPSClient;
@@ -55,6 +57,9 @@
private static final File FTPSERVER_KEYSTORE = new File(TestUtil
.getBaseDir(), "src/test/resources/ftpserver.jks");
+ protected KeyManager clientKeyManager;
+ protected TrustManager clientTrustManager;
+
protected SslConfigurationFactory createSslConfiguration() {
SslConfigurationFactory sslConfigFactory = new
SslConfigurationFactory();
sslConfigFactory.setKeystoreFile(FTPSERVER_KEYSTORE);
@@ -75,16 +80,17 @@
factory.setImplicitSsl(useImplicit());
factory.setSslConfiguration(createSslConfiguration().createSslConfiguration());
-
-// DataConnectionConfigurationFactory dataConfig = new
DataConnectionConfigurationFactory();
-//
dataConfig.setSslConfiguration(createSslConfiguration().createSslConfiguration());
-//
-//
factory.setDataConnectionConfiguration(dataConfig.createDataConnectionConfiguration());
-//
+
+
factory.setDataConnectionConfiguration(createDataConnectionConfiguration().createDataConnectionConfiguration());
+
server.addListener("default", factory.createListener());
return server;
}
+
+ protected DataConnectionConfigurationFactory
createDataConnectionConfiguration() {
+ return new DataConnectionConfigurationFactory();
+ }
protected boolean useImplicit() {
return false;
@@ -112,8 +118,12 @@
.getInstance("SunX509");
trustManagerFactory.init(store);
- ftpsClient.setKeyManager(keyManagerFactory.getKeyManagers()[0]);
- ftpsClient.setTrustManager(trustManagerFactory.getTrustManagers()[0]);
+
+ clientKeyManager = keyManagerFactory.getKeyManagers()[0];
+ clientTrustManager = trustManagerFactory.getTrustManagers()[0];
+
+ ftpsClient.setKeyManager(clientKeyManager);
+ ftpsClient.setTrustManager(clientTrustManager);
String auth = getAuthValue();
if (auth != null) {
Modified:
mina/ftpserver/trunk/core/src/test/resources/spring-config/config-spring-1.xml
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/resources/spring-config/config-spring-1.xml?rev=729474&r1=729473&r2=729474&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/test/resources/spring-config/config-spring-1.xml
(original)
+++
mina/ftpserver/trunk/core/src/test/resources/spring-config/config-spring-1.xml
Fri Dec 26 02:09:07 2008
@@ -38,7 +38,7 @@
<keystore file="src/test/resources/ftpserver.jks"
password="password"/>
</ssl>
- <data-connection idle-timeout="100">
+ <data-connection idle-timeout="100"
implicit-ssl="true">
<active enabled="true"
local-address="1.2.3.4"/>
<passive ports="123-125"/>
</data-connection>