File: System\ServiceModel\NetTcpSecurity.cs
Web Access
Project: src\src\System.ServiceModel.NetTcp\src\System.ServiceModel.NetTcp.csproj (System.ServiceModel.NetTcp)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.ComponentModel;
using System.Diagnostics.Contracts;
using System.ServiceModel.Channels;
 
namespace System.ServiceModel
{
    public sealed class NetTcpSecurity
    {
        internal const SecurityMode DefaultMode = SecurityMode.Transport;
 
        private SecurityMode _mode;
 
        public NetTcpSecurity() : this(DefaultMode, new TcpTransportSecurity(), new MessageSecurityOverTcp()) { }
 
        private NetTcpSecurity(SecurityMode mode, TcpTransportSecurity transportSecurity, MessageSecurityOverTcp messageSecurity)
        {
            Contract.Assert(SecurityModeHelper.IsDefined(mode),
                            string.Format("Invalid SecurityMode value: {0} = {1} (default is {2} = {3}).",
                                            (int)mode,
                                            mode.ToString(),
                                            (int)SecurityMode.Transport,
                                            SecurityMode.Transport.ToString()));
 
            _mode = mode;
            Transport = transportSecurity ?? new TcpTransportSecurity();
            Message = messageSecurity ?? new MessageSecurityOverTcp();
        }
 
        [DefaultValue(DefaultMode)]
        public SecurityMode Mode
        {
            get { return _mode; }
            set
            {
                if (!SecurityModeHelper.IsDefined(value))
                {
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException(nameof(value)));
                }
                _mode = value;
            }
        }
 
        public TcpTransportSecurity Transport { get; set; }
 
        public MessageSecurityOverTcp Message { get; set; }
 
        internal BindingElement CreateTransportSecurity()
        {
            if (_mode == SecurityMode.TransportWithMessageCredential)
            {
                return Transport.CreateTransportProtectionOnly();
            }
            else if (_mode == SecurityMode.Transport)
            {
                return Transport.CreateTransportProtectionAndAuthentication();
            }
            else
            {
                return null;
            }
        }
 
        internal SecurityBindingElement CreateMessageSecurity(bool isReliableSessionEnabled)
        {
            if (_mode == SecurityMode.Message)
            {
                throw new PlatformNotSupportedException();
            }
            else if (_mode == SecurityMode.TransportWithMessageCredential)
            {
                return Message.CreateSecurityBindingElement(true, isReliableSessionEnabled, CreateTransportSecurity());
            }
            else
            {
                return null;
            }
        }
    }
}