All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.picketlink.trust.jbossws.handler.MapBasedTokenHandler Maven / Gradle / Ivy

/*
 * JBoss, Home of Professional Open Source.
 * Copyright 2008, Red Hat Middleware LLC, and individual contributors
 * as indicated by the @author tags. See the copyright.txt file in the
 * distribution for a full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * 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, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.picketlink.trust.jbossws.handler;

import java.util.Map;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPMessageContext;

import org.picketlink.common.ErrorCodes;
import org.picketlink.identity.federation.core.util.SOAPUtil;
import org.picketlink.trust.jbossws.Constants;
import org.picketlink.trust.jbossws.Util;

/**
 * 

* Handler that looks for a binary token data that exists in jaasOptionsMap supplied in constructor. *

*

* Configuration: *

* System Properties: *

    *
  • map.token.key: key which will be used to fetch binary token from the jaasOptionsMap. Default value is ClientID
  • *
  • map.token.validation.class.key: validation class for binary token inside handleInbound method
  • *
  • binary.http.encodingType: attribute value of the EncodingType attribute
  • *
  • binary.http.valueType: attribute value of the ValueType attribute
  • *
  • binary.http.valueType.namespace: namespace for the ValueType attribute
  • *
  • binary.http.valueType.prefix: namespace for the ValueType attribute
  • *
* Setters: *

* Please see the see also section. *

* * @see #setEncodingType(String) * @see #setValueType(String) * @see #setValueTypeNamespace(String) * @see #setValueTypePrefix(String)

* @author [email protected] * @author [email protected] * @since Jun 11, 2012 */ public class MapBasedTokenHandler extends AbstractPicketLinkTrustHandler { public static final String SYS_PROP_TOKEN_KEY = "map.token.key"; public static final String DEFAULT_TOKEN_KEY = "ClientID"; private boolean trace = logger.isTraceEnabled(); /** * The JAAS shared options map key name for binary token to be stored in. */ public final String tokenOptionKey = SecurityActions.getSystemProperty( SYS_PROP_TOKEN_KEY, "ClientID"); /** * Key in the JAAS options map to find class name to validate token in * inbound message handle method. */ public final String validationTokenClassKey = SecurityActions .getSystemProperty("map.token.validation.class.key", "tokenValidationClass"); /** * Attribute value for the EncodingType attribute */ private String encodingType = SecurityActions .getSystemProperty( "binary.http.encodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"); /** * Attribute value for the ValueType attribute */ private String valueType = SecurityActions.getSystemProperty( "binary.http.valueType", null); /** * Namespace for the ValueType. Can be null. If null, then a separate * namespace is not added. */ private String valueTypeNamespace = SecurityActions.getSystemProperty( "binary.http.valueType.namespace", null); /** * Prefix for the ValueType. Can be null. */ private String valueTypePrefix = SecurityActions.getSystemProperty( "binary.http.valueType.prefix", null); private SOAPFactory factory = null; /** * Shared options from calling login module (@see * * @JBWSTokenIssuingLoginModule). */ private Map jaasLoginModuleOptions = null; public MapBasedTokenHandler(Map jaasOptionsMap) { jaasLoginModuleOptions = jaasOptionsMap; } /** *

* Set the EncodingType value. *

*

* Alternatively, set the system property "binary.http.encodingType" *

* * @param binaryEncodingType */ public void setEncodingType(String binaryEncodingType) { this.encodingType = binaryEncodingType; } /** *

* Set the Value type *

*

* Alternatively, set the system property "binary.http.valueType" *

* * @param binaryValueType */ public void setValueType(String binaryValueType) { this.valueType = binaryValueType; } /** *

* Set the ValueType Namespace *

*

* Alternatively, set the system property "binary.http.valueType.namespace" *

* * @param binaryValueNamespace */ public void setValueTypeNamespace(String binaryValueNamespace) { this.valueTypeNamespace = binaryValueNamespace; } /** *

* Set the Value Type Prefix *

*

* Alternatively, set the system property "binary.http.valueType.prefix" *

* * @param binaryValuePrefix */ public void setValueTypePrefix(String binaryValuePrefix) { this.valueTypePrefix = binaryValuePrefix; } @Override protected boolean handleInbound(MessageContext msgContext) { if (trace) { logger.trace("Handling Inbound Message"); } String tokenValidation = (String) jaasLoginModuleOptions .get(validationTokenClassKey); if (tokenValidation == null) { return true; } BinaryTokenValidation validation = null; try { ClassLoader cl = SecurityActions.getClassLoader(getClass()); validation = (BinaryTokenValidation) cl.loadClass(tokenValidation) .newInstance(); } catch (Exception e) { throw new RuntimeException(ErrorCodes.CLASS_NOT_LOADED + "Class not loaded:" + tokenValidation, e); } String token = getToken(msgContext); if (trace) { logger.trace("Validating token=" + token); } return validation.validateBinaryToken(token, msgContext); } @Override protected boolean handleOutbound(MessageContext msgContext) { if (trace) { logger.trace("Handling Outbound Message"); } String token = (String) jaasLoginModuleOptions.get(tokenOptionKey); if (token == null) throw new RuntimeException(ErrorCodes.INJECTED_VALUE_MISSING + tokenOptionKey + " has to be set by calling LoginMoule in option map."); SOAPElement security = null; try { security = create(token); } catch (SOAPException e) { logger.jbossWSUnableToCreateBinaryToken(e); } if (security == null) { logger.jbossWSUnableToCreateSecurityToken(); return true; } SOAPMessage sm = ((SOAPMessageContext) msgContext).getMessage(); SOAPEnvelope envelope; try { envelope = sm.getSOAPPart().getEnvelope(); SOAPHeader header = (SOAPHeader) Util.findElement(envelope, new QName(envelope.getNamespaceURI(), "Header")); if (header == null) { header = (SOAPHeader) envelope.getOwnerDocument() .createElementNS(envelope.getNamespaceURI(), envelope.getPrefix() + ":Header"); envelope.insertBefore(header, envelope.getFirstChild()); } header.addChildElement(security); } catch (SOAPException e) { logger.jbossWSUnableToCreateBinaryToken(e); } if (trace) { logger.trace("SOAP Message=" + SOAPUtil.soapMessageAsString(sm)); } return true; } /** * Given a binary token, create a {@link SOAPElement} * * @param token * @return * @throws SOAPException */ private SOAPElement create(String token) throws SOAPException { if (factory == null) factory = SOAPFactory.newInstance(); SOAPElement security = factory.createElement(Constants.WSSE_LOCAL, Constants.WSSE_PREFIX, Constants.WSSE_NS); if (valueTypeNamespace != null) { security.addNamespaceDeclaration(valueTypePrefix, valueTypeNamespace); } SOAPElement binarySecurityToken = factory.createElement( Constants.WSSE_BINARY_SECURITY_TOKEN, Constants.WSSE_PREFIX, Constants.WSSE_NS); binarySecurityToken.addTextNode(token); if (valueType != null && !valueType.isEmpty()) { binarySecurityToken.setAttribute(Constants.WSSE_VALUE_TYPE, valueType); } if (encodingType != null) { binarySecurityToken.setAttribute(Constants.WSSE_ENCODING_TYPE, encodingType); } security.addChildElement(binarySecurityToken); return security; } private String getToken(MessageContext msgContext) { SOAPMessage sm = ((SOAPMessageContext) msgContext).getMessage(); SOAPEnvelope envelope; try { envelope = sm.getSOAPPart().getEnvelope(); SOAPHeader header = (SOAPHeader) Util.findElement(envelope, new QName(envelope.getNamespaceURI(), "Header")); if (header == null) { header = (SOAPHeader) envelope.getOwnerDocument() .createElementNS(envelope.getNamespaceURI(), envelope.getPrefix() + ":Header"); } return Util.findElementByWsuId(header, "BinarySecurityToken") .getTextContent(); } catch (SOAPException e) { logger.jbossWSUnableToCreateBinaryToken(e); return null; } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy