< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Channels.UnixPosixIdentitySecurityUpgradeProvider
Assembly: CoreWCF.UnixDomainSocket
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.UnixDomainSocket/src/CoreWCF/Channels/UnixPosixIdentitySecurityUpgradeProvider.cs
Line coverage
82%
Covered lines: 46
Uncovered lines: 10
Coverable lines: 56
Total lines: 148
Line coverage: 82.1%
Branch coverage
50%
Covered branches: 7
Total branches: 14
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)100%11100%
CreateUpgradeAcceptor()100%11100%
OnAbort()100%110%
OnCloseAsync(...)100%11100%
OnOpenAsync(...)100%11100%
OnOpened()100%11100%
.ctor(...)100%11100%
AcceptUpgradeAsync()50%2287.5%
CanUpgrade(...)50%2266.66%
GetRemoteSecurity()100%11100%
OnAcceptUpgradeAsync()100%11100%
CreateClientSecurityAsync()50%101076%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.UnixDomainSocket/src/CoreWCF/Channels/UnixPosixIdentitySecurityUpgradeProvider.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.Collections.ObjectModel;
 5using System.IO;
 6using System.Net.Sockets;
 7using System.Security.Claims;
 8using System.Security.Principal;
 9using System.Threading;
 10using System.Threading.Tasks;
 11using CoreWCF.Channels.Framing;
 12using CoreWCF.IdentityModel;
 13using CoreWCF.IdentityModel.Policy;
 14using CoreWCF.IdentityModel.Selectors;
 15using CoreWCF.IdentityModel.Tokens;
 16using CoreWCF.Security;
 17using CoreWCF.UnixDomainSocket.Security;
 18using Microsoft.AspNetCore.Connections.Features;
 19
 20namespace CoreWCF.Channels
 21{
 22    internal class UnixPosixIdentitySecurityUpgradeProvider : StreamSecurityUpgradeProvider
 23    {
 24        public UnixPosixIdentitySecurityUpgradeProvider(UnixPosixIdentityBindingElement bindingElement, BindingContext c
 225            : base(context.Binding)
 26        {
 227            Scheme = context.Binding.Scheme;
 228        }
 29
 030        public string Scheme { get; }
 31
 132        public override EndpointIdentity Identity => null;
 33
 34        public override StreamUpgradeAcceptor CreateUpgradeAcceptor()
 35        {
 236            ThrowIfDisposedOrNotOpen();
 237            return new UnixPosixIdentitySecurityUpgradeAcceptor(this);
 38        }
 39
 40        protected override void OnAbort()
 41        {
 042        }
 43
 44        protected override Task OnCloseAsync(CancellationToken token)
 45        {
 146            return Task.CompletedTask;
 47        }
 48
 49        protected override  Task OnOpenAsync(CancellationToken token)
 50        {
 251            return Task.CompletedTask;
 52        }
 53
 54        protected override void OnOpened()
 55        {
 256            base.OnOpened();
 257        }
 58
 59        internal class UnixPosixIdentitySecurityUpgradeAcceptor : StreamSecurityUpgradeAcceptor
 60        {
 61            private readonly UnixPosixIdentitySecurityUpgradeProvider _parent;
 62            private SecurityMessageProperty _remoteSecurity;
 63            private bool _securityUpgraded;
 64            private Socket _socket;
 65            private readonly string _upgradeString;
 266            public UnixPosixIdentitySecurityUpgradeAcceptor(UnixPosixIdentitySecurityUpgradeProvider parent)
 67            {
 268                _parent = parent;
 269                _upgradeString = "application/unixposix";
 270            }
 71
 72
 73            public override async Task<Stream> AcceptUpgradeAsync(Stream stream)
 74            {
 175                FramingConnection conn = this.Features.Get<FramingConnection>();
 176                _socket = conn.ConnectionFeatures.Get<IConnectionSocketFeature>().Socket;
 177                if (stream == null)
 78                {
 079                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(stream));
 80                }
 81
 182                (stream, _remoteSecurity) = await OnAcceptUpgradeAsync(stream);
 183                _securityUpgraded = true;
 184                return stream;
 185            }
 86
 87            public override bool CanUpgrade(string contentType)
 88            {
 189                if (_securityUpgraded)
 90                {
 091                    return false;
 92                }
 93
 194                return (contentType == _upgradeString);
 95            }
 96
 97            public override SecurityMessageProperty GetRemoteSecurity()
 98            {
 299                return _remoteSecurity;
 100            }
 101
 102            protected async Task<(Stream, SecurityMessageProperty)> OnAcceptUpgradeAsync(Stream stream)
 103            {
 104
 1105                SecurityMessageProperty remoteSecurity = await CreateClientSecurityAsync();
 1106                return (stream, remoteSecurity);
 1107            }
 108
 109            private async Task<SecurityMessageProperty> CreateClientSecurityAsync()
 110            {
 111
 1112                if(!_socket.TryGetCredentials(out uint processId, out uint userId, out uint groupId))
 113                {
 0114                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SecurityNegotiationException(SR.Authen
 115                }
 1116                GenericIdentity genericIdentity = null;
 1117                if (userId > 0)
 118                {
 1119                    UserInfo userInfo = NativeSysCall.GetUserInfo(userId);
 1120                    GroupInfo groupInfo = NativeSysCall.GetGroupInfo(groupId);
 1121                    if (userInfo == null || groupInfo == null)
 122                    {
 0123                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SecurityNegotiationException(SR.Au
 124                    }
 1125                    genericIdentity = new GenericIdentity(userInfo.Name);
 1126                    ClaimsIdentity claimsIdentity = new ClaimsIdentity(genericIdentity);
 127                    //should we add member of (Group) ?
 1128                    SecurityUtils.AddPosixClaims(claimsIdentity, groupInfo.Name, groupInfo.Id, processId);
 129                }
 0130                else if(processId>0)
 131                {
 0132                    genericIdentity = new GenericIdentity(processId.ToString());
 0133                    ClaimsIdentity claimsIdentity = new ClaimsIdentity(genericIdentity);
 0134                    SecurityUtils.AddProcessIdClaim(claimsIdentity, processId);
 135                }
 1136                SecurityToken token = new GenericIdentitySecurityToken(genericIdentity, SecurityUniqueId.Create().Value)
 1137                WindowsSecurityTokenAuthenticator authenticator = new WindowsSecurityTokenAuthenticator();
 1138                ReadOnlyCollection<IAuthorizationPolicy>  authorizationPolicies = await authenticator.ValidateTokenAsync
 1139                SecurityMessageProperty clientSecurity = new SecurityMessageProperty
 1140                {
 1141                    TransportToken = new SecurityTokenSpecification(token, authorizationPolicies),
 1142                    ServiceSecurityContext = new ServiceSecurityContext(authorizationPolicies)
 1143                };
 1144                return clientSecurity;
 1145            }
 146        }
 147    }
 148}