Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Configuration / System / Configuration / RuntimeConfigurationRecord.cs / 1305376 / RuntimeConfigurationRecord.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Configuration { using System.Collections; using System.Collections.Specialized; using System.Globalization; using System.IO; using System.Reflection; using System.Security; using System.Security.Permissions; using System.Security.Policy; using System.Xml; using System.Net; using System.Configuration.Internal; using Assembly = System.Reflection.Assembly; internal sealed class RuntimeConfigurationRecord : BaseConfigurationRecord { static internal IInternalConfigRecord Create( InternalConfigRoot configRoot, IInternalConfigRecord parent, string configPath) { RuntimeConfigurationRecord configRecord = new RuntimeConfigurationRecord(); configRecord.Init(configRoot, (BaseConfigurationRecord) parent, configPath, null); return configRecord; } private RuntimeConfigurationRecord() { } static readonly SimpleBitVector32 RuntimeClassFlags = new SimpleBitVector32( ClassSupportsChangeNotifications | ClassSupportsRefresh | ClassSupportsImpersonation | ClassSupportsRestrictedPermissions | ClassSupportsDelayedInit); override protected SimpleBitVector32 ClassFlags { get { return RuntimeClassFlags; } } // Create the factory that will evaluate configuration override protected object CreateSectionFactory(FactoryRecord factoryRecord) { return new RuntimeConfigurationFactory(this, factoryRecord); } // parentConfig contains the config that we'd merge with. override protected object CreateSection(bool inputIsTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, object parentConfig, ConfigXmlReader reader) { // Get the factory used to create a section. RuntimeConfigurationFactory factory = (RuntimeConfigurationFactory) factoryRecord.Factory; // Use the factory to create a section. object config = factory.CreateSection(inputIsTrusted, this, factoryRecord, sectionRecord, parentConfig, reader); return config; } override protected object UseParentResult(string configKey, object parentResult, SectionRecord sectionRecord) { return parentResult; } // Ignore user code on the stack [PermissionSet(SecurityAction.Assert, Unrestricted=true)] private object GetRuntimeObjectWithFullTrust(ConfigurationSection section) { return section.GetRuntimeObject(); } private object GetRuntimeObjectWithRestrictedPermissions(ConfigurationSection section) { // Run configuration section handlers as if user code was on the stack bool revertPermitOnly = false; try { PermissionSet permissionSet = GetRestrictedPermissions(); if (permissionSet != null) { permissionSet.PermitOnly(); revertPermitOnly = true; } return section.GetRuntimeObject(); } finally { if (revertPermitOnly) { CodeAccessPermission.RevertPermitOnly(); } } } override protected object GetRuntimeObject(object result) { object runtimeObject; ConfigurationSection section = result as ConfigurationSection; if (section == null) { runtimeObject = result; } else { // Call into config section while impersonating process or UNC identity // so that the section could read files from disk if needed try { using (Impersonate()) { // If this configRecord is trusted, ignore user code on stack if (_flags[IsTrusted]) { runtimeObject = GetRuntimeObjectWithFullTrust(section); } else { // Run configuration section handlers as if user code was on the stack runtimeObject = GetRuntimeObjectWithRestrictedPermissions(section); } } } catch (Exception e) { throw new ConfigurationErrorsException(SR.GetString(SR.Config_exception_in_config_section_handler, section.SectionInformation.SectionName), e); } } return runtimeObject; } [PermissionSet(SecurityAction.Assert, Unrestricted=true)] protected override string CallHostDecryptSection(string encryptedXml, ProtectedConfigurationProvider protectionProvider, ProtectedConfigurationSection protectedConfig) { // Decrypt should always succeed in runtime. (VSWhidbey 429996) // Need to override in order to Assert before calling the base class method. return base.CallHostDecryptSection(encryptedXml, protectionProvider, protectedConfig); } private class RuntimeConfigurationFactory { ConstructorInfo _sectionCtor; IConfigurationSectionHandler _sectionHandler; internal RuntimeConfigurationFactory(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord) { // If the factory record was defined in a trusted config record, ignore user code on stack if (factoryRecord.IsFromTrustedConfigRecord) { InitWithFullTrust(configRecord, factoryRecord); } else { // Run configuration section handlers as if user code was on the stack InitWithRestrictedPermissions(configRecord, factoryRecord); } } private void Init(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord) { // Get the type of the factory Type type = TypeUtil.GetTypeWithReflectionPermission(configRecord.Host, factoryRecord.FactoryTypeName, true); // If the type is a ConfigurationSection, that's the type. if (typeof(ConfigurationSection).IsAssignableFrom(type)) { _sectionCtor = TypeUtil.GetConstructorWithReflectionPermission(type, typeof(ConfigurationSection), true); } else { // Note: in v1, IConfigurationSectionHandler is in effect a factory that has a Create method // that creates the real section object. // throws if type does not implement IConfigurationSectionHandler TypeUtil.VerifyAssignableType(typeof(IConfigurationSectionHandler), type, true); // Create an instance of the handler _sectionHandler = (IConfigurationSectionHandler) TypeUtil.CreateInstanceWithReflectionPermission(type); } } // Ignore user code on the stack [PermissionSet(SecurityAction.Assert, Unrestricted=true)] private void InitWithFullTrust(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord) { Init(configRecord, factoryRecord); } private void InitWithRestrictedPermissions(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord) { // Run configuration section handlers as if user code was on the stack bool revertPermitOnly = false; try { PermissionSet permissionSet = configRecord.GetRestrictedPermissions(); if (permissionSet != null) { permissionSet.PermitOnly(); revertPermitOnly = true; } Init(configRecord, factoryRecord); } finally { if (revertPermitOnly) { CodeAccessPermission.RevertPermitOnly(); } } } // // Throw an exception if an attribute within a legacy section is one of our // reserved locking attributes. We do not want admins to think they can lock // an attribute or element within a legacy section. // private static void CheckForLockAttributes(string sectionName, XmlNode xmlNode) { XmlAttributeCollection attributes = xmlNode.Attributes; if (attributes != null) { foreach (XmlAttribute attribute in attributes) { if (ConfigurationElement.IsLockAttributeName(attribute.Name)) { throw new ConfigurationErrorsException(SR.GetString(SR.Config_element_locking_not_supported, sectionName), attribute); } } } foreach (XmlNode child in xmlNode.ChildNodes) { if (xmlNode.NodeType == XmlNodeType.Element) { CheckForLockAttributes(sectionName, child); } } } private object CreateSectionImpl( RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord, SectionRecord sectionRecord, object parentConfig, ConfigXmlReader reader) { object config; if (_sectionCtor != null) { ConfigurationSection configSection = (ConfigurationSection) TypeUtil.InvokeCtorWithReflectionPermission(_sectionCtor); configSection.SectionInformation.SetRuntimeConfigurationInformation(configRecord, factoryRecord, sectionRecord); configSection.CallInit(); ConfigurationSection parentSection = (ConfigurationSection) parentConfig; configSection.Reset(parentSection); if (reader != null) { configSection.DeserializeSection(reader); } // throw if there are any cached errors ConfigurationErrorsException errors = configSection.GetErrors(); if (errors != null) { throw errors; } // don't allow changes to sections at runtime configSection.SetReadOnly(); // reset the modified bit configSection.ResetModified(); config = configSection; } else { if (reader != null) { XmlNode xmlNode = ErrorInfoXmlDocument.CreateSectionXmlNode(reader); CheckForLockAttributes(factoryRecord.ConfigKey, xmlNode); // In v1, our old section handler expects a context that contains the virtualPath from the configPath object configContext = configRecord.Host.CreateDeprecatedConfigContext(configRecord.ConfigPath); config = _sectionHandler.Create(parentConfig, configContext, xmlNode); } else { config = null; } } return config; } // Ignore user code on the stack [PermissionSet(SecurityAction.Assert, Unrestricted=true)] private object CreateSectionWithFullTrust( RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord, SectionRecord sectionRecord, object parentConfig, ConfigXmlReader reader) { return CreateSectionImpl(configRecord, factoryRecord, sectionRecord, parentConfig, reader); } private object CreateSectionWithRestrictedPermissions( RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord, SectionRecord sectionRecord, object parentConfig, ConfigXmlReader reader) { // run configuration section handlers as if user code was on the stack bool revertPermitOnly = false; try { PermissionSet permissionSet = configRecord.GetRestrictedPermissions(); if (permissionSet != null) { permissionSet.PermitOnly(); revertPermitOnly = true; } return CreateSectionImpl(configRecord, factoryRecord, sectionRecord, parentConfig, reader); } finally { if (revertPermitOnly) { CodeAccessPermission.RevertPermitOnly(); } } } internal object CreateSection(bool inputIsTrusted, RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord, SectionRecord sectionRecord, object parentConfig, ConfigXmlReader reader) { if (inputIsTrusted) { return CreateSectionWithFullTrust(configRecord, factoryRecord, sectionRecord, parentConfig, reader); } else { return CreateSectionWithRestrictedPermissions(configRecord, factoryRecord, sectionRecord, parentConfig, reader); } } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- BamlTreeUpdater.cs
- WorkflowServiceAttributes.cs
- AggregateException.cs
- OdbcConnectionPoolProviderInfo.cs
- TimeZone.cs
- SendMailErrorEventArgs.cs
- Path.cs
- DataGridViewCellCollection.cs
- ExpressionBindingsDialog.cs
- ContractCodeDomInfo.cs
- PropertyItem.cs
- TextEditorTables.cs
- WindowsImpersonationContext.cs
- NetworkInformationException.cs
- ListSortDescription.cs
- ObjectList.cs
- AxDesigner.cs
- AsymmetricAlgorithm.cs
- DoubleLink.cs
- ConfigXmlCDataSection.cs
- MemoryFailPoint.cs
- InputScopeNameConverter.cs
- Type.cs
- ComNativeDescriptor.cs
- HitTestResult.cs
- MultiSelectRootGridEntry.cs
- SmtpFailedRecipientsException.cs
- DLinqAssociationProvider.cs
- ScrollEvent.cs
- ListItemCollection.cs
- ModelEditingScope.cs
- Helpers.cs
- SudsParser.cs
- DispatchOperation.cs
- HMACSHA256.cs
- ReflectionServiceProvider.cs
- ConstrainedDataObject.cs
- PrintControllerWithStatusDialog.cs
- ComboBoxItem.cs
- TransactionManager.cs
- ServiceHttpHandlerFactory.cs
- LocationReferenceValue.cs
- BrowserCapabilitiesFactory.cs
- GlyphShapingProperties.cs
- DataBindingExpressionBuilder.cs
- Group.cs
- RightsManagementEncryptedStream.cs
- DictionarySectionHandler.cs
- DataGridTableCollection.cs
- ConfigurationValidatorAttribute.cs
- XmlWriterSettings.cs
- MessageQueuePermissionEntry.cs
- CodeGroup.cs
- Point.cs
- HtmlElementEventArgs.cs
- ChildTable.cs
- TableProvider.cs
- GridItemPatternIdentifiers.cs
- Touch.cs
- ClientApiGenerator.cs
- EnumerableRowCollectionExtensions.cs
- Brush.cs
- EventManager.cs
- CookieProtection.cs
- SystemUnicastIPAddressInformation.cs
- WebPartEventArgs.cs
- Point.cs
- ExceptionRoutedEventArgs.cs
- XmlSchemaCollection.cs
- HtmlShim.cs
- PkcsMisc.cs
- AuthenticationModuleElement.cs
- Int32CollectionConverter.cs
- ValidateNames.cs
- DataTable.cs
- TextDpi.cs
- AvTrace.cs
- ControlDesignerState.cs
- NamespaceEmitter.cs
- WebPartExportVerb.cs
- InstanceData.cs
- ViewEvent.cs
- PtsCache.cs
- WebRequestModulesSection.cs
- LockCookie.cs
- ProjectionPath.cs
- MobileListItemCollection.cs
- SerializationFieldInfo.cs
- SocketException.cs
- XmlUrlResolver.cs
- BaseTemplateCodeDomTreeGenerator.cs
- AccessViolationException.cs
- MergeFailedEvent.cs
- AssociationTypeEmitter.cs
- ServiceMetadataExtension.cs
- CallContext.cs
- FormsAuthenticationConfiguration.cs
- SystemIPInterfaceProperties.cs
- CompilationUtil.cs
- ExpressionDumper.cs