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

Daniel Kulp reassigned CXF-2158:
--------------------------------

    Assignee: Daniel Kulp

> Mix up of ID and ID reference of security token in signature causes WCF 
> service to throw Cannot resolve KeyInfo for verifying signature
> ---------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CXF-2158
>                 URL: https://issues.apache.org/jira/browse/CXF-2158
>             Project: CXF
>          Issue Type: Bug
>          Components: WS-* Components
>    Affects Versions: 2.2
>         Environment: Java(TM) SE Runtime Environment (build 1.6.0_07-b06-153) 
> - MacOS 10.5 and Windows Vista
>            Reporter: ian homer
>            Assignee: Daniel Kulp
>         Attachments: CalculatorService1339.wsdl
>
>
> Issue
> CXF client causes WCF to throw the error Cannot resolve KeyInfo for verifying 
> signature: KeyInfo 'SecurityKeyIdentifier when connecting to a secured WCF 
> service set up following the tutorial "WCF Getting Started Sample Tutorial 
> with Message Security User Name" @ 
> http://msdn.microsoft.com/en-us/library/ms752233.aspx. (WSDL attached on CXF 
> ticket)
> See analysis below for summary of the issue and indication of resolution.
> [edit] CXF Client Test Case
> $ java -version
> java version "1.6.0_07"
> Java(TM) SE Runtime Environment (build 1.6.0_07-b06-153)
> Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_07-b06-57, mixed mode)
>  
> MacOS 10.5 and Windows Vista
> CXF Version 2.2
> import static org.junit.Assert.assertEquals;
> import groovyx.net.ws.cxf.SSLHelper;
>  
> import java.util.ArrayList;
> import java.util.HashMap;
> import java.util.List;
> import java.util.Map;
>  
> import javax.security.auth.callback.Callback;
> import javax.security.auth.callback.CallbackHandler;
> import javax.xml.namespace.QName;
>  
> import org.apache.commons.logging.Log;
> import org.apache.commons.logging.LogFactory;
> import org.apache.cxf.Bus;
> import org.apache.cxf.binding.soap.SoapMessage;
> import org.apache.cxf.endpoint.Client;
> import org.apache.cxf.endpoint.Endpoint;
> import org.apache.cxf.endpoint.EndpointImpl;
> import org.apache.cxf.endpoint.dynamic.DynamicClientFactory;
> import org.apache.cxf.interceptor.Fault;
> import org.apache.cxf.interceptor.LoggingInInterceptor;
> import org.apache.cxf.interceptor.LoggingOutInterceptor;
> import org.apache.cxf.message.Exchange;
> import org.apache.cxf.message.Message;
> import org.apache.cxf.message.MessageUtils;
> import org.apache.cxf.phase.Phase;
> import org.apache.cxf.service.model.BindingOperationInfo;
> import org.apache.cxf.service.model.EndpointInfo;
> import org.apache.cxf.ws.policy.AbstractPolicyInterceptor;
> import org.apache.cxf.ws.policy.EffectivePolicy;
> import org.apache.cxf.ws.policy.PolicyEngine;
> import org.apache.cxf.ws.policy.PolicyException;
> import org.apache.cxf.ws.security.policy.model.SignedEncryptedParts;
> import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
> import org.apache.neethi.AbstractPolicyOperator;
> import org.apache.ws.security.WSConstants;
> import org.apache.ws.security.WSPasswordCallback;
> import org.apache.ws.security.handler.WSHandlerConstants;
> import org.junit.Test;
>  
> public class SSLAWSWCFCalculatorIssueTestCase {
>       protected static Log log = 
> LogFactory.getLog(SSLAWSWCFCalculatorIssueTestCase.class);
>  
>       public static final String WCF_HOST = "host";
>       private static final String WSDL_URI_REMOTE = "http://"; + WCF_HOST
>                       + "/ServiceModelSamples/service.svc?wsdl";
>       /**
>        * Filters for a default WCF_SSLA integration
>        */
>       public static final Class<?>[] WCF_SSLA = new Class<?>[] { 
> SignedEncryptedParts.class };
>  
>       @Test
>       public void testOperationsOfSSLClientWithSoapAuthentication() throws 
> Exception {
>               QName service = new QName("http://tempuri.org/";, 
> "CalculatorService");
>               QName port = new QName("http://tempuri.org/";, "SSLCalculatorA");
>  
>               Client client = 
> DynamicClientFactory.newInstance().createClient(WSDL_URI_REMOTE, service,
>                               
> SSLAWSWCFCalculatorIssueTestCase.class.getClassLoader(), port);
>  
>               SSLHelper sslHelper = new SSLHelper();
>               sslHelper.initialize();
>               sslHelper.enable(client);
>  
>               Bus bus = ((EndpointImpl) client.getEndpoint()).getBus();
>               /*
>                * Apply default policy filter in interceptor to filter out the
>                * mandatory signing of body parts. Otherwise CXF policy 
> validation
>                * fails since the response from WCF is not compliant with this
>                */
>               bus.getInInterceptors().add(new 
> PolicyFilterOutInterceptor(WCF_SSLA));
>               Map<String, Object> outProps = new HashMap<String, Object>();
>  
>               outProps.put(WSHandlerConstants.ACTION, 
> WSHandlerConstants.USERNAME_TOKEN);
>               outProps.put(WSHandlerConstants.USER, "bart\\myname");
>               outProps.put(WSHandlerConstants.PASSWORD_TYPE, 
> WSConstants.PW_TEXT);
>               outProps.put(WSHandlerConstants.MUST_UNDERSTAND, "true");
>               outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new 
> PasswordHandler("password"));
>  
>               bus.getOutInterceptors().add(new 
> JustOnceWSS4JOutInterceptor(outProps));
>  
>               /*
>                * Add logging interceptors
>                */
>               bus.getInInterceptors().add(new LoggingInInterceptor());
>               bus.getOutInterceptors().add(new LoggingOutInterceptor());
>  
>               BindingOperationInfo add = 
> client.getEndpoint().getEndpointInfo().getBinding()
>                               .getOperation(new 
> QName("http://Microsoft.ServiceModel.Samples";, "Add"))
>                               .getUnwrappedOperation();
>               /**
>                * Now call some operations
>                */
>               if (log.isDebugEnabled()) {
>                       log.debug("Invoking method add");
>               }
>               Object[] answer = client.invoke(add, new Object[] { "1", "2" });
>               if (log.isDebugEnabled()) {
>                       log.debug("1 + 2 = " + answer[0]);
>               }
>               assertEquals("Add method not correct", new Double(3.0), 
> answer[0]);
>  
>               if (log.isDebugEnabled()) {
>                       log.debug("Invoking method multiply");
>               }
>               BindingOperationInfo multiply = 
> client.getEndpoint().getEndpointInfo().getBinding()
>                               .getOperation(new 
> QName("http://Microsoft.ServiceModel.Samples";, "Multiply"))
>                               .getUnwrappedOperation();
>  
>               answer = client.invoke(multiply, new Object[] { "3", "2" });
>               assertEquals("Multiply method not correct", new Double(6.0), 
> answer);
>               if (log.isDebugEnabled()) {
>                       log.debug("3 x 2 = " + answer);
>               }
>       }
>  
>       /**
>        * Handler to get the password
>        */
>       public class PasswordHandler implements CallbackHandler {
>               private static final String DEFAULT_PASSWORD = "password";
>               String password;
>  
>               public PasswordHandler() {
>                       this.password = DEFAULT_PASSWORD;
>               }
>  
>               public PasswordHandler(String password) {
>                       this.password = password;
>               }
>  
>               public void handle(Callback[] callbacks) {
>                       WSPasswordCallback pc = (WSPasswordCallback) 
> callbacks[0];
>                       pc.setPassword(password);
>               }
>       }
>  
>       /**
>        * An WSS4J Interceptor that only includes the security header once, 
> without
>        * this WCF service throws a security exception when username and 
> password
>        * sent along with the SecurityContextToken in the second request
>        */
>  
>       public class JustOnceWSS4JOutInterceptor extends WSS4JOutInterceptor {
>               int count = 0;
>  
>               /**
>                * @param outProps
>                */
>               public JustOnceWSS4JOutInterceptor(Map<String, Object> 
> outProps) {
>                       super(outProps);
>               }
>  
>               @Override
>               public void handleMessage(SoapMessage mc) throws Fault {
>                       if (count == 0) {
>                               if (log.isDebugEnabled()) {
>                                       log.debug("Calling WSS4J interceptor : 
> count = " + count);
>                               }
>                               super.handleMessage(mc);
>                       } else {
>                               if (log.isDebugEnabled()) {
>                                       log.debug("Skipping WSS4J interceptor : 
> count = " + count);
>                               }
>                       }
>                       count++;
>               }
>       }
>  
>       public class PolicyFilterOutInterceptor extends 
> AbstractPolicyInterceptor {
>  
>               private Class<?>[] filters;
>  
>               public PolicyFilterOutInterceptor(Class<?>[] filters) {
>                       super(Phase.PRE_STREAM);
>                       this.filters = filters;
>               }
>  
>               @Override
>               protected void handle(Message message) throws PolicyException {
>                       if (log.isDebugEnabled()) {
>                               log.debug("Filtering policies for " + 
> this.getClass().getName());
>                       }
>  
>                       Exchange exchange = message.getExchange();
>                       BindingOperationInfo boi = 
> exchange.get(BindingOperationInfo.class);
>                       if (null == boi) {
>                               if (log.isDebugEnabled()) {
>                                       log.debug("No binding operation info.");
>                               }
>                               return;
>                       }
>  
>                       Endpoint e = exchange.get(Endpoint.class);
>                       if (null == e) {
>                               if (log.isDebugEnabled()) {
>                                       log.debug("No endpoint.");
>                               }
>                               return;
>                       }
>                       EndpointInfo ei = e.getEndpointInfo();
>  
>                       Bus bus = exchange.get(Bus.class);
>                       PolicyEngine pe = bus.getExtension(PolicyEngine.class);
>                       if (null == pe) {
>                               return;
>                       }
>  
>                       if (MessageUtils.isPartialResponse(message)) {
>                               if (log.isDebugEnabled()) {
>                                       log.debug("Not verifying policies on 
> inbound partial response.");
>                               }
>                               return;
>                       }
>  
>                       getTransportAssertions(message);
>  
>                       EffectivePolicy effectivePolicy = 
> message.get(EffectivePolicy.class);
>                       if (effectivePolicy == null) {
>                               if (MessageUtils.isRequestor(message)) {
>                                       effectivePolicy = 
> pe.getEffectiveClientResponsePolicy(ei, boi);
>                               } else {
>                                       effectivePolicy = 
> pe.getEffectiveServerRequestPolicy(ei, boi);
>                               }
>                       }
>  
>                       removePolicies(effectivePolicy.getPolicy(), filters);
>               }
>  
>               public void removePolicy(AbstractPolicyOperator operator, 
> Class<?> clazz) {
>                       removePolicies(operator, new Class<?>[] { clazz });
>               }
>  
>               @SuppressWarnings("unchecked")
>               public void removePolicies(AbstractPolicyOperator operator, 
> Class<?>[] classes) {
>                       List<Object> childrenForRemoval = new 
> ArrayList<Object>();
>  
>                       for (Object child : operator.getPolicyComponents()) {
>                               if (child instanceof AbstractPolicyOperator) {
>                                       removePolicies((AbstractPolicyOperator) 
> child, classes);
>                               } else {
>                                       for (int i = 0; i < classes.length; 
> i++) {
>                                               if (child.getClass() == 
> classes[i]) {
>                                                       
> childrenForRemoval.add(child);
>                                                       if 
> (log.isDebugEnabled()) {
>                                                               
> log.debug("Removing policy : " + child);
>                                                       }
>                                               }
>                                       }
>                               }
>                       }
>  
>                       /*
>                        * Remove all the children that have been marked for 
> removal
>                        */
>                       
> operator.getPolicyComponents().removeAll(childrenForRemoval);
>               }
>       }
> }
> [edit] WCF Exception
> <Exception>
> <ExceptionType>System.ServiceModel.Security.MessageSecurityException, 
> System.ServiceModel, Version=3.0.0.0, Culture=neutral, 
> PublicKeyToken=b77a5c561934e089</ExceptionType>
> <Message>Cannot resolve KeyInfo for verifying signature: KeyInfo 
> 'SecurityKeyIdentifier
>    (
>    IsReadOnly = False,
>    Count = 1,
>    Clause[0] = LocalIdKeyIdentifierClause(LocalId = 
> 'urn:uuid:67422cf9-69c5-4e15-802d-4c6d39cdc57d', Owner = 
> 'System.ServiceModel.Security.Tokens.SecurityContextSecurityToken')
>    )
> ', available tokens 'SecurityTokenResolver
>    (
>    TokenCount = 1,
>    TokenEntry[0] = (AllowedReferenceStyle=Internal, 
> Token=System.ServiceModel.Security.Tokens.SecurityContextSecurityToken, 
> Parameters=System.ServiceModel.Security.Tokens.SecureConversationSecurityTokenParameters:
> InclusionMode: AlwaysToRecipient
> ReferenceStyle: Internal
> RequireDerivedKeys: False
> RequireCancellation: True
> BootstrapSecurityBindingElement:
>  System.ServiceModel.Channels.TransportSecurityBindingElement:
>  DefaultAlgorithmSuite: Basic256
>  IncludeTimestamp: True
>  KeyEntropyMode: CombinedEntropy
>  MessageSecurityVersion: 
> WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10
>  SecurityHeaderLayout: Strict
>  EndpointSupportingTokenParameters:
>    No endorsing tokens.
>    No signed tokens.
>    SignedEncrypted[0]
>      System.ServiceModel.Security.Tokens.UserNameSecurityTokenParameters:
>      InclusionMode: AlwaysToRecipient
>      ReferenceStyle: Internal
>      RequireDerivedKeys: False
>    No signed endorsing tokens.
>  OptionalEndpointSupportingTokenParameters:
>    No endorsing tokens.
>    No signed tokens.
>    No signed encrypted tokens.
>    No signed endorsing tokens.
>  OperationSupportingTokenParameters: none
>  OptionalOperationSupportingTokenParameters: none)
>    )
> '.</Message>
> <StackTrace>
> at 
> System.ServiceModel.Security.WSSecurityOneDotZeroReceiveSecurityHeader.ResolveSignatureToken(SecurityKeyIdentifier
>  
> keyIdentifier, SecurityTokenResolver resolver, Boolean isPrimarySignature)
> at 
> System.ServiceModel.Security.WSSecurityOneDotZeroReceiveSecurityHeader.VerifySignature(SignedXml
>  signedXml, Boolean isPrimarySignature, SecurityHeaderTokenResolver resolver, 
> Object signatureTarget, String id)
> at 
> System.ServiceModel.Security.ReceiveSecurityHeader.ProcessSupportingSignature(SignedXml
>  signedXml, Boolean isFromDecryptedSource)
> at 
> System.ServiceModel.Security.ReceiveSecurityHeader.ExecuteFullPass(XmlDictionaryReader
>  reader)
> at System.ServiceModel.Security.ReceiveSecurityHeader.Process(TimeSpan 
> timeout)
> at 
> System.ServiceModel.Security.AcceptorSessionSymmetricTransportSecurityProtocol.VerifyIncomingMessageCore(Message&amp;
>  message, TimeSpan timeout)
> at 
> System.ServiceModel.Security.TransportSecurityProtocol.VerifyIncomingMessage(Message&amp;
>  message, TimeSpan timeout)
> at 
> System.ServiceModel.Security.SecurityProtocol.VerifyIncomingMessage(Message&amp;
>  message, TimeSpan timeout, SecurityProtocolCorrelationState[] 
> correlationStates)
> at 
> System.ServiceModel.Security.SecuritySessionServerSettings.ServerSecuritySessionChannel.ProcessRequestContext(RequestContext
>  requestContext, TimeSpan timeout, SecurityProtocolCorrelationState&amp; 
> correlationState, Boolean&amp; isSecurityProcessingFailure)
> at 
> System.ServiceModel.Security.SecuritySessionServerSettings.ServerSecuritySessionChannel.ReceiveRequestAsyncResult.WaitComplete()
> at 
> System.ServiceModel.Security.SecuritySessionServerSettings.ServerSecuritySessionChannel.ReceiveRequestAsyncResult..ctor(ServerSecuritySessionChannel
>  channel, TimeSpan timeout, AsyncCallback callback, Object state)
> at 
> System.ServiceModel.Security.SecuritySessionServerSettings.ServerSecuritySessionChannel.BeginTryReceiveRequest(TimeSpan
>  timeout, AsyncCallback callback, Object state)
> at System.ServiceModel.Dispatcher.ReplyChannelBinder.BeginTryReceive(TimeSpan 
> timeout, AsyncCallback callback, Object state)
> at 
> System.ServiceModel.Dispatcher.ErrorHandlingReceiver.BeginTryReceive(TimeSpan 
> timeout, AsyncCallback callback, Object state)
> at System.ServiceModel.Dispatcher.ChannelHandler.EnsurePump()
> at System.ServiceModel.Dispatcher.ChannelHandler.OpenAndEnsurePump()
> at 
> System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke2()
> at System.Security.SecurityContext.Run(SecurityContext securityContext, 
> ContextCallback callback, Object state)
> at 
> System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke()
> at 
> System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ProcessCallbacks()
> at 
> System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.CompletionCallback(Object
>  state)
> at 
> System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ScheduledOverlapped.IOCallback(UInt32
>  errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
> at 
> System.ServiceModel.Diagnostics.Utility.IOCompletionThunk.UnhandledExceptionFrame(UInt32
>  error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
> at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 
> errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
> </StackTrace>
> <ExceptionString>System.ServiceModel.Security.MessageSecurityException: 
> Cannot resolve KeyInfo for verifying signature: KeyInfo 'SecurityKeyIdentifier
>    (
>    IsReadOnly = False,
>    Count = 1,
>    Clause[0] = LocalIdKeyIdentifierClause(LocalId = 
> 'urn:uuid:67422cf9-69c5-4e15-802d-4c6d39cdc57d', Owner = 
> 'System.ServiceModel.Security.Tokens.SecurityContextSecurityToken')
>    )
> ', available tokens 'SecurityTokenResolver
>    (
>    TokenCount = 1,
>    TokenEntry[0] = (AllowedReferenceStyle=Internal, 
> Token=System.ServiceModel.Security.Tokens.SecurityContextSecurityToken, 
> Parameters=System.ServiceModel.Security.Tokens.SecureConversationSecurityTokenParameters:
> InclusionMode: AlwaysToRecipient
> ReferenceStyle: Internal
> RequireDerivedKeys: False
> RequireCancellation: True
> BootstrapSecurityBindingElement:
>  System.ServiceModel.Channels.TransportSecurityBindingElement:
>  DefaultAlgorithmSuite: Basic256
>  IncludeTimestamp: True
>  KeyEntropyMode: CombinedEntropy
>  MessageSecurityVersion: 
> WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10
>  SecurityHeaderLayout: Strict
>  EndpointSupportingTokenParameters:
>    No endorsing tokens.
>    No signed tokens.
>    SignedEncrypted[0]
>      System.ServiceModel.Security.Tokens.UserNameSecurityTokenParameters:
>      InclusionMode: AlwaysToRecipient
>      ReferenceStyle: Internal
>      RequireDerivedKeys: False
>    No signed endorsing tokens.
>  OptionalEndpointSupportingTokenParameters:
>    No endorsing tokens.
>    No signed tokens.
>    No signed encrypted tokens.
>    No signed endorsing tokens.
>  OperationSupportingTokenParameters: none
>  OptionalOperationSupportingTokenParameters: none)
>    )
> '.</ExceptionString>
> </Exception>
> [edit] WCF Client with WCF Server
> [edit] WCF Client Request 1
> <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"; 
> xmlns:a="http://www.w3.org/2005/08/addressing"; 
>         
> xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";>
>     <s:Header>
>         <a:Action 
> s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT</a:Action>
>         
> <a:MessageID>urn:uuid:8151f398-b043-485e-a443-681fb698d334</a:MessageID>
>         <a:ReplyTo>
>             
> <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
>         </a:ReplyTo>
>         <a:To 
> s:mustUnderstand="1">https://host/servicemodelsamples/service.svc/SSLA</a:To>
>         <o:Security s:mustUnderstand="1" 
> xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";>
>             <u:Timestamp u:Id="_0">
>                 <u:Created>2009-04-06T08:25:00.988Z</u:Created>
>                 <u:Expires>2009-04-06T08:30:00.988Z</u:Expires>
>             </u:Timestamp>
>             <o:UsernameToken 
> u:Id="uuid-0403819d-3bc9-4fc8-be6f-0c1b01da7397-1">
>                 <o:Username>
>                     <!-- Removed-->
>                 </o:Username>
>                 <o:Password>
>                     <!-- Removed-->
>                 </o:Password>
>             </o:UsernameToken>
>         </o:Security>
>     </s:Header>
>     <s:Body>
>         <t:RequestSecurityToken 
> xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust";>
>             
> <t:TokenType>http://schemas.xmlsoap.org/ws/2005/02/sc/sct</t:TokenType>
>             
> <t:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</t:RequestType>
>             <t:Entropy>
>                 <!-- Removed-->
>             </t:Entropy>
>             <t:KeySize>256</t:KeySize>
>         </t:RequestSecurityToken>
>     </s:Body>
> </s:Envelope>
> [edit] WCF Client Response from Server 1
> <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"; 
> xmlns:a="http://www.w3.org/2005/08/addressing"; 
> xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";>
>     <s:Header>
>         <a:Action 
> s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/SCT</a:Action>
>         
> <a:RelatesTo>urn:uuid:4f4996b9-4d71-47d8-91b8-ba75df9b3de6</a:RelatesTo>
>         <o:Security s:mustUnderstand="1" 
> xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";>
>             <u:Timestamp u:Id="_0">
>                 <u:Created>2009-04-06T08:59:01.713Z</u:Created>
>                 <u:Expires>2009-04-06T09:04:01.713Z</u:Expires>
>             </u:Timestamp>
>         </o:Security>
>     </s:Header>
>     <s:Body>
>         <t:RequestSecurityTokenResponse 
> xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust";>
>             
> <t:TokenType>http://schemas.xmlsoap.org/ws/2005/02/sc/sct</t:TokenType>
>             <t:RequestedSecurityToken>
>                 <c:SecurityContextToken 
> u:Id="uuid-75ea67a3-c521-4a6c-8fff-f23ff9e793bc-1" 
> xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc";>
>                     
> <c:Identifier>urn:uuid:33b535ab-9f44-431a-87c9-0d1cf8c71d8e</c:Identifier>
>                 </c:SecurityContextToken>
>             </t:RequestedSecurityToken>
>             <t:RequestedAttachedReference>
>                 <o:SecurityTokenReference 
> xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";>
>                     <o:Reference 
> ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct"; 
> URI="#uuid-75ea67a3-c521-4a6c-8fff-f23ff9e793bc-1"></o:Reference>
>                 </o:SecurityTokenReference>
>             </t:RequestedAttachedReference>
>             <t:RequestedUnattachedReference>
>                 <o:SecurityTokenReference 
> xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";>
>                     <o:Reference 
> URI="urn:uuid:33b535ab-9f44-431a-87c9-0d1cf8c71d8e" 
> ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct";></o:Reference>
>                 </o:SecurityTokenReference>
>             </t:RequestedUnattachedReference>
>             <t:RequestedProofToken>
>                 
> <t:ComputedKey>http://schemas.xmlsoap.org/ws/2005/02/trust/CK/PSHA1</t:ComputedKey>
>             </t:RequestedProofToken>
>             <t:Entropy>
>                 <!-- Removed-->
>             </t:Entropy>
>             <t:Lifetime>
>                 <u:Created>2009-04-06T08:59:01.701Z</u:Created>
>                 <u:Expires>2009-04-06T23:59:01.701Z</u:Expires>
>             </t:Lifetime>
>             <t:KeySize>256</t:KeySize>
>         </t:RequestSecurityTokenResponse>
>     </s:Body>
> </s:Envelope>
> [edit] WCF Client Request 2
> <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"; 
> xmlns:a="http://www.w3.org/2005/08/addressing"; 
> xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";>
>     <s:Header>
>         <a:Action 
> s:mustUnderstand="1">http://Microsoft.ServiceModel.Samples/ICalculator/Add</a:Action>
>         
> <a:MessageID>urn:uuid:3363fc9e-17e1-4e15-a0dc-ef56d63fa541</a:MessageID>
>         <a:ReplyTo>
>             
> <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
>         </a:ReplyTo>
>         <a:To 
> s:mustUnderstand="1">https://host/servicemodelsamples/service.svc/SSLA</a:To>
>         <o:Security s:mustUnderstand="1" 
> xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";>
>             <u:Timestamp u:Id="_0">
>                 <u:Created>2009-04-06T08:59:01.737Z</u:Created>
>                 <u:Expires>2009-04-06T09:04:01.737Z</u:Expires>
>             </u:Timestamp>
>             <c:SecurityContextToken 
> u:Id="uuid-75ea67a3-c521-4a6c-8fff-f23ff9e793bc-1" 
> xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc";>
>                 
> <c:Identifier>urn:uuid:33b535ab-9f44-431a-87c9-0d1cf8c71d8e</c:Identifier>
>             </c:SecurityContextToken>
>             <Signature xmlns="http://www.w3.org/2000/09/xmldsig#";>
>                 <SignedInfo>
>                     <CanonicalizationMethod 
> Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#";></CanonicalizationMethod>
>                     <SignatureMethod 
> Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1";></SignatureMethod>
>                     <Reference URI="#_0">
>                         <Transforms>
>                             <Transform 
> Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#";></Transform>
>                         </Transforms>
>                         <DigestMethod 
> Algorithm="http://www.w3.org/2000/09/xmldsig#sha1";></DigestMethod>
>                         
> <DigestValue>2VuDOwhOC2mm4YhQJEAzutsXuiU=</DigestValue>
>                     </Reference>
>                 </SignedInfo>
>                 <SignatureValue>AZzmujJH/wkgEzq9jopInPW3exQ=</SignatureValue>
>                 <KeyInfo>
>                     <o:SecurityTokenReference>
>                         <o:Reference 
> ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct"; 
> URI="#uuid-75ea67a3-c521-4a6c-8fff-f23ff9e793bc-1"></o:Reference>
>                     </o:SecurityTokenReference>
>                 </KeyInfo>
>             </Signature>
>         </o:Security>
>     </s:Header>
>     <s:Body>
>         <Add xmlns="http://Microsoft.ServiceModel.Samples";>
>             <n1>100</n1>
>             <n2>15.99</n2>
>         </Add>
>     </s:Body>
> </s:Envelope>
> [edit] WCF Client Response from Server 2
> <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"; 
> xmlns:a="http://www.w3.org/2005/08/addressing"; 
> xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";>
>     <s:Header>
>         <a:Action 
> s:mustUnderstand="1">http://Microsoft.ServiceModel.Samples/ICalculator/AddResponse</a:Action>
>         
> <a:RelatesTo>urn:uuid:3363fc9e-17e1-4e15-a0dc-ef56d63fa541</a:RelatesTo>
>         <o:Security s:mustUnderstand="1" 
> xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";>
>             <u:Timestamp u:Id="_0">
>                 <u:Created>2009-04-06T08:59:01.773Z</u:Created>
>                 <u:Expires>2009-04-06T09:04:01.773Z</u:Expires>
>             </u:Timestamp>
>         </o:Security>
>     </s:Header>
>     <s:Body>
>         <AddResponse xmlns="http://Microsoft.ServiceModel.Samples";>
>             <AddResult>115.99</AddResult>
>         </AddResponse>
>     </s:Body>
> </s:Envelope>
> [edit] CXF Client with WCF Server
> [edit] CXF Client Request 1
> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope";>
>       <soap:Header>
>               <Action xmlns="http://www.w3.org/2005/08/addressing";>
>                       
> http://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT</Action>
>               <MessageID xmlns="http://www.w3.org/2005/08/addressing";>
>                       
> urn:uuid:ee3fd188-2a43-4d0e-b202-aac81f803bc5</MessageID>
>               <To xmlns="http://www.w3.org/2005/08/addressing";>
>                       https://host/ServiceModelSamples/service.svc/SSLA</To>
>               <ReplyTo xmlns="http://www.w3.org/2005/08/addressing";>
>                       <Address>http://www.w3.org/2005/08/addressing/anonymous
>                       </Address>
>               </ReplyTo>
>               <wsse:Security
>                       
> xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
>                       soap:mustUnderstand="true">
>                       <wsu:Timestamp
>                               
> xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
>                               wsu:Id="Timestamp-1763636894">
>                               <wsu:Created>2009-04-06T10:00:47.466Z
>                               </wsu:Created>
>                               <wsu:Expires>2009-04-06T10:05:47.466Z
>                               </wsu:Expires>
>                       </wsu:Timestamp>
>                       <wsse:UsernameToken
>                               
> xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
>                               
> xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
>                               wsu:Id="UsernameToken-2095036283">
>                               <wsse:Username>bart\myuser</wsse:Username>
>                               <wsse:Password
>                                       
> Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText";>password</wsse:Password>
>                       </wsse:UsernameToken>
>               </wsse:Security>
>       </soap:Header>
>       <soap:Body>
>               <wst:RequestSecurityToken
>                       xmlns:wst="http://schemas.xmlsoap.org/ws/2005/02/trust";>
>                       
> <wst:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue
>                       </wst:RequestType>
>                       <wsp:AppliesTo 
> xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy";>
>                               <wsa:EndpointReference 
> xmlns:wsa="http://www.w3.org/2005/08/addressing";>
>                                       <wsa:Address>
>                                               
> https://host/ServiceModelSamples/service.svc/SSLA
>                                       </wsa:Address>
>                               </wsa:EndpointReference>
>                       </wsp:AppliesTo>
>                       <wst:Lifetime>
>                               <wsu:Created
>                                       
> xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";>2009-04-06T10:00:46.692Z
>                               </wsu:Created>
>                               <wsu:Expires
>                                       
> xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";>2009-04-06T10:05:46.692Z
>                               </wsu:Expires>
>                       </wst:Lifetime>
>                       
> <wst:TokenType>http://schemas.xmlsoap.org/ws/2005/02/sc/sct
>                       </wst:TokenType>
>                       <wst:Entropy>
>                               <wst:BinarySecret
>                                       
> Type="http://schemas.xmlsoap.org/ws/2005/02/trust/Nonce";>7pPJRu/vrIfSeAzoq48kAd+55khFFbU/sLw0PeYkIKA=
>                               </wst:BinarySecret>
>                       </wst:Entropy>
>                       <wst:ComputedKeyAlgorithm>
>                               
> http://schemas.xmlsoap.org/ws/2005/02/trust/CK/PSHA1
>                       </wst:ComputedKeyAlgorithm>
>               </wst:RequestSecurityToken>
>       </soap:Body>
> </soap:Envelope>
> [edit] CXF Client Response from Server 1
> <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope";
>       xmlns:a="http://www.w3.org/2005/08/addressing";
>       
> xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";>
>       <s:Header>
>               <a:Action s:mustUnderstand="1">
>                       
> http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/SCT</a:Action>
>               <a:RelatesTo>urn:uuid:ee3fd188-2a43-4d0e-b202-aac81f803bc5
>               </a:RelatesTo>
>               <o:Security s:mustUnderstand="1"
>                       
> xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";>
>                       <u:Timestamp u:Id="_0">
>                               <u:Created>2009-04-06T10:00:28.212Z
>                               </u:Created>
>                               <u:Expires>2009-04-06T10:05:28.212Z
>                               </u:Expires>
>                       </u:Timestamp>
>               </o:Security>
>       </s:Header>
>       <s:Body>
>               <t:RequestSecurityTokenResponse
>                       xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust";>
>                       
> <t:TokenType>http://schemas.xmlsoap.org/ws/2005/02/sc/sct
>                       </t:TokenType>
>                       <t:RequestedSecurityToken>
>                               <c:SecurityContextToken
>                                       
> u:Id="uuid-e19e1759-7ef7-452b-9055-17ed4b15114c-3" 
> xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc";>
>                                       
> <c:Identifier>urn:uuid:cc05aea2-c53b-417e-9527-5d81102d6b20
>                                       </c:Identifier>
>                               </c:SecurityContextToken>
>                       </t:RequestedSecurityToken>
>                       <wsp:AppliesTo 
> xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy";>
>                               <EndpointReference 
> xmlns="http://www.w3.org/2005/08/addressing";>
>                                       <Address>
>                                               
> https://host/ServiceModelSamples/service.svc/SSLA
>                                       </Address>
>                               </EndpointReference>
>                       </wsp:AppliesTo>
>                       <t:RequestedAttachedReference>
>                               <o:SecurityTokenReference
>                                       
> xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";>
>                                       <o:Reference 
> ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct";
>                                               
> URI="#uuid-e19e1759-7ef7-452b-9055-17ed4b15114c-3"></o:Reference>
>                               </o:SecurityTokenReference>
>                       </t:RequestedAttachedReference>
>                       <t:RequestedUnattachedReference>
>                               <o:SecurityTokenReference
>                                       
> xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";>
>                                       <o:Reference 
> URI="urn:uuid:cc05aea2-c53b-417e-9527-5d81102d6b20"
>                                               
> ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct";></o:Reference>
>                               </o:SecurityTokenReference>
>                       </t:RequestedUnattachedReference>
>                       <t:RequestedProofToken>
>                               
> <t:ComputedKey>http://schemas.xmlsoap.org/ws/2005/02/trust/CK/PSHA1
>                               </t:ComputedKey>
>                       </t:RequestedProofToken>
>                       <t:Entropy>
>                               <t:BinarySecret 
> u:Id="uuid-e19e1759-7ef7-452b-9055-17ed4b15114c-4"
>                                       
> Type="http://schemas.xmlsoap.org/ws/2005/02/trust/Nonce";>f6m4wEJy9gPMttOxzM+7yf1i5biWxbNaBfbx1sWvVPw=
>                               </t:BinarySecret>
>                       </t:Entropy>
>                       <t:Lifetime>
>                               <u:Created>2009-04-06T10:00:28.208Z
>                               </u:Created>
>                               <u:Expires>2009-04-07T01:00:28.208Z
>                               </u:Expires>
>                       </t:Lifetime>
>                       <t:KeySize>256</t:KeySize>
>               </t:RequestSecurityTokenResponse>
>       </s:Body>
> </s:Envelope>
> [edit] CXF Client Request 2
> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope";>
>       <soap:Header>
>               <Action xmlns="http://www.w3.org/2005/08/addressing";>
>                       
> http://Microsoft.ServiceModel.Samples/ICalculator/Add</Action>
>               <MessageID xmlns="http://www.w3.org/2005/08/addressing";>
>                       
> urn:uuid:b879526c-68c1-4713-8912-6ee23264715f</MessageID>
>               <To xmlns="http://www.w3.org/2005/08/addressing";>
>                       https://host/ServiceModelSamples/service.svc/SSLA</To>
>               <ReplyTo xmlns="http://www.w3.org/2005/08/addressing";>
>                       <Address>http://www.w3.org/2005/08/addressing/anonymous
>                       </Address>
>               </ReplyTo>
>               <wsse:Security
>                       
> xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
>                       soap:mustUnderstand="true">
>                       <wsu:Timestamp
>                               
> xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
>                               wsu:Id="Timestamp-937741416">
>                               <wsu:Created>2009-04-06T10:00:48.903Z
>                               </wsu:Created>
>                               <wsu:Expires>2009-04-06T10:05:48.903Z
>                               </wsu:Expires>
>                       </wsu:Timestamp>
>                       <c:SecurityContextToken 
> xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc";
>                               
> xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
>                               
> u:Id="uuid-e19e1759-7ef7-452b-9055-17ed4b15114c-3">
>                               
> <c:Identifier>urn:uuid:cc05aea2-c53b-417e-9527-5d81102d6b20
>                               </c:Identifier>
>                       </c:SecurityContextToken>
>                       <ds:Signature 
> xmlns:ds="http://www.w3.org/2000/09/xmldsig#";
>                               Id="Signature-1670444352">
>                               <ds:SignedInfo>
>                                       <ds:CanonicalizationMethod
>                                               
> Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"; />
>                                       <ds:SignatureMethod 
> Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1"; />
>                                       <ds:Reference 
> URI="#Timestamp-937741416">
>                                               <ds:Transforms>
>                                                       <ds:Transform 
> Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"; />
>                                               </ds:Transforms>
>                                               <ds:DigestMethod 
> Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"; />
>                                               
> <ds:DigestValue>/gRfeAVaxWCey/0KWfXh4VDIdGA=
>                                               </ds:DigestValue>
>                                       </ds:Reference>
>                               </ds:SignedInfo>
>                               <ds:SignatureValue>rhEDDQNJHxAKgsBz5ZVPma1TkeY=
>                               </ds:SignatureValue>
>                               <ds:KeyInfo Id="KeyId-451036744">
>                                       <wsse:SecurityTokenReference
>                                               
> xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
>                                               
> xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
>                                               wsu:Id="STRId-187592160">
>                                               <wsse:Reference
>                                                       
> xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
>                                                       
> URI="#urn:uuid:cc05aea2-c53b-417e-9527-5d81102d6b20" 
> ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct"; />
>                                       </wsse:SecurityTokenReference>
>                               </ds:KeyInfo>
>                       </ds:Signature>
>               </wsse:Security>
>       </soap:Header>
>       <soap:Body>
>               <ns1:Add xmlns:ns1="http://Microsoft.ServiceModel.Samples";>
>                       <ns1:n1 
> xmlns:ns2="http://schemas.microsoft.com/2003/10/Serialization/";
>                               xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>                               xsi:type="xs:string">1</ns1:n1>
>                       <ns1:n2 
> xmlns:ns2="http://schemas.microsoft.com/2003/10/Serialization/";
>                               xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>                               xsi:type="xs:string">2</ns1:n2>
>               </ns1:Add>
>       </soap:Body>
> </soap:Envelope>
> [edit] CXF Client Response from Server 2
> <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope";
>       xmlns:a="http://www.w3.org/2005/08/addressing";>
>       <s:Header>
>               <a:Action s:mustUnderstand="1">
>                       
> http://www.w3.org/2005/08/addressing/soap/fault</a:Action>
>               <a:RelatesTo>urn:uuid:c20c8ac5-3e6d-4189-8db8-97dda22f7cdc
>               </a:RelatesTo>
>       </s:Header>
>       <s:Body>
>               <s:Fault>
>                       <s:Code>
>                               <s:Value>s:Sender</s:Value>
>                               <s:Subcode>
>                                       <s:Value
>                                               
> xmlns:a="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";>a:InvalidSecurity</s:Value>
>                               </s:Subcode>
>                       </s:Code>
>                       <s:Reason>
>                               <s:Text xml:lang="en-GB">An error occurred when 
> verifying security
>                                       for the message.</s:Text>
>                       </s:Reason>
>               </s:Fault>
>       </s:Body>
> </s:Envelope>
> [edit] Analysis
> CXF client sends the following on request 2 with the URI attribute of the 
> Reference element equal to the element content of the Identifier element.
> <c:SecurityContextToken u:Id="uuid-e19e1759-7ef7-452b-9055-17ed4b15114c-3">
>       
> <c:Identifier>urn:uuid:cc05aea2-c53b-417e-9527-5d81102d6b20</c:Identifier>
> </c:SecurityContextToken>
> ...
> <ds:KeyInfo Id="KeyId-451036744">
>       <wsse:SecurityTokenReference>
>               <wsse:Reference
>                       URI="#urn:uuid:cc05aea2-c53b-417e-9527-5d81102d6b20" 
>                       
> ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct"; />
>       </wsse:SecurityTokenReference>
> </ds:KeyInfo>
> however, the WCF client sends the following for its second request with the 
> URI element of the Reference element equal to the Id attribute of the 
> SecurityContextToken element
> <c:SecurityContextToken u:Id="uuid-75ea67a3-c521-4a6c-8fff-f23ff9e793bc-1" 
> xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc";>
>     <c:Identifier>urn:uuid:33b535ab-9f44-431a-87c9-0d1cf8c71d8e</c:Identifier>
> </c:SecurityContextToken>
> ...
> <KeyInfo>
>     <o:SecurityTokenReference>
>         <o:Reference 
>                 ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct"; 
>                 
> URI="#uuid-75ea67a3-c521-4a6c-8fff-f23ff9e793bc-1"></o:Reference>
>     </o:SecurityTokenReference>
> </KeyInfo>
> If the following change is made in the 
> org.apache.cxf.ws.security.wss4j.policyhandler.TransportBindingHandler:
> CXF trunk 2.2 version
> sig.setCustomTokenId(secTok.getId());
> changed to
> Node firstChild = securityToken.getAttachedReference().getFirstChild();
> Attr referenceUriAttribute = (Attr) 
> firstChild.getAttributes().getNamedItem("URI");
> String referenceUri = referenceUriAttribute.getValue().substring(1);
> sig.setCustomTokenId(referenceUri)
> then the CXF client communicates with the WCF server successfully. It is not 
> expected that this is the correct place for the fix, since there are other 
> places in the CXF source which set the custom token id on the signature. It 
> is more likely that a correction is required earlier in the logic such that 
> security token allows the id reference (i.e. the Reference URI) to be set 
> correctly and made available for configuring in the signature. 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to