File: System\Configuration\ProtectedConfigurationSection.cs
Web Access
Project: src\src\libraries\System.Configuration.ConfigurationManager\src\System.Configuration.ConfigurationManager.csproj (System.Configuration.ConfigurationManager)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections.Specialized;
using System.Globalization;
using System.Xml;
 
namespace System.Configuration
{
    public sealed class ProtectedConfigurationSection : ConfigurationSection
    {
        private const string EncryptedSectionTemplate = "<{0} {1}=\"{2}\"> {3} </{0}>";
 
        private static readonly ConfigurationProperty s_propProviders =
            new ConfigurationProperty("providers",
                typeof(ProtectedProviderSettings),
                new ProtectedProviderSettings(),
                ConfigurationPropertyOptions.None);
 
        private static readonly ConfigurationProperty s_propDefaultProvider =
            new ConfigurationProperty("defaultProvider",
                type: typeof(string),
                defaultValue: "RsaProtectedConfigurationProvider",
                typeConverter: null,
                validator: ConfigurationProperty.s_nonEmptyStringValidator,
                options: ConfigurationPropertyOptions.None);
 
        private static readonly ConfigurationPropertyCollection s_properties = new ConfigurationPropertyCollection { s_propProviders, s_propDefaultProvider };
 
        public ProtectedConfigurationSection() { }
 
        protected internal override ConfigurationPropertyCollection Properties => s_properties;
 
        private ProtectedProviderSettings ProtectedProviders => (ProtectedProviderSettings)base[s_propProviders];
 
        [ConfigurationProperty("providers")]
        public ProviderSettingsCollection Providers => ProtectedProviders.Providers;
 
        [ConfigurationProperty("defaultProvider", DefaultValue = "RsaProtectedConfigurationProvider")]
        public string DefaultProvider
        {
            get { return (string)base[s_propDefaultProvider]; }
            set { base[s_propDefaultProvider] = value; }
        }
 
        internal ProtectedConfigurationProvider GetProviderFromName(string providerName)
        {
            ProviderSettings ps = Providers[providerName];
 
            if (ps == null)
                throw new ArgumentException(SR.Format(SR.ProtectedConfigurationProvider_not_found, providerName), nameof(providerName));
 
            return InstantiateProvider(ps);
        }
 
        internal ProtectedConfigurationProviderCollection GetAllProviders()
        {
            ProtectedConfigurationProviderCollection coll = new ProtectedConfigurationProviderCollection();
            foreach (ProviderSettings ps in Providers)
                coll.Add(InstantiateProvider(ps));
            return coll;
        }
 
        private static ProtectedConfigurationProvider CreateAndInitializeProviderWithAssert(Type t, ProviderSettings pn)
        {
            ProtectedConfigurationProvider provider =
                (ProtectedConfigurationProvider)TypeUtil.CreateInstance(t);
            NameValueCollection pars = pn.Parameters;
            NameValueCollection cloneParams = new NameValueCollection(pars.Count);
 
            foreach (string key in pars) cloneParams[key] = pars[key];
 
            provider.Initialize(pn.Name, cloneParams);
            return provider;
        }
 
        private static ProtectedConfigurationProvider InstantiateProvider(ProviderSettings pn)
        {
            Type t = TypeUtil.GetType(pn.Type, true);
            if (!typeof(ProtectedConfigurationProvider).IsAssignableFrom(t))
                throw new ArgumentException(SR.WrongType_of_Protected_provider, nameof(pn));
 
            return CreateAndInitializeProviderWithAssert(t, pn);
        }
 
        internal static string DecryptSection(string encryptedXml, ProtectedConfigurationProvider provider)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(encryptedXml);
            XmlNode resultNode = provider.Decrypt(doc.DocumentElement);
            return resultNode.OuterXml;
        }
 
        internal static string FormatEncryptedSection(string encryptedXml, string sectionName, string providerName)
        {
            return string.Format(CultureInfo.InvariantCulture, EncryptedSectionTemplate,
                sectionName, // The section to encrypt
                BaseConfigurationRecord.ProtectionProviderAttribute, // protectionProvider keyword
                providerName, // The provider name
                encryptedXml // the encrypted xml
                );
        }
 
        internal static string EncryptSection(string clearXml, ProtectedConfigurationProvider provider)
        {
            XmlDocument xmlDocument = new XmlDocument { PreserveWhitespace = true };
            xmlDocument.LoadXml(clearXml);
            XmlNode encNode = provider.Encrypt(xmlDocument.DocumentElement);
            return encNode.OuterXml;
        }
    }
}