1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.waarp.ftp.core.control;
21
22 import io.netty.channel.Channel;
23 import org.waarp.common.command.exception.CommandAbstractException;
24 import org.waarp.common.file.Restart;
25 import org.waarp.common.file.filesystembased.FilesystemBasedOptsMLSxImpl;
26 import org.waarp.ftp.core.command.AbstractCommand;
27 import org.waarp.ftp.core.command.FtpCommandCode;
28 import org.waarp.ftp.core.data.FtpTransfer;
29 import org.waarp.ftp.core.file.FtpAuth;
30 import org.waarp.ftp.core.file.FtpDir;
31 import org.waarp.ftp.core.session.FtpSession;
32
33
34
35
36
37 public abstract class BusinessHandler {
38 private static final String FILENAME = " \"filename\"";
39 private static final String[] PROPERTIES_0_LENGTH = new String[0];
40
41
42
43 private NetworkHandler networkHandler;
44
45
46
47
48 private FtpSession session;
49
50
51
52
53 protected BusinessHandler() {
54
55 }
56
57
58
59
60
61
62 public final void setNetworkHandler(final NetworkHandler networkHandler) {
63 this.networkHandler = networkHandler;
64 session = this.networkHandler.getFtpSession();
65 }
66
67
68
69
70 public final NetworkHandler getNetworkHandler() {
71 return networkHandler;
72 }
73
74
75
76
77
78
79 public final FtpSession getFtpSession() {
80 return session;
81 }
82
83
84
85
86
87
88 public abstract FtpAuth getBusinessNewAuth();
89
90
91
92
93
94
95 public abstract FtpDir getBusinessNewDir();
96
97
98
99
100
101
102 public abstract Restart getBusinessNewRestart();
103
104
105
106
107
108
109 public abstract String getHelpMessage(String arg);
110
111
112
113
114 public abstract String getFeatMessage();
115
116 protected final String getSslFeatMessage() {
117 return "AUTH TLS\nAUTH SSL\nCCC\nPROT P\nPROT C";
118 }
119
120
121
122
123
124
125 protected final String getDefaultFeatMessage() {
126 final StringBuilder builder = new StringBuilder();
127 builder.append(FtpCommandCode.MODE.name()).append(" Z\n")
128 .append(FtpCommandCode.MDTM.name()).append('\n')
129 .append(FtpCommandCode.MLSD.name())
130 .append(getFtpSession().getDir().getOptsMLSx().getFeat())
131 .append('\n').append(FtpCommandCode.MLST.name())
132 .append(getFtpSession().getDir().getOptsMLSx().getFeat())
133 .append('\n').append(FtpCommandCode.SIZE.name()).append('\n')
134 .append(FtpCommandCode.XCUP.name()).append('\n')
135 .append(FtpCommandCode.XCWD.name()).append('\n')
136 .append(FtpCommandCode.XMKD.name()).append('\n')
137 .append(FtpCommandCode.XPWD.name()).append('\n')
138 .append(FtpCommandCode.XRMD.name()).append('\n')
139 .append(FtpCommandCode.PASV.name()).append('\n')
140 .append(FtpCommandCode.ALLO.name()).append('\n')
141 .append(FtpCommandCode.EPRT.name()).append('\n')
142 .append(FtpCommandCode.EPSV.name()).append('\n')
143 .append(FtpCommandCode.XCRC.name()).append(' ').append(FILENAME)
144 .append('\n').append(FtpCommandCode.XMD5.name()).append(' ')
145 .append(FILENAME).append('\n').append(FtpCommandCode.XSHA1.name())
146 .append(' ').append(FILENAME).append('\n')
147 .append(FtpCommandCode.XDIGEST.name()).append(' ').append(
148 "Digest_algo_among(CRC32,ADLER32,MD5,MD2,SHA-1,SHA-256,SHA-384,SHA-512)")
149 .append(' ').append(FILENAME).append('\n')
150 .append(FtpCommandCode.SITE.name()).append(' ')
151 .append(FtpCommandCode.XCRC.name())
152
153 .append('\n').append(FtpCommandCode.SITE.name()).append(' ')
154 .append(FtpCommandCode.XMD5.name())
155
156 .append('\n').append(FtpCommandCode.SITE.name()).append(' ')
157 .append(FtpCommandCode.XSHA1.name())
158
159 .append('\n').append(FtpCommandCode.SITE.name()).append(' ')
160 .append(FtpCommandCode.XDIGEST.name()).append(' ').append(
161 "Digest_algo_among(CRC32,ADLER32,MD5,MD2,SHA-1,SHA-256,SHA-384,SHA-512)")
162
163 .append('\n').append("LAN EN*").append('\n')
164 .append(FtpCommandCode.REST.name()).append(" STREAM\n");
165 return builder.toString();
166 }
167
168
169
170
171
172
173
174
175 public abstract String getOptsMessage(String[] args)
176 throws CommandAbstractException;
177
178
179
180
181
182
183
184
185
186
187
188 public abstract AbstractCommand getSpecializedSiteCommand(FtpSession session,
189 String line);
190
191
192
193
194
195
196
197 protected final String getMLSxOptsMessage(final String[] args) {
198 String[] properties = PROPERTIES_0_LENGTH;
199 if (args.length >= 2) {
200 properties = args[1].split(";");
201 }
202
203 final FilesystemBasedOptsMLSxImpl optsMLSx =
204 (FilesystemBasedOptsMLSxImpl) getFtpSession().getDir().getOptsMLSx();
205 optsMLSx.setOptsModify((byte) 0);
206 optsMLSx.setOptsPerm((byte) 0);
207 optsMLSx.setOptsSize((byte) 0);
208 optsMLSx.setOptsType((byte) 0);
209 for (final String propertie : properties) {
210 if ("modify".equalsIgnoreCase(propertie)) {
211 optsMLSx.setOptsModify((byte) 1);
212 } else if ("perm".equalsIgnoreCase(propertie)) {
213 optsMLSx.setOptsPerm((byte) 1);
214 } else if ("size".equalsIgnoreCase(propertie)) {
215 optsMLSx.setOptsSize((byte) 1);
216 } else if ("type".equalsIgnoreCase(propertie)) {
217 optsMLSx.setOptsType((byte) 1);
218 }
219 }
220 return args[0] + ' ' + FtpCommandCode.OPTS.name() + optsMLSx.getFeat();
221 }
222
223
224
225
226
227
228
229
230
231
232 public abstract void executeChannelClosed();
233
234
235
236
237 protected abstract void cleanSession();
238
239
240
241
242 public final void clear() {
243 cleanSession();
244 }
245
246
247
248
249
250
251
252
253 public abstract void executeChannelConnected(Channel channel);
254
255
256
257
258
259
260
261
262 public abstract void exceptionLocalCaught(Throwable e);
263
264
265
266
267
268
269
270
271 public abstract void beforeRunCommand() throws CommandAbstractException;
272
273
274
275
276
277
278
279
280
281
282
283 public abstract void afterRunCommandOk() throws CommandAbstractException;
284
285
286
287
288
289
290
291
292
293
294 public abstract void afterRunCommandKo(CommandAbstractException e);
295
296
297
298
299
300
301
302
303
304
305
306
307 public abstract void afterTransferDoneBeforeAnswer(FtpTransfer transfer)
308 throws CommandAbstractException;
309 }