internal static ChannelProtectionRequirements CreateFromContract(ContractDescription contract, ProtectionLevel defaultRequestProtectionLevel, ProtectionLevel defaultResponseProtectionLevel, bool isForClient)
        {
            if (contract == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("contract"));
            }

            ChannelProtectionRequirements requirements = new ChannelProtectionRequirements();

            ProtectionLevel contractScopeDefaultRequestProtectionLevel;
            ProtectionLevel contractScopeDefaultResponseProtectionLevel;

            if (contract.HasProtectionLevel)
            {
                contractScopeDefaultRequestProtectionLevel  = contract.ProtectionLevel;
                contractScopeDefaultResponseProtectionLevel = contract.ProtectionLevel;
            }
            else
            {
                contractScopeDefaultRequestProtectionLevel  = defaultRequestProtectionLevel;
                contractScopeDefaultResponseProtectionLevel = defaultResponseProtectionLevel;
            }

            foreach (OperationDescription operation in contract.Operations)
            {
                ProtectionLevel operationScopeDefaultRequestProtectionLevel;
                ProtectionLevel operationScopeDefaultResponseProtectionLevel;

                operationScopeDefaultRequestProtectionLevel  = contractScopeDefaultRequestProtectionLevel;
                operationScopeDefaultResponseProtectionLevel = contractScopeDefaultResponseProtectionLevel;

                foreach (MessageDescription message in operation.Messages)
                {
                    ProtectionLevel messageScopeDefaultProtectionLevel;
                    if (message.HasProtectionLevel)
                    {
                        messageScopeDefaultProtectionLevel = message.ProtectionLevel;
                    }
                    else if (message.Direction == MessageDirection.Input)
                    {
                        messageScopeDefaultProtectionLevel = operationScopeDefaultRequestProtectionLevel;
                    }
                    else
                    {
                        messageScopeDefaultProtectionLevel = operationScopeDefaultResponseProtectionLevel;
                    }

                    MessagePartSpecification signedParts    = new MessagePartSpecification();
                    MessagePartSpecification encryptedParts = new MessagePartSpecification();

                    // determine header protection requirements for message
                    foreach (MessageHeaderDescription header in message.Headers)
                    {
                        AddHeaderProtectionRequirements(header, signedParts, encryptedParts, messageScopeDefaultProtectionLevel);
                    }

                    // determine body protection requirements for message
                    ProtectionLevel bodyProtectionLevel;
                    if (message.Body.Parts.Count > 0)
                    {
                        // initialize the body protection level to none. all the body parts will be
                        // unioned to get the effective body protection level
                        bodyProtectionLevel = ProtectionLevel.None;
                    }
                    else if (message.Body.ReturnValue != null)
                    {
                        if (!(message.Body.ReturnValue.GetType().Equals(typeof(MessagePartDescription))))
                        {
                            Fx.Assert("Only body return values are supported currently");
                            throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.OnlyBodyReturnValuesSupported));
                        }
                        MessagePartDescription desc = message.Body.ReturnValue;
                        bodyProtectionLevel = desc.HasProtectionLevel ? desc.ProtectionLevel : messageScopeDefaultProtectionLevel;
                    }
                    else
                    {
                        bodyProtectionLevel = messageScopeDefaultProtectionLevel;
                    }

                    // determine body protection requirements for message
                    if (message.Body.Parts.Count > 0)
                    {
                        foreach (MessagePartDescription body in message.Body.Parts)
                        {
                            ProtectionLevel partProtectionLevel = body.HasProtectionLevel ? body.ProtectionLevel : messageScopeDefaultProtectionLevel;
                            bodyProtectionLevel = ProtectionLevelHelper.Max(bodyProtectionLevel, partProtectionLevel);
                            if (bodyProtectionLevel == ProtectionLevel.EncryptAndSign)
                            {
                                break;
                            }
                        }
                    }
                    if (bodyProtectionLevel != ProtectionLevel.None)
                    {
                        signedParts.IsBodyIncluded = true;
                        if (bodyProtectionLevel == ProtectionLevel.EncryptAndSign)
                        {
                            encryptedParts.IsBodyIncluded = true;
                        }
                    }

                    // add requirements for message
                    if (message.Direction == MessageDirection.Input)
                    {
                        requirements.IncomingSignatureParts.AddParts(signedParts, message.Action);
                        requirements.IncomingEncryptionParts.AddParts(encryptedParts, message.Action);
                    }
                    else
                    {
                        requirements.OutgoingSignatureParts.AddParts(signedParts, message.Action);
                        requirements.OutgoingEncryptionParts.AddParts(encryptedParts, message.Action);
                    }
                }
                if (operation.Faults != null)
                {
                    if (operation.IsServerInitiated())
                    {
                        AddFaultProtectionRequirements(operation.Faults, requirements, operationScopeDefaultRequestProtectionLevel, true);
                    }
                    else
                    {
                        AddFaultProtectionRequirements(operation.Faults, requirements, operationScopeDefaultResponseProtectionLevel, false);
                    }
                }
            }

            return(requirements);
        }
