|
@@ -46,11 +46,14 @@ public final class TELNET implements Protocol<ByteArray> {
|
|
|
|
|
|
@Override
|
|
|
public List<ByteArray> processMessage(ByteArray message) {
|
|
|
- if(message != null)
|
|
|
- lastMessage = message.get();
|
|
|
byte[] request = null;
|
|
|
- if(message != null) request = message.get();
|
|
|
+ if(message != null) {
|
|
|
+ lastMessage = message.get();
|
|
|
+ request = message.get();
|
|
|
+ System.out.println(HelperUtils.byteToStr(lastMessage));
|
|
|
+ }
|
|
|
List<ByteArray> response = new ArrayList<ByteArray>();
|
|
|
+
|
|
|
switch (state) {
|
|
|
case NONE:
|
|
|
response.add(new ByteArray(optionRequest));
|
|
@@ -66,18 +69,25 @@ public final class TELNET implements Protocol<ByteArray> {
|
|
|
break;
|
|
|
case LOGIN:
|
|
|
if(request == null) break;
|
|
|
- else if(request[0] == 0x0d) {
|
|
|
+ else if(checkForByte(request, (byte) 0x0d)) {
|
|
|
+ if(request.length > 2) {
|
|
|
+ byte[] buffer = new byte[request.length - 2];
|
|
|
+ System.arraycopy(request, 0, buffer, 0, request.length - 2);
|
|
|
+ user = HelperUtils.concat(user, buffer);
|
|
|
+ response.add(new ByteArray(buffer));
|
|
|
+ }
|
|
|
response.add(new ByteArray("\r\n"));
|
|
|
response.add(new ByteArray("Password: "));
|
|
|
state = STATE.AUTHENTICATE;
|
|
|
sessionToken = HelperUtils.concat(sessionPrefix, user, "@".getBytes(), server.getBytes(), sessionMiddle, user, "@".getBytes(), server.getBytes(), sessionSuffix);
|
|
|
break;
|
|
|
- } else if (request[0] == 0x7f) {
|
|
|
+ } else if (checkForByte(request, (byte) 0x7f) && user != null && user.length != 0) {
|
|
|
byte[] tmp = new byte[user.length - 1];
|
|
|
System.arraycopy(user, 0, tmp, 0, user.length - 1);
|
|
|
user = tmp;
|
|
|
response.add(new ByteArray("\b \b"));
|
|
|
- } else if (request[0] != (byte) 0xff){
|
|
|
+ break;
|
|
|
+ } else if (!checkForByte(request, (byte) 0xff)){
|
|
|
if(user == null)
|
|
|
user = request;
|
|
|
else
|
|
@@ -87,17 +97,23 @@ public final class TELNET implements Protocol<ByteArray> {
|
|
|
break;
|
|
|
case AUTHENTICATE:
|
|
|
if(request == null) break;
|
|
|
- else if(request[0] == 0x0d) {
|
|
|
- response.add(new ByteArray("\r\nLast Login: \r\nLinux" + server + " 3.6.11+\r\n"));
|
|
|
+ else if(checkForByte(request, (byte) 0x0d)) {
|
|
|
+ response.add(new ByteArray("\r\nLinux" + server + " 3.6.11+\r\n"));
|
|
|
response.add(new ByteArray(sessionToken));
|
|
|
state = STATE.LOGGED_IN;
|
|
|
- } else if (request[0] == 0x7f) {
|
|
|
+ } else if (checkForByte(request, (byte) 0x7f)) {
|
|
|
response.add(new ByteArray("\b \b"));
|
|
|
}
|
|
|
break;
|
|
|
case LOGGED_IN:
|
|
|
if(request == null) break;
|
|
|
- else if(request[0] == 0x0d) {
|
|
|
+ else if(checkForByte(request, (byte) 0x0d)) {
|
|
|
+ if(request.length > 2) {
|
|
|
+ byte[] buffer = new byte[request.length - 2];
|
|
|
+ System.arraycopy(request, 0, buffer, 0, request.length - 2);
|
|
|
+ command = HelperUtils.concat(command, buffer);
|
|
|
+ response.add(new ByteArray(buffer));
|
|
|
+ }
|
|
|
if(command == null) {
|
|
|
response.add(new ByteArray("\r\n"));
|
|
|
response.add(new ByteArray(sessionToken));
|
|
@@ -111,12 +127,13 @@ public final class TELNET implements Protocol<ByteArray> {
|
|
|
response.add(new ByteArray(sessionToken));
|
|
|
command = null;
|
|
|
}
|
|
|
- } else if (request[0] == 0x7f) {
|
|
|
+ } else if (checkForByte(request, (byte) 0x7f) && command != null && command.length != 0) {
|
|
|
byte[] tmp = new byte[command.length - 1];
|
|
|
System.arraycopy(command, 0, tmp, 0, command.length - 1);
|
|
|
command = tmp;
|
|
|
response.add(new ByteArray("\b \b"));
|
|
|
- } else if (request[0] != (byte) 0xff){
|
|
|
+ break;
|
|
|
+ } else if (!checkForByte(request, (byte) 0xff)){
|
|
|
if(command == null)
|
|
|
command = request;
|
|
|
else
|
|
@@ -150,6 +167,13 @@ public final class TELNET implements Protocol<ByteArray> {
|
|
|
public Class<ByteArray> getType() {
|
|
|
return ByteArray.class;
|
|
|
}
|
|
|
+
|
|
|
+ private boolean checkForByte(byte[] bytes, byte b) {
|
|
|
+ for(byte oneByte : bytes) {
|
|
|
+ if(oneByte == b) return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* Determines which options that are requested by the client will be done and which not
|