FTP.java 2.7 KB

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