private ConfigXmlReader DecryptConfigSection(ConfigXmlReader reader, ProtectedConfigurationProvider protectionProvider) {
ConfigXmlReader clone = reader.Clone();
IConfigErrorInfo err = (IConfigErrorInfo)clone;
string encryptedXml = null;
string clearTextXml = null;
XmlNodeType nodeType;
clone.Read();
// Save the file and line at the top of the section
string filename = err.Filename;
int lineNumber = err.LineNumber;
int sectionLineNumber = lineNumber;
if (clone.IsEmptyElement) {
throw new ConfigurationErrorsException(SR.GetString(SR.EncryptedNode_not_found), filename, lineNumber);
}
//////////////////////////////////////////////////////////
// Find the <EncryptedData> node
for (;;) {
clone.Read(); // Keep reading till we find a relavant node
nodeType = clone.NodeType;
if (nodeType == XmlNodeType.Element && clone.Name == "EncryptedData") { // Found it!
break;
}
if (nodeType == XmlNodeType.EndElement) {
throw new ConfigurationErrorsException(SR.GetString(SR.EncryptedNode_not_found), filename, lineNumber);
}
else if (nodeType != XmlNodeType.Comment && nodeType != XmlNodeType.Whitespace) {
// some other unexpected content
throw new ConfigurationErrorsException(SR.GetString(SR.EncryptedNode_is_in_invalid_format), filename, lineNumber);
}
}
//////////////////////////////////////////////////////////
// Do the decryption
// Save the line at the top of the <EncryptedData> node
lineNumber = err.LineNumber;
encryptedXml = clone.ReadOuterXml();
try {
clearTextXml = CallHostDecryptSection(encryptedXml, protectionProvider, ProtectedConfig);
} catch (Exception e) {
throw new ConfigurationErrorsException(SR.GetString(SR.Decryption_failed, protectionProvider.Name, e.Message), e, filename, lineNumber);
}
catch {
throw new ConfigurationErrorsException(SR.GetString(SR.Decryption_failed, protectionProvider.Name, ExceptionUtil.NoExceptionInformation), filename, lineNumber);
}
// Detect if there is any XML left over after <EncryptedData>
do {
nodeType = clone.NodeType;
if (nodeType == XmlNodeType.EndElement) {
break;
}
else if (nodeType != XmlNodeType.Comment && nodeType != XmlNodeType.Whitespace) {
// Got other unexpected content
throw new ConfigurationErrorsException(SR.GetString(SR.EncryptedNode_is_in_invalid_format), filename, lineNumber);
}
} while (clone.Read());
// Create a new reader, using the position of the original reader
return new ConfigXmlReader(clearTextXml, filename, sectionLineNumber, true);
}