File: FrameworkFork\System.ServiceModel\System\ServiceModel\Channels\ContextBindingElementPolicy.cs
Web Access
Project: src\src\dotnet-svcutil\lib\src\dotnet-svcutil-lib.csproj (dotnet-svcutil-lib)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
namespace System.ServiceModel.Channels
{
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using Microsoft.Xml;
    using System.ServiceModel.Description;
    using System.Net.Security;
 
    internal static class ContextBindingElementPolicy
    {
        private const string EncryptAndSignName = "EncryptAndSign";
        private const string HttpNamespace = "http://schemas.xmlsoap.org/soap/http";
        private const string HttpUseCookieName = "HttpUseCookie";
        private const string IncludeContextName = "IncludeContext";
        private const string NoneName = "None";
        private const string ProtectionLevelName = "ProtectionLevel";
        private const string SignName = "Sign";
        private const string WscNamespace = "http://schemas.microsoft.com/ws/2006/05/context";
        private static XmlDocument s_document;
 
        private static XmlDocument Document
        {
            get
            {
                if (s_document == null)
                {
                    s_document = new XmlDocument();
                }
 
                return s_document;
            }
        }
 
        public static bool TryGetHttpUseCookieAssertion(ICollection<XmlElement> assertions, out XmlElement httpUseCookieAssertion)
        {
            if (assertions == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("assertions");
            }
 
            httpUseCookieAssertion = null;
 
            foreach (XmlElement assertion in assertions)
            {
                if (assertion.LocalName == HttpUseCookieName
                    && assertion.NamespaceURI == HttpNamespace
                    && assertion.ChildNodes.Count == 0)
                {
                    httpUseCookieAssertion = assertion;
                    break;
                }
            }
 
            return httpUseCookieAssertion != null;
        }
 
        private static bool ContainOnlyWhitespaceChild(XmlElement parent)
        {
            if (parent.ChildNodes.Count == 0)
            {
                return true;
            }
 
            foreach (XmlNode node in parent.ChildNodes)
            {
                if (!(node is XmlWhitespace))
                {
                    return false;
                }
            }
 
            return true;
        }
 
        public static bool TryImportRequireContextAssertion(PolicyAssertionCollection assertions, out ContextBindingElement bindingElement)
        {
            if (assertions == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("assertions");
            }
 
            bindingElement = null;
 
            foreach (XmlElement assertion in assertions)
            {
                if (assertion.LocalName == IncludeContextName
                    && assertion.NamespaceURI == WscNamespace
                    && ContainOnlyWhitespaceChild(assertion))
                {
                    string protectionLevelAttribute = assertion.GetAttribute(ProtectionLevelName);
                    if (EncryptAndSignName.Equals(protectionLevelAttribute, StringComparison.Ordinal))
                    {
                        bindingElement = new ContextBindingElement(ProtectionLevel.EncryptAndSign);
                    }
                    else if (SignName.Equals(protectionLevelAttribute, StringComparison.Ordinal))
                    {
                        bindingElement = new ContextBindingElement(ProtectionLevel.Sign);
                    }
                    else if (NoneName.Equals(protectionLevelAttribute, StringComparison.Ordinal))
                    {
                        bindingElement = new ContextBindingElement(ProtectionLevel.None);
                    }
 
                    if (bindingElement != null)
                    {
                        assertions.Remove(assertion);
                        return true;
                    }
                }
            }
 
            return false;
        }
    }
}