package de.tudarmstadt.informatik.hostage.protocol; import java.util.ArrayList; import java.util.List; import de.tudarmstadt.informatik.hostage.wrapper.Packet; /** * FTP protocol * @author Wulf Pfeiffer */ public class FTP implements Protocol { /** * Represents the states of the protocol */ private static enum STATE { NONE, OPEN, CLOSED, USER, LOGGED_IN }; /** * Denotes in which state the protocol is right now */ private STATE state = STATE.NONE; @Override public int getPort() { return 21; } @Override public TALK_FIRST whoTalksFirst() { return TALK_FIRST.SERVER; } @Override public List processMessage(Packet packet) { String request = null; if (packet != null) { request = packet.toString(); } List response = new ArrayList(); switch (state) { case NONE: if (request == null) { state = STATE.OPEN; response.add(new Packet(c220)); } else { state = STATE.CLOSED; response.add(new Packet(c421)); } break; case OPEN: if (request.contains("QUIT")) { state = STATE.CLOSED; return null; } else if (request.equals("USER \r\n")) { response.add(new Packet(c501)); } else if (request.contains("USER")) { state = STATE.USER; response.add(new Packet(c331)); } else { response.add(new Packet(c332)); } break; case USER: if (request.equals("PASS \r\n")) { state = STATE.OPEN; response.add(new Packet(c501)); } else if (request.contains("PASS")) { state = STATE.LOGGED_IN; response.add(new Packet(c230)); } else { state = STATE.CLOSED; response.add(new Packet(c221)); } break; case LOGGED_IN: if (request != null && !request.contains("QUIT")) { response.add(new Packet(c500)); } else { state = STATE.CLOSED; response.add(new Packet(c221)); } break; default: state = STATE.CLOSED; response.add(new Packet(c421)); } return response; } //commands private String c220 = "220 Service ready for new user."; private String c221 = "221 Service closing control connection."; private String c230 = "230 User logged in."; private String c331 = "331 User name ok, need password."; private String c332 = "332 Need account for login."; private String c421 = "421 Service not available, closing control connection."; private String c500 = "500 Syntax error, command unrecognized."; private String c501 = "501 Syntax error in parameters or arguments"; @Override public boolean isClosed() { return state == STATE.CLOSED; } @Override public boolean isSecure() { return false; } @Override public Class getType() { return String.class; } @Override public String toString() { return "FTP"; } }