1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.waarp.common.command;
21
22 import org.waarp.common.exception.InvalidArgumentException;
23
24
25
26
27 public enum ReplyCode {
28
29
30
31 REPLY_000_SPECIAL_NOSTATUS(0),
32
33
34
35
36
37
38
39 REPLY_110_RESTART_MARKER_REPLY(110),
40
41
42
43
44 REPLY_120_SERVICE_READY_IN_NNN_MINUTES(120),
45
46
47
48
49 REPLY_125_DATA_CONNECTION_ALREADY_OPEN(125),
50
51
52
53
54 REPLY_150_FILE_STATUS_OKAY(150),
55
56
57
58
59 REPLY_200_COMMAND_OKAY(200),
60
61
62
63
64 REPLY_202_COMMAND_NOT_IMPLEMENTED(202),
65
66
67
68
69 REPLY_211_SYSTEM_STATUS_REPLY(211),
70
71
72
73
74 REPLY_212_DIRECTORY_STATUS(212),
75
76
77
78
79 REPLY_213_FILE_STATUS(213),
80
81
82
83
84
85
86 REPLY_214_HELP_MESSAGE(214,
87 "This FTP server refers to RFC 959, RFC 775, RFC 2389 and RFC 3659"),
88
89
90
91
92
93 REPLY_215_NAME_SYSTEM_TYPE(215),
94
95
96
97
98 REPLY_220_SERVICE_READY(220),
99
100
101
102
103 REPLY_221_CLOSING_CONTROL_CONNECTION(221),
104
105
106
107
108 REPLY_225_DATA_CONNECTION_OPEN_NO_TRANSFER_IN_PROGRESS(225),
109
110
111
112
113
114 REPLY_226_CLOSING_DATA_CONNECTION(226),
115
116
117
118
119 REPLY_227_ENTERING_PASSIVE_MODE(227),
120
121
122
123
124 REPLY_229_ENTERING_PASSIVE_MODE(229),
125
126
127
128
129 REPLY_230_USER_LOGGED_IN(230),
130
131
132
133
134 REPLY_232_USER_LOGGED_IN(232),
135
136
137
138
139 REPLY_234_SECURITY_DATA_EXCHANGE_COMPLETE(234),
140
141
142
143
144 REPLY_250_REQUESTED_FILE_ACTION_OKAY(250),
145
146
147
148
149 REPLY_257_PATHNAME_CREATED(257),
150
151
152
153
154 REPLY_331_USER_NAME_OKAY_NEED_PASSWORD(331),
155
156
157
158
159 REPLY_332_NEED_ACCOUNT_FOR_LOGIN(332),
160
161
162
163
164 REPLY_350_REQUESTED_FILE_ACTION_PENDING_FURTHER_INFORMATION(350),
165
166
167
168
169 REPLY_400_BAD_REQUEST(400),
170
171
172
173
174
175
176
177 REPLY_421_SERVICE_NOT_AVAILABLE_CLOSING_CONTROL_CONNECTION(421),
178
179
180
181
182 REPLY_425_CANT_OPEN_DATA_CONNECTION(425),
183
184
185
186
187 REPLY_426_CONNECTION_CLOSED_TRANSFER_ABORTED(426),
188
189
190
191
192 REPLY_431_NEED_UNAVAILABLE_RESOURCE_TO_PROCESS_SECURITY(431),
193
194
195
196
197 REPLY_450_REQUESTED_FILE_ACTION_NOT_TAKEN(450),
198
199
200
201
202 REPLY_451_REQUESTED_ACTION_ABORTED(451),
203
204
205
206
207 REPLY_452_REQUESTED_ACTION_NOT_TAKEN(452),
208
209
210
211
212
213 REPLY_500_SYNTAX_ERROR_COMMAND_UNRECOGNIZED(500),
214
215
216
217
218 REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS(501),
219
220
221
222
223 REPLY_502_COMMAND_NOT_IMPLEMENTED(502),
224
225
226
227
228 REPLY_503_BAD_SEQUENCE_OF_COMMANDS(503),
229
230
231
232
233 REPLY_504_COMMAND_NOT_IMPLEMENTED_FOR_THAT_PARAMETER(504),
234
235
236
237
238 REPLY_522_EXTENDED_PORT_FAILURE_UNKNOWN_NETWORK_PROTOCOL(522),
239
240
241
242
243 REPLY_530_NOT_LOGGED_IN(530),
244
245
246
247
248 REPLY_532_NEED_ACCOUNT_FOR_STORING_FILES(532),
249
250
251
252
253 REPLY_533_COMMAND_PROTECTION_LEVEL_DENIED_FOR_POLICY_REASONS(533),
254
255
256
257
258 REPLY_534_REQUEST_DENIED_FOR_POLICY_REASONS(534),
259
260
261
262
263 REPLY_535_FAILED_SECURITY_CHECK(535),
264
265
266
267
268 REPLY_536_REQUESTED_PROT_LEVEL_NOT_SUPPORTED(536),
269
270
271
272
273
274
275 REPLY_550_REQUESTED_ACTION_NOT_TAKEN(550),
276
277
278
279
280 REPLY_551_REQUESTED_ACTION_ABORTED_PAGE_TYPE_UNKNOWN(551),
281
282
283
284
285
286
287 REPLY_552_REQUESTED_FILE_ACTION_ABORTED_EXCEEDED_STORAGE(552),
288
289
290
291
292 REPLY_553_REQUESTED_ACTION_NOT_TAKEN_FILE_NAME_NOT_ALLOWED(553);
293
294
295
296
297 private final int code;
298
299
300
301
302 private final String mesg;
303
304
305
306
307 public static final String LF = "\n";
308
309
310
311
312 public static final String CRNUL = "\r\0";
313
314
315
316
317
318
319
320
321
322
323 public static final String CRLF = "\r\n";
324
325
326
327
328
329
330
331 ReplyCode(final int code, final String mesg) {
332 this.code = code;
333 this.mesg = getFinalMsg(code, mesg);
334 }
335
336
337
338
339
340
341
342
343
344
345 public static String getFinalMsg(final int code, final String msg) {
346 final StringBuilder builder = new StringBuilder();
347 builder.append(code);
348 if (msg.indexOf('\n') == -1) {
349 builder.append(' ').append(msg).append(CRLF);
350 } else {
351 final String[] lines = msg.split("\n");
352
353 builder.append('-').append(lines[0]).append(CRLF);
354
355 for (int i = 1; i < lines.length - 1; i++) {
356 final int firstBlank = lines[i].indexOf(' ');
357 if (firstBlank > 0) {
358 final String firstParam = lines[i].substring(0, firstBlank);
359 boolean isInt = false;
360 try {
361 Integer.parseInt(firstParam);
362 isInt = true;
363 } catch (final NumberFormatException e) {
364
365 }
366 if (isInt) {
367 builder.append(" ");
368 }
369 }
370 builder.append(lines[i]).append(CRLF);
371 }
372
373 builder.append(code).append(' ').append(lines[lines.length - 1])
374 .append(CRLF);
375 }
376 return builder.toString();
377 }
378
379
380
381
382
383
384 ReplyCode(final int code) {
385 this.code = code;
386 mesg = name().substring(6).replace('_', ' ') + CRLF;
387 }
388
389
390
391
392 public final int getCode() {
393 return code;
394 }
395
396
397
398
399 public final String getMesg() {
400 return mesg;
401 }
402
403
404
405
406
407
408
409
410 public static ReplyCode getReplyCode(final int code)
411 throws InvalidArgumentException {
412 switch (code) {
413 case 0:
414 return REPLY_000_SPECIAL_NOSTATUS;
415 case 110:
416 return REPLY_110_RESTART_MARKER_REPLY;
417 case 120:
418 return REPLY_120_SERVICE_READY_IN_NNN_MINUTES;
419 case 125:
420 return REPLY_125_DATA_CONNECTION_ALREADY_OPEN;
421 case 150:
422 return REPLY_150_FILE_STATUS_OKAY;
423 case 200:
424 return REPLY_200_COMMAND_OKAY;
425 case 202:
426 return REPLY_202_COMMAND_NOT_IMPLEMENTED;
427 case 211:
428 return REPLY_211_SYSTEM_STATUS_REPLY;
429 case 212:
430 return REPLY_212_DIRECTORY_STATUS;
431 case 213:
432 return REPLY_213_FILE_STATUS;
433 case 214:
434 return REPLY_214_HELP_MESSAGE;
435 case 215:
436 return REPLY_215_NAME_SYSTEM_TYPE;
437 case 220:
438 return REPLY_220_SERVICE_READY;
439 case 221:
440 return REPLY_221_CLOSING_CONTROL_CONNECTION;
441 case 225:
442 return REPLY_225_DATA_CONNECTION_OPEN_NO_TRANSFER_IN_PROGRESS;
443 case 226:
444 return REPLY_226_CLOSING_DATA_CONNECTION;
445 case 227:
446 return REPLY_227_ENTERING_PASSIVE_MODE;
447 case 229:
448 return REPLY_229_ENTERING_PASSIVE_MODE;
449 case 230:
450 return REPLY_230_USER_LOGGED_IN;
451 case 232:
452 return REPLY_232_USER_LOGGED_IN;
453 case 234:
454 return REPLY_234_SECURITY_DATA_EXCHANGE_COMPLETE;
455 case 250:
456 return REPLY_250_REQUESTED_FILE_ACTION_OKAY;
457 case 257:
458 return REPLY_257_PATHNAME_CREATED;
459 case 331:
460 return REPLY_331_USER_NAME_OKAY_NEED_PASSWORD;
461 case 332:
462 return REPLY_332_NEED_ACCOUNT_FOR_LOGIN;
463 case 350:
464 return REPLY_350_REQUESTED_FILE_ACTION_PENDING_FURTHER_INFORMATION;
465 case 400:
466 return REPLY_400_BAD_REQUEST;
467 case 421:
468 return REPLY_421_SERVICE_NOT_AVAILABLE_CLOSING_CONTROL_CONNECTION;
469 case 425:
470 return REPLY_425_CANT_OPEN_DATA_CONNECTION;
471 case 426:
472 return REPLY_426_CONNECTION_CLOSED_TRANSFER_ABORTED;
473 case 431:
474 return REPLY_431_NEED_UNAVAILABLE_RESOURCE_TO_PROCESS_SECURITY;
475 case 450:
476 return REPLY_450_REQUESTED_FILE_ACTION_NOT_TAKEN;
477 case 451:
478 return REPLY_451_REQUESTED_ACTION_ABORTED;
479 case 452:
480 return REPLY_452_REQUESTED_ACTION_NOT_TAKEN;
481 case 500:
482 return REPLY_500_SYNTAX_ERROR_COMMAND_UNRECOGNIZED;
483 case 501:
484 return REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS;
485 case 502:
486 return REPLY_502_COMMAND_NOT_IMPLEMENTED;
487 case 503:
488 return REPLY_503_BAD_SEQUENCE_OF_COMMANDS;
489 case 504:
490 return REPLY_504_COMMAND_NOT_IMPLEMENTED_FOR_THAT_PARAMETER;
491 case 522:
492 return REPLY_522_EXTENDED_PORT_FAILURE_UNKNOWN_NETWORK_PROTOCOL;
493 case 530:
494 return REPLY_530_NOT_LOGGED_IN;
495 case 532:
496 return REPLY_532_NEED_ACCOUNT_FOR_STORING_FILES;
497 case 533:
498 return REPLY_533_COMMAND_PROTECTION_LEVEL_DENIED_FOR_POLICY_REASONS;
499 case 534:
500 return REPLY_534_REQUEST_DENIED_FOR_POLICY_REASONS;
501 case 535:
502 return REPLY_535_FAILED_SECURITY_CHECK;
503 case 536:
504 return REPLY_536_REQUESTED_PROT_LEVEL_NOT_SUPPORTED;
505 case 550:
506 return REPLY_550_REQUESTED_ACTION_NOT_TAKEN;
507 case 551:
508 return REPLY_551_REQUESTED_ACTION_ABORTED_PAGE_TYPE_UNKNOWN;
509 case 552:
510 return REPLY_552_REQUESTED_FILE_ACTION_ABORTED_EXCEEDED_STORAGE;
511 case 553:
512 return REPLY_553_REQUESTED_ACTION_NOT_TAKEN_FILE_NAME_NOT_ALLOWED;
513 default:
514 throw new InvalidArgumentException("Unknown ReplyCode " + code);
515 }
516 }
517
518
519
520
521
522
523
524
525 public static ReplyCode getReplyCodeFromHttp(final int httpCode)
526 throws InvalidArgumentException {
527 if (httpCode < 200) {
528 return REPLY_000_SPECIAL_NOSTATUS;
529 } else if (httpCode < 300) {
530 return REPLY_200_COMMAND_OKAY;
531 } else if (httpCode < 400) {
532 return REPLY_220_SERVICE_READY;
533 } else if (httpCode < 500) {
534 return REPLY_400_BAD_REQUEST;
535 } else {
536 return REPLY_500_SYNTAX_ERROR_COMMAND_UNRECOGNIZED;
537 }
538 }
539 }