Package com.eviware.soapui.impl.wsdl.support.wss.entries

Source Code of com.eviware.soapui.impl.wsdl.support.wss.entries.AddSignatureEntry$InternalWssContainerListener

/*
*  soapUI, copyright (C) 2004-2011 eviware.com
*
*  soapUI is free software; you can redistribute it and/or modify it under the
*  terms of version 2.1 of the GNU Lesser General Public License as published by
*  the Free Software Foundation.
*
*  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
*  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*  See the GNU Lesser General Public License for more details at gnu.org.
*/

package com.eviware.soapui.impl.wsdl.support.wss.entries;

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javax.swing.JComponent;
import javax.swing.JScrollPane;

import org.apache.ws.security.WSConstants;
import org.apache.ws.security.WSEncryptionPart;
import org.apache.ws.security.message.WSSecHeader;
import org.apache.ws.security.message.WSSecSignature;
import org.apache.xml.security.algorithms.MessageDigestAlgorithm;
import org.apache.xml.security.signature.XMLSignature;
import org.w3c.dom.Document;

import com.eviware.soapui.SoapUI;
import com.eviware.soapui.config.WSSEntryConfig;
import com.eviware.soapui.impl.wsdl.support.wss.OutgoingWss;
import com.eviware.soapui.impl.wsdl.support.wss.WssCrypto;
import com.eviware.soapui.impl.wsdl.support.wss.support.KeystoresComboBoxModel;
import com.eviware.soapui.impl.wsdl.support.wss.support.WSPartsTable;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContext;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionsResult;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.components.SimpleBindingForm;
import com.eviware.soapui.support.types.StringToStringMap;
import com.eviware.soapui.support.xml.XmlObjectConfigurationBuilder;
import com.eviware.soapui.support.xml.XmlObjectConfigurationReader;
import com.eviware.soapui.support.xml.XmlUtils;
import com.jgoodies.binding.PresentationModel;

public class AddSignatureEntry extends WssEntryBase
{
  private static final String DEFAULT_OPTION = "<default>";
  public static final String TYPE = "Signature";
  private String crypto;
  private int keyIdentifierType = 0;
  private String signatureAlgorithm;
  private boolean useSingleCert;
  private String signatureCanonicalization;
  private String digestAlgorithm; /*
                         * ADDED: Combo box for selecting digest
                         * algorithm
                         */
  private List<StringToStringMap> parts = new ArrayList<StringToStringMap>();
  private com.eviware.soapui.impl.wsdl.support.wss.entries.WssEntryBase.KeyAliasComboBoxModel keyAliasComboBoxModel;
  private com.eviware.soapui.impl.wsdl.support.wss.entries.AddSignatureEntry.InternalWssContainerListener wssContainerListener;

  public void init( WSSEntryConfig config, OutgoingWss container )
  {
    super.init( config, container, TYPE );
  }

