Author: coheigea
Date: Fri Feb  1 16:22:05 2013
New Revision: 1441507

URL: http://svn.apache.org/viewvc?rev=1441507&view=rev
Log:
[WSS-420] - Add the ability to explicitly allow/disallow UsernameTokens with no 
passwords

Modified:
    
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/WSSConfig.java
    
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/handler/WSHandler.java
    
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/handler/WSHandlerConstants.java
    
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/message/token/UsernameToken.java
    
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/validate/UsernameTokenValidator.java
    
webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/message/UTDerivedKeyTest.java
    
webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/message/UTSignatureTest.java
    
webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/message/UsernameTokenTest.java

Modified: 
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/WSSConfig.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/WSSConfig.java?rev=1441507&r1=1441506&r2=1441507&view=diff
==============================================================================
--- 
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/WSSConfig.java
 (original)
+++ 
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/WSSConfig.java
 Fri Feb  1 16:22:05 2013
@@ -234,6 +234,13 @@ public class WSSConfig {
     protected String requiredPasswordType = null;
     
     /**
+     * This variable controls whether a UsernameToken with no password element 
is allowed. 
+     * The default value is "false". Set it to "true" to allow deriving keys 
from UsernameTokens 
+     * or to support UsernameTokens for purposes other than authentication.
+     */
+    protected boolean allowUsernameTokenNoPassword = false;
+    
+    /**
      * The time in seconds between creation and expiry for a Timestamp. The 
default
      * is 300 seconds (5 minutes).
      */
@@ -954,5 +961,13 @@ public class WSSConfig {
         }
         return currentProvider.getName();
     }
+
+    public boolean isAllowUsernameTokenNoPassword() {
+        return allowUsernameTokenNoPassword;
+    }
+
+    public void setAllowUsernameTokenNoPassword(boolean 
allowUsernameTokenNoPassword) {
+        this.allowUsernameTokenNoPassword = allowUsernameTokenNoPassword;
+    }
     
 }

Modified: 
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/handler/WSHandler.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/handler/WSHandler.java?rev=1441507&r1=1441506&r2=1441507&view=diff
==============================================================================
--- 
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/handler/WSHandler.java
 (original)
+++ 
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/handler/WSHandler.java
 Fri Feb  1 16:22:05 2013
@@ -292,6 +292,10 @@ public abstract class WSHandler {
         wssConfig.setAllowNamespaceQualifiedPasswordTypes(
             decodeNamespaceQualifiedPasswordTypes(reqData)
         );
+        wssConfig.setAllowUsernameTokenNoPassword(
+            decodeAllowUsernameTokenNoPassword(reqData)
+        );
+        
         wssConfig.setSecretKeyLength(reqData.getSecretKeyLength());
         wssConfig.setWsiBSPCompliant(decodeBSPCompliance(reqData));
         reqData.setWssConfig(wssConfig);
@@ -717,6 +721,14 @@ public abstract class WSHandler {
         );
     }
     
