Hi Colm,
Just to add more things, if cxf client with CXFAuthenticator is running in
a container(tomcat,glassfish, wildfly or osgi container karaf ?) , the
upgrade
will get this not working. I already fixed this issue
https://issues.apache.org/jira/browse/CXF-8378 in master and 3.3.x branch.
Where can we add
some note and let the community know this backward compatible issue in
3.3.8 and 3.4.1 ?

Cheers,
Jim


On Mon, Nov 23, 2020 at 3:58 PM Jim Ma <mail2ji...@gmail.com> wrote:

> Hi Colm,
> I think this commit [1] caused the regression.   We have some tests for
> CXFAuthenticator in CXF, but they are running
> with the single "flat" classloader and don't throw this exception.
>
> [1]
> https://github.com/apache/cxf/commit/58539be7c6367b0e7db354cd90467fe006ddef57
>
> Cheers,
> Jim
>
> On Fri, Nov 20, 2020 at 10:08 PM Colm O hEigeartaigh <cohei...@apache.org>
> wrote:
>
>> Hi Jim,
>>
>> Do you know which CXF commit caused the regression. Do we have no tests
>> for CXFAuthenticator?
>>
>> Colm.
>>
>> On Fri, Nov 20, 2020 at 11:19 AM Jim Ma <mail2ji...@gmail.com> wrote:
>>
>>> When upgrade cxf to 3.3.8/3.4.1, the cxf client with
>>> CXFAuthenticator throws NoClassDefFoundError like following :
>>> java.lang.NoClassDefFoundError: org/apache/cxf/common/util/ReflectionUtil
>>> at
>>>
>>> org.apache.cxf.transport.http.ReferencingAuthenticator.tryWith(ReferencingAuthenticator.java:125)
>>>
>>> at
>>>
>>> org.apache.cxf.transport.http.ReferencingAuthenticator.getPasswordAuthentication(ReferencingAuthenticator.java:58)
>>>
>>> at
>>>
>>> java.net.Authenticator.requestPasswordAuthentication(Authenticator.java:317)
>>>
>>> at
>>>
>>> sun.net.www.protocol.http.HttpURLConnection$1.run(HttpURLConnection.java:453)
>>>
>>> at
>>>
>>> sun.net.www.protocol.http.HttpURLConnection$1.run(HttpURLConnection.java:448)
>>>
>>> at java.security.AccessController.doPrivileged(Native Method)
>>> at
>>>
>>> sun.net.www.protocol.http.HttpURLConnection.privilegedRequestPasswordAuthentication(HttpURLConnection.java:447)
>>>
>>> at
>>>
>>> sun.net.www.protocol.http.HttpURLConnection.getServerAuthentication(HttpURLConnection.java:2439)
>>>
>>> at
>>>
>>> sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1737)
>>>
>>> at
>>>
>>> sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
>>>
>>> at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
>>> at
>>>
>>> org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream$2.run(URLConnectionHTTPConduit.java:377)
>>>
>>> at
>>>
>>> org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream$2.run(URLConnectionHTTPConduit.java:373)
>>>
>>> at java.security.AccessController.doPrivileged(Native Method)
>>> at
>>>
>>> org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getResponseCode(URLConnectionHTTPConduit.java:373)
>>>
>>> at
>>>
>>> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.doProcessResponseCode(HTTPConduit.java:1597)
>>>
>>> at
>>>
>>> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1625)
>>>
>>> at
>>>
>>> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1570)
>>>
>>> at
>>>
>>> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1371)
>>>
>>> at
>>> org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
>>> at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:671)
>>> at
>>>
>>> org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:63)
>>>
>>> at
>>>
>>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
>>>
>>> at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530)
>>> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:441)
>>> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:356)
>>> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:314)
>>> at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
>>> at
>>> org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:140)
>>>
>>> From debug, it turns out ReferencingAuthenticator has to load another new
>>> added class ReflectionUtil to do some security check in CXF 3.3.8 and CXF
>>> 3.4.1.
>>> But the ReferenceingAuthenticator is very special class which is loaded
>>> with a new created URLClassloader
>>> (code with  "new URLClassLoader(new URL[0], ClassLoader
>>> .getSystemClassLoader()") to avoid some
>>> classloader leakage issue (see
>>> https://issues.apache.org/jira/browse/CXF-4529). Hence, this
>>> ReflectionUtil
>>> always
>>> fails to load and throws this exception. Fixing this issue is simple, we
>>> only need to add doPrivileged blocks in this class without introducing
>>> ReflectionUtil.
>>> I already sent a PR to fix this issue :
>>> https://github.com/apache/cxf/pull/728.
>>>
>>> This issue looks like a backward compatible one and the upgrade will fail
>>> the cxf client with CXFAuthenticator.
>>> Should we release the next minor soon to include this fix?
>>>
>>> Cheers,
>>> Jim
>>>
>>

Reply via email to