package de.tudarmstadt.informatik.hostage.format; import de.tudarmstadt.informatik.hostage.commons.HelperUtils; /** * Telnet log view formatter. * * @author Wulf Pfeiffer */ public class TELNETFormatter implements ProtocolFormatter { public String format(String packet) { byte[] bytes = HelperUtils.hexStringToBytes(packet); String options = "Options:\n" + checkForOptions(bytes) + "\n"; String content = "Content: " + HelperUtils.byteToStr(bytes); return options + content; } /** * Checks a packet for option commands and returns their names as Strings. * * @param bytes * that are checked. * @return names of the option commands as String. */ private String checkForOptions(byte[] bytes) { StringBuffer options = new StringBuffer(); for (int i = 0; i < bytes.length; i++) { if (bytes[i] == (byte) 0xff && i + 2 < bytes.length) { switch (bytes[i + 1]) { case (byte) 0xfb: options.append(" WILL "); break; case (byte) 0xfc: options.append(" WON'T "); break; case (byte) 0xfd: options.append(" DO "); break; case (byte) 0xfe: options.append(" DON'T "); break; default: options.append(" unkown command "); break; } // option name switch (bytes[i + 2]) { case 0x00: options.append("Binary Transmission\n"); break; case 0x01: options.append("Echo\n"); break; case 0x02: options.append("Reconnection\n"); break; case 0x03: options.append("Suppress Go Ahead\n"); break; case 0x04: options.append("Approx Message Size Negotiation\n"); break; case 0x05: options.append("Status\n"); break; case 0x06: options.append("Timing Mark\n"); break; case 0x07: options.append("Remote Controlled Trans and Echo\n"); break; case 0x08: options.append("Output Line Width\n"); break; case 0x09: options.append("Output Page Size\n"); break; case 0x0a: options.append("Output Carriage-Return Disposition\n"); break; case 0x0b: options.append("Output Horizontal Tab Stops\n"); break; case 0x0c: options.append("Output Horizontal Tab Disposition\n"); break; case 0x0d: options.append("Output Formfeed Disposition\n"); break; case 0x0e: options.append("Output Vertical Tabstops\n"); break; case 0x0f: options.append("Output Vertical Tab Disposition\n"); break; case 0x10: options.append("Output Linefeed Disposition\n"); break; case 0x11: options.append("Extended ASCII\n"); break; case 0x12: options.append("Logout\n"); break; case 0x13: options.append("Byte Macro\n"); break; case 0x14: options.append("Data Entry Terminal\n"); break; case 0x15: options.append("SUPDUP\n"); break; case 0x16: options.append("SUPDUP Output\n"); break; case 0x17: options.append("Send Location\n"); break; case 0x18: options.append("Terminal Type\n"); break; case 0x19: options.append("End of Record\n"); break; case 0x1a: options.append("TACACS User Identification\n"); break; case 0x1b: options.append("Output Marking\n"); break; case 0x1c: options.append("Terminal Location Number\n"); break; case 0x1d: options.append("Telnet 3270 Regime\n"); break; case 0x1e: options.append("X.3 PAD\n"); break; case 0x1f: options.append("Negotiate About Window Size\n"); break; case 0x20: options.append("Terminal Speed\n"); break; case 0x21: options.append("Remote Flow Control\n"); break; case 0x22: options.append("Linemode\n"); break; case 0x23: options.append("X Display Location\n"); break; case (byte) 0xff: options.append("Extended-Options-List\n"); break; default: options.append("unknown option\n"); break; } } } return options.toString(); } }