[ 
https://issues.apache.org/jira/browse/WSS-702?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Colm O hEigeartaigh resolved WSS-702.
-------------------------------------
    Resolution: Fixed

> Process hangs when a signature is added and server not reachable
> ----------------------------------------------------------------
>
>                 Key: WSS-702
>                 URL: https://issues.apache.org/jira/browse/WSS-702
>             Project: WSS4J
>          Issue Type: Bug
>    Affects Versions: 3.0.1
>         Environment: Linux Debian
> JDK 17
> Apache CXF 4.0.2
> WSS4j 3.0.1 (and also 3.0.0)
>            Reporter: Cedric Tabin
>            Assignee: Colm O hEigeartaigh
>            Priority: Major
>         Attachments: sample.zip
>
>
> Hello,
> We are using wss4j with the Apache CXF library to connect to a SOAP web 
> service. The latter has some security-enabled methods which involves 
> signature and encryption.
> When writing the unit tests related to this, we hit a strange problem: if the 
> signature is enabled (through `WSS4JOutInterceptor`), then the process hangs 
> indefinitely during marshalling without any exception regardless of any 
> timeout set in the configuration (although a "Connection refused" exception 
> should have been thrown right away since we are pointing to localhost:1234 
> but this is the case for any host).
> The main problem is if there is any connection issue on the client side and 
> the server is unreachable, the process will wait forever.
> Here is the code snipped involved:
> {code:java}
> final ClientImpl client = (ClientImpl) ClientProxy.getClient(port);
> //url points to localhost:1234 on which nothing is listening => connection 
> should be refused immediately
> client.getRequestContext().put(Message.ENDPOINT_ADDRESS, url);
> client.setThreadLocalRequestContext(true);
> client.setSynchronousTimeout(10000);
> final HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
> HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
> httpClientPolicy.setReceiveTimeout(1200000);
> httpClientPolicy.setAllowChunking(true);
> httpClientPolicy.setMaxRetransmits(0);
> httpConduit.setClient(httpClientPolicy);
> TLSClientParameters tlsClientParameters = new TLSClientParameters();
> tlsClientParameters.setSecureSocketProtocol("TLSv1.3");
> tlsClientParameters.setDisableCNCheck(true);
> httpConduit.setTlsClientParameters(tlsClientParameters);
> {    
>     WSEncryptionPart sigTimestamp = new WSEncryptionPart("Timestamp", 
> WSConstants.WSU_NS, "");   
>     WSEncryptionPart sigBody = new WSEncryptionPart("Body", 
> WSConstants.URI_SOAP11_ENV, "");       
>     SignatureActionToken erpSignature = new SignatureActionToken();
>     erpSignature.setUser(getSignatureUser());      
>     erpSignature.setCryptoProperties(getOutSecurityPropFile());    
>     erpSignature.setKeyIdentifierId(WSConstants.BST_DIRECT_REFERENCE);   
>     erpSignature.setSignatureAlgorithm(WSConstants.RSA_SHA256);   
>     erpSignature.setDigestAlgorithm(WSConstants.SHA256);    
>     erpSignature.setParts(Arrays.asList(sigTimestamp, sigBody));
>     List<HandlerAction> actions = new ArrayList<>();    
>     actions.add(new HandlerAction(WSConstants.TS, null));    
>     actions.add(new HandlerAction(WSConstants.SIGN, erpSignature));    
>     Map<String, Object> properties = getOutSecurityProperties();
>     properties.put(WSHandlerConstants.HANDLER_ACTIONS, actions);    
>     ExtensibleWSS4JOutInterceptor wss4JOutInterceptor = new 
> ExtensibleWSS4JOutInterceptor(properties, getAfterSignatureCallbacks());    
>     wss4JOutInterceptor.setId("WSS4JOutSignatureInterceptor");         
>     //if this line is commented => the process fails directly (which is 
> correct) because nothing is listening at the endpoint    
>    client.getOutInterceptors().add(wss4JOutInterceptor);
> }
> String operation = jaxbElement.getName().getLocalPart();
> Object[] object = client.invoke(operation, jaxbElement.getValue());
> return object[0];
> {code}
> If the `wss4JOutInterceptor` is not added, the the process immediately fails 
> (which is expected).
> {noformat}
> org.apache.cxf.interceptor.Fault: Could not send Message.
> at 
> org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:67)
> at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:528)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:439)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:354)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:312)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:332)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:318)
>  Caused by: java.net.ConnectException: ConnectException invoking 
> [https://localhost:1234/Invalid:] Connection refused
> at 
> java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native
>  Method)
> at 
> java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
> at 
> java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
> at 
> java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
> at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
> Caused by: java.net.ConnectException
> at 
> java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1055)
> at 
> java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198)
> at 
> java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230)
> at 
> java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206)
> at 
> java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)
> at 
> java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)
> at 
> java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
> at 
> java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)
> at 
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
> at 
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
> at java.base/java.lang.Thread.run(Thread.java:833)
> Caused by: java.nio.channels.ClosedChannelException
> at 
> java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195)
> at 
> java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760)
> at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848)
> at 
> java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183)
> at 
> java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
> at 
> java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185)
> {noformat}
> If any help, here is the stacktrace where the process hangs forever:
> {noformat}
>  at java.lang.Object.wait(Object.java)
>  at java.io.PipedInputStream.awaitSpace(PipedInputStream.java:273)
>  at java.io.PipedInputStream.receive(PipedInputStream.java:231)
>  at java.io.PipedOutputStream.write(PipedOutputStream.java:150)
>  at 
> org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:51)
>  at 
> org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.output.UTF8XmlOutput.write(UTF8XmlOutput.java:386)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.output.Encoded.write(Encoded.java:137)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.output.UTF8XmlOutput.writePrefix(UTF8XmlOutput.java:205)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.output.UTF8XmlOutput.writeName(UTF8XmlOutput.java:209)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.output.UTF8XmlOutput.beginStartTag(UTF8XmlOutput.java:138)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.output.ForkXmlOutput.beginStartTag(ForkXmlOutput.java:48)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.leafElement(XMLSerializer.java:288)
>  at 
> org.glassfish.jaxb.runtime.v2.model.impl.RuntimeBuiltinLeafInfoImpl$StringImplImpl.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:1115)
>  at 
> org.glassfish.jaxb.runtime.v2.model.impl.RuntimeBuiltinLeafInfoImpl$StringImplImpl.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:1092)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.reflect.TransducedAccessor$CompositeTransducedAccessorImpl.writeLeafElement(TransducedAccessor.java:224)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementLeafProperty.serializeBody(SingleElementLeafProperty.java:94)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:38)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:132)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:122)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:125)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:93)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:316)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:324)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:38)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:456)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:265)
>  at 
> org.glassfish.jaxb.runtime.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:197)
>  at 
> jakarta.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:86)
>  at 
> org.apache.cxf.jaxb.JAXBEncoderDecoder.writeObject(JAXBEncoderDecoder.java:642)
>  at 
> org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:244)
>  at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:238)
>  at 
> org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:118)
>  at 
> org.apache.cxf.wsdl.interceptors.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68)
>  at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>  at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:528)
>  at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:439)
>  at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:354)
>  at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:312)
>  at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:332)
>  at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:318)
> {noformat}
> Any workaround is welcome.
> Thanks & best regards.
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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

Reply via email to