test.integ.be.fedict.hsm.ws.WSS4JTestSOAPHandler.java Source code

Java tutorial

Introduction

Here is the source code for test.integ.be.fedict.hsm.ws.WSS4JTestSOAPHandler.java

Source

/*
 * HSM Proxy Project.
 * Copyright (C) 2013 FedICT.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License version
 * 3.0 as published by the Free Software Foundation.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, see 
 * http://www.gnu.org/licenses/.
 */

package test.integ.be.fedict.hsm.ws;

import java.util.Set;
import java.util.UUID;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.ws.ProtocolException;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ws.security.WSSecurityException;
import org.apache.ws.security.message.WSSecHeader;
import org.apache.ws.security.message.WSSecSAMLToken;
import org.apache.ws.security.message.WSSecTimestamp;
import org.apache.ws.security.saml.ext.AssertionWrapper;
import org.opensaml.DefaultBootstrap;
import org.opensaml.common.SAMLObject;
import org.opensaml.common.SAMLObjectBuilder;
import org.opensaml.saml1.core.Assertion;
import org.opensaml.xml.Configuration;
import org.opensaml.xml.ConfigurationException;
import org.opensaml.xml.XMLObjectBuilderFactory;
import org.opensaml.xml.io.Marshaller;
import org.opensaml.xml.io.MarshallingException;

public class WSS4JTestSOAPHandler implements SOAPHandler<SOAPMessageContext> {

    private static final Log LOG = LogFactory.getLog(WSS4JTestSOAPHandler.class);

    private static final XMLObjectBuilderFactory xmlObjectBuilderFactory;

    static {
        try {
            DefaultBootstrap.bootstrap();
        } catch (ConfigurationException e) {
            throw new RuntimeException(e);
        }
        xmlObjectBuilderFactory = Configuration.getBuilderFactory();
    }

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        Boolean outboundProperty = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        if (true == outboundProperty.booleanValue()) {
            try {
                handleOutboundMessage(context);
            } catch (Exception e) {
                LOG.debug("error adding WS-Security header: " + e.getMessage(), e);
                throw new ProtocolException(e);
            }
        }
        return true;
    }

    private void handleOutboundMessage(SOAPMessageContext context)
            throws WSSecurityException, ConfigurationException, MarshallingException {
        SOAPMessage soapMessage = context.getMessage();
        SOAPPart soapPart = soapMessage.getSOAPPart();

        WSSecHeader wsSecHeader = new WSSecHeader();
        wsSecHeader.insertSecurityHeader(soapPart);

        WSSecTimestamp wsSecTimeStamp = new WSSecTimestamp();
        wsSecTimeStamp.setTimeToLive(60);
        wsSecTimeStamp.build(soapPart, wsSecHeader);

        WSSecSAMLToken wsSecSAMLToken = new WSSecSAMLToken();

        Assertion assertion = buildObject(Assertion.DEFAULT_ELEMENT_NAME, Assertion.class);
        assertion.setID("assertion-" + UUID.randomUUID().toString());
        Marshaller marshaller = Configuration.getMarshallerFactory().getMarshaller(assertion);
        marshaller.marshall(assertion);

        AssertionWrapper assertionWrapper = new AssertionWrapper(assertion);
        wsSecSAMLToken.build(soapPart, assertionWrapper, wsSecHeader);
    }

    private <T extends SAMLObject> T buildObject(QName name, Class<T> clazz) {
        SAMLObjectBuilder samlObjectBuilder = (SAMLObjectBuilder) xmlObjectBuilderFactory.getBuilder(name);
        return (T) samlObjectBuilder.buildObject();
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        return true;
    }

    @Override
    public void close(MessageContext context) {
    }

    @Override
    public Set<QName> getHeaders() {
        return null;
    }
}