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 final 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. @Override
  20. public int getPort() {
  21. return 21;
  22. }
  23. @Override
  24. public TALK_FIRST whoTalksFirst() {
  25. return TALK_FIRST.SERVER;
  26. }
  27. @Override
  28. public List<String> processMessage(String message) {
  29. List<String> response = new ArrayList<String>();
  30. switch (state) {
  31. case NONE:
  32. if (message == null) {
  33. state = STATE.OPEN;
  34. response.add(c220);
  35. } else {
  36. state = STATE.CLOSED;
  37. response.add(c421);
  38. }
  39. break;
  40. case OPEN:
  41. if (message.contains("QUIT")) {
  42. state = STATE.CLOSED;
  43. return null;
  44. } else if (message.equals("USER \r\n")) {
  45. response.add(c501);
  46. } else if (message.contains("USER")) {
  47. state = STATE.USER;
  48. response.add(c331);
  49. } else {
  50. response.add(c332);
  51. }
  52. break;
  53. case USER:
  54. if (message.equals("PASS \r\n")) {
  55. state = STATE.OPEN;
  56. response.add(c501);
  57. } else if (message.contains("PASS")) {
  58. state = STATE.LOGGED_IN;
  59. response.add(c230);
  60. } else {
  61. state = STATE.CLOSED;
  62. response.add(c221);
  63. }
  64. break;
  65. case LOGGED_IN:
  66. if (message != null && !message.contains("QUIT")) {
  67. response.add(c500);
  68. } else {
  69. state = STATE.CLOSED;
  70. response.add(c221);
  71. }
  72. break;
  73. default:
  74. state = STATE.CLOSED;
  75. response.add(c421);
  76. }
  77. return response;
  78. }
  79. private String c220 = "220 Service ready for new user.";
  80. private String c221 = "221 Service closing control connection.";
  81. private String c230 = "230 User logged in.";
  82. private String c331 = "331 User name ok, need password.";
  83. private String c332 = "332 Need account for login.";
  84. private String c421 = "421 Service not available, closing control connection.";
  85. private String c500 = "500 Syntax error, command unrecognized.";
  86. private String c501 = "501 Syntax error in parameters or arguments";
  87. @Override
  88. public boolean isClosed() {
  89. return state == STATE.CLOSED;
  90. }
  91. @Override
  92. public boolean isSecure() {
  93. return false;
  94. }
  95. @Override
  96. public Class<String> getType() {
  97. return String.class;
  98. }
  99. @Override
  100. public String toString() {
  101. return "FTP";
  102. }
  103. }