1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
//-----------------------------------------------------------------------------
// 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);
}
}
|