  @Override
  protected JComponent buildUI()
  {
    SimpleBindingForm form = new SimpleBindingForm( new PresentationModel<AddSignatureEntry>( this ) );
    form.addSpace( 5 );
    wssContainerListener = new InternalWssContainerListener();
    getWssContainer().addWssContainerListener( wssContainerListener );

    form.appendComboBox( "crypto", "Keystore",
        new KeystoresComboBoxModel( getWssContainer(), getWssContainer().getCryptoByName( crypto ) ),
        "Selects the Keystore containing the key to use for signing" ).addItemListener( new ItemListener()
    {

      public void itemStateChanged( ItemEvent e )
      {
        keyAliasComboBoxModel.update( getWssContainer().getCryptoByName( crypto ) );
      }
    } );

    keyAliasComboBoxModel = new KeyAliasComboBoxModel( getWssContainer().getCryptoByName( crypto ) );
    form.appendComboBox( "username", "Alias", keyAliasComboBoxModel, "The alias for the key to use for encryption" );

    // form.appendTextField( "username", "Alias", "The certificate alias" );
    form.appendPasswordField( "password", "Password", "The certificate password" );

    form.appendComboBox( "keyIdentifierType", "Key Identifier Type", new Integer[] { 0, 1, 3, 4 },
        "Sets which key identifier to use" ).setRenderer( new KeyIdentifierTypeRenderer() );
    form.appendComboBox( "signatureAlgorithm", "Signature Algorithm", new String[] { DEFAULT_OPTION, WSConstants.RSA,
        WSConstants.DSA, XMLSignature.ALGO_ID_MAC_HMAC_SHA1, XMLSignature.ALGO_ID_MAC_HMAC_SHA256,
        XMLSignature.ALGO_ID_MAC_HMAC_SHA384, XMLSignature.ALGO_ID_MAC_HMAC_SHA512,
        XMLSignature.ALGO_ID_MAC_HMAC_RIPEMD160, XMLSignature.ALGO_ID_MAC_HMAC_NOT_RECOMMENDED_MD5,
        XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA1, XMLSignature.ALGO_ID_SIGNATURE_NOT_RECOMMENDED_RSA_MD5,
        XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1, XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA256,
        XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA384, XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA512,
        XMLSignature.ALGO_ID_SIGNATURE_RSA_RIPEMD160 }, "Set the name of the signature encryption algorithm to use" );
    form.appendComboBox( "signatureCanonicalization", "Signature Canonicalization", new String[] { DEFAULT_OPTION,
        WSConstants.C14N_OMIT_COMMENTS, WSConstants.C14N_WITH_COMMENTS, WSConstants.C14N_EXCL_OMIT_COMMENTS,
        WSConstants.C14N_EXCL_WITH_COMMENTS }, "Set the canonicalization method to use." );

    /* ADDED: Combo box for selecting digest algorithm */
    form.appendComboBox( "digestAlgorithm", "Digest Algorithm", new String[] { DEFAULT_OPTION,
        MessageDigestAlgorithm.ALGO_ID_DIGEST_NOT_RECOMMENDED_MD5, MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA1,
        MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA256, MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA384,
        MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA512, MessageDigestAlgorithm.ALGO_ID_DIGEST_RIPEMD160 },
        "Set the digest algorithm to use" );

    form.appendCheckBox( "useSingleCert", "Use Single Certificate", "Use single certificate for signing" );

    form.append( "Parts", new WSPartsTable( parts, this ) );

    return new JScrollPane( form.getPanel() );
  }

  public void release()
  {
    if( wssContainerListener != null )
      getWssContainer().removeWssContainerListener( wssContainerListener );
  }

  @Override
  protected void load( XmlObjectConfigurationReader reader )
  {
    crypto = reader.readString( "crypto", null );
    keyIdentifierType = reader.readInt( "keyIdentifierType", 0 );
    signatureAlgorithm = reader.readString( "signatureAlgorithm", null );
    signatureCanonicalization = reader.readString( "signatureCanonicalization", null );
    useSingleCert = reader.readBoolean( "useSingleCert", false );

    /* ADDED: digest algorithm to use */
    digestAlgorithm = reader.readString( "digestAlgorithm", null );

    parts = readParts( reader, "signaturePart" );
  }

  @Override
  protected void save( XmlObjectConfigurationBuilder builder )
  {
    builder.add( "crypto", crypto );
    builder.add( "keyIdentifierType", keyIdentifierType );
    builder.add( "signatureAlgorithm", signatureAlgorithm );
    builder.add( "signatureCanonicalization", signatureCanonicalization );
    builder.add( "useSingleCert", useSingleCert );

    /* ADDED: digest algorithm to use */
    builder.add( "digestAlgorithm", digestAlgorithm );

    saveParts( builder, parts, "signaturePart" );
  }

