/// <summary> /// Handles a reconnect request. /// </summary> public void Reconnect( TcpMessageSocket socket, uint requestId, uint sequenceNumber, X509Certificate2 clientCertificate, TcpChannelToken token, OpenSecureChannelRequest request) { if (socket == null) { throw new ArgumentNullException("socket"); } lock (DataLock) { // make sure the same client certificate is being used. CompareCertificates(ClientCertificate, clientCertificate, false); // check for replay attacks. if (!VerifySequenceNumber(sequenceNumber, "Reconnect")) { throw new ServiceResultException(StatusCodes.BadSequenceNumberInvalid); } try { // replace the socket. Socket = socket; Utils.Trace("TCPSERVERCHANNEL SOCKET RECONNECTED: {0:X8}, ChannelId={1}", Socket.Handle, ChannelId); Socket.ChangeSink(this); // need to assign a new token id. token.TokenId = GetNewTokenId(); // put channel back in open state. ActivateToken(token); State = TcpChannelState.Open; // no need to cleanup. if (m_cleanupTimer != null) { m_cleanupTimer.Dispose(); m_cleanupTimer = null; } // send response. SendOpenSecureChannelResponse(requestId, token, request); // send any queue responses. ThreadPool.QueueUserWorkItem(new WaitCallback(OnChannelReconnected), m_queuedResponses); m_queuedResponses = new SortedDictionary <uint, IServiceResponse>(); } catch (Exception e) { SendServiceFault(token, requestId, ServiceResult.Create(e, StatusCodes.BadTcpInternalError, "Unexpected error processing request.")); } } }
/// <summary> /// Handles a reconnect request. /// </summary> public void Reconnect( TcpMessageSocket socket, uint requestId, uint sequenceNumber, X509Certificate2 clientCertificate, TcpChannelToken token, OpenSecureChannelRequest request) { if (socket == null) throw new ArgumentNullException("socket"); lock (DataLock) { // make sure the same client certificate is being used. CompareCertificates(ClientCertificate, clientCertificate, false); // check for replay attacks. if (!VerifySequenceNumber(sequenceNumber, "Reconnect")) { throw new ServiceResultException(StatusCodes.BadSequenceNumberInvalid); } try { // replace the socket. Socket = socket; Utils.Trace("TCPSERVERCHANNEL SOCKET RECONNECTED: {0:X8}, ChannelId={1}", Socket.Handle, ChannelId); Socket.ChangeSink(this); // need to assign a new token id. token.TokenId = GetNewTokenId(); // put channel back in open state. ActivateToken(token); State = TcpChannelState.Open; // no need to cleanup. if (m_cleanupTimer != null) { m_cleanupTimer.Dispose(); m_cleanupTimer = null; } // send response. SendOpenSecureChannelResponse(requestId, token, request); // send any queue responses. ThreadPool.QueueUserWorkItem(new WaitCallback(OnChannelReconnected), m_queuedResponses); m_queuedResponses = new SortedDictionary<uint,IServiceResponse>(); } catch (Exception e) { SendServiceFault(token, requestId, ServiceResult.Create(e, StatusCodes.BadTcpInternalError, "Unexpected error processing request.")); } } }