Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dotnet-svcutil TransportWithMessageCrendential support #4774

Merged
merged 3 commits into from
Mar 2, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/dotnet-svcutil/lib/src/CodeDomFixup/EndpointSelector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,8 @@ private static void ValidateUserNamePasswordSecurityBindingElement(TransportSecu

if (transportSecurityBindingElement.MessageSecurityVersion != MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10 &&
transportSecurityBindingElement.MessageSecurityVersion != MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10 &&
transportSecurityBindingElement.MessageSecurityVersion != MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11)
transportSecurityBindingElement.MessageSecurityVersion != MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11 &&
transportSecurityBindingElement.MessageSecurityVersion != MessageSecurityVersion.WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10)
{
string values = string.Format(CultureInfo.InvariantCulture, "'{0}', '{1}', '{2}'",
MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10,
Expand Down
276 changes: 273 additions & 3 deletions src/dotnet-svcutil/lib/src/CodeDomFixup/MethodCreationHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -175,16 +175,269 @@ private static void AddBindingConfiguration(CodeStatementCollection statements,
return;
}

WSHttpBinding httpBinding = binding as WSHttpBinding;
if (httpBinding != null)
if (binding is WS2007HttpBinding ws2007HttpBinding)
{
AddCustomBindingConfiguration(statements, new CustomBinding(httpBinding));
AddWS2007HttpBindingConfiguration(statements, ws2007HttpBinding);
return;
}

if (binding is WSHttpBinding wsHttpBinding)
{
AddWSHttpBindingConfiguration(statements, wsHttpBinding);
return;
}

throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, SR.ErrBindingTypeNotSupportedFormat, binding.GetType().FullName));
}

private static void AddWSHttpBindingConfiguration(CodeStatementCollection statements, WSHttpBinding wsHttp)
{
const string ResultVarName = "result";
WSHttpBinding defaultBinding = new WSHttpBinding();

statements.Add(
new CodeVariableDeclarationStatement(
typeof(WSHttpBinding),
ResultVarName,
new CodeObjectCreateExpression(typeof(WSHttpBinding))));
CodeVariableReferenceExpression resultVar = new CodeVariableReferenceExpression(ResultVarName);

WSHttpMaxOutProperties(statements, resultVar);

// Set AllowCookies's default value to true.
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
resultVar,
"AllowCookies"),
new CodePrimitiveExpression(true)));

if (defaultBinding.MessageEncoding != wsHttp.MessageEncoding)
{
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
resultVar,
"MessageEncoding"),
new CodePropertyReferenceExpression(
new CodeTypeReferenceExpression(typeof(WSMessageEncoding)),
wsHttp.MessageEncoding.ToString())));
}

if (defaultBinding.TransactionFlow != wsHttp.TransactionFlow)
{
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
resultVar,
"TransactionFlow"),
new CodePrimitiveExpression(wsHttp.TransactionFlow)));
}

if (defaultBinding.ReliableSession.Enabled != wsHttp.ReliableSession.Enabled)
{
if (wsHttp.ReliableSession.Enabled)
{
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(resultVar, "ReliableSession"),
"Enabled"),
new CodePrimitiveExpression(wsHttp.ReliableSession.Enabled)));
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(resultVar, "ReliableSession"),
"Ordered"),
new CodePrimitiveExpression(wsHttp.ReliableSession.Ordered)));
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(resultVar, "ReliableSession"),
"InactivityTimeout"),
CreateTimeSpanExpression(wsHttp.ReliableSession.InactivityTimeout)));
}
}

if (defaultBinding.Security.Mode != wsHttp.Security.Mode)
{
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(resultVar, "Security"),
"Mode"),
new CodeFieldReferenceExpression(
new CodeTypeReferenceExpression(typeof(SecurityMode)),
wsHttp.Security.Mode.ToString())));
}

if (defaultBinding.Security.Transport.ClientCredentialType != wsHttp.Security.Transport.ClientCredentialType)
{
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(resultVar, "Security"),
"Transport"),
"ClientCredentialType"),
new CodeFieldReferenceExpression(
new CodeTypeReferenceExpression(typeof(HttpClientCredentialType)),
wsHttp.Security.Transport.ClientCredentialType.ToString())));
}

if (defaultBinding.Security.Message.ClientCredentialType != wsHttp.Security.Message.ClientCredentialType)
{
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(resultVar, "Security"),
"Message"),
"ClientCredentialType"),
new CodeFieldReferenceExpression(
new CodeTypeReferenceExpression(typeof(MessageCredentialType)),
wsHttp.Security.Message.ClientCredentialType.ToString())));
}

if (defaultBinding.Security.Message.EstablishSecurityContext != wsHttp.Security.Message.EstablishSecurityContext)
{
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(resultVar, "Security"),
"Message"),
"EstablishSecurityContext"),
new CodePrimitiveExpression(wsHttp.Security.Message.EstablishSecurityContext)));
}

statements.Add(new CodeMethodReturnStatement(resultVar));
}

