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

Source Code of com.eviware.soapui.impl.wsdl.support.wss.entries.AddEncryptionEntry$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.List;
import java.util.Vector;

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

import org.apache.ws.security.WSConstants;
import org.apache.ws.security.WSEncryptionPart;
import org.apache.ws.security.components.crypto.Crypto;
import org.apache.ws.security.message.WSSecEncrypt;
import org.apache.ws.security.message.WSSecHeader;
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 AddEncryptionEntry extends WssEntryBase
{
  private static final String DEFAULT_OPTION = "<default>";
  public static final String TYPE = "Encryption";
  private String crypto;
  private int keyIdentifierType;
  private String symmetricEncAlgorithm;
  private String encKeyTransport;
  private List<StringToStringMap> parts;
  private String embeddedKeyName;
  private String embeddedKeyPassword;
  private String encryptionCanonicalization;
  private JTextField embeddedKeyNameTextField;
  private JTextField embeddedKeyNamePassword;
  private boolean encryptSymmetricKey;
  private KeyAliasComboBoxModel keyAliasComboBoxModel;
  private 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 );

    KeystoresComboBoxModel keystoresComboBoxModel = new KeystoresComboBoxModel( getWssContainer(), getWssContainer()
        .getCryptoByName( crypto ) );
    form.appendComboBox( "crypto", "Keystore", keystoresComboBoxModel,
        "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.appendPasswordField( "password", "Password",
        "The password for the key to use for encryption (if it is private)" );

    form.appendComboBox( "keyIdentifierType", "Key Identifier Type", new Integer[] { 0, 1, 3, 4, 5, 6, 8 },
        "Sets which key identifier to use" ).setRenderer( new KeyIdentifierTypeRenderer() );

    ( embeddedKeyNameTextField = form.appendTextField( "embeddedKeyName", "Embedded Key Name",
        "The embedded key name" ) ).setEnabled( keyIdentifierType == WSConstants.EMBEDDED_KEYNAME );
    ( embeddedKeyNamePassword = form.appendPasswordField( "embeddedKeyPassword", "Embedded Key Password",
        "The embedded key password" ) ).setEnabled( keyIdentifierType == WSConstants.EMBEDDED_KEYNAME );

    form.appendComboBox( "symmetricEncAlgorithm", "Symmetric Encoding Algorithm", new String[] { DEFAULT_OPTION,
        WSConstants.AES_128, WSConstants.AES_192, WSConstants.AES_256, WSConstants.TRIPLE_DES },
        "Set the name of the symmetric encryption algorithm to use" );

    form.appendComboBox( "encKeyTransport", "Key Encryption Algorithm", new String[] { DEFAULT_OPTION,
        WSConstants.KEYTRANSPORT_RSA15, WSConstants.KEYTRANSPORT_RSAOEP },
        "Sets the algorithm to encode the symmetric key" );

    form.appendComboBox( "encryptionCanonicalization", "Encryption 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 name of an optional canonicalization algorithm to use before encryption" );

    form.appendCheckBox( "encryptSymmetricKey", "Create Encrypted Key",
        "Indicates whether to encrypt the symmetric key into an EncryptedKey or not" );

    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 );
    symmetricEncAlgorithm = reader.readString( "symmetricEncAlgorithm", null );
    encKeyTransport = reader.readString( "encKeyTransport", null );
    embeddedKeyName = reader.readString( "embeddedKeyName", null );
    embeddedKeyPassword = reader.readString( "embeddedKeyPassword", null );
    encryptionCanonicalization = reader.readString( "encryptionCanonicalization", null );
    encryptSymmetricKey = reader.readBoolean( "encryptSymmetricKey", true );
    parts = readParts( reader, "encryptionPart" );
  }

  @Override
  protected void save( XmlObjectConfigurationBuilder builder )
  {
    builder.add( "crypto", crypto );
    builder.add( "keyIdentifierType", keyIdentifierType );
    builder.add( "symmetricEncAlgorithm", symmetricEncAlgorithm );
    builder.add( "encKeyTransport", encKeyTransport );
    builder.add( "embeddedKeyName", embeddedKeyName );
    builder.add( "embeddedKeyPassword", embeddedKeyPassword );
    builder.add( "encryptionCanonicalization", encryptionCanonicalization );
    builder.add( "encryptSymmetricKey", encryptSymmetricKey );
    saveParts( builder, parts, "encryptionPart" );
  }

  public String getEmbeddedKeyName()
  {
    return embeddedKeyName;
  }

  public void setEmbeddedKeyName( String embeddedKeyName )
  {
    this.embeddedKeyName = embeddedKeyName;
    saveConfig();
  }

  public String getEmbeddedKeyPassword()
  {
    return embeddedKeyPassword;
  }

  public void setEmbeddedKeyPassword( String embeddedKeyPassword )
  {
    this.embeddedKeyPassword = embeddedKeyPassword;
    saveConfig();
  }

  public String getEncKeyTransport()
  {
    return StringUtils.isNullOrEmpty( encKeyTransport ) ? DEFAULT_OPTION : encKeyTransport;
  }

  public void setEncKeyTransport( String encKeyTransport )
  {
    if( DEFAULT_OPTION.equals( encKeyTransport ) )
      encKeyTransport = null;

    this.encKeyTransport = encKeyTransport;
    saveConfig();
  }

  public String getEncryptionCanonicalization()
  {
    return StringUtils.isNullOrEmpty( encryptionCanonicalization ) ? DEFAULT_OPTION : encryptionCanonicalization;
  }

  public void setEncryptionCanonicalization( String encryptionCanonicalization )
  {
    if( DEFAULT_OPTION.equals( encryptionCanonicalization ) )
      encryptionCanonicalization = null;

    this.encryptionCanonicalization = encryptionCanonicalization;
    saveConfig();
  }

  public boolean isEncryptSymmetricKey()
  {
    return encryptSymmetricKey;
  }

  public void setEncryptSymmetricKey( boolean encryptSymmetricKey )
  {
    this.encryptSymmetricKey = encryptSymmetricKey;
    saveConfig();
  }

  public int getKeyIdentifierType()
  {
    return keyIdentifierType;
  }

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

    if( embeddedKeyNameTextField != null )
    {
      embeddedKeyNameTextField.setEnabled( keyIdentifierType == WSConstants.EMBEDDED_KEYNAME );
      embeddedKeyNamePassword.setEnabled( keyIdentifierType == WSConstants.EMBEDDED_KEYNAME );
    }
    saveConfig();
  }

  public String getSymmetricEncAlgorithm()
  {
    return StringUtils.isNullOrEmpty( symmetricEncAlgorithm ) ? DEFAULT_OPTION : symmetricEncAlgorithm;
  }

  public void setSymmetricEncAlgorithm( String symmetricEncAlgorithm )
  {
    if( DEFAULT_OPTION.equals( symmetricEncAlgorithm ) )
      symmetricEncAlgorithm = null;

    this.symmetricEncAlgorithm = symmetricEncAlgorithm;
    saveConfig();
  }

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

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

      Crypto crypto = wssCrypto.getCrypto();

      wsEncrypt.setUserInfo( context.expand( getUsername() ) );

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

      if( getKeyIdentifierType() == WSConstants.EMBEDDED_KEYNAME )
      {
        wsEncrypt.setEmbeddedKeyName( getEmbeddedKeyName() );
        wsEncrypt.setKey( crypto.getPrivateKey( getEmbeddedKeyName(), getEmbeddedKeyPassword() ).getEncoded() );
      }

      if( !getSymmetricEncAlgorithm().equals( DEFAULT_OPTION ) )
      {
        wsEncrypt.setSymmetricEncAlgorithm( getSymmetricEncAlgorithm() );
      }

      if( !getEncKeyTransport().equals( DEFAULT_OPTION ) )
      {
        wsEncrypt.setKeyEnc( getEncKeyTransport() );
      }

      if( !getEncryptionCanonicalization().equals( DEFAULT_OPTION ) )
      {
        wsEncrypt.setEncCanonicalization( getEncryptionCanonicalization() );
      }

      wsEncrypt.setEncryptSymmKey( isEncryptSymmetricKey() );

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

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

      wsEncrypt.build( doc, crypto, secHeader );
    }
    catch( Exception e )
    {
      SoapUI.logError( e );

      if( writer != null && writer.getBuffer().length() > 0 )
      {
        try
        {
          // try to restore..
          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();
  }

  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.AddEncryptionEntry$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.