e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
132 lines
3.9 KiB
C#
132 lines
3.9 KiB
C#
//-----------------------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//-----------------------------------------------------------------------------
|
|
namespace System.ServiceModel.Channels
|
|
{
|
|
using System.IO;
|
|
using System.ServiceModel;
|
|
using System.ServiceModel.Security;
|
|
|
|
abstract class StreamSecurityUpgradeInitiatorBase : StreamSecurityUpgradeInitiator
|
|
{
|
|
EndpointAddress remoteAddress;
|
|
Uri via;
|
|
SecurityMessageProperty remoteSecurity;
|
|
bool securityUpgraded;
|
|
string nextUpgrade;
|
|
bool isOpen;
|
|
|
|
protected StreamSecurityUpgradeInitiatorBase(string upgradeString, EndpointAddress remoteAddress, Uri via)
|
|
{
|
|
this.remoteAddress = remoteAddress;
|
|
this.via = via;
|
|
this.nextUpgrade = upgradeString;
|
|
}
|
|
|
|
protected EndpointAddress RemoteAddress
|
|
{
|
|
get
|
|
{
|
|
return this.remoteAddress;
|
|
}
|
|
}
|
|
|
|
protected Uri Via
|
|
{
|
|
get
|
|
{
|
|
return this.via;
|
|
}
|
|
}
|
|
|
|
public override IAsyncResult BeginInitiateUpgrade(Stream stream, AsyncCallback callback, object state)
|
|
{
|
|
if (stream == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("stream");
|
|
}
|
|
|
|
if (!this.isOpen)
|
|
{
|
|
this.Open(TimeSpan.Zero);
|
|
}
|
|
|
|
return this.OnBeginInitiateUpgrade(stream, callback, state);
|
|
}
|
|
|
|
public override Stream EndInitiateUpgrade(IAsyncResult result)
|
|
{
|
|
if (result == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("result");
|
|
}
|
|
Stream retValue = this.OnEndInitiateUpgrade(result, out this.remoteSecurity);
|
|
this.securityUpgraded = true;
|
|
return retValue;
|
|
}
|
|
|
|
public override string GetNextUpgrade()
|
|
{
|
|
string result = this.nextUpgrade;
|
|
this.nextUpgrade = null;
|
|
return result;
|
|
}
|
|
|
|
public override SecurityMessageProperty GetRemoteSecurity()
|
|
{
|
|
if (!securityUpgraded)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.OperationInvalidBeforeSecurityNegotiation)));
|
|
}
|
|
|
|
return this.remoteSecurity;
|
|
}
|
|
|
|
public override Stream InitiateUpgrade(Stream stream)
|
|
{
|
|
if (stream == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("stream");
|
|
}
|
|
|
|
if (!this.isOpen)
|
|
{
|
|
this.Open(TimeSpan.Zero);
|
|
}
|
|
|
|
Stream result = this.OnInitiateUpgrade(stream, out this.remoteSecurity);
|
|
this.securityUpgraded = true;
|
|
return result;
|
|
}
|
|
|
|
internal override void EndOpen(IAsyncResult result)
|
|
{
|
|
base.EndOpen(result);
|
|
this.isOpen = true;
|
|
}
|
|
|
|
internal override void Open(TimeSpan timeout)
|
|
{
|
|
base.Open(timeout);
|
|
this.isOpen = true;
|
|
}
|
|
|
|
internal override void EndClose(IAsyncResult result)
|
|
{
|
|
base.EndClose(result);
|
|
this.isOpen = false;
|
|
}
|
|
|
|
internal override void Close(TimeSpan timeout)
|
|
{
|
|
base.Close(timeout);
|
|
this.isOpen = false;
|
|
}
|
|
|
|
protected abstract IAsyncResult OnBeginInitiateUpgrade(Stream stream, AsyncCallback callback, object state);
|
|
protected abstract Stream OnEndInitiateUpgrade(IAsyncResult result,
|
|
out SecurityMessageProperty remoteSecurity);
|
|
protected abstract Stream OnInitiateUpgrade(Stream stream, out SecurityMessageProperty remoteSecurity);
|
|
}
|
|
}
|