You are viewing a plain text version of this content. The canonical link for it is here.
Posted to wss4j-dev@ws.apache.org by co...@apache.org on 2010/09/12 14:07:51 UTC

svn commit: r996298 - in /webservices/wss4j/branches/1_5_x-fixes: src/org/apache/ws/security/handler/WSHandler.java test/wssec/MyHandler.java test/wssec/TestWSSecurityWSS245.java

Author: coheigea
Date: Sun Sep 12 12:07:50 2010
New Revision: 996298

URL: http://svn.apache.org/viewvc?rev=996298&view=rev
Log:
[WSS-245] - WSHandlerConstants.PW_CALLBACK_REF isn't correctly searched for
 - Test added as well.

Added:
    webservices/wss4j/branches/1_5_x-fixes/test/wssec/TestWSSecurityWSS245.java
Modified:
    webservices/wss4j/branches/1_5_x-fixes/src/org/apache/ws/security/handler/WSHandler.java
    webservices/wss4j/branches/1_5_x-fixes/test/wssec/MyHandler.java

Modified: webservices/wss4j/branches/1_5_x-fixes/src/org/apache/ws/security/handler/WSHandler.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/branches/1_5_x-fixes/src/org/apache/ws/security/handler/WSHandler.java?rev=996298&r1=996297&r2=996298&view=diff
==============================================================================
--- webservices/wss4j/branches/1_5_x-fixes/src/org/apache/ws/security/handler/WSHandler.java (original)
+++ webservices/wss4j/branches/1_5_x-fixes/src/org/apache/ws/security/handler/WSHandler.java Sun Sep 12 12:07:50 2010
@@ -817,27 +817,35 @@ public abstract class WSHandler {
             RequestData reqData
     ) throws WSSecurityException {
         WSPasswordCallback pwCb = null;
-        CallbackHandler cbHandler = null;
-        String err = "provided null or empty password";
         Object mc = reqData.getMsgContext();
         String callback = getString(clsProp, mc);
-        if (callback != null) { // we have a password callback class
+        
+        if (callback != null) { 
+            // we have a password callback class
             pwCb = readPwViaCallbackClass(callback, username, doAction, reqData);
-            // Null passwords are not always a problem: if the callback was called to provide a username instead.
-        } else if ((cbHandler = (CallbackHandler) getProperty(mc, refProp)) != null) {
-            pwCb = performCallback(cbHandler, username, doAction);
         } else {
-            //
-            // If a callback isn't configured then try to get the password
-            // from the message context
-            //
-            String password = getPassword(mc);
-            if (password == null) {
-                throw new WSSecurityException("WSHandler: application " + err);
+            // Try to obtain a password callback class from the message context or handler options
+            CallbackHandler cbHandler = (CallbackHandler) getOption(refProp);
+            if (cbHandler == null) {
+                cbHandler = (CallbackHandler) getProperty(mc, refProp);
+            }
+            if (cbHandler != null) {
+                pwCb = performCallback(cbHandler, username, doAction);
+            } else {
+                //
+                // If a callback isn't configured then try to get the password
+                // from the message context
+                //
+                String password = getPassword(mc);
+                if (password == null) {
+                    String err = "provided null or empty password";
+                    throw new WSSecurityException("WSHandler: application " + err);
+                }
+                pwCb = constructPasswordCallback(username, doAction);
+                pwCb.setPassword(password);
             }
-            pwCb = constructPasswordCallback(username, doAction);
-            pwCb.setPassword(password);
         }
+        
         return pwCb;
     }
 

Modified: webservices/wss4j/branches/1_5_x-fixes/test/wssec/MyHandler.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/branches/1_5_x-fixes/test/wssec/MyHandler.java?rev=996298&r1=996297&r2=996298&view=diff
==============================================================================
--- webservices/wss4j/branches/1_5_x-fixes/test/wssec/MyHandler.java (original)
+++ webservices/wss4j/branches/1_5_x-fixes/test/wssec/MyHandler.java Sun Sep 12 12:07:50 2010
@@ -23,15 +23,25 @@ import org.apache.ws.security.handler.WS
 import org.apache.ws.security.handler.RequestData;
 import org.w3c.dom.Document;
 
+import java.util.HashMap;
+import java.util.Map;
+
 
 /**
  * A trivial extension of the WSHandler type for use in unit-testing.
  */
 public class MyHandler extends WSHandler {
+    
+    private Map optionsMap = new HashMap();
 
     public Object 
     getOption(String key) {
-        return null;
+        return optionsMap.get(key);
+    }
+    
+    public void
+    setOption(String key, Object option) {
+        optionsMap.put(key, option);
     }
 
     public void 

Added: webservices/wss4j/branches/1_5_x-fixes/test/wssec/TestWSSecurityWSS245.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/branches/1_5_x-fixes/test/wssec/TestWSSecurityWSS245.java?rev=996298&view=auto
==============================================================================
--- webservices/wss4j/branches/1_5_x-fixes/test/wssec/TestWSSecurityWSS245.java (added)
+++ webservices/wss4j/branches/1_5_x-fixes/test/wssec/TestWSSecurityWSS245.java Sun Sep 12 12:07:50 2010
@@ -0,0 +1,212 @@
+/**
+ * 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 wssec;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.apache.axis.Message;
+import org.apache.axis.MessageContext;
+import org.apache.axis.client.AxisClient;
+import org.apache.axis.configuration.NullProvider;
+import org.apache.axis.message.SOAPEnvelope;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ws.security.WSPasswordCallback;
+import org.apache.ws.security.WSConstants;
+import org.apache.ws.security.WSSConfig;
+import org.apache.ws.security.handler.WSHandler;
+import org.apache.ws.security.handler.RequestData;
+import org.apache.ws.security.handler.WSHandlerConstants;
+import org.w3c.dom.Document;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.UnsupportedCallbackException;
+
+
+/**
+ * Test case for WSS-245 - "WSHandlerConstants.PW_CALLBACK_REF isn't correctly searched for"
+ *
+ * https://issues.apache.org/jira/browse/WSS-245
+ */
+public class TestWSSecurityWSS245 extends TestCase {
+    private static final Log LOG = LogFactory.getLog(TestWSSecurityWSS245.class);
+    private static final String SOAPMSG = 
+        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
+        + "<SOAP-ENV:Envelope "
+        +   "xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" "
+        +   "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "
+        +   "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" 
+        +   "<SOAP-ENV:Body>" 
+        +       "<add xmlns=\"http://ws.apache.org/counter/counter_port_type\">" 
+        +           "<value xmlns=\"\">15</value>" 
+        +       "</add>" 
+        +   "</SOAP-ENV:Body>" 
+        + "</SOAP-ENV:Envelope>";
+
+    private MessageContext msgContext;
+    private SOAPEnvelope unsignedEnvelope;
+
+    /**
+     * TestWSSecurity constructor
+     * <p/>
+     * 
+     * @param name name of the test
+     */
+    public TestWSSecurityWSS245(String name) {
+        super(name);
+    }
+
+    /**
+     * JUnit suite
+     * <p/>
+     * 
+     * @return a junit test suite
+     */
+    public static Test suite() {
+        return new TestSuite(TestWSSecurityWSS245.class);
+    }
+
+    /**
+     * Setup method
+     * <p/>
+     * 
+     * @throws java.lang.Exception Thrown when there is a problem in setup
+     */
+    protected void setUp() throws Exception {
+        AxisClient tmpEngine = new AxisClient(new NullProvider());
+        msgContext = new MessageContext(tmpEngine);
+        unsignedEnvelope = getSOAPEnvelope();
+    }
+
+    /**
+     * Constructs a soap envelope
+     * <p/>
+     * 
+     * @return soap envelope
+     * @throws java.lang.Exception if there is any problem constructing the soap envelope
+     */
+    protected SOAPEnvelope getSOAPEnvelope() throws Exception {
+        InputStream in = new ByteArrayInputStream(SOAPMSG.getBytes());
+        Message msg = new Message(in);
+        msg.setMessageContext(msgContext);
+        return msg.getSOAPEnvelope();
+    }
+
+    /**
+     * A test for {@link WSHandler#getPassword(String, int, String, String, RequestData)},
+     * where the password is obtained from a Callback Handler, which is placed on the 
+     * Message Context using a reference.
+     */
+    public void
+    testMessageContextRef() throws Exception {
+        
+        final WSSConfig cfg = WSSConfig.getNewInstance();
+        final RequestData reqData = new RequestData();
+        reqData.setWssConfig(cfg);
+        reqData.setUsername("bob");
+        reqData.setPwType(WSConstants.PASSWORD_TEXT);
+        java.util.Map messageContext = new java.util.TreeMap();
+        messageContext.put(
+            WSHandlerConstants.PW_CALLBACK_REF, 
+            new MyCallbackHandler()
+        );
+        reqData.setMsgContext(messageContext);
+        
+        final java.util.Vector actions = new java.util.Vector();
+        actions.add(new Integer(WSConstants.UT));
+        Document doc = unsignedEnvelope.getAsDocument();
+        MyHandler handler = new MyHandler();
+        handler.send(
+            WSConstants.UT, 
+            doc, 
+            reqData, 
+            actions,
+            true
+        );
+        
+        String outputString = 
+            org.apache.ws.security.util.XMLUtils.PrettyDocumentToString(doc);
+        if (LOG.isDebugEnabled()) {
+            LOG.debug(outputString);
+        }
+        assertTrue(outputString.indexOf("bob") != -1);
+        assertTrue(outputString.indexOf("securityPassword") != -1);
+    }
+    
+    /**
+     * A test for {@link WSHandler#getPassword(String, int, String, String, RequestData)},
+     * where the password is obtained from a Callback Handler, which is obtained from the
+     * handler options using a ref.
+     */
+    public void
+    testHandlerOptionRef() throws Exception {
+        
+        final WSSConfig cfg = WSSConfig.getNewInstance();
+        final RequestData reqData = new RequestData();
+        reqData.setWssConfig(cfg);
+        reqData.setUsername("bob");
+        reqData.setPwType(WSConstants.PASSWORD_TEXT);
+        reqData.setMsgContext(new java.util.TreeMap());
+        
+        final java.util.Vector actions = new java.util.Vector();
+        actions.add(new Integer(WSConstants.UT));
+        Document doc = unsignedEnvelope.getAsDocument();
+        MyHandler handler = new MyHandler();
+        handler.setOption(WSHandlerConstants.PW_CALLBACK_REF, new MyCallbackHandler());
+        handler.send(
+            WSConstants.UT, 
+            doc, 
+            reqData, 
+            actions,
+            true
+        );
+        
+        String outputString = 
+            org.apache.ws.security.util.XMLUtils.PrettyDocumentToString(doc);
+        if (LOG.isDebugEnabled()) {
+            LOG.debug(outputString);
+        }
+        assertTrue(outputString.indexOf("bob") != -1);
+        assertTrue(outputString.indexOf("securityPassword") != -1);
+    }
+    
+    public static class MyCallbackHandler implements CallbackHandler {
+        public void handle(Callback[] callbacks)
+            throws IOException, UnsupportedCallbackException {
+            for (int i = 0; i < callbacks.length; i++) {
+                if (callbacks[i] instanceof WSPasswordCallback) {
+                    WSPasswordCallback pc = (WSPasswordCallback) callbacks[i];
+                    if (pc.getIdentifier() == "bob") {
+                        pc.setPassword("securityPassword");
+                    }
+                } else {
+                    throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback");
+                }
+            }
+        }
+    }
+    
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: wss4j-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: wss4j-dev-help@ws.apache.org