< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Channels.SslStreamSecurityBindingElement
Assembly: CoreWCF.NetFramingBase
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.NetFramingBase/src/CoreWCF/Channels/SslStreamSecurityBindingElement.cs
Line coverage
50%
Covered lines: 25
Uncovered lines: 25
Coverable lines: 50
Total lines: 153
Line coverage: 50%
Branch coverage
27%
Covered branches: 6
Total branches: 22
Branch coverage: 27.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor()100%11100%
.ctor(...)100%11100%
Clone()100%11100%
GetProperty(...)66.66%6675%
BuildServerStreamUpgradeProvider(...)100%11100%
GetTransportTokenAssertion()0%220%
CoreWCF.Description.IPolicyExportExtension.ExportPolicy(...)0%440%
IsMatch(...)0%660%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.NetFramingBase/src/CoreWCF/Channels/SslStreamSecurityBindingElement.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System.ComponentModel;
 5using System.Net.Security;
 6using System.Security.Authentication;
 7using System.Xml;
 8using CoreWCF.Description;
 9using CoreWCF.Security;
 10
 11namespace CoreWCF.Channels
 12{
 13    public class SslStreamSecurityBindingElement : StreamUpgradeBindingElement, ITransportTokenAssertionProvider, IPolic
 14    {
 15        private IdentityVerifier _identityVerifier;
 16        private SslProtocols _sslProtocols;
 17
 10618        public SslStreamSecurityBindingElement()
 19        {
 10620            RequireClientCertificate = TransportDefaults.RequireClientCertificate;
 10621            _sslProtocols = TransportDefaults.SslProtocols;
 10622        }
 23
 24        protected SslStreamSecurityBindingElement(SslStreamSecurityBindingElement elementToBeCloned)
 10425            : base(elementToBeCloned)
 26        {
 10427            _identityVerifier = elementToBeCloned._identityVerifier;
 10428            RequireClientCertificate = elementToBeCloned.RequireClientCertificate;
 10429            _sslProtocols = elementToBeCloned._sslProtocols;
 10430        }
 31
 32        internal IdentityVerifier IdentityVerifier
 33        {
 34            get
 35            {
 536                if (_identityVerifier == null)
 37                {
 538                    _identityVerifier = IdentityVerifier.CreateDefault();
 39                }
 40
 541                return _identityVerifier;
 42            }
 43            set
 44            {
 045                _identityVerifier = value ?? throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(val
 046            }
 47        }
 48
 49        [DefaultValue(TransportDefaults.RequireClientCertificate)]
 43550        public bool RequireClientCertificate { get; set; }
 51
 52        [DefaultValue(TransportDefaults.SslProtocols)]
 53        public SslProtocols SslProtocols
 54        {
 55            get
 56            {
 557                return _sslProtocols;
 58            }
 59            set
 60            {
 10661                SslProtocolsHelper.Validate(value);
 10662                _sslProtocols = value;
 10663            }
 64        }
 65
 66        public override BindingElement Clone()
 67        {
 10468            return new SslStreamSecurityBindingElement(this);
 69        }
 70
 71        public override T GetProperty<T>(BindingContext context)
 72        {
 2473            if (context == null)
 74            {
 075                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(context));
 76            }
 2477            if (typeof(T) == typeof(ISecurityCapabilities))
 78            {
 579                return (T)(object)new SecurityCapabilities(RequireClientCertificate, true, RequireClientCertificate,
 580                    ProtectionLevel.EncryptAndSign, ProtectionLevel.EncryptAndSign);
 81            }
 1982            else if (typeof(T) == typeof(IdentityVerifier))
 83            {
 084                return (T)(object)IdentityVerifier;
 85            }
 86            else
 87            {
 1988                return context.GetInnerProperty<T>();
 89            }
 90        }
 91
 92        public override StreamUpgradeProvider BuildServerStreamUpgradeProvider(BindingContext context)
 93        {
 594            return SslStreamSecurityUpgradeProvider.CreateServerProvider(this, context);
 95        }
 96
 97        #region ITransportTokenAssertionProvider Members
 98
 99        public XmlElement GetTransportTokenAssertion()
 100        {
 0101            XmlDocument document = new XmlDocument();
 0102            XmlElement assertion =
 0103                document.CreateElement(TransportPolicyConstants.DotNetFramingPrefix,
 0104                TransportPolicyConstants.SslTransportSecurityName,
 0105                TransportPolicyConstants.DotNetFramingNamespace);
 0106            if (RequireClientCertificate)
 107            {
 0108                assertion.AppendChild(document.CreateElement(TransportPolicyConstants.DotNetFramingPrefix,
 0109                    TransportPolicyConstants.RequireClientCertificateName,
 0110                    TransportPolicyConstants.DotNetFramingNamespace));
 111            }
 0112            return assertion;
 113        }
 114
 115        #endregion
 116
 117        void IPolicyExportExtension.ExportPolicy(MetadataExporter exporter, PolicyConversionContext context)
 118        {
 0119            if (exporter == null)
 120            {
 0121                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(exporter));
 122            }
 0123            if (context == null)
 124            {
 0125                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(context));
 126            }
 127
 0128            SecurityBindingElement.ExportPolicyForTransportTokenAssertionProviders(exporter, context);
 0129        }
 130
 131        protected override bool IsMatch(BindingElement b)
 132        {
 0133            if (b == null)
 134            {
 0135                return false;
 136            }
 0137            if (!(b is SslStreamSecurityBindingElement ssl))
 138            {
 0139                return false;
 140            }
 141
 0142            return RequireClientCertificate == ssl.RequireClientCertificate && _sslProtocols == ssl._sslProtocols;
 143        }
 144
 145        private static class TransportPolicyConstants
 146        {
 147            public const string DotNetFramingNamespace = Framing.FramingEncodingString.NamespaceUri + "/policy";
 148            public const string DotNetFramingPrefix = "msf";
 149            public const string RequireClientCertificateName = "RequireClientCertificate";
 150            public const string SslTransportSecurityName = "SslTransportSecurity";
 151        }
 152    }
 153}