blob: 3a9bf0f1ace027a5e067da33046dd40aec57c60e [file] [log] [blame]
/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.rampart.handler;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.OperationContext;
import org.apache.axis2.wsdl.WSDLConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.rampart.RampartConstants;
import org.apache.rampart.util.Axis2Util;
import org.apache.rampart.util.HandlerParameterDecoder;
import org.apache.rampart.util.MessageOptimizer;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.WSSecurityException;
import org.apache.ws.security.handler.RequestData;
import org.apache.ws.security.handler.WSHandlerConstants;
import org.apache.ws.security.util.WSSecurityUtil;
import org.w3c.dom.Document;
import java.util.Vector;
/**
* @deprecated
*/
public class WSDoAllSender extends WSDoAllHandler {
private static final Log log = LogFactory.getLog(WSDoAllSender.class);
private static Log mlog = LogFactory.getLog(RampartConstants.MESSAGE_LOG);
public WSDoAllSender() {
super();
inHandler = false;
}
public void processMessage(MessageContext msgContext) throws AxisFault {
String useDoomValue = (String) getProperty(msgContext,
WSSHandlerConstants.USE_DOOM);
boolean useDoom = useDoomValue != null
&& Constants.VALUE_TRUE.equalsIgnoreCase(useDoomValue);
RequestData reqData = new RequestData();
try {
//If the msgs are msgs to an STS then use basic WS-Sec
processBasic(msgContext, useDoom, reqData);
} catch (Exception e) {
throw new AxisFault(e.getMessage(), e);
}
finally {
if(reqData != null) {
reqData.clear();
reqData = null;
}
}
if(mlog.isDebugEnabled()){
mlog.debug("*********************** WSDoAllSender sent out \n"+msgContext.getEnvelope());
}
}
/**
* This will carryout the WS-Security related operations.
*
* @param msgContext
* @param useDoom
* @throws WSSecurityException
* @throws AxisFault
*/
private void processBasic(MessageContext msgContext, boolean useDoom,
RequestData reqData) throws WSSecurityException, AxisFault {
boolean doDebug = log.isDebugEnabled();
try {
HandlerParameterDecoder.processParameters(msgContext,false);
} catch (Exception e) {
throw new AxisFault("Configureation error", e);
}
if (doDebug) {
log.debug("WSDoAllSender: enter invoke()");
}
/*
* Copy the RECV_RESULTS over to the current message context
* - IF available
*/
OperationContext opCtx = msgContext.getOperationContext();
MessageContext inMsgCtx;
if(opCtx != null &&
(inMsgCtx = opCtx.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE)) != null) {
msgContext.setProperty(WSHandlerConstants.RECV_RESULTS,
inMsgCtx.getProperty(WSHandlerConstants.RECV_RESULTS));
}
reqData.setNoSerialization(false);
reqData.setMsgContext(msgContext);
if (((getOption(WSSHandlerConstants.OUTFLOW_SECURITY)) == null) &&
((getProperty(msgContext, WSSHandlerConstants.OUTFLOW_SECURITY)) == null)) {
if (msgContext.isServerSide() &&
((getOption(WSSHandlerConstants.OUTFLOW_SECURITY_SERVER)) == null) &&
((getProperty(msgContext, WSSHandlerConstants.OUTFLOW_SECURITY_SERVER)) == null)) {
return;
} else if (((getOption(WSSHandlerConstants.OUTFLOW_SECURITY_CLIENT)) == null) &&
((getProperty(msgContext, WSSHandlerConstants.OUTFLOW_SECURITY_CLIENT)) == null)) {
return;
}
}
Vector actions = new Vector();
String action = null;
if ((action = (String) getOption(WSSHandlerConstants.ACTION_ITEMS)) == null) {
action = (String) getProperty(msgContext, WSSHandlerConstants.ACTION_ITEMS);
}
if (action == null) {
throw new AxisFault("WSDoAllReceiver: No action items defined");
}
int doAction = WSSecurityUtil.decodeAction(action, actions);
if (doAction == WSConstants.NO_SECURITY) {
return;
}
/*
* For every action we need a username, so get this now. The
* username defined in the deployment descriptor takes precedence.
*/
reqData.setUsername((String) getOption(WSHandlerConstants.USER));
if (reqData.getUsername() == null || reqData.getUsername().length() == 0) {
String username = (String) getProperty(reqData.getMsgContext(), WSHandlerConstants.USER);
if (username != null) {
reqData.setUsername(username);
}
}
/*
* Now we perform some set-up for UsernameToken and Signature
* functions. No need to do it for encryption only. Check if
* username is available and then get a passowrd.
*/
if ((doAction & (WSConstants.SIGN | WSConstants.UT | WSConstants.UT_SIGN)) != 0) {
/*
* We need a username - if none throw an AxisFault. For
* encryption there is a specific parameter to get a username.
*/
if (reqData.getUsername() == null
|| reqData.getUsername().length() == 0) {
throw new AxisFault(
"WSDoAllSender: Empty username for specified action");
}
}
/*
* Now get the SOAPEvelope from the message context and convert it
* into a Document
*
* Now we can perform our security operations on this request.
*/
Document doc = null;
/*
* If the message context property conatins a document then this is
* a chained handler.
*/
if ((doc = (Document) ((MessageContext)reqData.getMsgContext())
.getProperty(WSHandlerConstants.SND_SECURITY)) == null) {
try {
doc = Axis2Util.getDocumentFromSOAPEnvelope(msgContext.getEnvelope(), useDoom);
} catch (WSSecurityException wssEx) {
throw new AxisFault("WSDoAllReceiver: Error in converting to Document", wssEx);
}
}
doSenderAction(doAction, doc, reqData, actions, !msgContext.isServerSide());
/*
* If noSerialization is false, this handler shall be the last (or
* only) one in a handler chain. If noSerialization is true, just
* set the processed Document in the transfer property. The next
* Axis WSS4J handler takes it and performs additional security
* processing steps.
*
*/
if (reqData.isNoSerialization()) {
((MessageContext)reqData.getMsgContext()).setProperty(WSHandlerConstants.SND_SECURITY,
doc);
} else {
if(useDoom) {
msgContext.setEnvelope((SOAPEnvelope)doc.getDocumentElement());
} else {
msgContext.setEnvelope(Axis2Util.getSOAPEnvelopeFromDOMDocument(doc, useDoom));
}
((MessageContext)reqData.getMsgContext()).setProperty(WSHandlerConstants.SND_SECURITY, null);
}
/**
* If the optimizeParts parts are set then optimize them
*/
String optimizeParts;
if((optimizeParts = (String) getOption(WSSHandlerConstants.OPTIMIZE_PARTS)) == null) {
optimizeParts = (String)
getProperty(reqData.getMsgContext(), WSSHandlerConstants.OPTIMIZE_PARTS);
}
if(optimizeParts != null) {
// Optimize the Envelope
MessageOptimizer.optimize(msgContext.getEnvelope(),optimizeParts);
}
//Enable handler repetition
Integer repeat;
int repeatCount;
if ((repeat = (Integer)getOption(WSSHandlerConstants.SENDER_REPEAT_COUNT)) == null) {
repeat = (Integer)
getProperty(reqData.getMsgContext(), WSSHandlerConstants.SENDER_REPEAT_COUNT);
}
repeatCount = repeat.intValue();
//Get the current repetition from message context
int repetition = this.getCurrentRepetition(msgContext);
if(repeatCount > 0 && repetition < repeatCount) {
reqData.clear();
reqData = null;
// Increment the repetition to indicate the next repetition
// of the same handler
repetition++;
msgContext.setProperty(WSSHandlerConstants.CURRENT_REPETITON,
new Integer(repetition));
this.invoke(msgContext);
}
if (doDebug) {
log.debug("WSDoAllSender: exit invoke()");
}
}
}