You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by co...@apache.org on 2012/03/16 12:05:43 UTC

svn commit: r1301434 - in /cxf/trunk/services/sts/sts-core/src: main/java/org/apache/cxf/sts/claims/ main/java/org/apache/cxf/sts/operation/ main/java/org/apache/cxf/sts/request/ test/java/org/apache/cxf/sts/common/ test/java/org/apache/cxf/sts/operati...

Author: coheigea
Date: Fri Mar 16 11:05:43 2012
New Revision: 1301434

URL: http://svn.apache.org/viewvc?rev=1301434&view=rev
Log:
[CXF-4062][CXF-4173] - Enabling custom claim parser / Support for ClaimValue element of federation claims dialect added
 - Patch(es) applied, thanks! I made a few minor modifications

Added:
    cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/claims/ClaimsParser.java
    cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/claims/IdentityClaimsParser.java
    cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/common/CustomClaimParser.java
Modified:
    cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/claims/ClaimsManager.java
    cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/operation/AbstractOperation.java
    cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/request/RequestParser.java
    cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/common/CustomClaimsHandler.java
    cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/operation/IssueSamlClaimsUnitTest.java
    cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/request/RequestParserUnitTest.java

Modified: cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/claims/ClaimsManager.java
URL: http://svn.apache.org/viewvc/cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/claims/ClaimsManager.java?rev=1301434&r1=1301433&r2=1301434&view=diff
==============================================================================
--- cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/claims/ClaimsManager.java (original)
+++ cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/claims/ClaimsManager.java Fri Mar 16 11:05:43 2012
@@ -44,6 +44,7 @@ public class ClaimsManager {
 
     private static final Logger LOG = LogUtils.getL7dLogger(ClaimsManager.class);
 
+    private List<ClaimsParser> claimParsers;
     private List<ClaimsHandler> claimHandlers;
     private List<URI> supportedClaimTypes = new ArrayList<URI>();
 
@@ -51,10 +52,18 @@ public class ClaimsManager {
         return supportedClaimTypes;
     }
 
+    public List<ClaimsParser> getClaimParsers() {
+        return claimParsers;
+    }
+    
     public List<ClaimsHandler> getClaimHandlers() {
         return claimHandlers;
     }
 
+    public void setClaimParsers(List<ClaimsParser> claimParsers) {
+        this.claimParsers = claimParsers;
+    }
+    
     public void setClaimHandlers(List<ClaimsHandler> claimHandlers) {
         this.claimHandlers = claimHandlers;
         if (claimHandlers == null) {

Added: cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/claims/ClaimsParser.java
URL: http://svn.apache.org/viewvc/cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/claims/ClaimsParser.java?rev=1301434&view=auto
==============================================================================
--- cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/claims/ClaimsParser.java (added)
+++ cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/claims/ClaimsParser.java Fri Mar 16 11:05:43 2012
@@ -0,0 +1,39 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.cxf.sts.claims;
+
+import org.w3c.dom.Element;
+
+public interface ClaimsParser {
+
+    /**
+     * @param claim Element to parse claim request from
+     * @return RequestClaim parsed from claim
+     */
+    RequestClaim parse(Element claim);
+
+    /**
+     * This method indicates the claims dialect this Parser can handle.
+     * 
+     * @return Name of supported Dialect
+     */
+    String getSupportedDialect();
+
+}

Added: cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/claims/IdentityClaimsParser.java
URL: http://svn.apache.org/viewvc/cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/claims/IdentityClaimsParser.java?rev=1301434&view=auto
==============================================================================
--- cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/claims/IdentityClaimsParser.java (added)
+++ cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/claims/IdentityClaimsParser.java Fri Mar 16 11:05:43 2012
@@ -0,0 +1,105 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.cxf.sts.claims;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+import org.apache.cxf.common.logging.LogUtils;
+
+public class IdentityClaimsParser implements ClaimsParser {
+    
+    public static final String IDENTITY_CLAIMS_DIALECT = 
+        "http://schemas.xmlsoap.org/ws/2005/05/identity";
+
+    private static final Logger LOG = LogUtils.getL7dLogger(IdentityClaimsParser.class);
+
+    public RequestClaim parse(Element claim) {
+        return parseClaimType(claim);
+    }
+
+    public static RequestClaim parseClaimType(Element claimType) {
+        String claimLocalName = claimType.getLocalName();
+        String claimNS = claimType.getNamespaceURI();
+        if ("ClaimType".equals(claimLocalName)) {
+            String claimTypeUri = claimType.getAttribute("Uri");
+            String claimTypeOptional = claimType.getAttribute("Optional");
+            RequestClaim requestClaim = new RequestClaim();
+            try {
+                requestClaim.setClaimType(new URI(claimTypeUri));
+            } catch (URISyntaxException e) {
+                LOG.log(
+                    Level.WARNING, 
+                    "Cannot create URI from the given ClaimType attribute value " + claimTypeUri,
+                    e
+                );
+            }
+            requestClaim.setOptional(Boolean.parseBoolean(claimTypeOptional));
+            return requestClaim;
+        } else if ("ClaimValue".equals(claimLocalName)) {
+            String claimTypeUri = claimType.getAttribute("Uri");
+            String claimTypeOptional = claimType.getAttribute("Optional");
+            RequestClaim requestClaim = new RequestClaim();
+            try {
+                requestClaim.setClaimType(new URI(claimTypeUri));
+            } catch (URISyntaxException e) {
+                LOG.log(
+                    Level.WARNING, 
+                    "Cannot create URI from the given ClaimTye attribute value " + claimTypeUri,
+                    e
+                );
+            }
+            
+            Node valueNode = claimType.getFirstChild();
+            if (valueNode != null) {
+                if ("Value".equals(valueNode.getLocalName())) {
+                    requestClaim.setClaimValue(valueNode.getTextContent());
+                } else {
+                    LOG.warning("Unsupported child element of ClaimValue element "
+                            + valueNode.getLocalName());
+                    return null;
+                }
+            } else {
+                LOG.warning("No child element of ClaimValue element available");
+                return null;
+            }
+             
+            requestClaim.setOptional(Boolean.parseBoolean(claimTypeOptional));
+            
+            return requestClaim;
+        }
+        
+        LOG.fine("Found unknown element: " + claimLocalName + " " + claimNS);
+        return null;
+    }
+
+    /**
+     * Return the supported dialect of this class
+     */
+    public String getSupportedDialect() {
+        return IDENTITY_CLAIMS_DIALECT;
+    }
+}

Modified: cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/operation/AbstractOperation.java
URL: http://svn.apache.org/viewvc/cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/operation/AbstractOperation.java?rev=1301434&r1=1301433&r2=1301434&view=diff
==============================================================================
--- cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/operation/AbstractOperation.java (original)
+++ cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/operation/AbstractOperation.java Fri Mar 16 11:05:43 2012
@@ -102,7 +102,7 @@ public abstract class AbstractOperation 
     protected List<TokenValidator> tokenValidators = new ArrayList<TokenValidator>();
     protected boolean returnReferences = true;
     protected STSTokenStore tokenStore;
-    protected ClaimsManager claimsManager;
+    protected ClaimsManager claimsManager = new ClaimsManager();
     
     public boolean isReturnReferences() {
         return returnReferences;
@@ -173,7 +173,7 @@ public abstract class AbstractOperation 
         stsProperties.configureProperties();
         
         RequestParser requestParser = new RequestParser();
-        requestParser.parseRequest(request, context, stsProperties);
+        requestParser.parseRequest(request, context, stsProperties, claimsManager.getClaimParsers());
         
         return requestParser;
     }

Modified: cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/request/RequestParser.java
URL: http://svn.apache.org/viewvc/cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/request/RequestParser.java?rev=1301434&r1=1301433&r2=1301434&view=diff
==============================================================================
--- cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/request/RequestParser.java (original)
+++ cxf/trunk/services/sts/sts-core/src/main/java/org/apache/cxf/sts/request/RequestParser.java Fri Mar 16 11:05:43 2012
@@ -43,7 +43,6 @@ import javax.xml.ws.WebServiceContext;
 import javax.xml.ws.handler.MessageContext;
 
 import org.w3c.dom.Element;
-import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
 import org.apache.cxf.common.logging.LogUtils;
@@ -53,6 +52,8 @@ import org.apache.cxf.helpers.DOMUtils;
 import org.apache.cxf.sts.QNameConstants;
 import org.apache.cxf.sts.STSConstants;
 import org.apache.cxf.sts.STSPropertiesMBean;
+import org.apache.cxf.sts.claims.ClaimsParser;
+import org.apache.cxf.sts.claims.IdentityClaimsParser;
 import org.apache.cxf.sts.claims.RequestClaim;
 import org.apache.cxf.sts.claims.RequestClaimCollection;
 import org.apache.cxf.ws.security.sts.provider.STSException;
@@ -95,9 +96,11 @@ public class RequestParser {
     private TokenRequirements tokenRequirements = new TokenRequirements();
 
     public void parseRequest(
-        RequestSecurityTokenType request, WebServiceContext wsContext, STSPropertiesMBean stsProperties
+        RequestSecurityTokenType request, WebServiceContext wsContext, STSPropertiesMBean stsProperties, 
+        List<ClaimsParser> claimsParsers
     ) throws STSException {
         LOG.fine("Parsing RequestSecurityToken");
+        
         keyRequirements = new KeyRequirements();
         tokenRequirements = new TokenRequirements();
         
@@ -105,7 +108,8 @@ public class RequestParser {
             // JAXB types
             if (requestObject instanceof JAXBElement<?>) {
                 JAXBElement<?> jaxbElement = (JAXBElement<?>) requestObject;
-                boolean found = parseTokenRequirements(jaxbElement, tokenRequirements, wsContext);
+                boolean found = 
+                    parseTokenRequirements(jaxbElement, tokenRequirements, wsContext, claimsParsers);
                 if (!found) {
                     found = parseKeyRequirements(jaxbElement, keyRequirements, wsContext, stsProperties);
                 }
@@ -120,7 +124,7 @@ public class RequestParser {
                 Element element = (Element)requestObject;
                 if (STSConstants.WST_NS_05_12.equals(element.getNamespaceURI())
                     && "SecondaryParameters".equals(element.getLocalName())) {
-                    parseSecondaryParameters(element);
+                    parseSecondaryParameters(element, claimsParsers);
                 } else if ("AppliesTo".equals(element.getLocalName())
                     && (STSConstants.WSP_NS.equals(element.getNamespaceURI())
                         || STSConstants.WSP_NS_04.equals(element.getNamespaceURI()))) {
@@ -216,7 +220,8 @@ public class RequestParser {
     private static boolean parseTokenRequirements(
         JAXBElement<?> jaxbElement, 
         TokenRequirements tokenRequirements,
-        WebServiceContext wsContext
+        WebServiceContext wsContext,
+        List<ClaimsParser> claimsParsers
     ) {
         if (QNameConstants.TOKEN_TYPE.equals(jaxbElement.getName())) {
             String tokenType = (String)jaxbElement.getValue();
@@ -272,7 +277,7 @@ public class RequestParser {
             LOG.fine("Found CancelTarget token");
         } else if (QNameConstants.CLAIMS.equals(jaxbElement.getName())) {
             ClaimsType claimsType = (ClaimsType)jaxbElement.getValue();
-            RequestClaimCollection requestedClaims = parseClaims(claimsType);
+            RequestClaimCollection requestedClaims = parseClaims(claimsType, claimsParsers);
             tokenRequirements.setClaims(requestedClaims);
             LOG.fine("Found Claims token");
         } else {
@@ -495,7 +500,7 @@ public class RequestParser {
      * direct children of the RequestSecurityToken element. 
      * @param secondaryParameters the secondaryParameters element to parse
      */
-    private void parseSecondaryParameters(Element secondaryParameters) {
+    private void parseSecondaryParameters(Element secondaryParameters, List<ClaimsParser> claimsParsers) {
         LOG.fine("Found SecondaryParameters element");
         Element child = DOMUtils.getFirstElement(secondaryParameters);
         while (child != null) {
@@ -519,7 +524,7 @@ public class RequestParser {
             } else if (tokenRequirements.getClaims() == null 
                 && "Claims".equals(localName) && STSConstants.WST_NS_05_12.equals(namespace)) {
                 LOG.fine("Found Claims element");
-                RequestClaimCollection requestedClaims = parseClaims(child);
+                RequestClaimCollection requestedClaims = parseClaims(child, claimsParsers);
                 tokenRequirements.setClaims(requestedClaims);
             } else {
                 LOG.fine("Found unknown element: " + localName + " " + namespace);
@@ -531,7 +536,7 @@ public class RequestParser {
     /**
      * Create a RequestClaimCollection from a DOM Element
      */
-    private RequestClaimCollection parseClaims(Element claimsElement) {
+    private RequestClaimCollection parseClaims(Element claimsElement, List<ClaimsParser> claimsParsers) {
         String dialectAttr = null;
         RequestClaimCollection requestedClaims = new RequestClaimCollection();
         try {
@@ -549,7 +554,7 @@ public class RequestParser {
         
         Element childClaimType = DOMUtils.getFirstElement(claimsElement);
         while (childClaimType != null) {
-            RequestClaim requestClaim = parseChildClaimType(childClaimType);
+            RequestClaim requestClaim = parseChildClaimType(childClaimType, dialectAttr, claimsParsers);
             if (requestClaim != null) {
                 requestedClaims.add(requestClaim);
             }
@@ -562,7 +567,9 @@ public class RequestParser {
     /**
      * Create a RequestClaimCollection from a JAXB ClaimsType object
      */
-    private static RequestClaimCollection parseClaims(ClaimsType claimsType) {
+    private static RequestClaimCollection parseClaims(
+        ClaimsType claimsType, List<ClaimsParser> claimsParsers
+    ) {
         String dialectAttr = null;
         RequestClaimCollection requestedClaims = new RequestClaimCollection();
         try {
@@ -580,7 +587,7 @@ public class RequestParser {
         
         for (Object claim : claimsType.getAny()) {
             if (claim instanceof Element) {
-                RequestClaim requestClaim = parseChildClaimType((Element)claim);
+                RequestClaim requestClaim = parseChildClaimType((Element)claim, dialectAttr, claimsParsers);
                 if (requestClaim != null) {
                     requestedClaims.add(requestClaim);
                 }
@@ -593,59 +600,24 @@ public class RequestParser {
     /**
      * Parse a child ClaimType into a RequestClaim object.
      */
-    private static RequestClaim parseChildClaimType(Element childClaimType) {
-        String claimLocalName = childClaimType.getLocalName();
-        String claimNS = childClaimType.getNamespaceURI();
-        if ("ClaimType".equals(claimLocalName)) {
-            String claimTypeUri = childClaimType.getAttribute("Uri");
-            String claimTypeOptional = childClaimType.getAttribute("Optional");
-            RequestClaim requestClaim = new RequestClaim();
-            try {
-                requestClaim.setClaimType(new URI(claimTypeUri));
-            } catch (URISyntaxException e) {
-                LOG.log(
-                    Level.WARNING, 
-                    "Cannot create URI from the given ClaimType attribute value " + claimTypeUri,
-                    e
-                );
-            }
-            requestClaim.setOptional(Boolean.parseBoolean(claimTypeOptional));
-            return requestClaim;
-        } else if ("ClaimValue".equals(claimLocalName)) {
-            String claimTypeUri = childClaimType.getAttribute("Uri");
-            String claimTypeOptional = childClaimType.getAttribute("Optional");
-            RequestClaim requestClaim = new RequestClaim();
-            try {
-                requestClaim.setClaimType(new URI(claimTypeUri));
-            } catch (URISyntaxException e) {
-                LOG.log(
-                    Level.WARNING, 
-                    "Cannot create URI from the given ClaimTye attribute value " + claimTypeUri,
-                    e
-                );
-            }
-            
-            Node valueNode = childClaimType.getFirstChild();
-            if (valueNode != null) {
-                if ("Value".equals(valueNode.getLocalName())) {
-                    requestClaim.setClaimValue(valueNode.getTextContent());
-                } else {
-                    LOG.warning("Unsupported child element of ClaimValue element "
-                            + valueNode.getLocalName());
-                    return null;
+    private static RequestClaim parseChildClaimType(
+        Element childClaimType, String dialect, List<ClaimsParser> claimsParsers
+    ) {
+        if (claimsParsers != null) {
+            for (ClaimsParser parser : claimsParsers) {
+                if (parser != null && dialect.equals(parser.getSupportedDialect())) {
+                    return parser.parse(childClaimType);
                 }
-            } else {
-                LOG.warning("No child element of ClaimValue element available");
-                return null;
             }
-             
-            requestClaim.setOptional(Boolean.parseBoolean(claimTypeOptional));
-            
-            return requestClaim;
+        }
+        if (IdentityClaimsParser.IDENTITY_CLAIMS_DIALECT.equals(dialect)) {
+            return IdentityClaimsParser.parseClaimType(childClaimType);
         }
         
-        LOG.fine("Found unknown element: " + claimLocalName + " " + claimNS);
-        return null;
+        LOG.log(Level.WARNING, "No ClaimsParser is registered for dialect " + dialect);
+        throw new STSException(
+            "No ClaimsParser is registered for dialect " + dialect, STSException.BAD_REQUEST
+        );
     }
     
     

Added: cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/common/CustomClaimParser.java
URL: http://svn.apache.org/viewvc/cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/common/CustomClaimParser.java?rev=1301434&view=auto
==============================================================================
--- cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/common/CustomClaimParser.java (added)
+++ cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/common/CustomClaimParser.java Fri Mar 16 11:05:43 2012
@@ -0,0 +1,68 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.cxf.sts.common;
+
+import java.net.URI;
+
+import org.w3c.dom.Element;
+
+import org.apache.cxf.sts.claims.ClaimsParser;
+import org.apache.cxf.sts.claims.RequestClaim;
+
+public class CustomClaimParser implements ClaimsParser {
+
+    public static final String CLAIMS_DIALECT = "http://my.custom.org/my/custom/namespace";
+    
+    public RequestClaim parse(Element claim) {
+        
+        String claimLocalName = claim.getLocalName();
+        String claimNS = claim.getNamespaceURI();
+        if (CLAIMS_DIALECT.equals(claimNS) && "MyElement".equals(claimLocalName)) {
+            String claimTypeUri = claim.getAttribute("Uri");
+            CustomRequestClaim response = new CustomRequestClaim();
+            response.setClaimType(URI.create(claimTypeUri));
+            String claimValue = claim.getAttribute("value");
+            response.setClaimValue(claimValue);
+            String scope = claim.getAttribute("scope");
+            response.setScope(scope);
+            return response;
+        }
+        return null;
+    }
+
+    public String getSupportedDialect() {
+        return CLAIMS_DIALECT;
+    }
+    
+    /**
+     * Extends RequestClaim class to add additional attributes
+     */
+    public class CustomRequestClaim extends RequestClaim {
+        private String scope;
+        
+        public String getScope() {
+            return scope;
+        }
+        
+        public void setScope(String scope) {
+            this.scope = scope;
+        }
+    }
+
+}

Modified: cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/common/CustomClaimsHandler.java
URL: http://svn.apache.org/viewvc/cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/common/CustomClaimsHandler.java?rev=1301434&r1=1301433&r2=1301434&view=diff
==============================================================================
--- cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/common/CustomClaimsHandler.java (original)
+++ cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/common/CustomClaimsHandler.java Fri Mar 16 11:05:43 2012
@@ -19,6 +19,7 @@
 package org.apache.cxf.sts.common;
 
 import java.net.URI;
+import java.security.Principal;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -29,6 +30,7 @@ import org.apache.cxf.sts.claims.ClaimsH
 import org.apache.cxf.sts.claims.ClaimsParameters;
 import org.apache.cxf.sts.claims.RequestClaim;
 import org.apache.cxf.sts.claims.RequestClaimCollection;
+import org.apache.cxf.sts.common.CustomClaimParser.CustomRequestClaim;
 
 /**
  * A custom ClaimsHandler implementation for use in the tests.
@@ -36,11 +38,14 @@ import org.apache.cxf.sts.claims.Request
 public class CustomClaimsHandler implements ClaimsHandler {
     
     private static List<URI> knownURIs = new ArrayList<URI>();
+    private static final URI ROLE_CLAIM = 
+            URI.create("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/role");
     
     static {
         knownURIs.add(ClaimTypes.FIRSTNAME);
         knownURIs.add(ClaimTypes.LASTNAME);
         knownURIs.add(ClaimTypes.EMAILADDRESS);
+        knownURIs.add(ROLE_CLAIM);
     }
 
     public List<URI> getSupportedClaimTypes() {
@@ -56,12 +61,25 @@ public class CustomClaimsHandler impleme
                 Claim claim = new Claim();
                 claim.setClaimType(requestClaim.getClaimType());
                 if (ClaimTypes.FIRSTNAME.equals(requestClaim.getClaimType())) {
-                    claim.setValue("alice");
+                    if (requestClaim instanceof CustomRequestClaim) {
+                        CustomRequestClaim customClaim = (CustomRequestClaim) requestClaim;
+                        String customName = customClaim.getClaimValue() + "@" + customClaim.getScope();
+                        claim.setValue(customName);
+                    } else {
+                        claim.setValue("alice");
+                    }
                 } else if (ClaimTypes.LASTNAME.equals(requestClaim.getClaimType())) {
                     claim.setValue("doe");
                 } else if (ClaimTypes.EMAILADDRESS.equals(requestClaim.getClaimType())) {
                     claim.setValue("alice@cxf.apache.org");
-                }
+                } else if (ROLE_CLAIM.equals(requestClaim.getClaimType())) {
+                    String requestedRole = requestClaim.getClaimValue();
+                    if (isUserInRole(parameters.getPrincipal(), requestedRole)) {
+                        claim.setValue(requestedRole);
+                    } else {
+                        continue;
+                    }
+                }                
                 claimCollection.add(claim);
             }
             return claimCollection;
@@ -70,5 +88,8 @@ public class CustomClaimsHandler impleme
         return null;
     }
 
+    private boolean isUserInRole(Principal principal, String requestedRole) {
+        return true;
+    }
         
 }

Modified: cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/operation/IssueSamlClaimsUnitTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/operation/IssueSamlClaimsUnitTest.java?rev=1301434&r1=1301433&r2=1301434&view=diff
==============================================================================
--- cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/operation/IssueSamlClaimsUnitTest.java (original)
+++ cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/operation/IssueSamlClaimsUnitTest.java Fri Mar 16 11:05:43 2012
@@ -18,6 +18,7 @@
  */
 package org.apache.cxf.sts.operation;
 
+import java.net.URI;
 import java.security.Principal;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -47,9 +48,11 @@ import org.apache.cxf.sts.claims.ClaimsA
 import org.apache.cxf.sts.claims.ClaimsHandler;
 import org.apache.cxf.sts.claims.ClaimsManager;
 import org.apache.cxf.sts.claims.ClaimsMapper;
+import org.apache.cxf.sts.claims.ClaimsParser;
 import org.apache.cxf.sts.claims.RequestClaim;
 import org.apache.cxf.sts.claims.RequestClaimCollection;
 import org.apache.cxf.sts.common.CustomAttributeProvider;
+import org.apache.cxf.sts.common.CustomClaimParser;
 import org.apache.cxf.sts.common.CustomClaimsHandler;
 import org.apache.cxf.sts.common.PasswordCallbackHandler;
 import org.apache.cxf.sts.request.KeyRequirements;
@@ -90,6 +93,9 @@ public class IssueSamlClaimsUnitTest ext
     public static final QName REQUESTED_SECURITY_TOKEN = 
         QNameConstants.WS_TRUST_FACTORY.createRequestedSecurityToken(null).getName();
     
+    private static final URI ROLE_CLAIM = 
+            URI.create("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/role");
+    
     /**
      * Test to successfully issue a Saml 1.1 token.
      */
@@ -97,32 +103,11 @@ public class IssueSamlClaimsUnitTest ext
     public void testIssueSaml1Token() throws Exception {
         TokenIssueOperation issueOperation = new TokenIssueOperation();
         
-        // Add Token Provider
-        List<TokenProvider> providerList = new ArrayList<TokenProvider>();
+        addTokenProvider(issueOperation);
         
-        List<AttributeStatementProvider> customProviderList = 
-            new ArrayList<AttributeStatementProvider>();
-        customProviderList.add(new CustomAttributeProvider());
-        SAMLTokenProvider samlTokenProvider = new SAMLTokenProvider();
-        samlTokenProvider.setAttributeStatementProviders(customProviderList);
-        providerList.add(samlTokenProvider);
-        issueOperation.setTokenProviders(providerList);
+        addService(issueOperation);
         
-        // Add Service
-        ServiceMBean service = new StaticService();
-        service.setEndpoints(Collections.singletonList("http://dummy-service.com/dummy"));
-        issueOperation.setServices(Collections.singletonList(service));
-        
-        // Add STSProperties object
-        STSPropertiesMBean stsProperties = new StaticSTSProperties();
-        Crypto crypto = CryptoFactory.getInstance(getEncryptionProperties());
-        stsProperties.setEncryptionCrypto(crypto);
-        stsProperties.setSignatureCrypto(crypto);
-        stsProperties.setEncryptionUsername("myservicekey");
-        stsProperties.setSignatureUsername("mystskey");
-        stsProperties.setCallbackHandler(new PasswordCallbackHandler());
-        stsProperties.setIssuer("STS");
-        issueOperation.setStsProperties(stsProperties);
+        addSTSProperties(issueOperation);
         
         // Set the ClaimsManager
         ClaimsManager claimsManager = new ClaimsManager();
@@ -141,21 +126,10 @@ public class IssueSamlClaimsUnitTest ext
         request.getAny().add(secondaryParameters);
         request.getAny().add(createAppliesToElement("http://dummy-service.com/dummy"));
         
-        // Mock up message context
-        MessageImpl msg = new MessageImpl();
-        WrappedMessageContext msgCtx = new WrappedMessageContext(msg);
-        msgCtx.put(
-            SecurityContext.class.getName(), 
-            createSecurityContext(new CustomTokenPrincipal("alice"))
-        );
-        WebServiceContextImpl webServiceContext = new WebServiceContextImpl(msgCtx);
+        WebServiceContextImpl webServiceContext = setupMessageContext();
         
-        // Issue a token
-        RequestSecurityTokenResponseCollectionType response = 
-            issueOperation.issue(request, webServiceContext);
-        List<RequestSecurityTokenResponseType> securityTokenResponse = 
-            response.getRequestSecurityTokenResponse();
-        assertTrue(!securityTokenResponse.isEmpty());
+        List<RequestSecurityTokenResponseType> securityTokenResponse = issueToken(issueOperation, request,
+                webServiceContext);
         
         // Test the generated token.
         Element assertion = null;
@@ -175,6 +149,8 @@ public class IssueSamlClaimsUnitTest ext
         assertTrue(tokenString.contains("alice"));
         assertTrue(tokenString.contains(SAML1Constants.CONF_BEARER));
         assertTrue(tokenString.contains(ClaimTypes.LASTNAME.toString()));
+        assertTrue(tokenString.contains(ROLE_CLAIM.toString()));
+        assertTrue(tokenString.contains("administrator"));
     }
     
     /**
@@ -185,31 +161,13 @@ public class IssueSamlClaimsUnitTest ext
         TokenIssueOperation issueOperation = new TokenIssueOperation();
         
         // Add Token Provider
-        List<TokenProvider> providerList = new ArrayList<TokenProvider>();
-        
-        List<AttributeStatementProvider> customProviderList = 
-            new ArrayList<AttributeStatementProvider>();
-        customProviderList.add(new CustomAttributeProvider());
-        SAMLTokenProvider samlTokenProvider = new SAMLTokenProvider();
-        samlTokenProvider.setAttributeStatementProviders(customProviderList);
-        providerList.add(samlTokenProvider);
-        issueOperation.setTokenProviders(providerList);
+        addTokenProvider(issueOperation);
         
         // Add Service
-        ServiceMBean service = new StaticService();
-        service.setEndpoints(Collections.singletonList("http://dummy-service.com/dummy"));
-        issueOperation.setServices(Collections.singletonList(service));
+        addService(issueOperation);
         
         // Add STSProperties object
-        STSPropertiesMBean stsProperties = new StaticSTSProperties();
-        Crypto crypto = CryptoFactory.getInstance(getEncryptionProperties());
-        stsProperties.setEncryptionCrypto(crypto);
-        stsProperties.setSignatureCrypto(crypto);
-        stsProperties.setEncryptionUsername("myservicekey");
-        stsProperties.setSignatureUsername("mystskey");
-        stsProperties.setCallbackHandler(new PasswordCallbackHandler());
-        stsProperties.setIssuer("STS");
-        issueOperation.setStsProperties(stsProperties);
+        addSTSProperties(issueOperation);
         
         // Set the ClaimsManager
         ClaimsManager claimsManager = new ClaimsManager();
@@ -228,21 +186,10 @@ public class IssueSamlClaimsUnitTest ext
         request.getAny().add(secondaryParameters);
         request.getAny().add(createAppliesToElement("http://dummy-service.com/dummy"));
         
-        // Mock up message context
-        MessageImpl msg = new MessageImpl();
-        WrappedMessageContext msgCtx = new WrappedMessageContext(msg);
-        msgCtx.put(
-            SecurityContext.class.getName(), 
-            createSecurityContext(new CustomTokenPrincipal("alice"))
-        );
-        WebServiceContextImpl webServiceContext = new WebServiceContextImpl(msgCtx);
+        WebServiceContextImpl webServiceContext = setupMessageContext();
         
-        // Issue a token
-        RequestSecurityTokenResponseCollectionType response = 
-            issueOperation.issue(request, webServiceContext);
-        List<RequestSecurityTokenResponseType> securityTokenResponse = 
-            response.getRequestSecurityTokenResponse();
-        assertTrue(!securityTokenResponse.isEmpty());
+        List<RequestSecurityTokenResponseType> securityTokenResponse = issueToken(issueOperation, request,
+                webServiceContext);
         
         // Test the generated token.
         Element assertion = null;
@@ -262,33 +209,104 @@ public class IssueSamlClaimsUnitTest ext
         assertTrue(tokenString.contains("alice"));
         assertTrue(tokenString.contains(SAML2Constants.CONF_BEARER));
         assertTrue(tokenString.contains(ClaimTypes.LASTNAME.toString()));
+        assertTrue(tokenString.contains(ROLE_CLAIM.toString()));
+        assertTrue(tokenString.contains("administrator"));
     }
     
     /**
-     * Test to successfully issue a Saml 1.1 token. The claims information is included as a 
-     * JAXB Element under RequestSecurityToken, rather than as a child of SecondaryParameters.
+     * Test custom claim parser and handler.
      */
     @org.junit.Test
-    public void testIssueJaxbSaml1Token() throws Exception {
+    public void testCustomClaimDialect() throws Exception {
         TokenIssueOperation issueOperation = new TokenIssueOperation();
         
         // Add Token Provider
-        List<TokenProvider> providerList = new ArrayList<TokenProvider>();
-        
-        List<AttributeStatementProvider> customProviderList = 
-            new ArrayList<AttributeStatementProvider>();
-        customProviderList.add(new CustomAttributeProvider());
-        SAMLTokenProvider samlTokenProvider = new SAMLTokenProvider();
-        samlTokenProvider.setAttributeStatementProviders(customProviderList);
-        providerList.add(samlTokenProvider);
-        issueOperation.setTokenProviders(providerList);
+        addTokenProvider(issueOperation);
         
         // Add Service
-        ServiceMBean service = new StaticService();
-        service.setEndpoints(Collections.singletonList("http://dummy-service.com/dummy"));
-        issueOperation.setServices(Collections.singletonList(service));
+        addService(issueOperation);
         
         // Add STSProperties object
+        addSTSProperties(issueOperation);
+        
+        // Set the ClaimsManager
+        ClaimsManager claimsManager = new ClaimsManager();
+        ClaimsHandler claimsHandler = new CustomClaimsHandler();
+        ClaimsParser claimsParser = new CustomClaimParser();
+        claimsManager.setClaimParsers(Collections.singletonList(claimsParser));
+        claimsManager.setClaimHandlers(Collections.singletonList(claimsHandler));
+        issueOperation.setClaimsManager(claimsManager);
+        
+        // Mock up a request
+        RequestSecurityTokenType request = new RequestSecurityTokenType();
+        JAXBElement<String> tokenType = 
+            new JAXBElement<String>(
+                QNameConstants.TOKEN_TYPE, String.class, WSConstants.WSS_SAML2_TOKEN_TYPE
+            );
+        request.getAny().add(tokenType);
+        Element secondaryParameters = createCustomSecondaryParameters();
+        request.getAny().add(secondaryParameters);
+        request.getAny().add(createAppliesToElement("http://dummy-service.com/dummy"));
+        
+        // Mock up message context
+        WebServiceContextImpl webServiceContext = setupMessageContext();
+        
+        // Issue a token
+        List<RequestSecurityTokenResponseType> securityTokenResponse = issueToken(issueOperation, 
+                request, webServiceContext);
+        
+        // Test the generated token.
+        Element assertion = null;
+        for (Object tokenObject : securityTokenResponse.get(0).getAny()) {
+            if (tokenObject instanceof JAXBElement<?>
+                && REQUESTED_SECURITY_TOKEN.equals(((JAXBElement<?>)tokenObject).getName())) {
+                RequestedSecurityTokenType rstType = 
+                    (RequestedSecurityTokenType)((JAXBElement<?>)tokenObject).getValue();
+                assertion = (Element)rstType.getAny();
+                break;
+            }
+        }
+        
+        assertNotNull(assertion);
+        String tokenString = DOM2Writer.nodeToString(assertion);
+        assertTrue(tokenString.contains("AttributeStatement"));
+        assertTrue(tokenString.contains("bob@custom"));
+    }
+
+    /**
+     * @param issueOperation
+     * @param request
+     * @param webServiceContext
+     * @return
+     */
+    private List<RequestSecurityTokenResponseType> issueToken(TokenIssueOperation issueOperation,
+            RequestSecurityTokenType request, WebServiceContextImpl webServiceContext) {
+        RequestSecurityTokenResponseCollectionType response = 
+            issueOperation.issue(request, webServiceContext);
+        List<RequestSecurityTokenResponseType> securityTokenResponse = 
+            response.getRequestSecurityTokenResponse();
+        assertTrue(!securityTokenResponse.isEmpty());
+        return securityTokenResponse;
+    }
+
+    /**
+     * @return
+     */
+    private WebServiceContextImpl setupMessageContext() {
+        MessageImpl msg = new MessageImpl();
+        WrappedMessageContext msgCtx = new WrappedMessageContext(msg);
+        msgCtx.put(
+            SecurityContext.class.getName(), 
+            createSecurityContext(new CustomTokenPrincipal("alice"))
+        );
+        return new WebServiceContextImpl(msgCtx);
+    }
+
+    /**
+     * @param issueOperation
+     * @throws WSSecurityException
+     */
+    private void addSTSProperties(TokenIssueOperation issueOperation) throws WSSecurityException {
         STSPropertiesMBean stsProperties = new StaticSTSProperties();
         Crypto crypto = CryptoFactory.getInstance(getEncryptionProperties());
         stsProperties.setEncryptionCrypto(crypto);
@@ -298,6 +316,45 @@ public class IssueSamlClaimsUnitTest ext
         stsProperties.setCallbackHandler(new PasswordCallbackHandler());
         stsProperties.setIssuer("STS");
         issueOperation.setStsProperties(stsProperties);
+    }
+
+    /**
+     * @param issueOperation
+     */
+    private void addService(TokenIssueOperation issueOperation) {
+        ServiceMBean service = new StaticService();
+        service.setEndpoints(Collections.singletonList("http://dummy-service.com/dummy"));
+        issueOperation.setServices(Collections.singletonList(service));
+    }
+
+    /**
+     * @param issueOperation
+     */
+    private void addTokenProvider(TokenIssueOperation issueOperation) {
+        List<TokenProvider> providerList = new ArrayList<TokenProvider>();
+        
+        List<AttributeStatementProvider> customProviderList = 
+            new ArrayList<AttributeStatementProvider>();
+        customProviderList.add(new CustomAttributeProvider());
+        SAMLTokenProvider samlTokenProvider = new SAMLTokenProvider();
+        samlTokenProvider.setAttributeStatementProviders(customProviderList);
+        providerList.add(samlTokenProvider);
+        issueOperation.setTokenProviders(providerList);
+    }
+    
+    /**
+     * Test to successfully issue a Saml 1.1 token. The claims information is included as a 
+     * JAXB Element under RequestSecurityToken, rather than as a child of SecondaryParameters.
+     */
+    @org.junit.Test
+    public void testIssueJaxbSaml1Token() throws Exception {
+        TokenIssueOperation issueOperation = new TokenIssueOperation();
+        
+        addTokenProvider(issueOperation);
+        
+        addService(issueOperation);
+        
+        addSTSProperties(issueOperation);
         
         // Set the ClaimsManager
         ClaimsManager claimsManager = new ClaimsManager();
@@ -328,21 +385,10 @@ public class IssueSamlClaimsUnitTest ext
         
         request.getAny().add(createAppliesToElement("http://dummy-service.com/dummy"));
         
-        // Mock up message context
-        MessageImpl msg = new MessageImpl();
-        WrappedMessageContext msgCtx = new WrappedMessageContext(msg);
-        msgCtx.put(
-            SecurityContext.class.getName(), 
-            createSecurityContext(new CustomTokenPrincipal("alice"))
-        );
-        WebServiceContextImpl webServiceContext = new WebServiceContextImpl(msgCtx);
+        WebServiceContextImpl webServiceContext = setupMessageContext();
         
-        // Issue a token
-        RequestSecurityTokenResponseCollectionType response = 
-            issueOperation.issue(request, webServiceContext);
-        List<RequestSecurityTokenResponseType> securityTokenResponse = 
-            response.getRequestSecurityTokenResponse();
-        assertTrue(!securityTokenResponse.isEmpty());
+        List<RequestSecurityTokenResponseType> securityTokenResponse = issueToken(issueOperation, request,
+                webServiceContext);
         
         // Test the generated token.
         Element assertion = null;
@@ -370,7 +416,8 @@ public class IssueSamlClaimsUnitTest ext
      * The relationship type between realm A and B is: FederateClaims
      */
     @org.junit.Test
-    public void testIssueSaml2TokenOnBehalfOfSaml2DifferentRealmFederateClaims() throws Exception {
+    public void testIssueSaml2TokenOnBehalfOfSaml2DifferentRealmFederateClaims() 
+        throws Exception {
         TokenIssueOperation issueOperation = new TokenIssueOperation();
         
         Map<String, SAMLRealm> realms = createSamlRealms();
@@ -393,10 +440,7 @@ public class IssueSamlClaimsUnitTest ext
         validatorList.add(samlTokenValidator);
         issueOperation.setTokenValidators(validatorList);
 
-        // Add Service
-        ServiceMBean service = new StaticService();
-        service.setEndpoints(Collections.singletonList("http://dummy-service.com/dummy"));
-        issueOperation.setServices(Collections.singletonList(service));
+        addService(issueOperation);
         
         // Add Relationship list
         List<Relationship> relationshipList = new ArrayList<Relationship>();
@@ -469,13 +513,8 @@ public class IssueSamlClaimsUnitTest ext
         msgCtx.put("url", "https");
         WebServiceContextImpl webServiceContext = new WebServiceContextImpl(msgCtx);
         
-        // run the test
-        RequestSecurityTokenResponseCollectionType response = 
-            issueOperation.issue(request, webServiceContext);
-        List<RequestSecurityTokenResponseType> securityTokenResponseList = 
-            response.getRequestSecurityTokenResponse();
-
-        assertTrue(!securityTokenResponseList.isEmpty());       
+        List<RequestSecurityTokenResponseType> securityTokenResponseList = issueToken(issueOperation,
+                request, webServiceContext);       
         RequestSecurityTokenResponseType securityTokenResponse = securityTokenResponseList.get(0);
         
         // Test the generated token.
@@ -489,7 +528,6 @@ public class IssueSamlClaimsUnitTest ext
                 break;
             }
         }
-        
         assertNotNull(assertion);
         String tokenString = DOM2Writer.nodeToString(assertion);
         assertTrue(tokenString.contains("AttributeStatement"));
@@ -547,10 +585,7 @@ public class IssueSamlClaimsUnitTest ext
         validatorList.add(samlTokenValidator);
         issueOperation.setTokenValidators(validatorList);
 
-        // Add Service
-        ServiceMBean service = new StaticService();
-        service.setEndpoints(Collections.singletonList("http://dummy-service.com/dummy"));
-        issueOperation.setServices(Collections.singletonList(service));
+        addService(issueOperation);
         
         // Add Relationship list
         List<Relationship> relationshipList = new ArrayList<Relationship>();
@@ -629,13 +664,8 @@ public class IssueSamlClaimsUnitTest ext
         msgCtx.put("url", "https");
         WebServiceContextImpl webServiceContext = new WebServiceContextImpl(msgCtx);
         
-        // run the test
-        RequestSecurityTokenResponseCollectionType response = 
-            issueOperation.issue(request, webServiceContext);
-        List<RequestSecurityTokenResponseType> securityTokenResponseList = 
-            response.getRequestSecurityTokenResponse();
-
-        assertTrue(!securityTokenResponseList.isEmpty());       
+        List<RequestSecurityTokenResponseType> securityTokenResponseList = issueToken(issueOperation,
+                request, webServiceContext);       
         RequestSecurityTokenResponseType securityTokenResponse = securityTokenResponseList.get(0);
         
         // Test the generated token.
@@ -739,8 +769,31 @@ public class IssueSamlClaimsUnitTest ext
         claims.setAttributeNS(null, "Dialect", STSConstants.IDT_NS_05_05);
         
         Element claimType = createClaimsType(doc);
-        
         claims.appendChild(claimType);
+        Element claimValue = createClaimValue(doc);
+        claims.appendChild(claimValue);
+        secondary.appendChild(claims);
+
+        return secondary;
+    }
+    
+    /*
+     * Mock up a SecondaryParameters DOM Element containing a custom claim dialect.
+     */
+    private Element createCustomSecondaryParameters() {
+        Document doc = DOMUtils.createDocument();
+        Element secondary = doc.createElementNS(STSConstants.WST_NS_05_12, "SecondaryParameters");
+        secondary.setAttributeNS(WSConstants.XMLNS_NS, "xmlns", STSConstants.WST_NS_05_12);
+        
+        Element claims = doc.createElementNS(STSConstants.WST_NS_05_12, "Claims");
+        claims.setAttributeNS(null, "Dialect", CustomClaimParser.CLAIMS_DIALECT);
+        
+        Element claim = doc.createElementNS(CustomClaimParser.CLAIMS_DIALECT, "MyElement");
+        claim.setAttributeNS(null, "Uri", ClaimTypes.FIRSTNAME.toString());
+        claim.setAttributeNS(null, "value", "bob");
+        claim.setAttributeNS(null, "scope", "custom");
+        
+        claims.appendChild(claim);
         secondary.appendChild(claims);
 
         return secondary;
@@ -756,6 +809,16 @@ public class IssueSamlClaimsUnitTest ext
         return claimType;
     }
     
+    private Element createClaimValue(Document doc) {
+        Element claimValue = doc.createElementNS(STSConstants.IDT_NS_05_05, "ClaimValue");
+        claimValue.setAttributeNS(null, "Uri", ROLE_CLAIM.toString());
+        claimValue.setAttributeNS(WSConstants.XMLNS_NS, "xmlns", STSConstants.IDT_NS_05_05);
+        Element value = doc.createElementNS(STSConstants.IDT_NS_05_05, "Value");
+        value.setTextContent("administrator");
+        claimValue.appendChild(value);
+        return claimValue;
+    }
+    
     private Map<String, SAMLRealm> createSamlRealms() {
         // Create Realms
         Map<String, SAMLRealm> samlRealms = new HashMap<String, SAMLRealm>();

Modified: cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/request/RequestParserUnitTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/request/RequestParserUnitTest.java?rev=1301434&r1=1301433&r2=1301434&view=diff
==============================================================================
--- cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/request/RequestParserUnitTest.java (original)
+++ cxf/trunk/services/sts/sts-core/src/test/java/org/apache/cxf/sts/request/RequestParserUnitTest.java Fri Mar 16 11:05:43 2012
@@ -147,7 +147,7 @@ public class RequestParserUnitTest exten
         resultsList.add(new WSHandlerResult("actor", engineResultList));
         msgContext.put(WSHandlerConstants.RECV_RESULTS, resultsList);
         
-        parser.parseRequest(request, wsContext, null);
+        parser.parseRequest(request, wsContext, null, null);
         
         SCTCanceller sctCanceller = new SCTCanceller();
         assertTrue(sctCanceller.canHandleToken(parser.getTokenRequirements().getCancelTarget()));
@@ -178,7 +178,7 @@ public class RequestParserUnitTest exten
         resultsList.add(new WSHandlerResult("actor", engineResultList));
         msgContext.put(WSHandlerConstants.RECV_RESULTS, resultsList);
         
-        parser.parseRequest(request, wsContext, null);
+        parser.parseRequest(request, wsContext, null, null);
         
         SCTValidator sctValidator = new SCTValidator();
         assertTrue(sctValidator.canHandleToken(parser.getTokenRequirements().getValidateTarget()));
@@ -210,7 +210,7 @@ public class RequestParserUnitTest exten
         resultsList.add(new WSHandlerResult("actor", engineResultList));
         msgContext.put(WSHandlerConstants.RECV_RESULTS, resultsList);
         
-        parser.parseRequest(request, wsContext, null);
+        parser.parseRequest(request, wsContext, null, null);
         
         assertNotNull(parser.getKeyRequirements().getReceivedKey().getX509Cert());
     }