|
// 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;
}
}
}
|