/*
* 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.IncomingWssConfig;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContext;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.resolver.ResolveContext;
import org.apache.commons.codec.binary.Base64;
import org.apache.ws.security.WSPasswordCallback;
import org.apache.ws.security.WSSecurityEngine;
import org.apache.ws.security.WSSecurityEngineResult;
import org.apache.ws.security.WSSecurityException;
import org.apache.ws.security.components.crypto.Crypto;
import org.apache.ws.security.util.WSSecurityUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Vector;
public class IncomingWss {
private IncomingWssConfig wssConfig;
private final WssContainer container;
public IncomingWss(IncomingWssConfig wssConfig, WssContainer container) {
this.wssConfig = wssConfig;
this.container = container;
}
public WssContainer getWssContainer() {
return container;
}
public String getDecryptCrypto() {
return wssConfig.getDecryptCrypto();
}
public String getDecryptPassword() {
return wssConfig.getDecryptPassword();
}
public String getName() {
return wssConfig.getName();
}
public String getSignatureCrypto() {
return wssConfig.getSignatureCrypto();
}
public void setDecryptCrypto(String arg0) {
wssConfig.setDecryptCrypto(arg0);
}
public void setDecryptPassword(String arg0) {
wssConfig.setDecryptPassword(arg0);
}
public void setName(String arg0) {
wssConfig.setName(arg0);
}
public void setSignatureCrypto(String arg0) {
wssConfig.setSignatureCrypto(arg0);
}
public Vector<Object> processIncoming(Document soapDocument, PropertyExpansionContext context)
throws WSSecurityException {
Element header = WSSecurityUtil.findWsseSecurityHeaderBlock(soapDocument, soapDocument.getDocumentElement(),
false);
if (header == null) {
return null;
}
try {
WSSecurityEngine wssecurityEngine = new WSSecurityEngine();
WssCrypto signatureCrypto = getWssContainer().getCryptoByName(getSignatureCrypto());
WssCrypto decryptCrypto = getWssContainer().getCryptoByName(getDecryptCrypto());
Crypto sig = signatureCrypto == null ? null : signatureCrypto.getCrypto();
Crypto dec = decryptCrypto == null ? null : decryptCrypto.getCrypto();
if (sig == null && dec == null) {
throw new WSSecurityException("Missing cryptos");
}
if (sig == null) {
sig = dec;
} else if (dec == null) {
dec = sig;
}
List<WSSecurityEngineResult> incomingResult = wssecurityEngine.processSecurityHeader(soapDocument,
(String) null, new WSSCallbackHandler(dec), sig, dec);
Vector<Object> wssResult = new Vector<Object>();
wssResult.setSize(incomingResult.size());
Collections.copy(wssResult, incomingResult);
return wssResult;
} catch (WSSecurityException e) {
SoapUI.logError(e);
throw e;
}
}
public class WSSCallbackHandler implements CallbackHandler {
private final Crypto dec;
public WSSCallbackHandler(Crypto dec) {
this.dec = dec;
}
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for (Callback callback : callbacks) {
if (callback instanceof WSPasswordCallback) {
WSPasswordCallback cb = (WSPasswordCallback) callback;
if (StringUtils.hasContent(getDecryptPassword())) {
cb.setPassword(getDecryptPassword());
} else {
cb.setPassword(new String(UISupport.promptPassword("Password required for WSS processing",
"Specify Password")));
}
if (cb.getUsage() == WSPasswordCallback.ENCRYPTED_KEY_TOKEN) {
byte[] str = Base64.decodeBase64(cb.getIdentifier().getBytes());
}
}
}
}
}
public void updateConfig(IncomingWssConfig config) {
this.wssConfig = config;
}
public void resolve(ResolveContext<?> context) {
}
}