package com.spec.extender.updater;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import com.spec.extender.util.CryptUtil;
import com.spec.extender.util._debug;
public class EcoUpdater extends BaseUpdater {
private String serviceBaseURL;
private String clientID;
private String hmacKey;
private String signaturePlaceholder;
public EcoUpdater(){};
public EcoUpdater(String _serviceBaseURL, String _clientID, String _hmacKey, String _signaturePlaceholder){
this.serviceBaseURL = _serviceBaseURL;
this.clientID = _clientID;
this.hmacKey = _hmacKey;
this.signaturePlaceholder
= _signaturePlaceholder;
}
public static void main(String args[]){
EcoUpdater eu = (EcoUpdater)new UpdaterFactory().create("https://fourdos304p.dev.ch3.s.com:2043/efpipe/eventsqueue/1/efevents/v1");
String requestHeader = "GET /efpipe/eventsqueue/0/efevents/v1?batchId=234w-23s-234s22&batchSize=0";
//"POST /efpipe/eventsqueue/0/resetBatch";//?sid=1001&ts=2014-07-30T20:42:07Z&sig=oPt7n9Jv0PWU5ucg54tswmJPRl4%3D HTTP/1.1";
String host = "HOST: fourdos304p.dev.ch3.s.com:2080";
String timeStamp = "2014-11-20T18:16:57.688Z";
//"2014-11-20T16:12:47.298Z";
String requestBody = "";//"<abod ?>";
List<String> headers = new ArrayList<String>();
headers.add(requestHeader);
headers.add(host);
// String[] mbq = eu.getRequestMethodBaseUrlQueryString(requestHeader);
// _debug.println(mbq[0] + "\n--" + mbq[1] + "\n--" + mbq[2]);
// _debug.println(eu.generateEcoTimestamp());
String hmacPayload = eu.generateHMACPayload(headers, requestBody, timeStamp);
String hmacDigest = eu.generateHMACdigest(hmacPayload);
_debug.println("payload:\n" + hmacPayload);
_debug.println("eco hamc:\n" + hmacDigest);
}
@Override
public String getHmacKey() {
return this.hmacKey;
}
@Override
public String getSignaturePlaceholder() {
return this.signaturePlaceholder;
}
@Override
public String getServiceBaseURL() {
return this.serviceBaseURL;
}
@Override
public String getClientID() {
return this.clientID;
}
/**
* request body is not changed
*/
@Override
protected String updateBody(List<String> headers, String requestBody){
return requestBody;
}
/**
* @headers Incoming request header looks like the following:
POST /cisp/v1/update?sid=1001&ts=2014-07-30T20:42:07Z&sig=oPt7n9Jv0PWU5ucg54tswmJPRl4%3D HTTP/1.1,
Host: google.com,
Accept-Encoding: identity,
* This method replace the query string
*/
protected List<String> updateHeaders(List<String> headers, String requestBody) {
//---update timestamp header---
String timeStamp = generateEcoTimestamp();
String dateHeader = generateEcoDateHeader(timeStamp);
List<String> udpatedHeaders
= updateAnHeader(headers, "Date:", dateHeader);
// update hmac header
String payload = generateHMACPayload(headers, requestBody, timeStamp);
_debug.println("hmac payload: " + payload);
String hmacDigest = this.generateHMACdigest(payload);
System.out.println("EcoUpdater updating headers...");
udpatedHeaders = updateHMACHeader(udpatedHeaders, hmacDigest, this.signaturePlaceholder);
// _debug.println("updated headers: ");
// _debug.print(Util.listToString(udpatedHeaders));
return udpatedHeaders;
}
private String generateHMACdigest(String payload){
String hmacDigest = null;
try {
hmacDigest = CryptUtil.generateSHA256Hamc(payload, getHmacKey());
} catch (Exception e) {
e.printStackTrace();
}
return hmacDigest;
}
private String generateHMACPayload(List<String> headers, String requestBody, String timeStamp){
String methodUrlProtocolHeader = headers.get(0);
String[] mbq = getRequestMethodUrlProtocol(methodUrlProtocolHeader);
String host = retrieveCaseInsensitiveHeader(headers, "HOST");
String transmission = this.serviceBaseURL.substring(0, this.serviceBaseURL.indexOf(':'));
//TODO only in debug
//transmission = "http";
_debug.println("mbq array: |" + mbq[0] + "|" + mbq[1] + "|" + mbq[2] + "|");
StringBuffer payload = new StringBuffer();
payload.append(mbq[0] + "\n");
payload.append(transmission + "://" + host + mbq[1] + "\n");
payload.append(timeStamp + "\n");
String method = mbq[0];
if (method.equals("POST")){
if (requestBody.length() == 0) payload.append("{}\n");
else payload.append(requestBody.trim() + "\n");
}
return payload.toString();
}
/**
* Sample Date header: Date: Sat, 9 Mar 2013 21:01:27 CST
* @param timeStamp
* @param headers
* @return
*/
public String generateEcoDateHeader(String timeStamp){
StringBuffer sb = new StringBuffer("Date: " + timeStamp);
return sb.toString();
}
/**
*
* @return in the format of "2014-11-13T16:17:47.741Z"
*/
public String generateEcoTimestamp(){
Calendar calendar = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S'Z'");
String timeStamp = dateFormat.format(calendar.getTime());
return timeStamp;
}
}