Ejemplo n.º 2
0
        internal static ChannelProtectionRequirements CreateFromContract(ContractDescription contract, ProtectionLevel defaultRequestProtectionLevel, ProtectionLevel defaultResponseProtectionLevel, bool isForClient)
        {
            ProtectionLevel protectionLevel;
            ProtectionLevel level2;

            if (contract == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("contract"));
            }
            ChannelProtectionRequirements requirements = new ChannelProtectionRequirements();

            if (contract.HasProtectionLevel)
            {
                protectionLevel = contract.ProtectionLevel;
                level2          = contract.ProtectionLevel;
            }
            else
            {
                protectionLevel = defaultRequestProtectionLevel;
                level2          = defaultResponseProtectionLevel;
            }
            foreach (OperationDescription description in contract.Operations)
            {
                ProtectionLevel level3;
                ProtectionLevel level4;
                if (description.HasProtectionLevel)
                {
                    level3 = description.ProtectionLevel;
                    level4 = description.ProtectionLevel;
                }
                else
                {
                    level3 = protectionLevel;
                    level4 = level2;
                }
                foreach (MessageDescription description2 in description.Messages)
                {
                    ProtectionLevel level5;
                    ProtectionLevel none;
                    if (description2.HasProtectionLevel)
                    {
                        level5 = description2.ProtectionLevel;
                    }
                    else if (description2.Direction == MessageDirection.Input)
                    {
                        level5 = level3;
                    }
                    else
                    {
                        level5 = level4;
                    }
                    MessagePartSpecification signedParts    = new MessagePartSpecification();
                    MessagePartSpecification encryptedParts = new MessagePartSpecification();
                    foreach (MessageHeaderDescription description3 in description2.Headers)
                    {
                        AddHeaderProtectionRequirements(description3, signedParts, encryptedParts, level5);
                    }
                    if (description2.Body.Parts.Count > 0)
                    {
                        none = ProtectionLevel.None;
                    }
                    else if (description2.Body.ReturnValue != null)
                    {
                        if (!description2.Body.ReturnValue.GetType().Equals(typeof(MessagePartDescription)))
                        {
                            throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("OnlyBodyReturnValuesSupported")));
                        }
                        MessagePartDescription returnValue = description2.Body.ReturnValue;
                        none = returnValue.HasProtectionLevel ? returnValue.ProtectionLevel : level5;
                    }
                    else
                    {
                        none = level5;
                    }
                    if (description2.Body.Parts.Count > 0)
                    {
                        foreach (MessagePartDescription description5 in description2.Body.Parts)
                        {
                            ProtectionLevel level7 = description5.HasProtectionLevel ? description5.ProtectionLevel : level5;
                            none = ProtectionLevelHelper.Max(none, level7);
                            if (none == ProtectionLevel.EncryptAndSign)
                            {
                                break;
                            }
                        }
                    }
                    if (none != ProtectionLevel.None)
                    {
                        signedParts.IsBodyIncluded = true;
                        if (none == ProtectionLevel.EncryptAndSign)
                        {
                            encryptedParts.IsBodyIncluded = true;
                        }
                    }
                    if (description2.Direction == MessageDirection.Input)
                    {
                        requirements.IncomingSignatureParts.AddParts(signedParts, description2.Action);
                        requirements.IncomingEncryptionParts.AddParts(encryptedParts, description2.Action);
                    }
                    else
                    {
                        requirements.OutgoingSignatureParts.AddParts(signedParts, description2.Action);
                        requirements.OutgoingEncryptionParts.AddParts(encryptedParts, description2.Action);
                    }
                }
                if (description.Faults != null)
                {
                    if (description.IsServerInitiated())
                    {
                        AddFaultProtectionRequirements(description.Faults, requirements, level3, true);
                    }
                    else
                    {
                        AddFaultProtectionRequirements(description.Faults, requirements, level4, false);
                    }
                }
            }
            return(requirements);
        }