+    protected boolean decodeAllowUsernameTokenNoPassword(
+        RequestData reqData
+        ) throws WSSecurityException {
+        return decodeBooleanConfigValue(
+            reqData, WSHandlerConstants.ALLOW_USERNAMETOKEN_NOPASSWORD, false
+        );
+    }
+
     protected boolean decodeUseEncodedPasswords(RequestData reqData) 
         throws WSSecurityException {
         return decodeBooleanConfigValue(

Modified: 
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/handler/WSHandlerConstants.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/handler/WSHandlerConstants.java?rev=1441507&r1=1441506&r2=1441507&view=diff
==============================================================================
--- 
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/handler/WSHandlerConstants.java
 (original)
+++ 
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/handler/WSHandlerConstants.java
 Fri Feb  1 16:22:05 2013
@@ -368,6 +368,13 @@ public final class WSHandlerConstants {
     public static final String HANDLE_CUSTOM_PASSWORD_TYPES = 
"handleCustomPasswordTypes";
     
     /**
+     * This variable controls whether a UsernameToken with no password element 
is allowed. 
+     * The default value is "false". Set it to "true" to allow deriving keys 
from UsernameTokens 
+     * or to support UsernameTokens for purposes other than authentication.
+     */
+    public static final String ALLOW_USERNAMETOKEN_NOPASSWORD = 
"allowUsernameTokenNoPassword";
+    
+    /**
      * Set the value of this parameter to true to enable strict Username Token 
password type
      * handling. The default value is "false".
      * 

Modified: 
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/message/token/UsernameToken.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/message/token/UsernameToken.java?rev=1441507&r1=1441506&r2=1441507&view=diff
==============================================================================
--- 
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/message/token/UsernameToken.java
 (original)
+++ 
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/message/token/UsernameToken.java
 Fri Feb  1 16:22:05 2013
@@ -414,6 +414,13 @@ public class UsernameToken {
         }
         return password;
     }
+    
+    /**
+     * Return true if this UsernameToken contains a Password element
+     */
+    public boolean containsPasswordElement() {
+        return elementPassword != null;
+    }
 
     /**
      * Get the Salt value of this UsernameToken.

Modified: 
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/validate/UsernameTokenValidator.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/validate/UsernameTokenValidator.java?rev=1441507&r1=1441506&r2=1441507&view=diff
==============================================================================
--- 
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/validate/UsernameTokenValidator.java
 (original)
+++ 
webservices/wss4j/branches/1_6_x-fixes/src/main/java/org/apache/ws/security/validate/UsernameTokenValidator.java
 Fri Feb  1 16:22:05 2013
@@ -206,14 +206,27 @@ public class UsernameTokenValidator impl
     }
     
     /**
-     * Verify a UsernameToken containing no password. This does nothing - but 
is in a separate
-     * method to allow the end-user to override validation easily. 
+     * Verify a UsernameToken containing no password. An exception is thrown 
unless the user
+     * has explicitly allowed this use-case via 
WSHandlerConstants.ALLOW_USERNAMETOKEN_NOPASSWORD
      * @param usernameToken The UsernameToken instance to verify
      * @throws WSSecurityException on a failed authentication.
      */
     protected void verifyUnknownPassword(UsernameToken usernameToken,
                                          RequestData data) throws 
WSSecurityException {
-        //
+        
+        boolean allowUsernameTokenDerivedKeys = false;
+        WSSConfig wssConfig = data.getWssConfig();
+        if (wssConfig != null) {
+            allowUsernameTokenDerivedKeys = 
wssConfig.isAllowUsernameTokenNoPassword();
+        }
+        
+        if (!(allowUsernameTokenDerivedKeys || 
usernameToken.containsPasswordElement())) {
+            if (log.isDebugEnabled()) {
+                log.debug("Authentication failed as the received UsernameToken 
does not "
+                    + "contain any password element");
+            }
+            throw new 
WSSecurityException(WSSecurityException.FAILED_AUTHENTICATION);
+        }
     }
    
 }

Modified: 
webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/message/UTDerivedKeyTest.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/message/UTDerivedKeyTest.java?rev=1441507&r1=1441506&r2=1441507&view=diff
==============================================================================
--- 
webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/message/UTDerivedKeyTest.java
 (original)
+++ 
webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/message/UTDerivedKeyTest.java
 Fri Feb  1 16:22:05 2013
@@ -157,6 +157,13 @@ public class UTDerivedKeyTest extends or
         }
         
         verify(encryptedDoc);
+        
+        try {
+            verify(encryptedDoc, false);
+            fail("Failure expected on deriving keys from a UsernameToken not 
allowed");
+        } catch (WSSecurityException ex) {
+            // expected
+        }
     }
     
     /**
@@ -202,6 +209,7 @@ public class UTDerivedKeyTest extends or
         
         WSSecurityEngine newEngine = new WSSecurityEngine();
         newEngine.getWssConfig().setPasswordsAreEncoded(true);
+        newEngine.getWssConfig().setAllowUsernameTokenNoPassword(true);
         newEngine.processSecurityHeader(
             encryptedDoc, null, new EncodedPasswordCallbackHandler(), null
         );
@@ -403,6 +411,7 @@ public class UTDerivedKeyTest extends or
         
         WSSecurityEngine newEngine = new WSSecurityEngine();
         newEngine.getWssConfig().setPasswordsAreEncoded(true);
+        newEngine.getWssConfig().setAllowUsernameTokenNoPassword(true);
         List<WSSecurityEngineResult> results =  
newEngine.processSecurityHeader(
             signedDoc, null, new EncodedPasswordCallbackHandler(), null
         );
@@ -661,6 +670,7 @@ public class UTDerivedKeyTest extends or
         config.setWsiBSPCompliant(false);
         WSSecurityEngine newEngine = new WSSecurityEngine();
         newEngine.setWssConfig(config);
+        config.setAllowUsernameTokenNoPassword(true);
         newEngine.processSecurityHeader(doc, null, callbackHandler, crypto);
     }
 
@@ -718,6 +728,7 @@ public class UTDerivedKeyTest extends or
         // Turn off BSP compliance and it should work
         WSSConfig config = WSSConfig.getNewInstance();
         config.setWsiBSPCompliant(false);
+        config.setAllowUsernameTokenNoPassword(true);
         WSSecurityEngine newEngine = new WSSecurityEngine();
         newEngine.setWssConfig(config);
         newEngine.processSecurityHeader(doc, null, callbackHandler, crypto);
@@ -781,6 +792,7 @@ public class UTDerivedKeyTest extends or
         // Turn off BSP compliance and it should work
         WSSConfig config = WSSConfig.getNewInstance();
         config.setWsiBSPCompliant(false);
+        config.setAllowUsernameTokenNoPassword(true);
         WSSecurityEngine newEngine = new WSSecurityEngine();
         newEngine.setWssConfig(config);
         newEngine.processSecurityHeader(doc, null, callbackHandler, crypto);
@@ -794,7 +806,17 @@ public class UTDerivedKeyTest extends or
      * @throws java.lang.Exception Thrown when there is a problem in 
verification
      */
     private List<WSSecurityEngineResult> verify(Document doc) throws Exception 
{
+        return verify(doc, true);
+    }
+    
+    private List<WSSecurityEngineResult> verify(
+        Document doc, 
+        boolean allowUsernameTokenDerivedKeys
+    ) throws Exception {
         WSSecurityEngine secEngine = new WSSecurityEngine();
+        WSSConfig config = WSSConfig.getNewInstance();
+        config.setAllowUsernameTokenNoPassword(allowUsernameTokenDerivedKeys);
+        secEngine.setWssConfig(config);
         return secEngine.processSecurityHeader(doc, null, callbackHandler, 
crypto);
     }
 

Modified: 
webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/message/UTSignatureTest.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/message/UTSignatureTest.java?rev=1441507&r1=1441506&r2=1441507&view=diff
==============================================================================
--- 
webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/message/UTSignatureTest.java
 (original)
+++ 
webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/message/UTSignatureTest.java
 Fri Feb  1 16:22:05 2013
@@ -49,7 +49,6 @@ import java.util.List;
 public class UTSignatureTest extends org.junit.Assert {
     private static final org.apache.commons.logging.Log LOG = 
         org.apache.commons.logging.LogFactory.getLog(UTSignatureTest.class);
-    private WSSecurityEngine secEngine = new WSSecurityEngine();
     private CallbackHandler callbackHandler = new 
UsernamePasswordCallbackHandler();
     private Crypto crypto = null;
     
@@ -97,6 +96,13 @@ public class UTSignatureTest extends org
         java.security.Principal principal = 
             (java.security.Principal) 
actionResult.get(WSSecurityEngineResult.TAG_PRINCIPAL);
         assertTrue(principal.getName().indexOf("bob") != -1);
+        
+        try {
+            verify(signedDoc, false);
+            fail("Failure expected on deriving keys from a UsernameToken not 
allowed");
+        } catch (WSSecurityException ex) {
+            // expected
+        }
     }
     
     
@@ -241,6 +247,17 @@ public class UTSignatureTest extends org
      * @throws java.lang.Exception Thrown when there is a problem in 
verification
      */
     private List<WSSecurityEngineResult> verify(Document doc) throws Exception 
{
+        return verify(doc, true);
+    }
+    
+    private List<WSSecurityEngineResult> verify(
+        Document doc, 
+        boolean allowUsernameTokenDerivedKeys
+    ) throws Exception {
+        WSSecurityEngine secEngine = new WSSecurityEngine();
+        WSSConfig config = WSSConfig.getNewInstance();
+        config.setAllowUsernameTokenNoPassword(allowUsernameTokenDerivedKeys);
+        secEngine.setWssConfig(config);
         return secEngine.processSecurityHeader(doc, null, callbackHandler, 
crypto);
     }
 

Modified: 
webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/message/UsernameTokenTest.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/message/UsernameTokenTest.java?rev=1441507&r1=1441506&r2=1441507&view=diff
==============================================================================
--- 
webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/message/UsernameTokenTest.java
 (original)
+++ 
webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/message/UsernameTokenTest.java
 Fri Feb  1 16:22:05 2013
@@ -102,7 +102,6 @@ public class UsernameTokenTest extends o
         + "<value xmlns=\"\">15</value>" + "</add>" 
         + "</SOAP-ENV:Body>\r\n       \r\n" + "</SOAP-ENV:Envelope>";
     
-    private WSSecurityEngine secEngine = new WSSecurityEngine();
     private CallbackHandler callbackHandler = new 
UsernamePasswordCallbackHandler();
 
     /**
@@ -403,7 +402,7 @@ public class UsernameTokenTest extends o
             LOG.debug(outputString);
         }
         
-        List<WSSecurityEngineResult> results = verify(signedDoc);
+        List<WSSecurityEngineResult> results = verify(signedDoc, true);
         WSSecurityEngineResult actionResult =
             WSSecurityUtil.fetchActionResult(results, 
WSConstants.UT_NOPASSWORD);
         UsernameToken receivedToken = 
@@ -429,6 +428,7 @@ public class UsernameTokenTest extends o
                 
org.apache.ws.security.util.XMLUtils.PrettyDocumentToString(signedDoc);
             LOG.debug(outputString);
         }
+        WSSecurityEngine secEngine = new WSSecurityEngine();
         secEngine.processSecurityHeader(doc, null, this, null);
     }
     
@@ -445,6 +445,7 @@ public class UsernameTokenTest extends o
             LOG.debug(outputString);
         }
         
+        WSSecurityEngine secEngine = new WSSecurityEngine();
         secEngine.processSecurityHeader(doc, null, this, null);
     }
     
@@ -470,6 +471,7 @@ public class UsernameTokenTest extends o
             LOG.debug(outputString);
         }
         try {
+            WSSecurityEngine secEngine = new WSSecurityEngine();
             secEngine.processSecurityHeader(signedDoc, null, this, null);
             fail("Custom token types are not permitted");
         } catch (WSSecurityException ex) {
@@ -505,14 +507,9 @@ public class UsernameTokenTest extends o
         //
         WSSConfig cfg = WSSConfig.getNewInstance();
         cfg.setHandleCustomPasswordTypes(true);
+        WSSecurityEngine secEngine = new WSSecurityEngine();
         secEngine.setWssConfig(cfg);
-        verify(signedDoc);
-        
-        //
-        // Go back to default for other tests
-        //
-        cfg.setHandleCustomPasswordTypes(false);
-        secEngine.setWssConfig(cfg);
+        secEngine.processSecurityHeader(doc, null, callbackHandler, null);
     }
     
     
@@ -871,13 +868,21 @@ public class UsernameTokenTest extends o
         newEngine.processSecurityHeader(doc, null, callbackHandler, null);
     }
     
+    private List<WSSecurityEngineResult> verify(Document doc) throws Exception 
{
+        return verify(doc, false);
+    }
+    
     /**
      * Verifies the soap envelope
      * 
      * @param env soap envelope
      * @throws java.lang.Exception Thrown when there is a problem in 
verification
      */
-    private List<WSSecurityEngineResult> verify(Document doc) throws Exception 
{
+    private List<WSSecurityEngineResult> verify(Document doc, boolean 
allowUsernameTokenDerivedKeys) throws Exception {
+        WSSecurityEngine secEngine = new WSSecurityEngine();
+        WSSConfig config = WSSConfig.getNewInstance();
+        config.setAllowUsernameTokenNoPassword(allowUsernameTokenDerivedKeys);
+        secEngine.setWssConfig(config);
         return secEngine.processSecurityHeader(doc, null, callbackHandler, 
null);
     }
     


Reply via email to