Author: coheigea
Date: Wed Apr  2 13:11:26 2014
New Revision: 1584019

URL: http://svn.apache.org/r1584019
Log:
Making setting AudienceRestrictions more configurable

Added:
    
webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/bean/AudienceRestrictionBean.java
Modified:
    
webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/bean/ConditionsBean.java
    
webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/builder/SAML1ComponentBuilder.java
    
webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/builder/SAML2ComponentBuilder.java
    
webservices/wss4j/trunk/ws-security-dom/src/test/java/org/apache/wss4j/dom/saml/SamlConditionsTest.java
    
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SamlConditionsTest.java

Added: 
webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/bean/AudienceRestrictionBean.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/bean/AudienceRestrictionBean.java?rev=1584019&view=auto
==============================================================================
--- 
webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/bean/AudienceRestrictionBean.java
 (added)
+++ 
webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/bean/AudienceRestrictionBean.java
 Wed Apr  2 13:11:26 2014
@@ -0,0 +1,99 @@
+/**
+ * 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.wss4j.common.saml.bean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class AudienceRestrictionBean represents a SAML AudienceRestriction object
+ */
+public class AudienceRestrictionBean {
+    private final List<String> audienceURIs = new ArrayList<String>();
+
+    /**
+     * Constructor AudienceRestrictionBean creates a new 
AudienceRestrictionBean instance.
+     */
+    public AudienceRestrictionBean() {
+    }
+
+    /**
+     * Constructor AudienceRestrictionBean creates a new 
AudienceRestrictionBean instance.
+     *
+     * @param audienceURIs The audienceURI instances
+     */
+    public AudienceRestrictionBean(
+        List<String> audienceURIs
+    ) {
+        if (audienceURIs != null) {
+            this.audienceURIs.addAll(audienceURIs);
+        }
+    }
+    
+    /**
+     * Get the audienceURI instances
+     *
+     * @return the audienceURI instances
+     */
+    public List<String> getAudienceURIs() {
+        return audienceURIs;
+    }
+    
+    /**
+     * Set the audienceURI instance
+     *
+     * @param audienceURI the audienceURI instance to set
+     */
+    public void setAudienceURIs(List<String> audienceURIs) {
+        this.audienceURIs.clear();
+        this.audienceURIs.addAll(audienceURIs);
+    }
+    
+    /**
+     * Method equals ...
+     *
+     * @param o of type Object
+     * @return boolean
+     */
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof AudienceRestrictionBean)) return false;
+
+        AudienceRestrictionBean that = (AudienceRestrictionBean) o;
+
+        if (!audienceURIs.equals(that.audienceURIs)) {
+            return false; 
+        }
+        
+        return true;
+    }
+
+    /**
+     * @return the hashcode of this object
+     */
+    @Override
+    public int hashCode() {
+        int result = 17;
+        result = 31 * result + audienceURIs.hashCode();
+        return result;
+    }
+
+}

Modified: 
webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/bean/ConditionsBean.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/bean/ConditionsBean.java?rev=1584019&r1=1584018&r2=1584019&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/bean/ConditionsBean.java
 (original)
+++ 
webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/bean/ConditionsBean.java
 Wed Apr  2 13:11:26 2014
