< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Security.SecurityMessageProperty
Assembly: CoreWCF.Primitives
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Security/SecurityMessageProperty.cs
Line coverage
71%
Covered lines: 73
Uncovered lines: 29
Coverable lines: 102
Total lines: 298
Line coverage: 71.5%
Branch coverage
56%
Covered branches: 46
Total branches: 82
Branch coverage: 56%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor()100%11100%
CreateCopy()50%8875%
GetOrCreate(...)83.33%6688.88%
AddAuthorizationPolicies(...)100%88100%
GetInitiatorTokenAuthorizationPolicies()100%11100%
GetInitiatorTokenAuthorizationPolicies(...)100%11100%
GetInitiatorTokenAuthorizationPolicies(...)43.75%484864%
Dispose()100%22100%
ThrowIfDisposed()50%2266.66%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Security/SecurityMessageProperty.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.ObjectModel;
 6using CoreWCF.Channels;
 7using CoreWCF.IdentityModel.Policy;
 8using CoreWCF.Security.Tokens;
 9
 10namespace CoreWCF.Security
 11{
 12    public class SecurityMessageProperty : IMessageProperty, IDisposable
 13    {
 14        // This is the list of outgoing supporting tokens
 15        private Collection<SupportingTokenSpecification> _outgoingSupportingTokens;
 16        private Collection<SupportingTokenSpecification> _incomingSupportingTokens;
 17        private SecurityTokenSpecification _transportToken;
 18        private SecurityTokenSpecification _protectionToken;
 19        private SecurityTokenSpecification _initiatorToken;
 20        private SecurityTokenSpecification _recipientToken;
 21        private ServiceSecurityContext _securityContext;
 22        private bool _disposed = false;
 23
 20624        public SecurityMessageProperty()
 25        {
 20626            _securityContext = ServiceSecurityContext.Anonymous;
 20627        }
 28
 29        public ServiceSecurityContext ServiceSecurityContext
 30        {
 31            get
 32            {
 25833                ThrowIfDisposed();
 25834                return _securityContext;
 35            }
 36            set
 37            {
 13938                ThrowIfDisposed();
 13939                _securityContext = value;
 13940            }
 41        }
 42
 16643        public ReadOnlyCollection<IAuthorizationPolicy> ExternalAuthorizationPolicies { get; set; }
 44
 45        public SecurityTokenSpecification ProtectionToken
 46        {
 47            get
 48            {
 4049                ThrowIfDisposed();
 4050                return _protectionToken;
 51            }
 52            set
 53            {
 054                ThrowIfDisposed();
 055                _protectionToken = value;
 056            }
 57        }
 58
 59        public SecurityTokenSpecification InitiatorToken
 60        {
 61            get
 62            {
 1063                ThrowIfDisposed();
 1064                return _initiatorToken;
 65            }
 66            set
 67            {
 068                ThrowIfDisposed();
 069                _initiatorToken = value;
 070            }
 71        }
 72
 73        public SecurityTokenSpecification RecipientToken
 74        {
 75            get
 76            {
 077                ThrowIfDisposed();
 078                return _recipientToken;
 79            }
 80            set
 81            {
 082                ThrowIfDisposed();
 083                _recipientToken = value;
 084            }
 85        }
 86
 87        public SecurityTokenSpecification TransportToken
 88        {
 89            get
 90            {
 1791                ThrowIfDisposed();
 1792                return _transportToken;
 93            }
 94            set
 95            {
 396                ThrowIfDisposed();
 397                _transportToken = value;
 398            }
 99        }
 100
 101
 338102        public string SenderIdPrefix { get; set; } = "_";
 103
 104        public bool HasIncomingSupportingTokens
 105        {
 106            get
 107            {
 232108                ThrowIfDisposed();
 232109                return ((_incomingSupportingTokens != null) && (_incomingSupportingTokens.Count > 0));
 110            }
 111        }
 112
 113        public Collection<SupportingTokenSpecification> IncomingSupportingTokens
 114        {
 115            get
 116            {
 201117                ThrowIfDisposed();
 201118                if (_incomingSupportingTokens == null)
 119                {
 63120                    _incomingSupportingTokens = new Collection<SupportingTokenSpecification>();
 121                }
 201122                return _incomingSupportingTokens;
 123            }
 124        }
 125
 126        public Collection<SupportingTokenSpecification> OutgoingSupportingTokens
 127        {
 128            get
 129            {
 0130                if (_outgoingSupportingTokens == null)
 131                {
 0132                    _outgoingSupportingTokens = new Collection<SupportingTokenSpecification>();
 133                }
 0134                return _outgoingSupportingTokens;
 135            }
 136        }
 137
 138        internal bool HasOutgoingSupportingTokens
 139        {
 140            get
 141            {
 66142                return ((_outgoingSupportingTokens != null) && (_outgoingSupportingTokens.Count > 0));
 143            }
 144        }
 145
 146        public IMessageProperty CreateCopy()
 147        {
 66148            ThrowIfDisposed();
 66149            SecurityMessageProperty result = new SecurityMessageProperty();
 150
 66151            if (HasOutgoingSupportingTokens)
 152            {
 0153                for (int i = 0; i < _outgoingSupportingTokens.Count; ++i)
 154                {
 0155                    result.OutgoingSupportingTokens.Add(_outgoingSupportingTokens[i]);
 156                }
 157            }
 158
 66159            if (HasIncomingSupportingTokens)
 160            {
 0161                for (int i = 0; i < _incomingSupportingTokens.Count; ++i)
 162                {
 0163                    result.IncomingSupportingTokens.Add(_incomingSupportingTokens[i]);
 164                }
 165            }
 166
 66167            result._securityContext = _securityContext;
 66168            result.ExternalAuthorizationPolicies = ExternalAuthorizationPolicies;
 66169            result.SenderIdPrefix = SenderIdPrefix;
 170
 66171            result._protectionToken = _protectionToken;
 66172            result._initiatorToken = _initiatorToken;
 66173            result._recipientToken = _recipientToken;
 66174            result._transportToken = _transportToken;
 175
 66176            return result;
 177        }
 178
 179        public static SecurityMessageProperty GetOrCreate(Message message)
 180        {
 80181            if (message == null)
 182            {
 0183                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(message));
 184            }
 185
 80186            SecurityMessageProperty result = null;
 80187            if (message.Properties != null)
 188            {
 80189                result = message.Properties.Security;
 190            }
 191
 80192            if (result == null)
 193            {
 74194                result = new SecurityMessageProperty();
 74195                message.Properties.Security = result;
 196            }
 197
 80198            return result;
 199        }
 200
 201        private void AddAuthorizationPolicies(SecurityTokenSpecification spec, Collection<IAuthorizationPolicy> policies
 202        {
 252203            if (spec != null && spec.SecurityTokenPolicies != null && spec.SecurityTokenPolicies.Count > 0)
 204            {
 260205                for (int i = 0; i < spec.SecurityTokenPolicies.Count; ++i)
 206                {
 68207                    policies.Add(spec.SecurityTokenPolicies[i]);
 208                }
 209            }
 252210        }
 211
 212        internal ReadOnlyCollection<IAuthorizationPolicy> GetInitiatorTokenAuthorizationPolicies()
 213        {
 63214            return GetInitiatorTokenAuthorizationPolicies(true);
 215        }
 216
 217        internal ReadOnlyCollection<IAuthorizationPolicy> GetInitiatorTokenAuthorizationPolicies(bool includeTransportTo
 218        {
 63219            return GetInitiatorTokenAuthorizationPolicies(includeTransportToken, null);
 220        }
 221
 222        internal ReadOnlyCollection<IAuthorizationPolicy> GetInitiatorTokenAuthorizationPolicies(bool includeTransportTo
 223        {
 224            // fast path
 63225            if (!HasIncomingSupportingTokens)
 226            {
 0227                if (_transportToken != null && _initiatorToken == null && _protectionToken == null)
 228                {
 0229                    if (includeTransportToken && _transportToken.SecurityTokenPolicies != null)
 230                    {
 0231                        return _transportToken.SecurityTokenPolicies;
 232                    }
 233                    else
 234                    {
 0235                        return EmptyReadOnlyCollection<IAuthorizationPolicy>.Instance;
 236                    }
 237                }
 0238                else if (_transportToken == null && _initiatorToken != null && _protectionToken == null)
 239                {
 0240                    return _initiatorToken.SecurityTokenPolicies ?? EmptyReadOnlyCollection<IAuthorizationPolicy>.Instan
 241                }
 0242                else if (_transportToken == null && _initiatorToken == null && _protectionToken != null)
 243                {
 0244                    return _protectionToken.SecurityTokenPolicies ?? EmptyReadOnlyCollection<IAuthorizationPolicy>.Insta
 245                }
 246            }
 247
 63248            Collection<IAuthorizationPolicy> policies = new Collection<IAuthorizationPolicy>();
 63249            if (includeTransportToken)
 250            {
 63251                AddAuthorizationPolicies(_transportToken, policies);
 252            }
 63253            AddAuthorizationPolicies(_initiatorToken, policies);
 63254            AddAuthorizationPolicies(_protectionToken, policies);
 63255            if (HasIncomingSupportingTokens)
 256            {
 252257                for (int i = 0; i < _incomingSupportingTokens.Count; ++i)
 258                {
 63259                    if (supportingSessionTokenToExclude != null)
 260                    {
 0261                        if (_incomingSupportingTokens[i].SecurityToken is SecurityContextSecurityToken sct && sct.Contex
 262                        {
 263                            continue;
 264                        }
 265                    }
 63266                    SecurityTokenAttachmentMode attachmentMode = _incomingSupportingTokens[i].SecurityTokenAttachmentMod
 267                    // a safety net in case more attachment modes get added to the product without
 268                    // reviewing this code.
 63269                    if (attachmentMode == SecurityTokenAttachmentMode.Endorsing
 63270                        || attachmentMode == SecurityTokenAttachmentMode.Signed
 63271                        || attachmentMode == SecurityTokenAttachmentMode.SignedEncrypted
 63272                        || attachmentMode == SecurityTokenAttachmentMode.SignedEndorsing)
 273                    {
 63274                        AddAuthorizationPolicies(_incomingSupportingTokens[i], policies);
 275                    }
 276                }
 277            }
 63278            return new ReadOnlyCollection<IAuthorizationPolicy>(policies);
 279        }
 280
 281        public void Dispose()
 282        {
 283            // do no-op for future V2
 107284            if (!_disposed)
 285            {
 107286                _disposed = true;
 287            }
 107288        }
 289
 290        private void ThrowIfDisposed()
 291        {
 966292            if (_disposed)
 293            {
 0294                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ObjectDisposedException(GetType().FullName
 295            }
 966296        }
 297    }
 298}