package de.tudarmstadt.informatik.hostage.protocol; import java.util.ArrayList; import java.util.List; /** * FTP protocol * @author Wulf Pfeiffer */ public final 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; private String lastMessage; @Override public int getPort() { return 21; } @Override public TALK_FIRST whoTalksFirst() { return TALK_FIRST.SERVER; } @Override public List processMessage(String message) { if(message != null) lastMessage = message; List response = new ArrayList(); switch (state) { case NONE: if (message == null) { state = STATE.OPEN; response.add(c220); } else { state = STATE.CLOSED; response.add(c421); } break; case OPEN: if (message.contains("QUIT")) { state = STATE.CLOSED; return null; } else if (message.equals("USER \r\n")) { response.add(c501); } else if (message.contains("USER")) { state = STATE.USER; response.add(c331); } else { response.add(c332); } break; case USER: if (message.equals("PASS \r\n")) { state = STATE.OPEN; response.add(c501); } else if (message.contains("PASS")) { state = STATE.LOGGED_IN; response.add(c230); } else { state = STATE.CLOSED; response.add(c221); } break; case LOGGED_IN: if (message != null && !message.contains("QUIT")) { response.add(c500); } else { state = STATE.CLOSED; response.add(c221); } break; default: state = STATE.CLOSED; response.add(c421); } return response; } 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"; } }