Author: coheigea
Date: Fri Sep 19 03:16:09 2008
New Revision: 697031

URL: http://svn.apache.org/viewvc?rev=697031&view=rev
Log:
[WSS-141] - A fix for the UsernameTokenProcessor leaking information about 
usernames
 - It just logs the error message now, instead of throwing an exception with it
 - the exception just returns a generic access denied error
 - Added a test, and fixed some of the other Username Token tests.


Modified:
    
webservices/wss4j/trunk/src/org/apache/ws/security/processor/UsernameTokenProcessor.java
    webservices/wss4j/trunk/test/wssec/TestWSSecurityNew5.java

Modified: 
webservices/wss4j/trunk/src/org/apache/ws/security/processor/UsernameTokenProcessor.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/processor/UsernameTokenProcessor.java?rev=697031&r1=697030&r2=697031&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/org/apache/ws/security/processor/UsernameTokenProcessor.java
 (original)
+++ 
webservices/wss4j/trunk/src/org/apache/ws/security/processor/UsernameTokenProcessor.java
 Fri Sep 19 03:16:09 2008
@@ -121,8 +121,10 @@
                 log.debug("UsernameToken callback password " + origPassword);
             }
             if (origPassword == null) {
-                throw new WSSecurityException(WSSecurityException.FAILURE,
-                        "noPassword", new Object[]{user});
+                if (log.isDebugEnabled()) {
+                    log.debug("Callback supplied no password for: " + user);
+                }
+                throw new 
WSSecurityException(WSSecurityException.FAILED_AUTHENTICATION);
             }
             String passDigest = UsernameToken.doPasswordDigest(nonce, 
createdTime, origPassword);
             if (!passDigest.equals(password)) {

Modified: webservices/wss4j/trunk/test/wssec/TestWSSecurityNew5.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/test/wssec/TestWSSecurityNew5.java?rev=697031&r1=697030&r2=697031&view=diff
==============================================================================
--- webservices/wss4j/trunk/test/wssec/TestWSSecurityNew5.java (original)
+++ webservices/wss4j/trunk/test/wssec/TestWSSecurityNew5.java Fri Sep 19 
03:16:09 2008
@@ -147,6 +147,44 @@
     }
     
     /**
+     * Test that a bad username with password digest does not leak whether the 
username
+     * is valid or not - see WSS-141.
+     */
+    public void testUsernameTokenBadUsername() throws Exception {
+        WSSecUsernameToken builder = new WSSecUsernameToken();
+        builder.setUserInfo("badusername", "verySecret");
+        log.info("Before adding UsernameToken PW Digest....");
+        Document doc = unsignedEnvelope.getAsDocument();
+        WSSecHeader secHeader = new WSSecHeader();
+        secHeader.insertSecurityHeader(doc);
+        Document signedDoc = builder.build(doc, secHeader);
+
+        /*
+         * convert the resulting document into a message first. The 
toAxisMessage()
+         * method performs the necessary c14n call to properly set up the 
signed
+         * document and convert it into a SOAP message. After that we extract 
it
+         * as a document again for further processing.
+         */
+
+        Message signedMsg = SOAPUtil.toAxisMessage(signedDoc);
+        if (log.isDebugEnabled()) {
+            log.debug("Message with UserNameToken PW Digest:");
+            
XMLUtils.PrettyElementToWriter(signedMsg.getSOAPEnvelope().getAsDOM(), new 
PrintWriter(System.out));
+        }
+        signedDoc = signedMsg.getSOAPEnvelope().getAsDocument();
+        log.info("After adding UsernameToken PW Digest....");
+        try {
+            verify(signedDoc);
+            throw new Exception("Failure expected on a bad username");
+        } catch (WSSecurityException ex) {
+            String message = ex.getMessage();
+            assertTrue(message.indexOf("badusername") == -1);
+            assertTrue(ex.getErrorCode() == 
WSSecurityException.FAILED_AUTHENTICATION);
+            // expected
+        }
+    }
+    
+    /**
      * Test that adds a UserNameToken with a bad password Digest to a 
WS-Security envelope
      * <p/>
      */
@@ -175,6 +213,7 @@
         log.info("After adding UsernameToken PW Digest....");
         try {
             verify(signedDoc);
+            throw new Exception("Failure expected on a bad password digest");
         } catch (WSSecurityException ex) {
             assertTrue(ex.getErrorCode() == 
WSSecurityException.FAILED_AUTHENTICATION);
             // expected
@@ -227,6 +266,7 @@
         
         try {
             verify(signedDoc);
+            throw new Exception("Failure expected on a bad password text");
         } catch (WSSecurityException ex) {
             assertTrue(ex.getErrorCode() == 
WSSecurityException.FAILED_AUTHENTICATION);
             // expected
@@ -265,14 +305,14 @@
     }
     
     /**
-     * Test with a null token type. This will pass as the WSSConfig is 
configured to 
+     * Test with a null password type. This will pass as the WSSConfig is 
configured to 
      * handle custom token types.
      * <p/>
      */
     public void testUsernameTokenCustomPass() throws Exception {
         WSSecUsernameToken builder = new WSSecUsernameToken();
         builder.setPasswordType(null);
-        builder.setUserInfo("wernerd", null);
+        builder.setUserInfo("customUser", null);
         
         Document doc = unsignedEnvelope.getAsDocument();
         WSSecHeader secHeader = new WSSecHeader();
@@ -410,9 +450,15 @@
                     pc.setPassword("verySecret");
                 } else if (
                     pc.getUsage() == WSPasswordCallback.USERNAME_TOKEN_UNKNOWN
-                    && "wernerd".equals(pc.getIdentifer())
-                    && "verySecret".equals(pc.getPassword())) {
-                    return;
+                ) {
+                    if ("wernerd".equals(pc.getIdentifer())
+                        && "verySecret".equals(pc.getPassword())) {
+                        return;
+                    } else if ("customUser".equals(pc.getIdentifer())) {
+                        return;
+                    } else {
+                        throw new IOException("Authentication failed");
+                    }
                 }
             } else {
                 throw new UnsupportedCallbackException(callbacks[i], 
"Unrecognized Callback");



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to