< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.IdentityModel.Policy.UnconditionalPolicy
Assembly: CoreWCF.Primitives
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/IdentityModel/Policy/UnconditionalPolicy.cs
Line coverage
59%
Covered lines: 56
Uncovered lines: 38
Coverable lines: 94
Total lines: 249
Line coverage: 59.5%
Branch coverage
53%
Covered branches: 32
Total branches: 60
Branch coverage: 53.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)100%110%
.ctor(...)50%2280%
.ctor(...)50%2280%
.ctor(...)100%110%
.ctor(...)100%110%
.ctor(...)100%11100%
.ctor(...)0%880%
Initialize(...)83.33%6681.81%
Clone()0%220%
Dispose()50%4433.33%
ThrowIfDisposed()50%2266.66%
Evaluate(...)85.71%141486.66%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/IdentityModel/Policy/UnconditionalPolicy.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.Security.Principal;
 8using CoreWCF.IdentityModel.Claims;
 9using CoreWCF.Security;
 10
 11namespace CoreWCF.IdentityModel.Policy
 12{
 13    internal interface IIdentityInfo
 14    {
 15        IIdentity Identity { get; }
 16    }
 17
 18    internal class UnconditionalPolicy : IAuthorizationPolicy, IDisposable
 19    {
 20        private SecurityUniqueId _id;
 21        private ClaimSet _issuance;
 22        private ReadOnlyCollection<ClaimSet> _issuances;
 23        private IIdentity _primaryIdentity;
 24        private bool _disposed = false;
 25
 26        public UnconditionalPolicy(ClaimSet issuance)
 027            : this(issuance, SecurityUtils.MaxUtcDateTime)
 28        {
 029        }
 30
 1831        public UnconditionalPolicy(ClaimSet issuance, DateTime expirationTime)
 32        {
 1833            if (issuance == null)
 34            {
 035                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(issuance));
 36            }
 37
 1838            Initialize(ClaimSet.System, issuance, null, expirationTime);
 1839        }
 40
 1041        public UnconditionalPolicy(ReadOnlyCollection<ClaimSet> issuances, DateTime expirationTime)
 42        {
 1043            if (issuances == null)
 44            {
 045                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(issuances));
 46            }
 47
 1048            Initialize(ClaimSet.System, null, issuances, expirationTime);
 1049        }
 50
 51        internal UnconditionalPolicy(IIdentity primaryIdentity, ClaimSet issuance)
 052            : this(issuance)
 53        {
 054            _primaryIdentity = primaryIdentity;
 055        }
 56
 57        internal UnconditionalPolicy(IIdentity primaryIdentity, ClaimSet issuance, DateTime expirationTime)
 058            : this(issuance, expirationTime)
 59        {
 060            _primaryIdentity = primaryIdentity;
 061        }
 62
 63        internal UnconditionalPolicy(IIdentity primaryIdentity, ReadOnlyCollection<ClaimSet> issuances, DateTime expirat
 1064            : this(issuances, expirationTime)
 65        {
 1066            _primaryIdentity = primaryIdentity;
 1067        }
 68
 069        private UnconditionalPolicy(UnconditionalPolicy from)
 70        {
 071            IsDisposable = from.IsDisposable;
 072            _primaryIdentity = from.IsDisposable ? SecurityUtils.CloneIdentityIfNecessary(from._primaryIdentity) : from.
 073            if (from._issuance != null)
 74            {
 075                _issuance = from.IsDisposable ? SecurityUtils.CloneClaimSetIfNecessary(from._issuance) : from._issuance;
 76            }
 77            else
 78            {
 079                _issuances = from.IsDisposable ? SecurityUtils.CloneClaimSetsIfNecessary(from._issuances) : from._issuan
 80            }
 081            Issuer = from.Issuer;
 082            ExpirationTime = from.ExpirationTime;
 083        }
 84
 85        private void Initialize(ClaimSet issuer, ClaimSet issuance, ReadOnlyCollection<ClaimSet> issuances, DateTime exp
 86        {
 2887            Issuer = issuer;
 2888            _issuance = issuance;
 2889            _issuances = issuances;
 2890            ExpirationTime = expirationTime;
 2891            if (issuance != null)
 92            {
 1893                IsDisposable = issuance is WindowsClaimSet;
 94            }
 95            else
 96            {
 4097                for (int i = 0; i < issuances.Count; ++i)
 98                {
 1099                    if (issuances[i] is WindowsClaimSet)
 100                    {
 0101                        IsDisposable = true;
 0102                        break;
 103                    }
 104                }
 105            }
 10106        }
 107
 108        public string Id
 109        {
 110            get
 111            {
 0112                if (_id == null)
 113                {
 0114                    _id = SecurityUniqueId.Create();
 115                }
 116
 0117                return _id.Value;
 118            }
 119        }
 120
 28121        public ClaimSet Issuer { get; private set; }
 122
 123        internal IIdentity PrimaryIdentity
 124        {
 125            get
 126            {
 91127                ThrowIfDisposed();
 91128                if (_primaryIdentity == null)
 129                {
 17130                    IIdentity identity = null;
 17131                    if (_issuance != null)
 132                    {
 17133                        if (_issuance is IIdentityInfo)
 134                        {
 17135                            identity = ((IIdentityInfo)_issuance).Identity;
 136                        }
 137                    }
 138                    else
 139                    {
 0140                        for (int i = 0; i < _issuances.Count; ++i)
 141                        {
 0142                            ClaimSet issuance = _issuances[i];
 0143                            if (issuance is IIdentityInfo)
 144                            {
 0145                                identity = ((IIdentityInfo)issuance).Identity;
 146                                // Preferably Non-Anonymous
 0147                                if (identity != null && identity != SecurityUtils.AnonymousIdentity)
 148                                {
 149                                    break;
 150                                }
 151                            }
 152                        }
 153                    }
 17154                    _primaryIdentity = identity ?? SecurityUtils.AnonymousIdentity;
 155                }
 91156                return _primaryIdentity;
 157            }
 158        }
 159
 160        internal ReadOnlyCollection<ClaimSet> Issuances
 161        {
 162            get
 163            {
 26164                ThrowIfDisposed();
 26165                if (_issuances == null)
 166                {
 10167                    List<ClaimSet> issuances = new List<ClaimSet>(1)
 10168                    {
 10169                        _issuance
 10170                    };
 10171                    _issuances = issuances.AsReadOnly();
 172                }
 26173                return _issuances;
 174            }
 175        }
 176
 32177        public DateTime ExpirationTime { get; private set; }
 178
 58179        internal bool IsDisposable { get; private set; } = false;
 180
 181        internal UnconditionalPolicy Clone()
 182        {
 0183            ThrowIfDisposed();
 0184            return (IsDisposable) ? new UnconditionalPolicy(this) : this;
 185        }
 186
 187        public virtual void Dispose()
 188        {
 10189            if (IsDisposable && !_disposed)
 190            {
 0191                _disposed = true;
 0192                SecurityUtils.DisposeIfNecessary(_primaryIdentity as WindowsIdentity);
 0193                SecurityUtils.DisposeClaimSetIfNecessary(_issuance);
 0194                SecurityUtils.DisposeClaimSetsIfNecessary(_issuances);
 195            }
 10196        }
 197
 198        private void ThrowIfDisposed()
 199        {
 121200            if (_disposed)
 201            {
 0202                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ObjectDisposedException(GetType().FullName
 203            }
 121204        }
 205
 206        public virtual bool Evaluate(EvaluationContext evaluationContext, ref object state)
 207        {
 4208            ThrowIfDisposed();
 4209            if (_issuance != null)
 210            {
 0211                evaluationContext.AddClaimSet(this, _issuance);
 212            }
 213            else
 214            {
 16215                for (int i = 0; i < _issuances.Count; ++i)
 216                {
 4217                    if (_issuances[i] != null)
 218                    {
 4219                        evaluationContext.AddClaimSet(this, _issuances[i]);
 220                    }
 221                }
 222            }
 223
 224            // Preferably Non-Anonymous
 4225            if (PrimaryIdentity != null && PrimaryIdentity != SecurityUtils.AnonymousIdentity)
 226            {
 227                IList<IIdentity> identities;
 4228                if (!evaluationContext.Properties.TryGetValue(SecurityUtils.Identities, out object obj))
 229                {
 4230                    identities = new List<IIdentity>(1);
 4231                    evaluationContext.Properties.Add(SecurityUtils.Identities, identities);
 232                }
 233                else
 234                {
 235                    // null if other overrides the property with something else
 0236                    identities = obj as IList<IIdentity>;
 237                }
 238
 4239                if (identities != null)
 240                {
 4241                    identities.Add(PrimaryIdentity);
 242                }
 243            }
 244
 4245            evaluationContext.RecordExpirationTime(ExpirationTime);
 4246            return true;
 247        }
 248    }
 249}