/*
* 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;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.config.OutgoingWssConfig;
import com.eviware.soapui.config.WSSEntryConfig;
import com.eviware.soapui.impl.wsdl.support.wss.entries.ManualSAMLEntry;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansion;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContainer;
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.resolver.ResolveContext;
import org.apache.ws.security.WSSecurityException;
import org.apache.ws.security.message.WSSecHeader;
import org.apache.ws.security.util.WSSecurityUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.util.ArrayList;
import java.util.List;
public class OutgoingWss implements PropertyExpansionContainer {
private static final String OLD_MANUAL_SAML_ENTRY_TYPE = "SAML";
public static final String WSSENTRY_PROPERTY = OutgoingWss.class.getName() + "@wssEntry";
private static final int MOVE_DOWN = 1;
private static final int MOVE_UP = -1;
private OutgoingWssConfig config;
private List<WssEntry> entries = new ArrayList<WssEntry>();
private final DefaultWssContainer container;
public OutgoingWss(OutgoingWssConfig config, DefaultWssContainer container) {
this.config = config;
this.container = container;
for (WSSEntryConfig entryConfig : config.getEntryList()) {
convertOldManualSAMLEntry(entryConfig);
WssEntry entry = WssEntryRegistry.get().build(entryConfig, this);
if (entry != null) {
entries.add(entry);
}
}
}
public WssContainer getWssContainer() {
return container;
}
public String getName() {
return config.getName();
}
public String getPassword() {
return config.getPassword();
}
public String getUsername() {
return config.getUsername();
}
public void setName(String arg0) {
config.setName(arg0);
}
public void setPassword(String arg0) {
config.setPassword(arg0);
}
public void setUsername(String arg0) {
config.setUsername(arg0);
}
public String getActor() {
return config.getActor();
}
public boolean getMustUnderstand() {
return config.getMustUnderstand();
}
public void setActor(String arg0) {
config.setActor(arg0);
}
public void setMustUnderstand(boolean arg0) {
config.setMustUnderstand(arg0);
}
public WssEntry addEntry(String type) {
WssEntry newEntry = WssEntryRegistry.get().create(type, this);
entries.add(newEntry);
container.fireWssEntryAdded(newEntry);
return newEntry;
}
public void removeEntry(WssEntry entry) {
int index = entries.indexOf(entry);
container.fireWssEntryRemoved(entries.remove(index));
config.removeEntry(index);
entry.release();
}
public void moveEntry(WssEntry entry, int offset) {
int indexBeforeMove = entries.indexOf(entry);
if ((offset == MOVE_UP && indexBeforeMove > 0)
|| (offset == MOVE_DOWN && indexBeforeMove < entries.size() - 1)) {
WssEntry adjacentEntry = entries.get(indexBeforeMove + offset);
entries.set(indexBeforeMove + offset, entry);
entries.set(indexBeforeMove, adjacentEntry);
WSSEntryConfig entryConfig = (WSSEntryConfig) config.getEntryList().get(indexBeforeMove).copy();
WSSEntryConfig adjacentEntryConfig = (WSSEntryConfig) config.getEntryList().get(indexBeforeMove + offset)
.copy();
config.getEntryList().set(indexBeforeMove + offset, entryConfig);
config.getEntryList().set(indexBeforeMove, adjacentEntryConfig);
entry.updateEntryConfig(config.getEntryList().get(indexBeforeMove + offset));
adjacentEntry.updateEntryConfig(config.getEntryList().get(indexBeforeMove));
container.fireWssEntryMoved(entry, offset);
}
}
public OutgoingWssConfig getConfig() {
return config;
}
public void processOutgoing(Document soapDocument, PropertyExpansionContext context) throws WSSecurityException {
Element header = WSSecurityUtil.findWsseSecurityHeaderBlock(soapDocument, soapDocument.getDocumentElement(),
false);
while (header != null) {
header.getParentNode().removeChild(header);
header = WSSecurityUtil.findWsseSecurityHeaderBlock(soapDocument, soapDocument.getDocumentElement(), false);
}
WSSecHeader secHeader = new WSSecHeader();
if (StringUtils.hasContent(getActor())) {
secHeader.setActor(getActor());
}
secHeader.setMustUnderstand(getMustUnderstand());
secHeader.insertSecurityHeader(soapDocument);
for (WssEntry entry : entries) {
try {
entry.process(secHeader, soapDocument, context);
} catch (Throwable e) {
SoapUI.logError(e);
}
}
}
public List<WssEntry> getEntries() {
return entries;
}
public void updateConfig(OutgoingWssConfig config) {
this.config = config;
for (int c = 0; c < entries.size(); c++) {
entries.get(c).updateEntryConfig(this.config.getEntryArray(c));
}
}
public void release() {
for (WssEntry entry : entries) {
entry.release();
}
}
public PropertyExpansion[] getPropertyExpansions() {
PropertyExpansionsResult result = new PropertyExpansionsResult(getWssContainer().getModelItem(), this);
result.extractAndAddAll("username");
result.extractAndAddAll("password");
for (WssEntry entry : entries) {
if (entry instanceof PropertyExpansionContainer) {
result.addAll(((PropertyExpansionContainer) entry).getPropertyExpansions());
}
}
return result.toArray();
}
public void resolve(ResolveContext<?> context) {
}
// Used to support backwards compatibility (< 4.5 - 4.5)
private void convertOldManualSAMLEntry(WSSEntryConfig entryConfig) {
if (entryConfig.getType().equals(OLD_MANUAL_SAML_ENTRY_TYPE)) {
entryConfig.setType(ManualSAMLEntry.TYPE);
}
}
}