Hi Colm,
With the following Callback Handler it is working OK, but still the callback 
handler is called twice for every request. I am not sure why it needs to be 
called twice? and what is the purpose of this extra password?
public void handle(Callback[] callbacks) throws IOException, 
UnsupportedCallbackException {             
System.out.println("=======================");          
System.out.println("Handle - Callback length = " + callbacks.length);           
System.out.println("=======================");          System.out.flush();     
   for (int i = 0; i < callbacks.length; i++) {            WSPasswordCallback 
pc = (WSPasswordCallback)callbacks[i];
                        String id = pc.getIdentifier();         String pass = 
passwords.get(id);                if (pass == null) {                     pass 
= "doNotKnowWhyThisIsRequired";            }
                                     if (pass == null) {                throw 
new SecurityException ("The UsernameToken '"+pc.getIdentifier()+"' can not be 
authenticated.");            }            else if (pass != null) {              
  pc.setPassword(pass);                return;            }        }
        //        // Password not found        //        throw new 
IOException();    }

Thanks,Venkat

From: [email protected]
To: [email protected]
Subject: RE: WSS4JStax interceptor issues in Apache CXF 3.0.0
Date: Wed, 10 Sep 2014 17:04:18 +0000




With the Callback Handler code given below it is resulting in same error for 
every request.
public void handle(Callback[] callbacks) throws IOException, 
UnsupportedCallbackException {        for (int i = 0; i < callbacks.length; 
i++) {            WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];
            String pass = passwords.get(pc.getIdentifier());                    
   if (pass == null) {                throw new SecurityException ("The 
UsernameToken '"+pc.getIdentifier()+"' can not be authenticated.");            
}            else if (pass != null) {                pc.setPassword(pass);      
          return;            }        }
        //        // Password not found        //        throw new 
IOException();    }
Thanks,Venkat
Date: Wed, 10 Sep 2014 14:42:52 +0100
Subject: Re: WSS4JStax interceptor issues in Apache CXF 3.0.0
From: [email protected]
To: [email protected]


You can test by checking out the latest WSS4J + CXF sources + building them 
locally (or waiting until the SNAPSHOTS have deployed to Maven). It's a minor 
issue though...why do you need the fix? It just accepts the CallbackHandler for 
a password + proceeds as normal after that.

Colm.

On Wed, Sep 10, 2014 at 2:41 PM, venkatesham nalla <[email protected]> wrote:
Hi Colm,
Thanks for the update. How can I get the updated code?

ThxVenkat Nalla
On Sep 10, 2014, at 5:43 AM, "Colm O hEigeartaigh" <[email protected]> wrote:


I took another look at this issue. The reason the CallbackHandler is being 
called twice, once without an identifier, is that the JasyptPasswordEncryptor 
asks the CallbackHandler for a password on startup. The JasyptPasswordEncryptor 
is a new feature in WSS4J 2.0.0, which allows you to have encrypted passwords 
in Crypto properties files. I have merged a fix to WSS4J to only query the 
CallbackHandler for a password when it is actually needed. 

Colm.

On Fri, Aug 22, 2014 at 8:50 AM, Colm O hEigeartaigh <[email protected]> 
wrote:

The logging issue is an interceptor ordering issue that Dan has just fixed on 
trunk. With regards to the password callback issue, could you create a 
test-case that I could take a look at? I don't see anything obviously wrong in 
the code you pasted.


Colm.


On Thu, Aug 21, 2014 at 7:16 PM, venkatesham nalla <[email protected]> wrote:

Hi Colm,

I have tested with CXF 3.0.1 as well and results are same.The SOAP Request and 
Password Callback code are included below.

Yes I have enabled the logging, which does not log outbound message on the 
client side when WSS4JStaxOutInterceptor is used. However the inbound message 
is getting logged.

SOAP Request:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/";>  
<soap:Header>           <wsse:Security 
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
 soap:mustUnderstand="1">                  <wsse:UsernameToken 
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
 wsu:Id="G0174fea5-ef7f-435e-8d5f-36a3143ffaa4">                              
<wsse:Username>theUserName</wsse:Username>                              
<wsse:Password 
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText";>thePassword</wsse:Password>
                       </wsse:UsernameToken>           </wsse:Security>        
</soap:Header>  <soap:Body>             <TwowayStructStringRequest 
xmlns="http://test.com/struct/xsd";>                  <PerfStructStringArrayVal> 
                             <Item>                                  
<StringVal>String</StringVal>                                   
<DoubleVal>18446744073709551616</DoubleVal>                                     
<FloatVal>4294967296</FloatVal>                                 
<CharVal>a</CharVal>                                    
<LongVal>4294967296</LongVal>                                   
<ShortVal>65536</ShortVal>                              </Item>                 
</PerfStructStringArrayVal>             </TwowayStructStringRequest>    
</soap:Body></soap:Envelope>


Password Callback Code (this code works with WS-SecurityPolicy as well as WSS4J 
old interceptors.

public class ServerPasswordCallback implements CallbackHandler {

    private Map<String, String> passwords =        new HashMap<String, 
String>();

    public ServerPasswordCallback() {        passwords.put("theUserName", 
"thePassword");        passwords.put("abcd", "dcba");    }

    /**     * Here, we attempt to get the password from the private     * 
alias/passwords map.     */    public void handle(Callback[] callbacks) throws 
IOException, UnsupportedCallbackException {        for (int i = 0; i < 
callbacks.length; i++) {            WSPasswordCallback pc = 
(WSPasswordCallback)callbacks[i];


            String pass = passwords.get(pc.getIdentifier());                    
  if (pass == null) {                throw new SecurityException ("The 
UsernameToken '"+pc.getIdentifier()+"' can not be authenticated.");            
}            else if (pass != null) {                pc.setPassword(pass);      
          return;            }        }


        //        // Password not found        //        throw new 
IOException();    }

    /**     * Add an alias/password pair to the callback mechanism.     */    
public void setAliasPassword(String alias, String password) {        
passwords.put(alias, password);    }}

Client configuration with WSS4JStaxOutInterceptor:

<jaxws:client name="..." createdFromAPI="true">         <jaxws:outInterceptors> 
                                        <bean 
class="org.apache.cxf.ws.security.wss4j.WSS4JStaxOutInterceptor">               
          <constructor-arg>                                       <map>         
                                  <entry key="action" value="UsernameToken"/>   
                                          <entry key="user" 
value="theUserName"/>                                         <entry 
key="passwordType" value="PasswordText"/>                                       
         <entry key="passwordCallbackRef" value-ref="clientCallback"/>          
                         </map>                          </constructor-arg>     
                 </bean>         </jaxws:outInterceptors>        
</jaxws:client> <bean id="clientCallback" 
class="com.att.cio.rpcperf.client.ClientPasswordCallback"/>   <cxf:bus>         
      <cxf:features>                  <cxf:logging/>                            
      </cxf:features> </cxf:bus>


Thanks,Venkat



> Date: Thu, 21 Aug 2014 16:33:03 +0100

> Subject: Re: WSS4JStax interceptor issues in Apache CXF 3.0.0

> From: [email protected]

> To: [email protected]

>

> Hi,

>

> > 1)      The client with WSS4JStaxOutInterceptor (WSS4J-2.0.0) is not

> working. It is throwing the exception.

>

> It was a bug in WSS4J 2.0.0 (SOAP schemas were not included), fixed in

> WSS4J 2.0.1.

>

> > 2)      I replaced the WSS4J 2.0.0 jar’s with WSS4J 2.0.1 jar and the

> client side works fine. However with 2.0.0 and 2.0.1 the server > side code

> was not getting the User Name in password callback handler when

> WSS4JStaxInInterceptor used, basically

> > “getIdentifier” method returns an empty string. Everything works fine

> with old WSS4J interceptors as well as WS-SecurityPolicy.

>

> This seems odd. Could you paste in what the UsernameToken from the message

> looks like, what the CallbackHandler implementation looks like?

>

> > 3)      WSS4JStaxOutInterceptor does not log the outbound message when

