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

Reply via email to