1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.net.ftp;
19
20 import static org.junit.Assert.assertEquals;
21 import static org.junit.Assert.assertTrue;
22
23 import java.io.File;
24 import java.io.IOException;
25 import java.net.SocketException;
26 import java.net.URL;
27 import java.time.Duration;
28
29 import org.apache.commons.io.FileUtils;
30 import org.apache.commons.io.output.NullOutputStream;
31 import org.apache.commons.net.PrintCommandListener;
32 import org.apache.ftpserver.FtpServer;
33 import org.apache.ftpserver.FtpServerFactory;
34 import org.apache.ftpserver.ftplet.FtpException;
35 import org.apache.ftpserver.ftplet.UserManager;
36 import org.apache.ftpserver.listener.ListenerFactory;
37 import org.apache.ftpserver.ssl.SslConfiguration;
38 import org.apache.ftpserver.ssl.SslConfigurationFactory;
39 import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory;
40 import org.apache.ftpserver.usermanager.impl.BaseUser;
41 import org.junit.Assert;
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 public abstract class AbstractFtpsTest {
57
58 private static int SocketPort;
59 private static FtpServer EmbeddedFtpServer;
60 protected static final boolean IMPLICIT = false;
61 protected static final long TEST_TIMEOUT = 10000;
62 private static final boolean TRACE_CALLS = Boolean.parseBoolean(System.getenv("TRACE_CALLS"));
63 private static final boolean ADD_LISTENER = Boolean.parseBoolean(System.getenv("ADD_LISTENER"));
64 private static final long startTime = System.nanoTime();
65
66
67
68
69
70
71
72 protected static String getTestHomeDirectory(final String defaultHome) {
73 return System.getProperty("test.basedir", defaultHome);
74 }
75
76
77
78
79
80
81
82
83
84
85 protected synchronized static void setupServer(final boolean implicit, final String userPropertiesResource, final String serverJksResourceResource, final String defaultHome)
86 throws FtpException {
87 if (EmbeddedFtpServer != null) {
88 return;
89 }
90
91 SocketPort = 0;
92 final FtpServerFactory serverFactory = new FtpServerFactory();
93 final PropertiesUserManagerFactory propertiesUserManagerFactory = new PropertiesUserManagerFactory();
94 final URL userPropsResource = ClassLoader.getSystemClassLoader().getResource(userPropertiesResource);
95 Assert.assertNotNull(userPropertiesResource, userPropsResource);
96 propertiesUserManagerFactory.setUrl(userPropsResource);
97 final UserManager userManager = propertiesUserManagerFactory.createUserManager();
98 final BaseUser user = (BaseUser) userManager.getUserByName("test");
99
100
101 user.setHomeDirectory(getTestHomeDirectory(defaultHome));
102 serverFactory.setUserManager(userManager);
103 final ListenerFactory factory = new ListenerFactory();
104 factory.setPort(SocketPort);
105
106
107 final URL serverJksResource = ClassLoader.getSystemClassLoader().getResource(serverJksResourceResource);
108 Assert.assertNotNull(serverJksResourceResource, serverJksResource);
109
110 final SslConfigurationFactory sllConfigFactory = new SslConfigurationFactory();
111 final File keyStoreFile = FileUtils.toFile(serverJksResource);
112 Assert.assertTrue(keyStoreFile.toString(), keyStoreFile.exists());
113 sllConfigFactory.setKeystoreFile(keyStoreFile);
114 sllConfigFactory.setKeystorePassword("password");
115
116
117 final SslConfiguration sslConfiguration = sllConfigFactory.createSslConfiguration();
118 final NoProtocolSslConfigurationProxy noProtocolSslConfigurationProxy = new NoProtocolSslConfigurationProxy(sslConfiguration);
119 factory.setSslConfiguration(noProtocolSslConfigurationProxy);
120 factory.setImplicitSsl(implicit);
121
122
123 serverFactory.addListener("default", factory.createListener());
124
125
126 EmbeddedFtpServer = serverFactory.createServer();
127 EmbeddedFtpServer.start();
128 SocketPort = ((org.apache.ftpserver.impl.DefaultFtpServer) EmbeddedFtpServer).getListener("default").getPort();
129
130 trace("Server started");
131 }
132
133 protected static void trace(final String msg) {
134 if (TRACE_CALLS) {
135 System.err.println(msg + " " + (System.nanoTime() - startTime));
136 }
137 }
138
139 private final boolean endpointCheckingEnabled;
140
141 public AbstractFtpsTest(final boolean endpointCheckingEnabled, final String userPropertiesResource, final String serverJksResource) {
142 this.endpointCheckingEnabled = endpointCheckingEnabled;
143 }
144
145 protected void assertClientCode(final FTPSClient client) {
146 final int replyCode = client.getReplyCode();
147 assertTrue(FTPReply.isPositiveCompletion(replyCode));
148 }
149
150 protected FTPSClient loginClient() throws SocketException, IOException {
151 trace(">>loginClient");
152 final FTPSClient client = new FTPSClient(IMPLICIT);
153 if (ADD_LISTENER) {
154 client.addProtocolCommandListener(new PrintCommandListener(System.err));
155 }
156
157 client.setControlKeepAliveReplyTimeout(null);
158 assertEquals(0, client.getControlKeepAliveReplyTimeoutDuration().getSeconds());
159 client.setControlKeepAliveReplyTimeout(Duration.ofSeconds(60));
160 assertEquals(60, client.getControlKeepAliveReplyTimeoutDuration().getSeconds());
161
162 client.setControlKeepAliveTimeout(null);
163 assertEquals(0, client.getControlKeepAliveTimeoutDuration().getSeconds());
164 client.setControlKeepAliveTimeout(Duration.ofSeconds(61));
165 assertEquals(61, client.getControlKeepAliveTimeoutDuration().getSeconds());
166
167 client.setDataTimeout(null);
168 assertEquals(0, client.getDataTimeout().getSeconds());
169 client.setDataTimeout(Duration.ofSeconds(62));
170 assertEquals(62, client.getDataTimeout().getSeconds());
171
172 client.setEndpointCheckingEnabled(endpointCheckingEnabled);
173 client.connect("localhost", SocketPort);
174
175 assertClientCode(client);
176 assertEquals(SocketPort, client.getRemotePort());
177
178 try {
179
180
181 Thread.sleep(200);
182 } catch (final InterruptedException ignore) {
183
184 }
185 assertTrue(client.login("test", "test"));
186 assertClientCode(client);
187
188 client.setFileType(FTP.BINARY_FILE_TYPE);
189 assertClientCode(client);
190
191 client.execPBSZ(0);
192 assertClientCode(client);
193
194 client.execPROT("P");
195 assertClientCode(client);
196 trace("<<loginClient");
197 return client;
198 }
199
200 protected void retrieveFile(final String pathname) throws SocketException, IOException {
201 final FTPSClient client = loginClient();
202 try {
203
204
205 assertTrue(pathname, client.retrieveFile(pathname, NullOutputStream.NULL_OUTPUT_STREAM));
206 assertTrue(pathname, client.retrieveFile(pathname, NullOutputStream.NULL_OUTPUT_STREAM));
207 } finally {
208 client.disconnect();
209 }
210 }
211 }