@@ -32,7 +32,7 @@ public class ConditionsBean {
     private DateTime notBefore;
     private DateTime notAfter;
     private long tokenPeriodSeconds;
-    private List<String> audienceURIs;
+    private List<AudienceRestrictionBean> audienceRestrictions;
     private boolean oneTimeUse;
     private ProxyRestrictionBean proxyRestriction;
 
@@ -140,21 +140,21 @@ public class ConditionsBean {
     }
     
     /**
-     * Get the audienceURI instances
+     * Get the audienceRestrictions instances
      *
-     * @return the audienceURI instances
+     * @return the audienceRestrictions instances
      */
-    public List<String> getAudienceURIs() {
-        return audienceURIs;
+    public List<AudienceRestrictionBean> getAudienceRestrictions() {
+        return audienceRestrictions;
     }
 
     /**
-     * Set the audienceURI instance
+     * Set the audienceRestrictions instance
      *
-     * @param audienceURI the audienceURI instance to set
+     * @param audienceRestrictions the audienceRestrictions instance to set
      */
-    public void setAudienceURIs(List<String> audienceURIs) {
-        this.audienceURIs = audienceURIs;
+    public void setAudienceRestrictions(List<AudienceRestrictionBean> 
audienceRestrictions) {
+        this.audienceRestrictions = audienceRestrictions;
     }
 
     /**
@@ -208,9 +208,10 @@ public class ConditionsBean {
             return false; 
         }
         
-        if (audienceURIs == null && that.audienceURIs != null) {
+        if (audienceRestrictions == null && that.audienceRestrictions != null) 
{
             return false;
-        } else if (audienceURIs != null && 
!audienceURIs.equals(that.audienceURIs)) {
+        } else if (audienceRestrictions != null 
+                && !audienceRestrictions.equals(that.audienceRestrictions)) {
             return false; 
         }
         
@@ -238,8 +239,8 @@ public class ConditionsBean {
         if (notAfter != null) {
             result = 31 * result + notAfter.hashCode();
         }
-        if (audienceURIs != null) {
-            result = 31 * result + audienceURIs.hashCode();
+        if (audienceRestrictions != null) {
+            result = 31 * result + audienceRestrictions.hashCode();
         }
         result = 31 * result + (oneTimeUse ? 1 : 0);
         if (proxyRestriction != null) {

Modified: 
webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/builder/SAML1ComponentBuilder.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/builder/SAML1ComponentBuilder.java?rev=1584019&r1=1584018&r2=1584019&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/builder/SAML1ComponentBuilder.java
 (original)
+++ 
webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/builder/SAML1ComponentBuilder.java
 Wed Apr  2 13:11:26 2014
@@ -24,6 +24,7 @@ import org.apache.wss4j.common.saml.Open
 import org.apache.wss4j.common.saml.bean.ActionBean;
 import org.apache.wss4j.common.saml.bean.AttributeBean;
 import org.apache.wss4j.common.saml.bean.AttributeStatementBean;
+import org.apache.wss4j.common.saml.bean.AudienceRestrictionBean;
 import org.apache.wss4j.common.saml.bean.AuthDecisionStatementBean;
 import org.apache.wss4j.common.saml.bean.AuthenticationStatementBean;
 import org.apache.wss4j.common.saml.bean.ConditionsBean;
@@ -277,10 +278,14 @@ public final class SAML1ComponentBuilder
             conditions.setNotOnOrAfter(notOnOrAfter);
         }
         
-        if (conditionsBean.getAudienceURIs() != null && 
!conditionsBean.getAudienceURIs().isEmpty()) {
-            AudienceRestrictionCondition audienceRestriction = 
-                
createSamlv1AudienceRestriction(conditionsBean.getAudienceURIs());
-            
conditions.getAudienceRestrictionConditions().add(audienceRestriction);
+        if (conditionsBean.getAudienceRestrictions() != null 
+            && !conditionsBean.getAudienceRestrictions().isEmpty()) {
+            for (AudienceRestrictionBean audienceRestrictionBean 
+                    : conditionsBean.getAudienceRestrictions()) {
+                AudienceRestrictionCondition audienceRestriction = 
+                    createSamlv1AudienceRestriction(audienceRestrictionBean);
+                
conditions.getAudienceRestrictionConditions().add(audienceRestriction);
+            }
         }
         
         return conditions;
@@ -289,12 +294,12 @@ public final class SAML1ComponentBuilder
     /**
      * Create an AudienceRestrictionCondition object
      *
-     * @param audienceURIs of type String
+     * @param audienceRestrictionBean of type AudienceRestrictionBean
      * @return an AudienceRestrictionCondition object
      */
     @SuppressWarnings("unchecked")
     public static AudienceRestrictionCondition 
-    createSamlv1AudienceRestriction(List<String> audienceURIs) {
+    createSamlv1AudienceRestriction(AudienceRestrictionBean 
audienceRestrictionBean) {
         if (audienceRestrictionV1Builder == null) {
             audienceRestrictionV1Builder = 
(SAMLObjectBuilder<AudienceRestrictionCondition>) 
                 
builderFactory.getBuilder(AudienceRestrictionCondition.DEFAULT_ELEMENT_NAME);
@@ -307,7 +312,7 @@ public final class SAML1ComponentBuilder
         AudienceRestrictionCondition audienceRestriction = 
             audienceRestrictionV1Builder.buildObject();
         
-        for (String audienceURI : audienceURIs) {
+        for (String audienceURI : audienceRestrictionBean.getAudienceURIs()) {
             Audience audience = audienceV1Builder.buildObject();
             audience.setUri(audienceURI);
             audienceRestriction.getAudiences().add(audience);

Modified: 
webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/builder/SAML2ComponentBuilder.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/builder/SAML2ComponentBuilder.java?rev=1584019&r1=1584018&r2=1584019&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/builder/SAML2ComponentBuilder.java
 (original)
+++ 
webservices/wss4j/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/saml/builder/SAML2ComponentBuilder.java
 Wed Apr  2 13:11:26 2014
@@ -23,6 +23,7 @@ import org.apache.wss4j.common.ext.WSSec
 import org.apache.wss4j.common.saml.bean.ActionBean;
 import org.apache.wss4j.common.saml.bean.AttributeBean;
 import org.apache.wss4j.common.saml.bean.AttributeStatementBean;
+import org.apache.wss4j.common.saml.bean.AudienceRestrictionBean;
 import org.apache.wss4j.common.saml.bean.AuthDecisionStatementBean;
 import org.apache.wss4j.common.saml.bean.AuthenticationStatementBean;
 import org.apache.wss4j.common.saml.bean.ConditionsBean;
@@ -213,11 +214,15 @@ public final class SAML2ComponentBuilder
             conditions.setNotOnOrAfter(notOnOrAfter);
         }
         
-        if (conditionsBean.getAudienceURIs() != null && 
!conditionsBean.getAudienceURIs().isEmpty()) {
-            AudienceRestriction audienceRestriction = 
-                createAudienceRestriction(conditionsBean.getAudienceURIs());
-            conditions.getAudienceRestrictions().add(audienceRestriction);
-        }
+        if (conditionsBean.getAudienceRestrictions() != null 
+                && !conditionsBean.getAudienceRestrictions().isEmpty()) {
+                for (AudienceRestrictionBean audienceRestrictionBean 
+                        : conditionsBean.getAudienceRestrictions()) {
+                    AudienceRestriction audienceRestriction = 
+                        createAudienceRestriction(audienceRestrictionBean);
+                    
conditions.getAudienceRestrictions().add(audienceRestriction);
+                }
+            }
         
         if (conditionsBean.isOneTimeUse()) {
             conditions.getConditions().add(createOneTimeUse());
@@ -232,11 +237,13 @@ public final class SAML2ComponentBuilder
     /**
      * Create an AudienceRestriction object
      *
-     * @param audienceURIs of type String
+     * @param audienceRestrictionBean of type AudienceRestrictionBean
      * @return an AudienceRestriction object
      */
     @SuppressWarnings("unchecked")
-    public static AudienceRestriction createAudienceRestriction(List<String> 
audienceURIs) {
+    public static AudienceRestriction createAudienceRestriction(
+        AudienceRestrictionBean audienceRestrictionBean
+    ) {
         if (audienceRestrictionBuilder == null) {
             audienceRestrictionBuilder = 
(SAMLObjectBuilder<AudienceRestriction>) 
                 
builderFactory.getBuilder(AudienceRestriction.DEFAULT_ELEMENT_NAME);
@@ -248,7 +255,7 @@ public final class SAML2ComponentBuilder
        
         AudienceRestriction audienceRestriction = 
audienceRestrictionBuilder.buildObject();
         
-        for (String audienceURI : audienceURIs) {
+        for (String audienceURI : audienceRestrictionBean.getAudienceURIs()) {
             Audience audience = audienceBuilder.buildObject();
             audience.setAudienceURI(audienceURI);
             audienceRestriction.getAudiences().add(audience);

Modified: 
webservices/wss4j/trunk/ws-security-dom/src/test/java/org/apache/wss4j/dom/saml/SamlConditionsTest.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-dom/src/test/java/org/apache/wss4j/dom/saml/SamlConditionsTest.java?rev=1584019&r1=1584018&r2=1584019&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/ws-security-dom/src/test/java/org/apache/wss4j/dom/saml/SamlConditionsTest.java
 (original)
+++ 
webservices/wss4j/trunk/ws-security-dom/src/test/java/org/apache/wss4j/dom/saml/SamlConditionsTest.java
 Wed Apr  2 13:11:26 2014
@@ -20,12 +20,14 @@
 package org.apache.wss4j.dom.saml;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.wss4j.common.ext.WSSecurityException;
 import org.apache.wss4j.common.saml.SAMLCallback;
 import org.apache.wss4j.common.saml.SAMLUtil;
 import org.apache.wss4j.common.saml.SamlAssertionWrapper;
+import org.apache.wss4j.common.saml.bean.AudienceRestrictionBean;
 import org.apache.wss4j.common.saml.bean.ConditionsBean;
 import org.apache.wss4j.common.saml.bean.ProxyRestrictionBean;
 import org.apache.wss4j.common.util.XMLUtils;
@@ -331,7 +333,58 @@ public class SamlConditionsTest extends 
         List<String> audiences = new ArrayList<String>();
         audiences.add("http://apache.org/one";);
         audiences.add("http://apache.org/two";);
-        conditions.setAudienceURIs(audiences);
+        AudienceRestrictionBean audienceRestrictionBean = new 
AudienceRestrictionBean();
+        audienceRestrictionBean.setAudienceURIs(audiences);
+        
conditions.setAudienceRestrictions(Collections.singletonList(audienceRestrictionBean));
+        
+        callbackHandler.setConditions(conditions);
+        
+        SAMLCallback samlCallback = new SAMLCallback();
+        SAMLUtil.doSAMLCallback(callbackHandler, samlCallback);
+        SamlAssertionWrapper samlAssertion = new 
SamlAssertionWrapper(samlCallback);
+
+        WSSecSAMLToken wsSign = new WSSecSAMLToken();
+
+        Document doc = SOAPUtil.toSOAPPart(SOAPUtil.SAMPLE_SOAP_MSG);
+        WSSecHeader secHeader = new WSSecHeader();
+        secHeader.insertSecurityHeader(doc);
+        
+        Document unsignedDoc = wsSign.build(doc, samlAssertion, secHeader);
+
+        String outputString = 
+            XMLUtils.PrettyDocumentToString(unsignedDoc);
+        assertTrue(outputString.contains("AudienceRestriction"));
+        if (LOG.isDebugEnabled()) {
+            LOG.debug(outputString);
+        }
+        
+        verify(unsignedDoc);
+    }
+    
+    /**
+     * Test that creates, sends and processes an unsigned SAML 2 
authentication assertion
+     * with two AudienceRestriction Elements
+     */
+    @org.junit.Test
+    public void testSAML2AudienceRestrictionSeparateRestrictions() throws 
Exception {
+        SAML2CallbackHandler callbackHandler = new SAML2CallbackHandler();
+        callbackHandler.setStatement(SAML2CallbackHandler.Statement.AUTHN);
+        callbackHandler.setIssuer("www.example.com");
+        
+        ConditionsBean conditions = new ConditionsBean();
+        conditions.setTokenPeriodMinutes(5);
+        
+        List<AudienceRestrictionBean> audiencesRestrictions = 
+            new ArrayList<AudienceRestrictionBean>();
+        AudienceRestrictionBean audienceRestrictionBean = new 
AudienceRestrictionBean();
+        
audienceRestrictionBean.setAudienceURIs(Collections.singletonList("http://apache.org/one";));
+        audiencesRestrictions.add(audienceRestrictionBean);
+        
+        audienceRestrictionBean = new AudienceRestrictionBean();
+        
audienceRestrictionBean.setAudienceURIs(Collections.singletonList("http://apache.org/two";));
+        audiencesRestrictions.add(audienceRestrictionBean);
+        
+        conditions.setAudienceRestrictions(audiencesRestrictions);
         
         callbackHandler.setConditions(conditions);
         

Modified: 
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SamlConditionsTest.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SamlConditionsTest.java?rev=1584019&r1=1584018&r2=1584019&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SamlConditionsTest.java
 (original)
+++ 
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SamlConditionsTest.java
 Wed Apr  2 13:11:26 2014
@@ -18,6 +18,7 @@
  */
 package org.apache.wss4j.stax.test.saml;
 
+import org.apache.wss4j.common.saml.bean.AudienceRestrictionBean;
 import org.apache.wss4j.common.saml.bean.ConditionsBean;
 import org.apache.wss4j.common.saml.bean.ProxyRestrictionBean;
 import org.apache.wss4j.common.saml.builder.SAML1Constants;
@@ -50,6 +51,7 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Properties;
 
@@ -397,7 +399,60 @@ public class SamlConditionsTest extends 
             List<String> audiences = new ArrayList<String>();
             audiences.add("http://apache.org/one";);
             audiences.add("http://apache.org/two";);
-            conditions.setAudienceURIs(audiences);
+            AudienceRestrictionBean audienceRestrictionBean = new 
AudienceRestrictionBean();
+            audienceRestrictionBean.setAudienceURIs(audiences);
+            
conditions.setAudienceRestrictions(Collections.singletonList(audienceRestrictionBean));
+            
+            callbackHandler.setConditions(conditions);
+
+            InputStream sourceDocument = 
this.getClass().getClassLoader().getResourceAsStream("testdata/plain-soap-1.1.xml");
+            String action = WSHandlerConstants.SAML_TOKEN_SIGNED;
+            Properties properties = new Properties();
+            properties.put(WSHandlerConstants.SAML_CALLBACK_REF, 
callbackHandler);
+            Document securedDocument = 
doOutboundSecurityWithWSS4J(sourceDocument, action, properties);
+
+            javax.xml.transform.Transformer transformer = 
TRANSFORMER_FACTORY.newTransformer();
+            transformer.transform(new DOMSource(securedDocument), new 
StreamResult(baos));
+        }
+
+        //done signature; now test sig-verification:
+        {
+            WSSSecurityProperties securityProperties = new 
WSSSecurityProperties();
+            
securityProperties.loadSignatureVerificationKeystore(this.getClass().getClassLoader().getResource("receiver.jks"),
 "default".toCharArray());
+            InboundWSSec wsSecIn = WSSec.getInboundWSSec(securityProperties);
+            XMLStreamReader xmlStreamReader = 
wsSecIn.processInMessage(xmlInputFactory.createXMLStreamReader(new 
ByteArrayInputStream(baos.toByteArray())));
+
+            Document document = 
StAX2DOM.readDoc(documentBuilderFactory.newDocumentBuilder(), xmlStreamReader);
+            Assert.assertNotNull(document);
+        }
+    }
+    
+    /**
+     * Test that creates, sends and processes an unsigned SAML 2 
authentication assertion
+     * with two AudienceRestriction Elements
+     */
+    @org.junit.Test
+    public void testSAML2AudienceRestrictionSeparateRestrictions() throws 
Exception {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        {
+            SAML2CallbackHandler callbackHandler = new SAML2CallbackHandler();
+            callbackHandler.setStatement(SAML2CallbackHandler.Statement.AUTHN);
+            callbackHandler.setIssuer("www.example.com");
+
+            ConditionsBean conditions = new ConditionsBean();
+            conditions.setTokenPeriodMinutes(5);
+            
+            List<AudienceRestrictionBean> audiencesRestrictions = 
+                new ArrayList<AudienceRestrictionBean>();
+            AudienceRestrictionBean audienceRestrictionBean = new 
AudienceRestrictionBean();
+            
audienceRestrictionBean.setAudienceURIs(Collections.singletonList("http://apache.org/one";));
+            audiencesRestrictions.add(audienceRestrictionBean);
+
+            audienceRestrictionBean = new AudienceRestrictionBean();
+            
audienceRestrictionBean.setAudienceURIs(Collections.singletonList("http://apache.org/two";));
+            audiencesRestrictions.add(audienceRestrictionBean);
+
+            conditions.setAudienceRestrictions(audiencesRestrictions);
             
             callbackHandler.setConditions(conditions);
 


Reply via email to