Search in sources :

Example 1 with OperationPolicy

use of org.apache.wss4j.policy.stax.OperationPolicy in project cxf by apache.

the class PolicyBasedWSS4JStaxInInterceptor method createPolicyEnforcer.

private PolicyEnforcer createPolicyEnforcer(EndpointInfo endpointInfo, SoapMessage msg) throws WSSPolicyException {
    EffectivePolicy dispatchPolicy = null;
    List<OperationPolicy> operationPolicies = new ArrayList<>();
    Collection<BindingOperationInfo> bindingOperationInfos = endpointInfo.getBinding().getOperations();
    for (Iterator<BindingOperationInfo> bindingOperationInfoIterator = bindingOperationInfos.iterator(); bindingOperationInfoIterator.hasNext(); ) {
        BindingOperationInfo bindingOperationInfo = bindingOperationInfoIterator.next();
        QName operationName = bindingOperationInfo.getName();
        // todo: I'm not sure what the effectivePolicy exactly contains,
        // a) only the operation policy,
        // or b) all policies for the service,
        // or c) all policies which applies for the current operation.
        // c) is that what we need for stax.
        EffectivePolicy policy = (EffectivePolicy) bindingOperationInfo.getProperty("policy-engine-info-serve-request");
        // PolicyEngineImpl.POLICY_INFO_REQUEST_SERVER);
        if (MessageUtils.isRequestor(msg)) {
            policy = (EffectivePolicy) bindingOperationInfo.getProperty("policy-engine-info-client-response");
            // Save the Dispatch Policy as it may be used on another BindingOperationInfo
            if (policy != null && "http://cxf.apache.org/jaxws/dispatch".equals(operationName.getNamespaceURI())) {
                dispatchPolicy = policy;
            }
            if (bindingOperationInfo.getOutput() != null) {
                MessageInfo messageInfo = bindingOperationInfo.getOutput().getMessageInfo();
                operationName = messageInfo.getName();
                if (messageInfo.getMessagePartsNumber() > 0) {
                    QName cn = messageInfo.getFirstMessagePart().getConcreteName();
                    if (cn != null) {
                        operationName = cn;
                    }
                }
            }
        } else {
            if (bindingOperationInfo.getInput() != null) {
                MessageInfo messageInfo = bindingOperationInfo.getInput().getMessageInfo();
                operationName = messageInfo.getName();
                if (messageInfo.getMessagePartsNumber() > 0) {
                    QName cn = messageInfo.getFirstMessagePart().getConcreteName();
                    if (cn != null) {
                        operationName = cn;
                    }
                }
            }
        }
        SoapOperationInfo soapOperationInfo = bindingOperationInfo.getExtensor(SoapOperationInfo.class);
        if (soapOperationInfo != null && policy == null && dispatchPolicy != null) {
            policy = dispatchPolicy;
        }
        if (policy != null && soapOperationInfo != null) {
            String soapNS;
            BindingInfo bindingInfo = bindingOperationInfo.getBinding();
            if (bindingInfo instanceof SoapBindingInfo) {
                soapNS = ((SoapBindingInfo) bindingInfo).getSoapVersion().getNamespace();
            } else {
                // most probably throw an exception:
                throw new IllegalArgumentException("BindingInfo is not an instance of SoapBindingInfo");
            }
            OperationPolicy operationPolicy = new OperationPolicy(operationName);
            operationPolicy.setPolicy(policy.getPolicy());
            operationPolicy.setOperationAction(soapOperationInfo.getAction());
            operationPolicy.setSoapMessageVersionNamespace(soapNS);
            operationPolicies.add(operationPolicy);
        }
    }
    String soapAction = SoapActionInInterceptor.getSoapAction(msg);
    if (soapAction == null) {
        soapAction = "";
    }
    String actor = (String) msg.getContextualProperty(SecurityConstants.ACTOR);
    final Collection<org.apache.cxf.message.Attachment> attachments = msg.getAttachments();
    int attachmentCount = 0;
    if (attachments != null && !attachments.isEmpty()) {
        attachmentCount = attachments.size();
    }
    return new PolicyEnforcer(operationPolicies, soapAction, isRequestor(msg), actor, attachmentCount, new WSS4JPolicyAsserter(msg.get(AssertionInfoMap.class)));
}
Also used : BindingOperationInfo(org.apache.cxf.service.model.BindingOperationInfo) QName(javax.xml.namespace.QName) ArrayList(java.util.ArrayList) Endpoint(org.apache.cxf.endpoint.Endpoint) MessageInfo(org.apache.cxf.service.model.MessageInfo) EffectivePolicy(org.apache.cxf.ws.policy.EffectivePolicy) OperationPolicy(org.apache.wss4j.policy.stax.OperationPolicy) BindingInfo(org.apache.cxf.service.model.BindingInfo) SoapBindingInfo(org.apache.cxf.binding.soap.model.SoapBindingInfo) SoapBindingInfo(org.apache.cxf.binding.soap.model.SoapBindingInfo) SoapOperationInfo(org.apache.cxf.binding.soap.model.SoapOperationInfo) PolicyEnforcer(org.apache.wss4j.policy.stax.enforcer.PolicyEnforcer)

Aggregations

ArrayList (java.util.ArrayList)1 QName (javax.xml.namespace.QName)1 SoapBindingInfo (org.apache.cxf.binding.soap.model.SoapBindingInfo)1 SoapOperationInfo (org.apache.cxf.binding.soap.model.SoapOperationInfo)1 Endpoint (org.apache.cxf.endpoint.Endpoint)1 BindingInfo (org.apache.cxf.service.model.BindingInfo)1 BindingOperationInfo (org.apache.cxf.service.model.BindingOperationInfo)1 MessageInfo (org.apache.cxf.service.model.MessageInfo)1 EffectivePolicy (org.apache.cxf.ws.policy.EffectivePolicy)1 OperationPolicy (org.apache.wss4j.policy.stax.OperationPolicy)1 PolicyEnforcer (org.apache.wss4j.policy.stax.enforcer.PolicyEnforcer)1