FTP.java 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package de.tudarmstadt.informatik.hostage.protocol;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. /**
  5. * FTP protocol
  6. * @author Wulf Pfeiffer
  7. */
  8. public class FTP implements Protocol<String> {
  9. /**
  10. * Represents the states of the protocol
  11. */
  12. private static enum STATE {
  13. NONE, OPEN, CLOSED, USER, LOGGED_IN
  14. };
  15. /**
  16. * Denotes in which state the protocol is right now
  17. */
  18. private STATE state = STATE.NONE;
  19. public int getPort() {
  20. return 21;
  21. }
  22. public TALK_FIRST whoTalksFirst() {
  23. return TALK_FIRST.SERVER;
  24. }
  25. public List<String> processMessage(String message) {
  26. List<String> response = new ArrayList<String>();
  27. switch (state) {
  28. case NONE:
  29. if (message == null) {
  30. state = STATE.OPEN;
  31. response.add(c220);
  32. } else {
  33. state = STATE.CLOSED;
  34. response.add(c421);
  35. }
  36. break;
  37. case OPEN:
  38. if (message.contains("QUIT")) {
  39. state = STATE.CLOSED;
  40. return null;
  41. } else if (message.equals("USER \r\n")) {
  42. response.add(c501);
  43. } else if (message.contains("USER")) {
  44. state = STATE.USER;
  45. response.add(c331);
  46. } else {
  47. response.add(c332);
  48. }
  49. break;
  50. case USER:
  51. if (message.equals("PASS \r\n")) {
  52. state = STATE.OPEN;
  53. response.add(c501);
  54. } else if (message.contains("PASS")) {
  55. state = STATE.LOGGED_IN;
  56. response.add(c230);
  57. } else {
  58. state = STATE.CLOSED;
  59. response.add(c221);
  60. }
  61. break;
  62. case LOGGED_IN:
  63. if (message != null && !message.contains("QUIT")) {
  64. response.add(c500);
  65. } else {
  66. state = STATE.CLOSED;
  67. response.add(c221);
  68. }
  69. break;
  70. default:
  71. state = STATE.CLOSED;
  72. response.add(c421);
  73. }
  74. return response;
  75. }
  76. //commands
  77. private String c220 = "220 Service ready for new user.";
  78. private String c221 = "221 Service closing control connection.";
  79. private String c230 = "230 User logged in.";
  80. private String c331 = "331 User name ok, need password.";
  81. private String c332 = "332 Need account for login.";
  82. private String c421 = "421 Service not available, closing control connection.";
  83. private String c500 = "500 Syntax error, command unrecognized.";
  84. private String c501 = "501 Syntax error in parameters or arguments";
  85. public boolean isClosed() {
  86. return state == STATE.CLOSED;
  87. }
  88. public boolean isSecure() {
  89. return false;
  90. }
  91. public Class<String> getType() {
  92. return String.class;
  93. }
  94. public String toString() {
  95. return "FTP";
  96. }
  97. }