Browse Source

-add SIP with minimal functionality

Wulf Pfeiffer 10 years ago
parent
commit
d5725d1f90

+ 1 - 0
res/values/protocols.xml

@@ -8,6 +8,7 @@
         <item>HTTP</item>
         <item>HTTPS</item>
         <item>MySQL</item>
+        <item>SIP</item>
         <item>SMB</item>
         <item>SSH</item>
         <item>TELNET</item>

+ 1 - 1
src/de/tudarmstadt/informatik/hostage/protocol/GHOST.java

@@ -43,7 +43,7 @@ public class GHOST implements Protocol {
 
 	@Override
 	public int getPort() {
-		return 5050; // TODO whats the default!? (1433)
+		return 1433;
 	}
 
 	@Override

+ 94 - 3
src/de/tudarmstadt/informatik/hostage/protocol/SIP.java

@@ -1,10 +1,24 @@
 package de.tudarmstadt.informatik.hostage.protocol;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import de.tudarmstadt.informatik.hostage.wrapper.Packet;
 
 public class SIP implements Protocol {
+	
+	private String request;
+	
+	private static final String VERSION = "SIP/2.0";
+	private static final String INVITE = "INVITE";
+	private static final String ACK= "ACK";
+	private static final String BYE = "BYE";
+	private static final String STATUS_CODE_180 = "180 Ringing";
+	private static final String STATUS_CODE_200 = "200 OK";
+	private static final String STATUS_CODE_505 = "505 Version Not Supported";
+	
+	private String header;
+	private String sdpPayload;
 
 	@Override
 	public int getPort() {
@@ -14,7 +28,7 @@ public class SIP implements Protocol {
 	@Override
 	public boolean isClosed() {
 		// TODO Auto-generated method stub
-		return true;
+		return false;
 	}
 
 	@Override
@@ -23,14 +37,91 @@ public class SIP implements Protocol {
 	}
 
 	@Override
-	public List<Packet> processMessage(Packet packet) {
+	public List<Packet> processMessage(Packet requestPacket) {
 		// TODO Auto-generated method stub
-		return null;
+		String request = null;
+		if (requestPacket != null) {
+			request = requestPacket.toString();
+		}
+		List<Packet> responsePackets = new ArrayList<Packet>();
+		this.request = request;
+		System.out.println(request);
+		String[] lines = request.split("\r\n");
+		extractLines(lines);
+		
+		if(!lines[0].contains(VERSION)) {
+			responsePackets.add(new Packet(STATUS_CODE_505));
+			return responsePackets;
+		} else if(lines[0].contains(INVITE)) {
+			responsePackets.add(getRingResponse());
+			responsePackets.add(getOkResponseWithSDP());
+		} else if(lines[0].contains(BYE)) {
+			responsePackets.add(getOkResponse());
+		}
+		
+		return responsePackets;
 	}
 
 	@Override
 	public TALK_FIRST whoTalksFirst() {
 		return TALK_FIRST.CLIENT;
 	}
+	
+	@Override
+	public String toString() {
+		return "SIP";
+	}
+	
+	private void extractLines(String[] lines) {
+		StringBuffer sbHeader = new StringBuffer();
+		StringBuffer sbSdp = new StringBuffer();
+		boolean recordHeader = false;
+		boolean recordSdp = false;
+		for (String line : lines) {
+			if (line.startsWith("Via:")) {
+				recordHeader = true;
+			} else if (line.startsWith("Max-Forwards:")) {
+				recordHeader = false;
+			} else if(line.startsWith("v=")) {
+				recordSdp = true;
+			}
+			if(recordHeader) {
+				sbHeader.append(line + "\r\n");
+			} else if(recordSdp) {
+				sbSdp.append(line + "\r\n");
+			}
+		}
+		header = sbHeader.toString();
+		sdpPayload = sbSdp.toString();
+	}
+	
+	private Packet getRingResponse() {
+		StringBuffer sb = new StringBuffer();
+		sb.append(VERSION + " " + STATUS_CODE_180 + "\r\n");
+		sb.append(header);
+		sb.append("Content-Length: 0\r\n");
+		return new Packet(sb.toString());
+	}
+	
+	private Packet getOkResponseWithSDP() {
+		StringBuffer sb = new StringBuffer();
+		sb.append(VERSION + " " + STATUS_CODE_200 + "\r\n");
+		sb.append(header);
+		sb.append("Content-Type: application/sdp\r\n");
+		sb.append("Content-Length:   " + sdpPayload.length() + "\r\n");
+		sb.append("\r\n");
+		sb.append(sdpPayload);
+		System.out.println(sb.toString());
+		return new Packet(sb.toString());
+	}
+	
+	private Packet getOkResponse() {
+		StringBuffer sb = new StringBuffer();
+		sb.append(VERSION + " " + STATUS_CODE_200 + "\r\n");
+		sb.append(header);
+		sb.append("Content-Length:   0\r\n");
+		
+		return new Packet(sb.toString());
+	}
 
 }

+ 1 - 1
src/de/tudarmstadt/informatik/hostage/wrapper/Packet.java

@@ -47,7 +47,7 @@ public class Packet {
 	public String toString() {
 		StringBuilder builder = new StringBuilder(payload.length);
 		for (int i = 0; i < payload.length; ++i) {
-			if (payload[i] < 32) {
+			if (payload[i] < 10) {
 				builder.append("{0x").append(payload[i]).append("}");
 			} else {
 				builder.append(Character.toString((char) payload[i]));