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.command.rfc4217;
21
22 import org.waarp.common.command.ReplyCode;
23 import org.waarp.common.command.exception.CommandAbstractException;
24 import org.waarp.common.command.exception.Reply501Exception;
25 import org.waarp.common.command.exception.Reply503Exception;
26 import org.waarp.common.command.exception.Reply504Exception;
27 import org.waarp.ftp.core.command.AbstractCommand;
28 import org.waarp.ftp.core.command.FtpCommandCode;
29
30
31
32
33 public class PROT extends AbstractCommand {
34
35 @Override
36 public final void exec() throws CommandAbstractException {
37 if (!getSession().isSslReady()) {
38
39 throw new Reply503Exception("Session not using SSL / TLS");
40 }
41
42 if (!hasArg()) {
43
44 throw new Reply501Exception("Missing Parameter: P or C");
45 }
46 final String[] types = getArgs();
47 if ("P".equalsIgnoreCase(types[0])) {
48 if (getSession().isDataSsl() &&
49 getSession().getConfiguration().getFtpInternalConfiguration()
50 .isAcceptAuthProt()) {
51
52 throw new Reply503Exception("Data already using SSL / TLS");
53 }
54
55 getSession().setDataSsl(true);
56 getSession().setReplyCode(ReplyCode.REPLY_200_COMMAND_OKAY, null);
57 } else if ("C".equalsIgnoreCase(types[0]) &&
58 !getSession().getConfiguration().getFtpInternalConfiguration()
59 .isAcceptAuthProt()) {
60 if (!getSession().isDataSsl()) {
61
62 throw new Reply503Exception("Data already not using SSL / TLS");
63 }
64 getSession().setDataSsl(false);
65 getSession().setReplyCode(ReplyCode.REPLY_200_COMMAND_OKAY, null);
66 } else if (!getSession().getConfiguration().getFtpInternalConfiguration()
67 .isAcceptAuthProt()) {
68 throw new Reply503Exception(
69 "Data is using SSL / TLS and cannot be removed due to Implicit mode");
70 } else {
71 throw new Reply504Exception("Unknown Parameter: " + types[0]);
72 }
73 if (!getSession().getAuth().isIdentified()) {
74 setExtraNextCommand(FtpCommandCode.AUTH);
75 }
76 }
77
78 }