private static void AddWS2007HttpBindingConfiguration(CodeStatementCollection statements, WS2007HttpBinding ws2007Http)
{
const string ResultVarName = "result";
WS2007HttpBinding defaultBinding = new WS2007HttpBinding();

statements.Add(
new CodeVariableDeclarationStatement(
typeof(WS2007HttpBinding),
ResultVarName,
new CodeObjectCreateExpression(typeof(WS2007HttpBinding))));
CodeVariableReferenceExpression resultVar = new CodeVariableReferenceExpression(ResultVarName);

WSHttpMaxOutProperties(statements, resultVar);

// Set AllowCookies's default value to true.
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
resultVar,
"AllowCookies"),
new CodePrimitiveExpression(true)));

if (defaultBinding.MessageEncoding != ws2007Http.MessageEncoding)
{
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
resultVar,
"MessageEncoding"),
new CodePropertyReferenceExpression(
new CodeTypeReferenceExpression(typeof(WSMessageEncoding)),
ws2007Http.MessageEncoding.ToString())));
}

if (defaultBinding.TransactionFlow != ws2007Http.TransactionFlow)
{
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
resultVar,
"TransactionFlow"),
new CodePrimitiveExpression(ws2007Http.TransactionFlow)));
}

if (defaultBinding.ReliableSession.Enabled != ws2007Http.ReliableSession.Enabled)
{
if (ws2007Http.ReliableSession.Enabled)
{
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(resultVar, "ReliableSession"),
"Enabled"),
new CodePrimitiveExpression(ws2007Http.ReliableSession.Enabled)));
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(resultVar, "ReliableSession"),
"Ordered"),
new CodePrimitiveExpression(ws2007Http.ReliableSession.Ordered)));
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(resultVar, "ReliableSession"),
"InactivityTimeout"),
CreateTimeSpanExpression(ws2007Http.ReliableSession.InactivityTimeout)));
}
}

if (defaultBinding.Security.Mode != ws2007Http.Security.Mode)
{
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(resultVar, "Security"),
"Mode"),
new CodeFieldReferenceExpression(
new CodeTypeReferenceExpression(typeof(SecurityMode)),
ws2007Http.Security.Mode.ToString())));
}

if (defaultBinding.Security.Transport.ClientCredentialType != ws2007Http.Security.Transport.ClientCredentialType)
{
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(resultVar, "Security"),
"Transport"),
"ClientCredentialType"),
new CodeFieldReferenceExpression(
new CodeTypeReferenceExpression(typeof(HttpClientCredentialType)),
ws2007Http.Security.Transport.ClientCredentialType.ToString())));
}

if (defaultBinding.Security.Message.ClientCredentialType != ws2007Http.Security.Message.ClientCredentialType)
{
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(resultVar, "Security"),
"Message"),
"ClientCredentialType"),
new CodeFieldReferenceExpression(
new CodeTypeReferenceExpression(typeof(MessageCredentialType)),
ws2007Http.Security.Message.ClientCredentialType.ToString())));
}

if (defaultBinding.Security.Message.EstablishSecurityContext != ws2007Http.Security.Message.EstablishSecurityContext)
{
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(
new CodePropertyReferenceExpression(resultVar, "Security"),
"Message"),
"EstablishSecurityContext"),
new CodePrimitiveExpression(ws2007Http.Security.Message.EstablishSecurityContext)));
}

statements.Add(new CodeMethodReturnStatement(resultVar));
}

private static void AddCustomBindingConfiguration(CodeStatementCollection statements, CustomBinding custom)
{
const string ResultVarName = "result";
Expand Down Expand Up @@ -1054,6 +1307,23 @@ private static void MaxOutProperties(CodeStatementCollection statements, CodeVar
new CodePropertyReferenceExpression(new CodeTypeReferenceExpression(typeof(int)), "MaxValue")));
}

private static void WSHttpMaxOutProperties(CodeStatementCollection statements, CodeVariableReferenceExpression resultVar)
{
statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
resultVar,
"ReaderQuotas"),
new CodePropertyReferenceExpression(new CodeTypeReferenceExpression(typeof(XmlDictionaryReaderQuotas)), "Max")));

statements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(
resultVar,
"MaxReceivedMessageSize"),
new CodePropertyReferenceExpression(new CodeTypeReferenceExpression(typeof(int)), "MaxValue")));
}

private void AddNewEndpointAddress(string endpointConfigurationName, string endpointAddress, ServiceEndpoint serviceEndpoint)
{
CodeExpression createIdentityExpression = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,31 @@ public ReliableSession(ReliableSessionBindingElement reliableSessionBindingEleme
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("reliableSessionBindingElement");
_element = reliableSessionBindingElement;
}

public bool Ordered
{
get { return _element.Ordered; }
set { _element.Ordered = value; }
}

public TimeSpan InactivityTimeout
{
get { return _element.InactivityTimeout; }
set
{
if (value <= TimeSpan.Zero)
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException(nameof(value), value,
SRServiceModel.ValueMustBePositive));

_element.InactivityTimeout = value;
}
}

internal void CopySettings(ReliableSession copyFrom)
{
Ordered = copyFrom.Ordered;
InactivityTimeout = copyFrom.InactivityTimeout;
}
}

public class OptionalReliableSession : ReliableSession
Expand Down
Loading