/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.impl.wsdl.support.wss.entries; import com.eviware.soapui.config.WSSEntryConfig; import com.eviware.soapui.impl.wsdl.support.wss.OutgoingWss; import com.eviware.soapui.impl.wsdl.support.wss.WssContainer; import com.eviware.soapui.impl.wsdl.support.wss.WssCrypto; import com.eviware.soapui.impl.wsdl.support.wss.WssEntry; import com.eviware.soapui.impl.wsdl.support.wss.crypto.CryptoType; import com.eviware.soapui.model.propertyexpansion.PropertyExpansion; import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContainer; import com.eviware.soapui.model.propertyexpansion.PropertyExpansionsResult; import com.eviware.soapui.support.StringUtils; import com.eviware.soapui.support.types.StringList; import com.eviware.soapui.support.types.StringToStringMap; import com.eviware.soapui.support.xml.XmlObjectConfigurationBuilder; import com.eviware.soapui.support.xml.XmlObjectConfigurationReader; import org.apache.ws.security.WSConstants; import org.apache.ws.security.WSEncryptionPart; import org.apache.ws.security.WSSecurityException; import org.apache.ws.security.components.crypto.Merlin; import javax.swing.AbstractListModel; import javax.swing.ComboBoxModel; import javax.swing.DefaultListCellRenderer; import javax.swing.JComponent; import javax.swing.JList; import java.awt.Component; import java.beans.PropertyChangeListener; import java.security.KeyStore; import java.security.KeyStoreException; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Vector; public abstract class WssEntryBase implements WssEntry, PropertyExpansionContainer { private WSSEntryConfig config; private OutgoingWss outgoingWss; private JComponent configComponent; private String label; public void init(WSSEntryConfig config, OutgoingWss outgoingWss, String label) { this.config = config; this.outgoingWss = outgoingWss; this.label = label; if (config.getConfiguration() == null) { config.addNewConfiguration(); } load(new XmlObjectConfigurationReader(config.getConfiguration())); } public OutgoingWss getOutgoingWss() { return outgoingWss; } public String getPassword() { String password = config.getPassword(); if (StringUtils.isNullOrEmpty(password)) { password = outgoingWss.getPassword(); } return password; } public String getUsername() { String username = config.getUsername(); if (StringUtils.isNullOrEmpty(username)) { username = outgoingWss.getUsername(); } return username; } public void setPassword(String arg0) { config.setPassword(arg0); } public void setUsername(String arg0) { config.setUsername(arg0); } public JComponent getConfigurationPanel() { if (configComponent == null) { configComponent = buildUI(); } return configComponent; } public String getLabel() { return label; } protected abstract JComponent buildUI(); protected abstract void load(XmlObjectConfigurationReader reader); public void setConfig(WSSEntryConfig config) { this.config = config; } public void saveConfig() { XmlObjectConfigurationBuilder builder = new XmlObjectConfigurationBuilder(); save(builder); config.getConfiguration().set(builder.finish()); } protected abstract void save(XmlObjectConfigurationBuilder builder); public WssContainer getWssContainer() { return outgoingWss.getWssContainer(); } public void addPropertyChangeListener(PropertyChangeListener listener) { } public void removePropertyChangeListener(PropertyChangeListener listener) { } public PropertyExpansion[] getPropertyExpansions() { PropertyExpansionsResult result = new PropertyExpansionsResult(getWssContainer().getModelItem(), this); addPropertyExpansions(result); return result.toArray(); } protected void addPropertyExpansions(PropertyExpansionsResult result) { if (StringUtils.hasContent(config.getUsername())) { result.extractAndAddAll("username"); } if (StringUtils.hasContent(config.getPassword())) { result.extractAndAddAll("password"); } } protected int readKeyIdentifierType(XmlObjectConfigurationReader reader) { int identifierType = reader.readInt("keyIdentifierType", WSConstants.ISSUER_SERIAL); //For backward compatibility see SOAP-2347 if(identifierType == 0) { return WSConstants.ISSUER_SERIAL; } return identifierType; } public void updateEntryConfig(WSSEntryConfig config) { this.config = config; } @Override public String toString() { return getLabel(); } // Used to save values from table GUI components protected List<StringToStringMap> readTableValues(XmlObjectConfigurationReader reader, String parameterName) { List<StringToStringMap> result = new ArrayList<StringToStringMap>(); String[] tableValues = reader.readStrings(parameterName); if (tableValues != null && tableValues.length > 0) { for (String tableValue : tableValues) { result.add(StringToStringMap.fromXml(tableValue)); } } return result; } // Used to read values from table GUI components protected void saveTableValues(XmlObjectConfigurationBuilder builder, List<StringToStringMap> tableValues, String string) { for (StringToStringMap tableValue : tableValues) { builder.add(string, tableValue.toXml()); } } protected Vector<WSEncryptionPart> createWSParts(List<StringToStringMap> parts) { Vector<WSEncryptionPart> result = new Vector<WSEncryptionPart>(); for (StringToStringMap map : parts) { if (map.hasValue("id")) { result.add(new WSEncryptionPart(map.get("id"), map.get("enc"))); } else { String ns = map.get("namespace"); if (ns == null) { ns = ""; } String name = map.get("name"); if (StringUtils.hasContent(name)) { result.add(new WSEncryptionPart(name, ns, map.get("enc"))); } } } return result; } protected class KeyIdentifierTypeRenderer extends DefaultListCellRenderer { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component result = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (value.equals(1)) { setText("Binary Security Token"); } else if (value.equals(2)) { setText("Issuer Name and Serial Number"); } else if (value.equals(3)) { setText("X509 Certificate"); } else if (value.equals(4)) { setText("Subject Key Identifier"); } else if (value.equals(5)) { setText("Embedded KeyInfo"); } else if (value.equals(6)) { setText("Embed SecurityToken Reference"); } else if (value.equals(7)) { setText("UsernameToken Signature"); } else if (value.equals(8)) { setText("Thumbprint SHA1 Identifier"); } else if (value.equals(9)) { setText("Custom Reference"); } else if( value.equals(12) ) { setText("Custom Key Identifier"); } return result; } } protected class KeyAliasComboBoxModel extends AbstractListModel implements ComboBoxModel { private KeyStore keyStore; private Object alias; private StringList aliases = new StringList(); public KeyAliasComboBoxModel(WssCrypto crypto) { update(crypto); } void update(WssCrypto crypto) { try { if (crypto == null || crypto.getCrypto() == null) { keyStore = null; } else { Merlin merlinCrypto = (Merlin) crypto.getCrypto(); if (crypto.getType() == CryptoType.KEYSTORE) { keyStore = merlinCrypto.getKeyStore(); } else if (crypto.getType() == CryptoType.TRUSTSTORE) { keyStore = merlinCrypto.getTrustStore(); } } } catch (WSSecurityException wssecurityException) { wssecurityException.printStackTrace(); } if (keyStore != null) { if (!aliases.isEmpty()) { int sz = aliases.size(); aliases.clear(); fireIntervalRemoved(this, 0, sz - 1); } try { for (Enumeration e = keyStore.aliases(); e.hasMoreElements(); ) { aliases.add(e.nextElement().toString()); } fireIntervalAdded(this, 0, aliases.size() - 1); } catch (KeyStoreException e) { e.printStackTrace(); } } } public Object getSelectedItem() { return alias; } public void setSelectedItem(Object anItem) { this.alias = anItem; } public Object getElementAt(int index) { return aliases.get(index); } public int getSize() { return aliases.size(); } } public void release() { } }