package org.oep.ssomgt.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.RSAPublicKeySpec;
import javax.portlet.PortletException;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.commons.codec.binary.Base64;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.upload.UploadRequest;
import com.liferay.portal.util.PortalUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;
import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
/**
* Portlet implementation class RSAToolPortlet
*/
public class RSAToolPortlet extends MVCPortlet {
private static int KEY_LENGTH = 512;
private static Log _log = LogFactoryUtil.getLog(RSAToolPortlet.class);
private static String phpPublicKey;
private static String dotNetPublicKey;
private void uploadPHPFile(ResourceRequest resourceRequest,
ResourceResponse resourceResponse) throws IOException {
UploadRequest uploadRequest = PortalUtil.getUploadPortletRequest(resourceRequest);
File objFile = uploadRequest.getFile("PHPFILE");
String objFileName = uploadRequest.getFileName("PHPFILE");
_log.info("objFile: [" + objFile + "], objFileName: [" + objFileName + "]");
InputStream is = new FileInputStream(objFile);
byte[] buff = new byte[is.available()];
is.read(buff);
is.close();
String publicKeyStr = new String(buff);
resourceResponse.setContentType("text/html");
PrintWriter writer = resourceResponse.getWriter();
JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
String[] arrStr = publicKeyStr.split("-----BEGIN PUBLIC KEY-----");
publicKeyStr = arrStr[1];
arrStr = publicKeyStr.split("-----END PUBLIC KEY-----");
jsonObject.put("publicKey", arrStr[0]);
phpPublicKey = arrStr[0];
writer.print(jsonObject.toString());
writer.flush();
writer.close();
}
private void uploadDotNetFile(ResourceRequest resourceRequest,
ResourceResponse resourceResponse) throws IOException {
UploadRequest uploadRequest = PortalUtil.getUploadPortletRequest(resourceRequest);
File objFile = uploadRequest.getFile("DOTNETFILE");
String objFileName = uploadRequest.getFileName("DOTNETFILE");
_log.info("objFile: [" + objFile + "], objFileName: [" + objFileName + "]");
InputStream is = new FileInputStream(objFile);
byte[] buff = new byte[is.available()];
is.read(buff);
is.close();
resourceResponse.setContentType("text/html");
PrintWriter writer = resourceResponse.getWriter();
JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
try {
dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(objFile);
doc.getDocumentElement().normalize();
NodeList nListModulus = doc.getElementsByTagName("Modulus");
Node nModulus = nListModulus.item(0);
NodeList nListExponent = doc.getElementsByTagName("Exponent");
Node nExponent = nListExponent.item(0);
byte[] modulusBytes = com.sun.org.apache.xml.internal.security.utils.Base64.decode(nModulus.getTextContent());
byte[] exponentBytes = com.sun.org.apache.xml.internal.security.utils.Base64.decode(nExponent.getTextContent());
BigInteger modulus = new BigInteger(1, modulusBytes );
BigInteger exponent = new BigInteger(1, exponentBytes);
RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus, exponent);
KeyFactory fact = KeyFactory.getInstance("RSA");
PublicKey pubKey = fact.generatePublic(rsaPubKey);
dotNetPublicKey = Base64.encodeBase64String(pubKey.getEncoded());
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Base64DecodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DOMException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeySpecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
writer.print(jsonObject.toString());
writer.flush();
writer.close();
}
@Override
public void serveResource(ResourceRequest resourceRequest,
ResourceResponse resourceResponse) throws IOException,
PortletException {
String resourceId = resourceRequest.getResourceID();
_log.info(resourceId);
System.out.println("Resource ID: " + resourceId);
if(resourceId != null && resourceId.equals("UPLOADPHP_FILE")){
uploadPHPFile(resourceRequest, resourceResponse);
}
else if (resourceId != null && resourceId.equals("PHPPUBLICKEY")) {
resourceResponse.setContentType("text/html");
PrintWriter writer = resourceResponse.getWriter();
JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
jsonObject.put("publicKey", phpPublicKey);
writer.print(jsonObject.toString());
writer.flush();
writer.close();
}
else if(resourceId != null && resourceId.equals("UPLOADDOTNET_FILE")){
uploadDotNetFile(resourceRequest, resourceResponse);
}
else if (resourceId != null && resourceId.equals("DOTNETPUBLICKEY")) {
resourceResponse.setContentType("text/html");
PrintWriter writer = resourceResponse.getWriter();
JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
jsonObject.put("publicKey", dotNetPublicKey);
writer.print(jsonObject.toString());
writer.flush();
writer.close();
}
else {
resourceResponse.setContentType("text/html");
PrintWriter writer = resourceResponse.getWriter();
JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
try {
final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(KEY_LENGTH);
final KeyPair key = keyGen.generateKeyPair();
jsonObject.put("publicKey", Base64.encodeBase64String(key.getPublic().getEncoded()));
jsonObject.put("privateKey", Base64.encodeBase64String(key.getPrivate().getEncoded()));
} catch (Exception e) {
e.printStackTrace();
}
writer.print(jsonObject.toString());
writer.flush();
writer.close();
}
super.serveResource(resourceRequest, resourceResponse);
}
}