package de.tudarmstadt.informatik.hostage.protocol; import java.security.KeyStore; import java.util.ArrayList; import java.util.List; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import de.tudarmstadt.informatik.hostage.ui.MainActivity; /** * HTTPS protocol * @author Wulf Pfeiffer */ public class HTTPS implements SSLProtocol { @Override public int getPort() { return 443; } @Override public TALK_FIRST whoTalksFirst() { return TALK_FIRST.CLIENT; } private String lastMessage; @Override public List processMessage(String message) { if(message != null) lastMessage = message; List response = new ArrayList(); request = message + request; if(!message.contains(version)){ response.add(buildPacket(c505, "")); } else if(message.contains(get)) { response.add(buildPacket(c200, get)); } else if(message.contains(head)) { response.add(buildPacket(c200, head)); } else if(message.contains(trace)){ response.add(buildPacket(c200, trace)); } else if(message.contains(options)){ response.add(buildPacket(c400, options)); } else if(message.contains(post)){ response.add(buildPacket(c400, post)); } else if(message.contains(put)){ response.add(buildPacket(c400, put)); } else if(message.contains(delete)){ response.add(buildPacket(c400, delete)); } else if(message.contains(connect)){ response.add(buildPacket(c400, connect)); } else { response.add(buildPacket(c400, "")); } return response; } @Override public boolean isClosed() { return true; } @Override public boolean isSecure() { return true; } @Override public Class getType() { return String.class; } @Override public String toString() { return "HTTPS"; } @Override public SSLContext getSSLContext() { String ksName = "https_cert.bks"; char ksPass[] = "password".toCharArray(); KeyStore ks; KeyManagerFactory kmf = null; try { ks = KeyStore.getInstance(KeyStore.getDefaultType()); ks.load(MainActivity.getContext().getAssets().open(ksName), ksPass); kmf = KeyManagerFactory.getInstance(KeyManagerFactory .getDefaultAlgorithm()); kmf.init(ks, ksPass); } catch (Exception e) { e.printStackTrace(); } SSLContext sslcontext = null; try { sslcontext = SSLContext.getInstance("SSLv3"); sslcontext.init(kmf.getKeyManagers(), null, null); } catch (Exception e) { e.printStackTrace(); } return sslcontext; } /** * Builds a html response that can be sent * @param code response code that was determined * @param type request type that was sent by the client * @return the html response */ private String buildPacket(String code, String type) { String doc = ""; if(type.equals(get)) doc = htmlDoc; else if(type.equals(head)) doc = ""; else if(type.equals(trace)) doc = request; else doc = errorHtmlPrefix + code + errorHtmlSuffix; return version + code + headerPrefix + doc.length() + headerSuffix + doc; } /** Whole request that was sent by the client */ private String request = ""; private String version = "HTTP/1.1"; //request codes private String options = "OPTIONS"; private String get = "GET"; private String head = "HEAD"; private String post = "POST"; private String put = "PUT"; private String delete = "DELETE"; private String trace = "TRACE"; private String connect = "CONNECT"; //response codes private String c200 = " 200 OK\r\n"; private String c400 = " 400 Bad Request\r\n"; private String c505 = " 505 HTTP Version not supported\r\n"; //html header pre and suffix private String headerPrefix = "Date: Mon, 01 Jul 2013 18:27:55 GMT\r\n" + "Server: Apache/2.2.22 (Debian)\r\n" + "Vary: Accept-Encoding\r\n" + "Content-Length: "; private String headerSuffix = "\r\n" + "Keep-Alive: timeout=5, max=100\r\n" + "Connection: Keep-Alive\r\n" + "Content-Type: text/html\r\n" + "\r\n"; //html website private String htmlDoc = "\n" + "\n" + "\n" + "\n" + "Test successful\n" + "\n" + "\n" + "

Test successful

\n" + "

Congratulations.

\n" + "\n" + ""; //html error pre and suffix private String errorHtmlPrefix = "\n" + "\n" + "\n" + "\n" + ""; private String errorHtmlSuffix = "\n" + "\n" + "\n" + "\n" + ""; }