  public void process( WSSecHeader secHeader, Document doc, PropertyExpansionContext context )
  {
    StringWriter writer = null;

    try
    {
      WssCrypto wssCrypto = getWssContainer().getCryptoByName( crypto );
      if( wssCrypto == null )
      {
        throw new Exception( "Missing crypto [" + crypto + "] for signature entry" );
      }

      WSSecSignature wssSign = new WSSecSignature();
      wssSign.setUserInfo( context.expand( getUsername() ), context.expand( getPassword() ) );

      // default is
      // http://ws.apache.org/wss4j/apidocs/org/apache/ws/security/WSConstants.html#ISSUER_SERIAL
      if( keyIdentifierType != 0 )
        wssSign.setKeyIdentifierType( keyIdentifierType );

      if( StringUtils.hasContent( signatureAlgorithm ) && !signatureAlgorithm.equals( DEFAULT_OPTION ) )
        wssSign.setSignatureAlgorithm( signatureAlgorithm );

      if( StringUtils.hasContent( signatureCanonicalization ) && !signatureCanonicalization.equals( DEFAULT_OPTION ) )
        wssSign.setSigCanonicalization( signatureCanonicalization );

      wssSign.setUseSingleCertificate( useSingleCert );

      /* ADDED: Set the digest algorithm to the selected one */
      wssSign.setDigestAlgo( digestAlgorithm );

      Vector<WSEncryptionPart> wsParts = createWSParts( parts );
      if( !wsParts.isEmpty() )
      {
        wssSign.setParts( wsParts );
      }

      writer = new StringWriter();
      XmlUtils.serialize( doc, writer );

      wssSign.build( doc, wssCrypto.getCrypto(), secHeader );
    }
    catch( Exception e )
    {
      SoapUI.logError( e );

      if( writer != null && writer.getBuffer().length() > 0 )
      {
        try
        {
          doc.replaceChild( doc.importNode( XmlUtils.parseXml( writer.toString() ).getDocumentElement(), true ),
              doc.getDocumentElement() );
        }
        catch( Exception e1 )
        {
          SoapUI.logError( e1 );
        }
      }
    }
  }

  @Override
  protected void addPropertyExpansions( PropertyExpansionsResult result )
  {
    super.addPropertyExpansions( result );
  }

  public String getCrypto()
  {
    return crypto;
  }

  public void setCrypto( String crypto )
  {
    this.crypto = crypto;
    saveConfig();
  }

  public int getKeyIdentifierType()
  {
    return keyIdentifierType;
  }

  public void setKeyIdentifierType( int keyIdentifierType )
  {
    this.keyIdentifierType = keyIdentifierType;
    saveConfig();
  }

  public String getSignatureAlgorithm()
  {
    return StringUtils.isNullOrEmpty( signatureAlgorithm ) ? DEFAULT_OPTION : signatureAlgorithm;
  }

  public void setSignatureAlgorithm( String signatureAlgorithm )
  {
    if( DEFAULT_OPTION.equals( signatureAlgorithm ) )
      signatureAlgorithm = null;

    this.signatureAlgorithm = signatureAlgorithm;
    saveConfig();
  }

  /* ADDED: digest algorithm */
  public String getDigestAlgorithm()
  {
    return StringUtils.isNullOrEmpty( digestAlgorithm ) ? DEFAULT_OPTION : digestAlgorithm;
  }

  public void setDigestAlgorithm( String digestAlgorithm )
  {
    if( DEFAULT_OPTION.equals( digestAlgorithm ) )
      digestAlgorithm = null;

    this.digestAlgorithm = digestAlgorithm;
    saveConfig();
  }

  public String getSignatureCanonicalization()
  {
    return StringUtils.isNullOrEmpty( signatureCanonicalization ) ? DEFAULT_OPTION : signatureCanonicalization;
  }

  public void setSignatureCanonicalization( String signatureCanonicalization )
  {
    if( DEFAULT_OPTION.equals( signatureCanonicalization ) )
      signatureCanonicalization = null;

    this.signatureCanonicalization = signatureCanonicalization;
    saveConfig();
  }

  public boolean isUseSingleCert()
  {
    return useSingleCert;
  }

  public void setUseSingleCert( boolean useSingleCert )
  {
    this.useSingleCert = useSingleCert;
    saveConfig();
  }

  private final class InternalWssContainerListener extends WssContainerListenerAdapter
  {
    @Override
    public void cryptoUpdated( WssCrypto crypto )
    {
      if( crypto.getLabel().equals( getCrypto() ) )
        keyAliasComboBoxModel.update( crypto );
    }
  }
}
TOP

Related Classes of com.eviware.soapui.impl.wsdl.support.wss.entries.AddSignatureEntry$InternalWssContainerListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.