> the logging enabled.

>

> Do you mean that if you enable the CXF logging interceptors, it doesn't log

> the message? WSS4JStaxOutInterceptor itself doesn't log the message.

>

> Colm.

>

> On Wed, Aug 20, 2014 at 7:22 PM, NALLA, VENKAT <[email protected]> wrote:

>

> >  Hi Colm,

> >

> >

> >

> > I am using Apache CXF version 3.0.0 and testing JAX-WS services with

> > WS-Security UsernameToken profile with plain password, and running in to

> > following issues. Appreciate if you could help in resolving these issues.

> >

> >

> >

> > 1)      The client with WSS4JStaxOutInterceptor (WSS4J-2.0.0) is not

> > working. It is throwing the exception.

> >

> > a.       Exception using Oracle JDK 7 on Windows 7 desktop in the

> > attached file “OracleJDK7WSS4J-2.0.0-ClientException on Win7.txt”

> >

> > b.      Exception using IBM JDK 7 on AIX in the attached file

> > “IBMJDK7-WSS4j-2.0.0ClientException on AIX.txt”

> >

> >

> >

> > 2)      I replaced the WSS4J 2.0.0 jar’s with WSS4J 2.0.1 jar and the

> > client side works fine. However with 2.0.0 and 2.0.1 the server side code

> > was not getting the User Name in password callback handler when

> > WSS4JStaxInInterceptor used, basically “getIdentifier” method returns an

> > empty string. Everything works fine with old WSS4J interceptors as well as

> > WS-SecurityPolicy.

> >

> > 3)      WSS4JStaxOutInterceptor does not log the outbound message when

> > the logging enabled.

> >

> >

> >

> > The server configuration:

> >

> >                 <jaxws:endpoint name="…" createdFromAPI="true">

> >

> >                                 <jaxws:inInterceptors>

> >

> >

> >

> >                                                 <bean class="

> > org.apache.cxf.ws.security.wss4j.WSS4JStaxInInterceptor">

> >

> >                                                                 <

> > constructor-arg>

> >

> >

> > <map>

> >

> >

> > <entry key="action" value="UsernameToken"/>

> >

> >

> > <entry key="passwordType" value="PasswordText"/>

> >

> >

> > <entry key="passwordCallbackClass" value="...ServerPasswordCallback"/>

> >

> >

> > </map>

> >

> >                                                                 </

> > constructor-arg>

> >

> >                                                 </bean>

> >

> >                                 </jaxws:inInterceptors>

> >

> >                 </jaxws:endpoint>

> >

> >

> >

> > Thanks,

> >

> > Venkat

> >

> > --

> > Colm O hEigeartaigh

> >

> > Talend Community Coder

> > http://coders.talend.com

> >

> >

                                          

-- 
Colm O hEigeartaigh

Talend Community Coder
http://coders.talend.com




-- 
Colm O hEigeartaigh

Talend Community Coder
http://coders.talend.com




-- 
Colm O hEigeartaigh

Talend Community Coder
http://coders.talend.com

                                                                                
  

Reply via email to