diff options
4 files changed, 971 insertions, 0 deletions
| diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/FilePartMR.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/FilePartMR.java new file mode 100644 index 0000000..5420441 --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/FilePartMR.java @@ -0,0 +1,129 @@ +package at.knowcenter.wag.egov.egiz.sig.connectors.moa;
 +
 +import java.io.ByteArrayOutputStream;
 +import java.io.File;
 +import java.io.FileNotFoundException;
 +import java.io.IOException;
 +import java.io.OutputStream;
 +
 +import org.apache.commons.httpclient.methods.multipart.PartSource;
 +import org.apache.commons.httpclient.util.EncodingUtil;
 +import org.apache.commons.logging.Log;
 +import org.apache.commons.logging.LogFactory;
 +
 +public class FilePartMR extends
 +		org.apache.commons.httpclient.methods.multipart.FilePart {
 +	
 +    /** Log object for this class. */
 +    private static final Log LOG = LogFactory.getLog(FilePartMR.class);
 +    
 +    /** Content dispostion characters */
 +    protected static final String CONTENT_ID = "Content-Id: ";
 +    
 +    /** Content dispostion as a byte array */
 +    protected static final byte[] CONTENT_ID_BYTES = 
 +      EncodingUtil.getAsciiBytes(CONTENT_ID);
 +
 +    private String contentID = ""; 
 +
 +	public FilePartMR(String arg0, PartSource arg1) {
 +		super(arg0, arg1);
 +		// TODO Auto-generated constructor stub
 +	}
 +
 +	public FilePartMR(String arg0, File arg1) throws FileNotFoundException {
 +		super(arg0, arg1);
 +		// TODO Auto-generated constructor stub
 +	}
 +
 +	public FilePartMR(String arg0, String arg1, File arg2)
 +			throws FileNotFoundException {
 +		super(arg0, arg1, arg2);
 +		// TODO Auto-generated constructor stub
 +	}
 +
 +	public FilePartMR(String arg0, PartSource arg1, String arg2, String arg3) {
 +		super(arg0, arg1, arg2, arg3);
 +		// TODO Auto-generated constructor stub
 +	}
 +
 +	public FilePartMR(String arg0, File arg1, String arg2, String arg3)
 +			throws FileNotFoundException {
 +		super(arg0, arg1, arg2, arg3);
 +		// TODO Auto-generated constructor stub
 +	}
 +
 +	public FilePartMR(String arg0, String arg1, File arg2, String arg3,
 +			String arg4) throws FileNotFoundException {
 +		super(arg0, arg1, arg2, arg3, arg4);
 +		// TODO Auto-generated constructor stub
 +	}
 +	
 +	
 +    public void setContentID(String contentid) {
 +   	 this.contentID = contentid;
 +    }
 +    
 +    public String getContentID() {
 +   	 return this.contentID;    	 
 +    }
 +	
 +	/**
 +     * Write the content id header to the specified output stream
 +     * 
 +     * @param out The output stream
 +     * @throws IOException If an IO problem occurs.
 +     */
 +    protected void sendContentIDHeader(OutputStream out) throws IOException {
 +        LOG.trace("enter sendContendID instead of ContentDisposition(OutputStream out)");
 +        out.write(CONTENT_ID_BYTES);
 +        out.write(EncodingUtil.getAsciiBytes(getContentID()));
 +    }
 +	
 +    /**
 +     * Write all the data to the output stream.
 +     * If you override this method make sure to override 
 +     * #length() as well
 +     * 
 +     * @param out The output stream
 +     * @throws IOException If an IO problem occurs.
 +     */
 +    public void send(OutputStream out) throws IOException {
 +        LOG.trace("enter send(OutputStream out)");
 +        sendStart(out);
 +
 +        sendContentIDHeader(out);
 +        sendContentTypeHeader(out);
 +        sendTransferEncodingHeader(out);
 +        sendEndOfHeader(out);
 +        sendData(out);
 +        sendEnd(out);
 +    }
 +
 +
 +    /**
 +     * Return the full length of all the data.
 +     * If you override this method make sure to override 
 +     * #send(OutputStream) as well
 +     * 
 +     * @return long The length.
 +     * @throws IOException If an IO problem occurs
 +     */
 +    public long length() throws IOException {
 +        LOG.trace("enter length()");
 +        if (lengthOfData() < 0) {
 +            return -1;
 +        }
 +        ByteArrayOutputStream overhead = new ByteArrayOutputStream();
 +        sendStart(overhead);
 +
 +        sendContentIDHeader(overhead);
 +        sendContentTypeHeader(overhead);
 +        sendTransferEncodingHeader(overhead);
 +        sendEndOfHeader(overhead);
 +        sendEnd(overhead);
 +        return overhead.size() + lengthOfData();
 +    }
 +
 +
 +}
 diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/MOASoapWithAttachmentConnector.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/MOASoapWithAttachmentConnector.java new file mode 100644 index 0000000..fc37dfc --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/MOASoapWithAttachmentConnector.java @@ -0,0 +1,620 @@ +/**
 + * 
 + */
 +package at.knowcenter.wag.egov.egiz.sig.connectors.moa;
 +
 +import java.security.cert.X509Certificate;
 +import java.util.Properties;
 +
 +import org.apache.commons.logging.Log;
 +import org.apache.commons.logging.LogFactory;
 +
 +import at.gv.egiz.pdfas.exceptions.ErrorCode;
 +import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
 +import at.knowcenter.wag.egov.egiz.exceptions.ConnectorException;
 +import at.knowcenter.wag.egov.egiz.exceptions.SettingsException;
 +import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
 +import at.knowcenter.wag.egov.egiz.sig.SignatureData;
 +import at.knowcenter.wag.egov.egiz.sig.SignatureResponse;
 +import at.knowcenter.wag.egov.egiz.sig.connectors.Connector;
 +import at.knowcenter.wag.egov.egiz.sig.connectors.TemplateReplaces;
 +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.BKUHelper;
 +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.BKUPostConnection;
 +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.DetachedBKUConnector;
 +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.SignSignatureObject;
 +import at.knowcenter.wag.egov.egiz.sig.sigid.DetachedLocRefMOAIdFormatter;
 +import at.knowcenter.wag.egov.egiz.sig.sigkz.SigKZIDHelper;
 +import at.knowcenter.wag.egov.egiz.tools.CodingHelper;
 +import at.knowcenter.wag.egov.egiz.tools.DebugHelper;
 +import at.knowcenter.wag.egov.egiz.tools.FileHelper;
 +
 +/**
 + * Connects to MOA providing the Data detached as LocRef on a local resource.
 + * 
 + * @author wprinz
 + */
 +public class MOASoapWithAttachmentConnector implements Connector
 +{
 +  /**
 +   * The SIG_ID prefix.
 +   */
 +  // public static final String SIG_ID_PREFIX = "etsi-bku-detached@"; //$NON-NLS-1$
 +  /**
 +   * The log.
 +   */
 +  private static Log log = LogFactory.getLog(MOASoapWithAttachmentConnector.class);
 +
 +  protected static final String MULTIPART_LOC_REF_CONTENT = "formdata:fileupload"; //$NON-NLS-1$
 +  
 +  /**
 +   * The environemnt configuration of this connector containing templates and
 +   * other configurable elements.
 +   */
 +  protected Environment environment = null;
 +
 +  /**
 +   * Constructor that builds the configuration environment for this connector
 +   * according to the given profile.
 +   * 
 +   * <p>
 +   * If confuguration parameters are not defined on that profile, the default
 +   * parameters defined in the configuration are used.
 +   * </p>
 +   * 
 +   * @param profile
 +   *          The profile from which the Environment should be assembled.
 +   * @throws SettingsException
 +   *           f.e.
 +   * @throws SignatureException
 +   *           f.e.
 +   */
 +  public MOASoapWithAttachmentConnector(String profile) throws ConnectorException
 +  {
 +	  
 +    this.environment = new Environment(profile, MULTIPART_LOC_REF_CONTENT);
 +  }
 +
 +  protected String prepareSignRequest(SignatureData data) throws ConnectorException
 +  {
 +    log.debug("prepareSignRequestDetached:"); //$NON-NLS-1$
 +
 +    String sign_request_template = this.environment.getSignRequestTemplate();
 +
 +    String sign_key_identifier = this.environment.getSignKeyIdentifier();
 +    String loc_ref_content = this.environment.getSignatureDataUrl();
 +    String mime_type = data.getMimeType();
 +    if (log.isDebugEnabled())
 +    {
 +      log.debug("sign keybox identifier = " + sign_key_identifier); //$NON-NLS-1$
 +      log.debug("LocRefContent = " + loc_ref_content); //$NON-NLS-1$
 +      log.debug("mime type = " + mime_type); //$NON-NLS-1$
 +    }
 +
 +    String sign_request_xml = sign_request_template.replaceFirst(TemplateReplaces.KEY_IDENTIFIER_REPLACE, sign_key_identifier);
 +    sign_request_xml = sign_request_xml.replaceFirst(TemplateReplaces.LOC_REF_CONTENT_REPLACE, loc_ref_content);
 +    sign_request_xml = sign_request_xml.replaceFirst(TemplateReplaces.MIME_TYPE_REPLACE, mime_type);
 +
 +    log.debug("prepareSignRequestDetached finished."); //$NON-NLS-1$
 +    return sign_request_xml;
 +  }
 +
 +  /**
 +   * @see at.knowcenter.wag.egov.egiz.sig.connectors.LocalConnector#analyzeSignResponse(java.util.Properties)
 +   */
 +  public SignSignatureObject analyzeSignResponse(Properties response_properties) throws ConnectorException
 +  {
 +    log.debug("analyzeSignResponse:"); //$NON-NLS-1$
 +
 +    String response_string = response_properties.getProperty(BKUPostConnection.RESPONSE_STRING_KEY);
 +
 +    BKUHelper.checkResponseForError(response_string);
 +
 +    SignSignatureObject so = MOAHelper.parseCreateXMLResponse(response_string, new DetachedLocRefMOAIdFormatter());
 +
 +    log.debug("analyzeSignResponse finished."); //$NON-NLS-1$
 +    return so;
 +  }
 +
 +  /**
 +   * @see at.knowcenter.wag.egov.egiz.sig.connectors.Connector#doSign(at.knowcenter.wag.egov.egiz.sig.SignatureData)
 +   */
 +  public SignSignatureObject doSign(SignatureData data) throws ConnectorException
 +  {
 +    log.debug("doSign:"); //$NON-NLS-1$
 +
 +    String sign_request_xml = prepareSignRequest(data);
 +//    DebugHelper.debugStringToFile(sign_request_xml, "MOA_DetLocRef_sign_request.xml"); //$NON-NLS-1$
 +
 +    String url = this.environment.getSignURL();
 +    Properties response_properties = sendRequest(url, MOASoapConnection.SERVICE_SIGN, sign_request_xml, data);
 +
 +//    DebugHelper.debugStringToFile(response_properties.getProperty(BKUPostConnection.RESPONSE_STRING_KEY), "MOA_DetLocRef_sign_response.xml"); //$NON-NLS-1$
 +    SignSignatureObject sso = analyzeSignResponse(response_properties);
 +
 +    sso.response_properties = response_properties;
 +
 +    log.debug("doSign finished."); //$NON-NLS-1$
 +    return sso;
 +  }
 +
 +  /**
 +   * @see at.knowcenter.wag.egov.egiz.sig.connectors.Connector#doVerify(at.knowcenter.wag.egov.egiz.sig.SignatureData,
 +   *      at.knowcenter.wag.egov.egiz.sig.connectors.bku.SignSignatureObject)
 +   */
 +  public SignatureResponse doVerify(SignatureData data, SignSignatureObject so) throws ConnectorException
 +  {
 +    log.debug("doVerify:"); //$NON-NLS-1$
 +
 +    String verify_request_xml = prepareVerifyRequest(data, so);
 +    log.debug("verify_request_xml = " + verify_request_xml); //$NON-NLS-1$
 +
 +    String url = this.environment.getVerifyURL();
 +    Properties response_properties = sendRequest(url, MOASoapConnection.SERVICE_VERIFY, verify_request_xml, data);
 +
 +    SignatureResponse signature_response = analyzeVerifyResponse(response_properties);
 +
 +    log.debug("doVerify finished."); //$NON-NLS-1$
 +    return signature_response;
 +  }
 +
 +  /**
 +   * Prepares the verify request xml to be sent using the verify request
 +   * template.
 +   * 
 +   * @param data
 +   *          The SignatureData.
 +   * @param so
 +   *          The signature information object.
 +   * @return Returns the verify request xml to be sent.
 +   * @throws ConnectorException
 +   *           f.e.
 +   */
 +  public String prepareVerifyRequest(SignatureData data, SignSignatureObject so) throws ConnectorException
 +  {
 +    String verify_request_template = this.environment.getVerifyRequestTemplate();
 +
 +    String xml_content = null;
 +    if (!SigKZIDHelper.isMOASigned(so))
 +    {
 +      DetachedBKUConnector bku_connector = new DetachedBKUConnector(this.environment.getProfile(), "not needed here");
 +      xml_content = bku_connector.prepareXMLContent(data, so);
 +    }
 +    else
 +    {
 +      xml_content = prepareXMLContent(data, so);
 +    }
 +
 +    String verify_request_xml = verify_request_template.replaceFirst(TemplateReplaces.XML_CONTENT_REPLACE, xml_content);
 +    verify_request_xml = verify_request_xml.replaceFirst(TemplateReplaces.TRUST_PROFILE_ID_REPLACE, this.environment.getVerifyTrustProfileId());
 +    verify_request_xml = verify_request_xml.replaceFirst(TemplateReplaces.LOC_REF_CONTENT_REPLACE, this.environment.getSignatureDataUrl());
 +
 +    log.debug("\r\n\r\n" + verify_request_xml + "\r\n\r\n");
 +
 +    return verify_request_xml;
 +  }
 +
 +  /**
 +   * Analyzes the verify response string.
 +   * 
 +   * @param response_properties
 +   *          The response properties containing the response XML.
 +   * @return Returns the SignatureResponse containing the verification result.
 +   * @throws ConnectorException
 +   *           f.e.
 +   */
 +  public SignatureResponse analyzeVerifyResponse(Properties response_properties) throws ConnectorException
 +  {
 +    log.debug("analyzeVerifyResponse:"); //$NON-NLS-1$
 +
 +    String response_string = response_properties.getProperty(BKUPostConnection.RESPONSE_STRING_KEY);
 +
 +    BKUHelper.checkResponseForError(response_string);
 +
 +    SignatureResponse signature_response = BKUHelper.parseVerifyXMLResponse(response_string);
 +
 +    log.debug("analyzeVerifyResponse finished."); //$NON-NLS-1$
 +    return signature_response;
 +  }
 +
 +  public String prepareXMLContent(SignatureData data, SignSignatureObject so) throws ConnectorException
 +  {
 +    log.debug("prepareXMLContent:"); //$NON-NLS-1$
 +    try
 +    {
 +
 +      String verify_template = this.environment.getVerifyTemplate();
 +
 +      X509Certificate cert = so.getX509Certificate();
 +      String cert_alg = this.environment.getCertAlgEcdsa();
 +      if (cert.getPublicKey().getAlgorithm().indexOf("RSA") >= 0) //$NON-NLS-1$
 +      {
 +        cert_alg = this.environment.getCertAlgRsa();
 +      }
 +
 +      // cert alg replace
 +      String verify_xml = verify_template.replaceFirst(TemplateReplaces.CERT_ALG_REPLACE, cert_alg);
 +
 +      // data digest replace
 +      {
 +//        byte[] data_value = data.getData();
 +//        byte[] data_value_hash = CodingHelper.buildDigest(data_value);
 +        byte[] data_value_hash = CodingHelper.buildDigest(data.getDataSource());
 +        String object_data_hash = CodingHelper.encodeBase64(data_value_hash);
 +
 +        verify_xml = verify_xml.replaceFirst(TemplateReplaces.DIGEST_VALUE_SIGNED_DATA_REPLACE, object_data_hash);
 +      }
 +
 +      verify_xml = verify_xml.replaceFirst(TemplateReplaces.SIGNATURE_VALUE_REPLACE, so.getSignatureValue());
 +
 +      // X.509 Certificate replace
 +      byte[] der = cert.getEncoded();
 +      byte[] cert_hash = CodingHelper.buildDigest(der);
 +      String certDigest = CodingHelper.encodeBase64(cert_hash);
 +      String x509_cert_string = CodingHelper.encodeBase64(der);
 +      verify_xml = verify_xml.replaceFirst(TemplateReplaces.X509_CERTIFICATE_REPLACE, x509_cert_string);
 +
 +      // Qualified Properties replaces
 +      verify_xml = verify_xml.replaceFirst(TemplateReplaces.SIGNING_TIME_REPLACE, so.getDate());
 +      verify_xml = verify_xml.replaceFirst(TemplateReplaces.DIGEST_VALUE_CERTIFICATE_REPLACE, certDigest);
 +      verify_xml = verify_xml.replaceFirst(TemplateReplaces.X509_ISSUER_NAME_REPLACE, so.getIssuer());
 +      verify_xml = verify_xml.replaceFirst(TemplateReplaces.X509_SERIAL_NUMBER_REPLACE, so.getSerialNumber());
 +      // SigDataRefReplace already done above
 +      verify_xml = verify_xml.replaceFirst(TemplateReplaces.MIME_TYPE_REPLACE, data.getMimeType());
 +
 +      // Signed Properties hash
 +      {
 +        final String ETSI_SIGNED_PROPERTIES_START_TAG = "<etsi:SignedProperties"; //$NON-NLS-1$
 +        final String ETSI_SIGNED_PROPERTIES_END_TAG = "</etsi:SignedProperties>"; //$NON-NLS-1$
 +
 +        final int hash_start = verify_xml.indexOf(ETSI_SIGNED_PROPERTIES_START_TAG);
 +        assert hash_start >= 0;
 +        final int hash_end = verify_xml.indexOf(ETSI_SIGNED_PROPERTIES_END_TAG, hash_start) + ETSI_SIGNED_PROPERTIES_END_TAG.length();
 +        assert hash_end - ETSI_SIGNED_PROPERTIES_END_TAG.length() >= 0;
 +        assert hash_end > hash_start;
 +
 +        final String string_to_be_hashed = verify_xml.substring(hash_start, hash_end);
 +        log.debug("etsi:SignedProperties string to be hashed: " + string_to_be_hashed); //$NON-NLS-1$
 +
 +        final byte[] bytes_to_be_hashed = string_to_be_hashed.getBytes("UTF-8"); //$NON-NLS-1$
 +        byte[] sig_prop_code = CodingHelper.buildDigest(bytes_to_be_hashed);
 +        String sig_prop_hash = CodingHelper.encodeBase64(sig_prop_code);
 +
 +        verify_xml = verify_xml.replaceFirst(TemplateReplaces.DIGEST_VALUE_SIGNED_PROPERTIES_REPLACE, sig_prop_hash);
 +      }
 +
 +      log.debug("prepareXMLContent finished."); //$NON-NLS-1$
 +      return verify_xml;
 +    }
 +    catch (Exception e)
 +    {
 +      log.debug(e);
 +      throw new ConnectorException(310, e);
 +    }
 +  }
 +
 +  protected Properties sendRequest(String url, String mode, String request_string, SignatureData data) throws ConnectorException
 +  {
 +    try
 +    {
 +//      Properties response_properties = MOASoapConnection.connectMOA(request_string, MOASoapConnection.SERVICE_SIGN, url);
 +      Properties response_properties = MOASoapConnection.doPostRequestMultipart(url,MOASoapConnection.SERVICE_SIGN, request_string, data );
 +      return response_properties;
 +    }
 +    catch (Exception e)
 +    {
 +      throw new ConnectorException(330, e);
 +    }
 +  }
 +
 +  /**
 +   * Holds environment configuration information like templates.
 +   * 
 +   * @author wprinz
 +   */
 +  public static class Environment
 +  {
 +    /**
 +     * The configuration key of the sign keybox identifier.
 +     */
 +    protected static final String SIGN_KEY_IDENTIFIER_KEY = "moa.sign.KeyIdentifier"; //$NON-NLS-1$
 +
 +    /**
 +     * The configuration key of the sign request template.
 +     */
 +    protected static final String SIGN_REQUEST_TEMPLATE_KEY = "moa.sign.request.detached"; //$NON-NLS-1$
 +
 +    /**
 +     * The configuration key of the sign URL.
 +     */
 +    protected static final String SIGN_URL_KEY = "moa.sign.url"; //$NON-NLS-1$
 +
 +    /**
 +     * MOA template file prefix
 +     */
 +    protected static final String TEMPLATE_FILE_PREFIX = "./templates/moa.";
 +
 +    /**
 +     * signing file template sufix
 +     */
 +    protected static final String SIGN_TEMPLATE_FILE_SUFIX = ".sign.xml";
 +
 +    /**
 +     * verifing template file sufix
 +     */
 +    protected static final String VERIFY_REQUEST_TEMPLATE_FILE_SUFIX = ".verify.request.xml";
 +
 +    /**
 +     * verifing file template key sufix
 +     */
 +    protected static final String VERIFY_TEMPLATE_SUFIX = ".verify.template.xml";
 +
 +    /**
 +     * The configuration key of the verify request template.
 +     */
 +    protected static final String VERIFY_REQUEST_TEMPLATE_KEY = "moa.verify.request.detached"; //$NON-NLS-1$
 +
 +    /**
 +     * The configuration key of the verify template.
 +     */
 +    protected static final String VERIFY_TEMPLATE_KEY = "moa.verify.template.detached"; //$NON-NLS-1$
 +
 +    /**
 +     * The configuration key of the verify URL.
 +     */
 +    protected static final String VERIFY_URL_KEY = "moa.verify.url"; //$NON-NLS-1$
 +
 +    /**
 +     * The configuration key of the trust profile id.
 +     */
 +    protected static final String VERIFY_TRUST_PROFILE_ID = "moa.verify.TrustProfileID"; //$NON-NLS-1$
 +
 +    /**
 +     * The configuration key for the ECDSA cert alg property.
 +     */
 +    protected static final String ECDSA_CERT_ALG_KEY = "cert.alg.ecdsa"; //$NON-NLS-1$
 +
 +    /**
 +     * The configuration key for the RSA cert alg property.
 +     */
 +    protected static final String RSA_CERT_ALG_KEY = "cert.alg.rsa"; //$NON-NLS-1$
 +
 +    protected String profile = null;
 +
 +    protected String signature_data_url = null;
 +
 +    protected String sign_key_identifier = null;
 +
 +    protected String sign_request_template = null;
 +
 +    protected String sign_url = null;
 +
 +    protected String verify_request_template = null;
 +
 +    protected String verify_template = null;
 +
 +    protected String verify_url = null;
 +
 +    protected String verify_trust_profile_id = null;
 +
 +    protected String cert_alg_ecdsa = null;
 +
 +    protected String cert_alg_rsa = null;
 +
 +    /**
 +     * Initializes the environment with a given profile.
 +     * 
 +     * @param profile
 +     *          The configuration profile.
 +     * @throws SettingsException
 +     *           f.e.
 +     * @throws ConnectorException
 +     *           f.e.
 +     */
 +    public Environment(String profile, String signature_data_url) throws ConnectorException
 +    {
 +      this.profile = profile;
 +
 +      this.signature_data_url = signature_data_url;
 +
 +      SettingsReader settings = null;
 +      try
 +      {
 +        settings = SettingsReader.getInstance();
 +      }
 +      catch (SettingsException e)
 +      {
 +        throw new ConnectorException(300, e);
 +      }
 +
 +      this.sign_key_identifier = getConnectorValueFromProfile(settings, profile, SIGN_KEY_IDENTIFIER_KEY);
 +
 +      String sign_request_filename = TEMPLATE_FILE_PREFIX + settings.getValueFromKey("default.moa.algorithm.id") + SIGN_TEMPLATE_FILE_SUFIX;
 +
 +      // try to load template from file
 +      this.sign_request_template = FileHelper.readFromFile(SettingsReader.relocateFile(sign_request_filename));
 +
 +      if (this.sign_request_template == null)
 +      {
 +        sign_request_filename = getConnectorValueFromProfile(settings, profile, SIGN_REQUEST_TEMPLATE_KEY);
 +        this.sign_request_template = FileHelper.readFromFile(SettingsReader.relocateFile(sign_request_filename));
 +      }
 +
 +      //this.sign_request_template = FileHelper.readFromFile(SettingsReader.relocateFile(sign_request_filename));
 +      if (this.sign_request_template == null)
 +      {
 +        throw new ConnectorException(ErrorCode.SETTING_NOT_FOUND, "Can not read the create xml request template"); //$NON-NLS-1$
 +      }
 +
 +      this.sign_url = getConnectorValueFromProfile(settings, profile, SIGN_URL_KEY);
 +
 +      String verify_request_filename = TEMPLATE_FILE_PREFIX + settings.getValueFromKey("default.moa.algorithm.id") + VERIFY_REQUEST_TEMPLATE_FILE_SUFIX;
 +
 +      // try to load template file for verifing
 +      this.verify_request_template = FileHelper.readFromFile(SettingsReader.relocateFile(verify_request_filename));
 +
 +      if (this.verify_request_template == null)
 +      {
 +        verify_request_filename = getConnectorValueFromProfile(settings, profile, VERIFY_REQUEST_TEMPLATE_KEY);
 +        this.verify_request_template = FileHelper.readFromFile(SettingsReader.relocateFile(verify_request_filename));
 +      }
 +
 +      if (this.verify_request_template == null)
 +      {
 +        throw new ConnectorException(ErrorCode.SETTING_NOT_FOUND, "Can not read the verify xml request template"); //$NON-NLS-1$
 +      }
 +
 +      // load template key file
 +      String verify_filename = TEMPLATE_FILE_PREFIX + settings.getValueFromKey("default.moa.algorithm.id") + VERIFY_TEMPLATE_SUFIX;
 +      this.verify_template = FileHelper.readFromFile(SettingsReader.relocateFile(verify_filename));
 +
 +      if (this.verify_template == null)
 +      {
 +        verify_filename = getConnectorValueFromProfile(settings, profile, VERIFY_TEMPLATE_KEY);
 +        this.verify_template = FileHelper.readFromFile(SettingsReader.relocateFile(verify_filename));
 +      }
 +
 +      if (this.verify_template == null)
 +      {
 +        throw new ConnectorException(ErrorCode.SETTING_NOT_FOUND, "Can not read the verify template"); //$NON-NLS-1$
 +      }
 +
 +      this.verify_url = getConnectorValueFromProfile(settings, profile, VERIFY_URL_KEY);
 +
 +      this.verify_trust_profile_id = settings.getValueFromKey(VERIFY_TRUST_PROFILE_ID);
 +
 +      this.cert_alg_ecdsa = settings.getValueFromKey(ECDSA_CERT_ALG_KEY);
 +
 +      this.cert_alg_rsa = settings.getValueFromKey(RSA_CERT_ALG_KEY);
 +
 +    }
 +
 +    public String getProfile()
 +    {
 +      return this.profile;
 +    }
 +
 +    /**
 +     * Returns the URL where to load the detached data from.
 +     * 
 +     * @return Returns the URL where to load the detached data from.
 +     */
 +    public String getSignatureDataUrl()
 +    {
 +      return this.signature_data_url;
 +    }
 +
 +    /**
 +     * Returns the sign key identifier.
 +     * 
 +     * @return Returns the sign key identifier.
 +     */
 +    public String getSignKeyIdentifier()
 +    {
 +      return this.sign_key_identifier;
 +    }
 +
 +    /**
 +     * Returns the sign request template.
 +     * 
 +     * @return Returns the sign request template.
 +     */
 +    public String getSignRequestTemplate()
 +    {
 +      return this.sign_request_template;
 +    }
 +
 +    /**
 +     * Returns the sign URL.
 +     * 
 +     * @return Returns the sign URL.
 +     */
 +    public String getSignURL()
 +    {
 +      return this.sign_url;
 +    }
 +
 +    /**
 +     * Returns the verify request template.
 +     * 
 +     * @return Returns the verify request template.
 +     */
 +    public String getVerifyRequestTemplate()
 +    {
 +      return this.verify_request_template;
 +    }
 +
 +    /**
 +     * Returns the verify template.
 +     * 
 +     * @return Returns the verify template.
 +     */
 +    public String getVerifyTemplate()
 +    {
 +      return this.verify_template;
 +    }
 +
 +    /**
 +     * Returns the verify URL.
 +     * 
 +     * @return Returns the verify URL.
 +     */
 +    public String getVerifyURL()
 +    {
 +      return this.verify_url;
 +    }
 +
 +    /**
 +     * Returns the verify trust profile id.
 +     * 
 +     * @return Returns the verify trust profile id.
 +     */
 +    public String getVerifyTrustProfileId()
 +    {
 +      return this.verify_trust_profile_id;
 +    }
 +
 +    /**
 +     * Returns the ecdsa cert alg property.
 +     * 
 +     * @return Returns the ecdsa cert alg property.
 +     */
 +    public String getCertAlgEcdsa()
 +    {
 +      return this.cert_alg_ecdsa;
 +    }
 +
 +    /**
 +     * Returns the rsa cert alg property.
 +     * 
 +     * @return Returns the rsa cert alg property.
 +     */
 +    public String getCertAlgRsa()
 +    {
 +      return this.cert_alg_rsa;
 +    }
 +
 +    /**
 +     * Reads the configuration entry given by the key, first from the given
 +     * profile, if not found from the defaults.
 +     * 
 +     * @param settings
 +     *          The settings.
 +     * @param profile
 +     *          The profile.
 +     * @param key
 +     *          The configuration key.
 +     * @return Returns the configuration entry.
 +     */
 +    public static String getConnectorValueFromProfile(SettingsReader settings, String profile, String key)
 +    {
 +      String value = settings.getValueFromKey("sig_obj." + profile + "." + key); //$NON-NLS-1$//$NON-NLS-2$
 +      if (value == null)
 +      {
 +        value = settings.getValueFromKey(key);
 +      }
 +      return value;
 +    }
 +
 +  }
 +
 +}
 diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/MultipartRelatedEntity.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/MultipartRelatedEntity.java new file mode 100644 index 0000000..82fdfbc --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/MultipartRelatedEntity.java @@ -0,0 +1,56 @@ +package at.knowcenter.wag.egov.egiz.sig.connectors.moa;
 +
 +import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
 +import org.apache.commons.httpclient.methods.multipart.Part;
 +import org.apache.commons.httpclient.params.HttpMethodParams;
 +import org.apache.commons.httpclient.util.EncodingUtil;
 +
 +public class MultipartRelatedEntity extends MultipartRequestEntity {
 +	
 +	/** The Content-Type for multipart/related. */
 +    private static final String MULTIPART_RELATED_CONTENT_TYPE = "multipart/related";
 +
 +
 +    private String startID;
 +    
 +    private String contentType;
 +    
 +	public MultipartRelatedEntity(Part[] parts, HttpMethodParams params) {
 +		super(parts, params);
 +		// TODO Auto-generated constructor stub
 +	}
 +	
 +	
 +    public void setContentType(String contentType) {
 +		this.contentType = contentType;
 +	}
 +
 +
 +	public String getStartID() {
 +		return startID;
 +	}
 +
 +
 +	public void setStartID(String startID) {
 +		this.startID = startID;
 +	}
 +
 +
 +	/* (non-Javadoc)
 +     * @see org.apache.commons.httpclient.methods.RequestEntity#getContentType()
 +     */
 +    public String getContentType() {
 +        StringBuffer buffer = new StringBuffer(MULTIPART_RELATED_CONTENT_TYPE);
 +        buffer.append("; type=\"");
 +        buffer.append(EncodingUtil.getAsciiString(this.contentType.getBytes()));
 +        buffer.append("\"; start=\"");
 +        buffer.append(EncodingUtil.getAsciiString(getStartID().getBytes()));
 +        buffer.append("\"; boundary=\"");
 +        buffer.append(EncodingUtil.getAsciiString(getMultipartBoundary()));
 +        buffer.append("\"");
 +        return buffer.toString();
 +    }
 +
 +	
 +	
 +}
 diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/StringPartMR.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/StringPartMR.java new file mode 100644 index 0000000..45a0e33 --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/StringPartMR.java @@ -0,0 +1,166 @@ +package at.knowcenter.wag.egov.egiz.sig.connectors.moa;
 +
 +import java.io.ByteArrayOutputStream;
 +import java.io.IOException;
 +import java.io.OutputStream;
 +
 +import org.apache.commons.httpclient.methods.multipart.StringPart;
 +import org.apache.commons.httpclient.util.EncodingUtil;
 +import org.apache.commons.logging.Log;
 +import org.apache.commons.logging.LogFactory;
 +
 +public class StringPartMR extends StringPart {
 +	
 +    /** Log object for this class. */
 +    private static final Log LOG = LogFactory.getLog(StringPartMR.class);
 +
 +       
 +    /** Content dispostion characters */
 +    protected static final String CONTENT_ID = "Content-Id: ";
 +    
 +    /** Content dispostion as a byte array */
 +    protected static final byte[] CONTENT_ID_BYTES = 
 +      EncodingUtil.getAsciiBytes(CONTENT_ID);
 +
 +    private String contentID = ""; 
 +
 +	public StringPartMR(String name, String value, String charset) {
 +		super(name, value, charset);
 +		// TODO Auto-generated constructor stub
 +	}
 +
 +	public StringPartMR(String name, String value) {
 +		super(name, value);
 +		// TODO Auto-generated constructor stub
 +	}
 +	
 +	/**
 +     * Write the content disposition header to the specified output stream
 +     * 
 +     * @param out The output stream
 +     * @throws IOException If an IO problem occurs.
 +     */
 +    protected void sendDispositionHeader(OutputStream out) throws IOException {
 +        LOG.trace("enter sendContendID instead of ContentDisposition(OutputStream out)");
 +        //  	Do nothing !
 +    }
 +    
 +	/**
 +     * Write the content id header to the specified output stream
 +     * 
 +     * @param out The output stream
 +     * @throws IOException If an IO problem occurs.
 +     */
 +    protected void sendContentIDHeader(OutputStream out) throws IOException {
 +        LOG.trace("enter sendContendID instead of ContentDisposition(OutputStream out)");
 +        out.write(CONTENT_ID_BYTES);
 +        out.write(EncodingUtil.getAsciiBytes(getContentID()));
 +    }
 +    
 +    
 +    /**
 +     * Write the content type header to the specified output stream
 +     * @param out The output stream
 +     * @throws IOException If an IO problem occurs.
 +     */
 +     protected void sendContentTypeHeader(OutputStream out) throws IOException {
 +        LOG.trace("enter sendContentTypeHeader(OutputStream out)");
 +        String contentType = getContentType();
 +        if (contentType != null) {
 +            out.write(CRLF_BYTES);
 +            out.write(CONTENT_TYPE_BYTES);
 +            out.write(EncodingUtil.getAsciiBytes(contentType));
 +            String charSet = getCharSet();
 +            if (charSet != null) {
 +                out.write(CHARSET_BYTES);
 +                out.write(EncodingUtil.getAsciiBytes(charSet));
 +            }
 +        }
 +    }
 +
 +    /**
 +     * Write the content transfer encoding header to the specified 
 +     * output stream
 +     * 
 +     * @param out The output stream
 +     * @throws IOException If an IO problem occurs.
 +     */
 +     protected void sendTransferEncodingHeader(OutputStream out) throws IOException {
 +        LOG.trace("enter sendTransferEncodingHeader(OutputStream out)");
 +        String transferEncoding = getTransferEncoding();
 +        if (transferEncoding != null) {
 +            out.write(CRLF_BYTES);
 +            out.write(CONTENT_TRANSFER_ENCODING_BYTES);
 +            out.write(EncodingUtil.getAsciiBytes(transferEncoding));
 +        }
 +    }
 +
 +     public void setContentID(String contentid) {
 +    	 this.contentID = contentid;
 +     }
 +     
 +     public String getContentID() {
 +    	 return this.contentID;    	 
 +     }
 +     
 +    /**
 +     * Write the end of the header to the output stream
 +     * @param out The output stream
 +     * @throws IOException If an IO problem occurs.
 +     */
 +    protected void sendEndOfHeader(OutputStream out) throws IOException {
 +        LOG.trace("enter sendEndOfHeader(OutputStream out)");
 +        out.write(CRLF_BYTES);
 +        out.write(CRLF_BYTES);
 +    }
 +
 +	
 +    /**
 +     * Write all the data to the output stream.
 +     * If you override this method make sure to override 
 +     * #length() as well
 +     * 
 +     * @param out The output stream
 +     * @throws IOException If an IO problem occurs.
 +     */
 +    public void send(OutputStream out) throws IOException {
 +        LOG.trace("enter send(OutputStream out)");
 +        sendStart(out);
 +
 +        sendContentIDHeader(out);
 +        sendContentTypeHeader(out);
 +        sendTransferEncodingHeader(out);
 +        sendEndOfHeader(out);
 +        sendData(out);
 +        sendEnd(out);
 +    }
 +
 +
 +    /**
 +     * Return the full length of all the data.
 +     * If you override this method make sure to override 
 +     * #send(OutputStream) as well
 +     * 
 +     * @return long The length.
 +     * @throws IOException If an IO problem occurs
 +     */
 +    public long length() throws IOException {
 +        LOG.trace("enter length()");
 +        if (lengthOfData() < 0) {
 +            return -1;
 +        }
 +        ByteArrayOutputStream overhead = new ByteArrayOutputStream();
 +        sendStart(overhead);
 +
 +        sendContentIDHeader(overhead);
 +        sendContentTypeHeader(overhead);
 +        sendTransferEncodingHeader(overhead);
 +        sendEndOfHeader(overhead);
 +        sendEnd(overhead);
 +        return overhead.size() + lengthOfData();
 +    }
 +
 +
 +	
 +	
 +}
 | 
