FTP.java 2.5 KB

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