536cd135cc
Former-commit-id: 5624ac747d633e885131e8349322922b6a59baaa
114 lines
4.0 KiB
C#
114 lines
4.0 KiB
C#
//-----------------------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//-----------------------------------------------------------------------------
|
|
namespace System.ServiceModel.Channels
|
|
{
|
|
using System.IO;
|
|
using System.Runtime;
|
|
using System.Security.Authentication;
|
|
using System.ServiceModel.Security;
|
|
|
|
abstract class StreamSecurityUpgradeInitiatorAsyncResult : AsyncResult
|
|
{
|
|
Stream originalStream;
|
|
SecurityMessageProperty remoteSecurity;
|
|
Stream upgradedStream;
|
|
|
|
static AsyncCallback onAuthenticateAsClient = Fx.ThunkCallback(new AsyncCallback(OnAuthenticateAsClient));
|
|
|
|
public StreamSecurityUpgradeInitiatorAsyncResult(AsyncCallback callback, object state)
|
|
: base(callback, state)
|
|
{
|
|
// empty
|
|
}
|
|
|
|
public void Begin(Stream stream)
|
|
{
|
|
this.originalStream = stream;
|
|
IAsyncResult result;
|
|
|
|
try
|
|
{
|
|
result = this.OnBeginAuthenticateAsClient(this.originalStream, onAuthenticateAsClient);
|
|
}
|
|
catch (AuthenticationException exception)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SecurityNegotiationException(exception.Message,
|
|
exception));
|
|
}
|
|
catch (IOException ioException)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SecurityNegotiationException(
|
|
SR.GetString(SR.NegotiationFailedIO, ioException.Message), ioException));
|
|
}
|
|
|
|
if (!result.CompletedSynchronously)
|
|
{
|
|
return;
|
|
}
|
|
|
|
CompleteAuthenticateAsClient(result);
|
|
base.Complete(true);
|
|
}
|
|
|
|
void CompleteAuthenticateAsClient(IAsyncResult result)
|
|
{
|
|
try
|
|
{
|
|
this.upgradedStream = this.OnCompleteAuthenticateAsClient(result);
|
|
}
|
|
catch (AuthenticationException exception)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SecurityNegotiationException(exception.Message,
|
|
exception));
|
|
}
|
|
catch (IOException ioException)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SecurityNegotiationException(
|
|
SR.GetString(SR.NegotiationFailedIO, ioException.Message), ioException));
|
|
}
|
|
|
|
this.remoteSecurity = this.ValidateCreateSecurity();
|
|
}
|
|
|
|
public static Stream End(IAsyncResult result, out SecurityMessageProperty remoteSecurity)
|
|
{
|
|
StreamSecurityUpgradeInitiatorAsyncResult thisPtr = AsyncResult.End<StreamSecurityUpgradeInitiatorAsyncResult>(result);
|
|
remoteSecurity = thisPtr.remoteSecurity;
|
|
return thisPtr.upgradedStream;
|
|
}
|
|
|
|
static void OnAuthenticateAsClient(IAsyncResult result)
|
|
{
|
|
if (result.CompletedSynchronously)
|
|
{
|
|
return;
|
|
}
|
|
|
|
StreamSecurityUpgradeInitiatorAsyncResult thisPtr =
|
|
(StreamSecurityUpgradeInitiatorAsyncResult)result.AsyncState;
|
|
|
|
Exception completionException = null;
|
|
try
|
|
{
|
|
thisPtr.CompleteAuthenticateAsClient(result);
|
|
}
|
|
#pragma warning suppress 56500 // Microsoft, transferring exception to another thread
|
|
catch (Exception e)
|
|
{
|
|
if (Fx.IsFatal(e))
|
|
{
|
|
throw;
|
|
}
|
|
|
|
completionException = e;
|
|
}
|
|
thisPtr.Complete(false, completionException);
|
|
}
|
|
|
|
protected abstract IAsyncResult OnBeginAuthenticateAsClient(Stream stream, AsyncCallback callback);
|
|
protected abstract Stream OnCompleteAuthenticateAsClient(IAsyncResult result);
|
|
protected abstract SecurityMessageProperty ValidateCreateSecurity();
|
|
}
|
|
}
|