//$Header: /cvsroot-fuse/mec-as2/39/mendelson/comm/as2/cem/CEMInitiator.java,v 1.1 2012/04/18 14:10:17 heller Exp $
package de.mendelson.comm.as2.cem;
import de.mendelson.comm.as2.cem.messages.EDIINTCertificateExchangeRequest;
import de.mendelson.comm.as2.cem.messages.EndEntity;
import de.mendelson.comm.as2.cem.messages.TradingPartnerInfo;
import de.mendelson.comm.as2.cem.messages.TrustRequest;
import de.mendelson.comm.as2.cert.CertificateAccessDB;
import de.mendelson.util.security.cert.CertificateManager;
import de.mendelson.util.security.cert.KeystoreCertificate;
import de.mendelson.comm.as2.message.AS2Message;
import de.mendelson.comm.as2.message.AS2MessageCreation;
import de.mendelson.comm.as2.message.AS2MessageInfo;
import de.mendelson.comm.as2.message.AS2Payload;
import de.mendelson.comm.as2.message.UniqueId;
import de.mendelson.comm.as2.partner.Partner;
import de.mendelson.comm.as2.sendorder.SendOrder;
import de.mendelson.comm.as2.sendorder.SendOrderSender;
import de.mendelson.comm.as2.server.AS2Server;
import de.mendelson.util.AS2Tools;
import de.mendelson.util.security.KeyStoreUtil;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.sql.Connection;
import java.util.Date;
import java.util.logging.Logger;
/*
* Copyright (C) mendelson-e-commerce GmbH Berlin Germany
*
* This software is subject to the license agreement set forth in the license.
* Please read and agree to all terms before using this software.
* Other product and brand names are trademarks of their respective owners.
*/
/**
* Initiates a CEM request
* @author S.Heller
* @version $Revision: 1.1 $
*/
public class CEMInitiator {
/**Logger to log inforamtion to*/
private Logger logger = Logger.getLogger(AS2Server.SERVER_LOGGER_NAME);
/**Connection to the database*/
private Connection configConnection = null;
private Connection runtimeConnection = null;
/**Stores the certificates*/
private CertificateManager certificateManagerEncSign;
/**Partner access*/
private CertificateAccessDB certificateAccess;
/** Creates new message I/O log and connects to localhost
*@param host host to connect to
*/
public CEMInitiator(Connection configConnection, Connection runtimeConnection, CertificateManager certificateManagerEncSign) {
this.configConnection = configConnection;
this.runtimeConnection = runtimeConnection;
this.certificateManagerEncSign = certificateManagerEncSign;
this.certificateAccess = new CertificateAccessDB(this.configConnection, this.runtimeConnection);
}
/**Sends the request to the partner*/
public void sendRequest(Partner initiator, Partner receiver, KeystoreCertificate certificate,
boolean encryptionUsage, boolean signatureUsage, boolean sslUsage, Date respondByDate)
throws Exception {
EDIINTCertificateExchangeRequest request = new EDIINTCertificateExchangeRequest();
String requestId = UniqueId.createId();
String requestContentId = UniqueId.createId();
String certContentId = UniqueId.createId();
request.setRequestId(requestId);
TradingPartnerInfo partnerInfo = new TradingPartnerInfo();
partnerInfo.setSenderAS2Id(initiator.getAS2Identification());
request.setTradingPartnerInfo(partnerInfo);
EndEntity endEntity = new EndEntity();
endEntity.setContentId(certContentId);
endEntity.setIssuerName(certificate.getIssuerDN());
endEntity.setSerialNumber(certificate.getSerialNumberDEC());
TrustRequest trustRequest = new TrustRequest();
trustRequest.setResponseURL(initiator.getMdnURL());
trustRequest.setRespondByDate(respondByDate);
trustRequest.setCertUsageEncryption(encryptionUsage);
trustRequest.setCertUsageSSL(sslUsage);
trustRequest.setCertUsageSignature(signatureUsage);
trustRequest.setEndEntity(endEntity);
request.addTrustRequest(trustRequest);
//export the certificate to a file and create a payload
File certFile = this.exportCertificate(certificate, certContentId);
AS2Payload[] payloads = new AS2Payload[2];
File descriptionFile = this.storeRequest(request);
//build up the XML description as payload
AS2Payload payloadXML = new AS2Payload();
payloadXML.setPayloadFilename(descriptionFile.getAbsolutePath());
payloadXML.loadDataFromPayloadFile();
payloadXML.setContentId(requestContentId);
payloadXML.setContentType("application/ediint-cert-exchange+xml");
payloads[0] = payloadXML;
//build up the certificate as payload
AS2Payload payloadCert = new AS2Payload();
payloadCert.setPayloadFilename(certFile.getAbsolutePath());
payloadCert.loadDataFromPayloadFile();
payloadCert.setContentId(certContentId);
payloadCert.setContentType("application/pkcs7-mime; smime-type=certs-only");
payloads[1] = payloadCert;
//send the message
AS2MessageCreation creation = new AS2MessageCreation(this.certificateManagerEncSign, this.certificateManagerEncSign);
AS2Message message = creation.createMessage(initiator, receiver, payloads, AS2Message.MESSAGETYPE_CEM);
SendOrder order = new SendOrder();
order.setReceiver(receiver);
order.setMessage(message);
order.setSender(initiator);
SendOrderSender orderSender = new SendOrderSender(this.configConnection, this.runtimeConnection);
orderSender.send(order);
//set the certificates as fallback to the partner
if (encryptionUsage) {
this.setCertificateToPartner(initiator, certificate, CEMEntry.CATEGORY_CRYPT, 2);
}
if (signatureUsage) {
this.setCertificateToPartner(initiator, certificate, CEMEntry.CATEGORY_SIGN, 2);
}
//enter the request to the CEM table in the db
CEMAccessDB cemAccess = new CEMAccessDB(this.configConnection, this.runtimeConnection);
cemAccess.insertRequest((AS2MessageInfo) message.getAS2Info(), initiator, receiver, request);
}
/**Sets a certificate to a partner*/
private void setCertificateToPartner(Partner partner, KeystoreCertificate certificate, int category, int prio) {
partner.getPartnerCertificateInformationList().insertNewCertificate(certificate.getFingerPrintSHA1(), category, prio);
this.certificateAccess.storePartnerCertificateInformationList(partner);
//display the changes in the certificates for the user in the log
this.logger.fine(partner.getPartnerCertificateInformationList().getCertificatePurposeDescription(this.certificateManagerEncSign, partner, category));
}
private File exportCertificate(KeystoreCertificate certificate, String certContentId)
throws Exception {
KeyStoreUtil util = new KeyStoreUtil();
String tempDir = System.getProperty("java.io.tmpdir");
File[] exportFile = util.exportX509CertificatePKCS7(this.certificateManagerEncSign.getKeystore(),
certificate.getAlias(), tempDir + certContentId + ".p7c");
return (exportFile[0]);
}
private File storeRequest(EDIINTCertificateExchangeRequest request) throws Exception {
File descriptionFile = AS2Tools.createTempFile("request", ".xml");
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(descriptionFile), "UTF-8");
writer.write(request.toXML());
writer.flush();
writer.close();
return (descriptionFile);
}
}