< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Security.AcceptorSessionSymmetricTransportSecurityProtocol
Assembly: CoreWCF.Primitives
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Security/AcceptorSessionSymmetricTransportSecurityProtocol.cs
Line coverage
88%
Covered lines: 55
Uncovered lines: 7
Coverable lines: 62
Total lines: 138
Line coverage: 88.7%
Branch coverage
60%
Covered branches: 12
Total branches: 20
Branch coverage: 60%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)50%2280%
SetSessionTokenAuthenticator(...)100%11100%
GetOutgoingSessionToken()100%110%
SetOutgoingSessionToken(...)50%22100%
VerifyIncomingMessageCoreAsync()62.5%161688.88%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Security/AcceptorSessionSymmetricTransportSecurityProtocol.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;
 5using System.Collections.Generic;
 6using System.Collections.ObjectModel;
 7using System.Threading.Tasks;
 8using System.Xml;
 9using CoreWCF.Channels;
 10using CoreWCF.Description;
 11using CoreWCF.IdentityModel.Selectors;
 12using CoreWCF.IdentityModel.Tokens;
 13using CoreWCF.Runtime;
 14using CoreWCF.Security.Tokens;
 15
 16namespace CoreWCF.Security
 17{
 18    internal sealed class AcceptorSessionSymmetricTransportSecurityProtocol : TransportSecurityProtocol, IAcceptorSecuri
 19    {
 20        private SecurityToken _outgoingSessionToken;
 21        private SecurityTokenAuthenticator _sessionTokenAuthenticator;
 22        private SecurityTokenResolver _sessionTokenResolver;
 23        private ReadOnlyCollection<SecurityTokenResolver> _sessionTokenResolverList;
 24        private UniqueId _sessionId;
 25        private Collection<SupportingTokenAuthenticatorSpecification> _sessionTokenAuthenticatorSpecificationList;
 26        private readonly bool _requireDerivedKeys;
 27
 1028        public AcceptorSessionSymmetricTransportSecurityProtocol(SessionSymmetricTransportSecurityProtocolFactory factor
 29        {
 1030            if (factory.ActAsInitiator == true)
 31            {
 32                Fx.Assert("This protocol can only be used at the recipient.");
 033                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.Format(SR.Pro
 34            }
 1035            _requireDerivedKeys = factory.SecurityTokenParameters.RequireDerivedKeys;
 1036        }
 37
 38        private SessionSymmetricTransportSecurityProtocolFactory Factory
 39        {
 21040            get { return (SessionSymmetricTransportSecurityProtocolFactory)SecurityProtocolFactory; }
 41        }
 42
 43        public bool ReturnCorrelationState
 44        {
 45            get
 46            {
 047                return false;
 48            }
 49            set
 50            {
 851            }
 52        }
 53
 54        public void SetSessionTokenAuthenticator(UniqueId sessionId, SecurityTokenAuthenticator sessionTokenAuthenticato
 55        {
 1056            CommunicationObject.ThrowIfDisposedOrImmutable();
 1057            _sessionId = sessionId;
 1058            _sessionTokenResolver = sessionTokenResolver;
 1059            Collection<SecurityTokenResolver> tmp = new Collection<SecurityTokenResolver>
 1060            {
 1061                _sessionTokenResolver
 1062            };
 1063            _sessionTokenResolverList = new ReadOnlyCollection<SecurityTokenResolver>(tmp);
 1064            _sessionTokenAuthenticator = sessionTokenAuthenticator;
 1065            SupportingTokenAuthenticatorSpecification spec = new SupportingTokenAuthenticatorSpecification(_sessionToken
 1066            _sessionTokenAuthenticatorSpecificationList = new Collection<SupportingTokenAuthenticatorSpecification>
 1067            {
 1068                spec
 1069            };
 1070        }
 71
 72        public SecurityToken GetOutgoingSessionToken()
 73        {
 074            return _outgoingSessionToken;
 75        }
 76
 77        public void SetOutgoingSessionToken(SecurityToken token)
 78        {
 1079            _outgoingSessionToken = token ?? throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(tok
 1080        }
 81
 82        protected override async ValueTask<Message> VerifyIncomingMessageCoreAsync(Message message, TimeSpan timeout)
 83        {
 2084            string actor = string.Empty; // message.Version.Envelope.UltimateDestinationActor;
 2085            ReceiveSecurityHeader securityHeader = Factory.StandardsManager.TryCreateReceiveSecurityHeader(message, acto
 2086                Factory.IncomingAlgorithmSuite, MessageDirection.Input);
 2087            securityHeader.RequireMessageProtection = false;
 2088            securityHeader.ReaderQuotas = Factory.SecurityBindingElement.ReaderQuotas;
 2089            IList<SupportingTokenAuthenticatorSpecification> supportingAuthenticators = GetSupportingTokenAuthenticators
 2090            ReadOnlyCollection<SecurityTokenResolver> mergedTokenResolvers = MergeOutOfBandResolvers(supportingAuthentic
 2091            if (supportingAuthenticators != null && supportingAuthenticators.Count > 0)
 92            {
 093                supportingAuthenticators = new List<SupportingTokenAuthenticatorSpecification>(supportingAuthenticators)
 094                supportingAuthenticators.Insert(0, _sessionTokenAuthenticatorSpecificationList[0]);
 95            }
 96            else
 97            {
 2098                supportingAuthenticators = _sessionTokenAuthenticatorSpecificationList;
 99            }
 20100            securityHeader.ConfigureTransportBindingServerReceiveHeader(supportingAuthenticators);
 20101            securityHeader.ConfigureOutOfBandTokenResolver(mergedTokenResolvers);
 20102            securityHeader.ExpectEndorsingTokens = true;
 20103            TimeoutHelper timeoutHelper = new TimeoutHelper(timeout);
 104
 20105            securityHeader.ReplayDetectionEnabled = Factory.DetectReplays;
 20106            securityHeader.SetTimeParameters(Factory.NonceCache, Factory.ReplayWindow, Factory.MaxClockSkew);
 107            // do not enforce key derivation requirement for Cancel messages due to WSE interop
 20108            securityHeader.EnforceDerivedKeyRequirement = (message.Headers.Action != Factory.StandardsManager.SecureConv
 20109            await securityHeader.ProcessAsync(timeoutHelper.RemainingTime(), SecurityUtils.GetChannelBindingFromMessage(
 20110            if (securityHeader.Timestamp == null)
 111            {
 0112                throw DiagnosticUtility.ExceptionUtility.ThrowHelperWarning(new MessageSecurityException(SR.Format(SR.Re
 113            }
 20114            bool didSessionSctEndorse = false;
 20115            if (securityHeader.EndorsingSupportingTokens != null)
 116            {
 40117                for (int i = 0; i < securityHeader.EndorsingSupportingTokens.Count; ++i)
 118                {
 20119                    SecurityContextSecurityToken signingSct = (securityHeader.EndorsingSupportingTokens[i] as SecurityCo
 20120                    if (signingSct != null && signingSct.ContextId == _sessionId)
 121                    {
 20122                        didSessionSctEndorse = true;
 20123                        break;
 124                    }
 125                }
 126            }
 20127            if (!didSessionSctEndorse)
 128            {
 0129                throw DiagnosticUtility.ExceptionUtility.ThrowHelperWarning(new MessageSecurityException(SR.Format(SR.No
 130            }
 20131            Message processedMessage = securityHeader.ProcessedMessage;
 20132            AttachRecipientSecurityProperty(processedMessage, securityHeader.BasicSupportingTokens, securityHeader.Endor
 20133                securityHeader.SignedEndorsingSupportingTokens, securityHeader.SignedSupportingTokens, securityHeader.Se
 20134            OnIncomingMessageVerified(processedMessage);
 20135            return processedMessage;
 20136        }
 137    }
 138}