//------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //------------------------------------------------------------------------------ namespace System.Web.Configuration { using System; using System.Collections; using System.ComponentModel; using System.Configuration; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Web.Compilation; using System.Web.UI; using System.Web.Util; using System.Xml; /* */ public sealed class PagesSection : ConfigurationSection { private static readonly Version _controlRenderingDefaultVersion = VersionUtil.FrameworkDefault; private static readonly Version _controlRenderingMinimumVersion = VersionUtil.Framework35; private static ConfigurationPropertyCollection _properties; private static readonly ConfigurationProperty _propBuffer = new ConfigurationProperty("buffer", typeof(bool), true, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propControlRenderingCompatibilityVersion = new ConfigurationProperty("controlRenderingCompatibilityVersion", typeof(Version), _controlRenderingDefaultVersion, StdValidatorsAndConverters.VersionConverter, //typeConverter new VersionValidator(_controlRenderingMinimumVersion), //baseValidator ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propEnableSessionState = new ConfigurationProperty("enableSessionState", typeof(string), "true", ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propEnableViewState = new ConfigurationProperty("enableViewState", typeof(bool), true, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propEnableViewStateMac = new ConfigurationProperty("enableViewStateMac", typeof(bool), true, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propEnableEventValidation = new ConfigurationProperty("enableEventValidation", typeof(bool), Page.EnableEventValidationDefault, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propSmartNavigation = new ConfigurationProperty("smartNavigation", typeof(bool), false, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propAutoEventWireup = new ConfigurationProperty("autoEventWireup", typeof(bool), true, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propPageBaseType = new ConfigurationProperty("pageBaseType", typeof(string), "System.Web.UI.Page", ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propUserControlBaseType = new ConfigurationProperty("userControlBaseType", typeof(string), "System.Web.UI.UserControl", ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propValidateRequest = new ConfigurationProperty("validateRequest", typeof(bool), true, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propMasterPageFile = new ConfigurationProperty("masterPageFile", typeof(string), String.Empty, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propTheme = new ConfigurationProperty("theme", typeof(string), String.Empty, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propNamespaces = new ConfigurationProperty("namespaces", typeof(NamespaceCollection), null, ConfigurationPropertyOptions.IsDefaultCollection); private static readonly ConfigurationProperty _propControls = new ConfigurationProperty("controls", typeof(TagPrefixCollection), null, ConfigurationPropertyOptions.IsDefaultCollection); private static readonly ConfigurationProperty _propTagMapping = new ConfigurationProperty("tagMapping", typeof(TagMapCollection), null, ConfigurationPropertyOptions.IsDefaultCollection); private static readonly ConfigurationProperty _propMaxPageStateFieldLength = new ConfigurationProperty("maxPageStateFieldLength", typeof(int), Page.DefaultMaxPageStateFieldLength, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propCompilationMode = new ConfigurationProperty("compilationMode", typeof(CompilationMode), CompilationMode.Always, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propStyleSheetTheme = new ConfigurationProperty("styleSheetTheme", typeof(string), String.Empty, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propPageParserFilterType = new ConfigurationProperty("pageParserFilterType", typeof(string), String.Empty, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propViewStateEncryptionMode = new ConfigurationProperty("viewStateEncryptionMode", typeof(ViewStateEncryptionMode), ViewStateEncryptionMode.Auto, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propMaintainScrollPosition = new ConfigurationProperty("maintainScrollPositionOnPostBack", typeof(bool), false, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propAsyncTimeout = new ConfigurationProperty("asyncTimeout", typeof(TimeSpan), TimeSpan.FromSeconds((double)Page.DefaultAsyncTimeoutSeconds), StdValidatorsAndConverters.TimeSpanSecondsConverter, StdValidatorsAndConverters.PositiveTimeSpanValidator, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propRenderAllHiddenFieldsAtTopOfForm = new ConfigurationProperty("renderAllHiddenFieldsAtTopOfForm", typeof(bool), true, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propClientIDMode = new ConfigurationProperty("clientIDMode", typeof(ClientIDMode), ClientIDMode.Predictable, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propIgnoreDeviceFilters = new ConfigurationProperty("ignoreDeviceFilters", typeof(IgnoreDeviceFilterElementCollection), null, ConfigurationPropertyOptions.IsDefaultCollection); private VirtualPath _virtualPath; private string _masterPageFile; private Type _pageBaseType; private Type _userControlBaseType; private Type _pageParserFilterType; private bool _themeChecked; private bool _styleSheetThemeChecked; private ClientIDMode? _clientIDMode; private Version _controlRenderingCompatibilityVersion; // private TagNamespaceRegisterEntryTable _tagNamespaceRegisterEntries; // private Hashtable _userControlRegisterEntries; static PagesSection() { // Property initialization _properties = new ConfigurationPropertyCollection(); _properties.Add(_propBuffer); _properties.Add(_propControlRenderingCompatibilityVersion); _properties.Add(_propEnableSessionState); _properties.Add(_propEnableViewState); _properties.Add(_propEnableViewStateMac); _properties.Add(_propEnableEventValidation); _properties.Add(_propSmartNavigation); _properties.Add(_propAutoEventWireup); _properties.Add(_propPageBaseType); _properties.Add(_propUserControlBaseType); _properties.Add(_propValidateRequest); _properties.Add(_propMasterPageFile); _properties.Add(_propTheme); _properties.Add(_propStyleSheetTheme); _properties.Add(_propNamespaces); _properties.Add(_propControls); _properties.Add(_propTagMapping); _properties.Add(_propMaxPageStateFieldLength); _properties.Add(_propCompilationMode); _properties.Add(_propPageParserFilterType); _properties.Add(_propViewStateEncryptionMode); _properties.Add(_propMaintainScrollPosition); _properties.Add(_propAsyncTimeout); _properties.Add(_propRenderAllHiddenFieldsAtTopOfForm); _properties.Add(_propClientIDMode); _properties.Add(_propIgnoreDeviceFilters); } public PagesSection() { } /* protected override void InitializeDefault() { /* No Init Basic Map Controls.Add(new TagPrefixInfo("asp", "System.Web.UI.WebControls.WebParts", "System.Web, Version="+ThisAssembly.Version+", Culture=neutral, PublicKeyToken="+AssemblyRef.MicrosoftPublicKey, null, null)); */ /* } */ protected override ConfigurationPropertyCollection Properties { get { return _properties; } } [ConfigurationProperty("buffer", DefaultValue = true)] public bool Buffer { get { return (bool)base[_propBuffer]; } set { base[_propBuffer] = value; } } [ConfigurationProperty("enableSessionState", DefaultValue = "true")] public PagesEnableSessionState EnableSessionState { get { // note that the values of true and false are True and False // in the enum and need to be true and false in the file // so we cannot simple use the values from the enum // "true" and "false" are not legal values for the enum // since they are part of the language PagesEnableSessionState temp = PagesEnableSessionState.True; switch ((string)base[_propEnableSessionState]) { case "true": temp = PagesEnableSessionState.True; break; case "false": temp = PagesEnableSessionState.False; break; case "ReadOnly": temp = PagesEnableSessionState.ReadOnly; break; default: // throw here cause this is a bad value string PropName = _propEnableSessionState.Name; string LegalValues = "true, false, ReadOnly"; throw new ConfigurationErrorsException(SR.GetString(SR.Invalid_enum_attribute, PropName, LegalValues)); } return (PagesEnableSessionState)temp; } set { string tempStr = "true"; switch (value) { case PagesEnableSessionState.True: tempStr = "true"; break; case PagesEnableSessionState.False: tempStr = "false"; break; case PagesEnableSessionState.ReadOnly: tempStr = "ReadOnly"; break; default: tempStr = "true"; break; } base[_propEnableSessionState] = tempStr; } } [ConfigurationProperty("enableViewState", DefaultValue = true)] public bool EnableViewState { get { return (bool)base[_propEnableViewState]; } set { base[_propEnableViewState] = value; } } [ConfigurationProperty("enableViewStateMac", DefaultValue = true)] public bool EnableViewStateMac { get { return (bool)base[_propEnableViewStateMac]; } set { base[_propEnableViewStateMac] = value; } } [ConfigurationProperty("enableEventValidation", DefaultValue = Page.EnableEventValidationDefault)] public bool EnableEventValidation { get { return (bool)base[_propEnableEventValidation]; } set { base[_propEnableEventValidation] = value; } } [ConfigurationProperty("smartNavigation", DefaultValue = false)] public bool SmartNavigation { get { return (bool)base[_propSmartNavigation]; } set { base[_propSmartNavigation] = value; } } [ConfigurationProperty("autoEventWireup", DefaultValue = true)] public bool AutoEventWireup { get { return (bool)base[_propAutoEventWireup]; } set { base[_propAutoEventWireup] = value; } } [ConfigurationProperty("maintainScrollPositionOnPostBack", DefaultValue = false)] public bool MaintainScrollPositionOnPostBack { get { return (bool)base[_propMaintainScrollPosition]; } set { base[_propMaintainScrollPosition] = value; } } [ConfigurationProperty("pageBaseType", DefaultValue = "System.Web.UI.Page")] public string PageBaseType { get { return (string)base[_propPageBaseType]; } set { base[_propPageBaseType] = value; } } [ConfigurationProperty("userControlBaseType", DefaultValue = "System.Web.UI.UserControl")] public string UserControlBaseType { get { return (string)base[_propUserControlBaseType]; } set { base[_propUserControlBaseType] = value; } } internal Type PageBaseTypeInternal { get { if (_pageBaseType == null && ElementInformation.Properties[_propPageBaseType.Name].ValueOrigin != PropertyValueOrigin.Default) { lock (this) { if (_pageBaseType == null) { Type pageBaseType = ConfigUtil.GetType(PageBaseType, "pageBaseType", this); ConfigUtil.CheckBaseType(typeof(System.Web.UI.Page), pageBaseType, "pageBaseType", this); _pageBaseType = pageBaseType; } } } return _pageBaseType; } } internal Type UserControlBaseTypeInternal { get { if (_userControlBaseType == null && ElementInformation.Properties[_propUserControlBaseType.Name].ValueOrigin != PropertyValueOrigin.Default) { lock (this) { if (_userControlBaseType == null) { Type userControlBaseType = ConfigUtil.GetType( UserControlBaseType, "userControlBaseType", this); ConfigUtil.CheckBaseType(typeof(System.Web.UI.UserControl), userControlBaseType, "userControlBaseType", this); _userControlBaseType = userControlBaseType; } } } return _userControlBaseType; } } [ConfigurationProperty("pageParserFilterType", DefaultValue = "")] public string PageParserFilterType { get { return (string)base[_propPageParserFilterType]; } set { base[_propPageParserFilterType] = value; } } internal Type PageParserFilterTypeInternal { get { if (PageParser.DefaultPageParserFilterType != null) { return PageParser.DefaultPageParserFilterType; } // If pageParserFilterType is an empty string, we treat this as meaning 'no filter', // possibly overriding one specified on a parent web.config if (_pageParserFilterType == null && !String.IsNullOrEmpty(PageParserFilterType)) { Type pageParserFilterType = ConfigUtil.GetType(PageParserFilterType, "pageParserFilterType", this); ConfigUtil.CheckBaseType(typeof(PageParserFilter), pageParserFilterType, "pageParserFilterType", this); _pageParserFilterType = pageParserFilterType; } return _pageParserFilterType; } } internal PageParserFilter CreateControlTypeFilter() { Type pageParserFilterType = PageParserFilterTypeInternal; // If no filter type is registered, return null if (pageParserFilterType == null) return null; // Create an instance of the filter return (PageParserFilter)HttpRuntime.CreateNonPublicInstance(pageParserFilterType); } [ConfigurationProperty("validateRequest", DefaultValue = true)] public bool ValidateRequest { get { return (bool)base[_propValidateRequest]; } set { base[_propValidateRequest] = value; } } [ConfigurationProperty("masterPageFile", DefaultValue = "")] public string MasterPageFile { get { return (string)base[_propMasterPageFile]; } set { base[_propMasterPageFile] = value; } } internal string MasterPageFileInternal { get { if (_masterPageFile == null) { String masterPageFile = MasterPageFile; if (!String.IsNullOrEmpty(masterPageFile)) { if (UrlPath.IsAbsolutePhysicalPath(masterPageFile)) { throw new ConfigurationErrorsException( SR.GetString(SR.Physical_path_not_allowed, masterPageFile), ElementInformation.Properties["masterPageFile"].Source, ElementInformation.Properties["masterPageFile"].LineNumber); } VirtualPath masterPageVirtualPath; try { masterPageVirtualPath = VirtualPath.CreateNonRelative(masterPageFile); } catch (Exception ex) { throw new ConfigurationErrorsException(ex.Message, ex, ElementInformation.Properties["masterPageFile"].Source, ElementInformation.Properties["masterPageFile"].LineNumber); } if (!Util.VirtualFileExistsWithAssert(masterPageVirtualPath)) { throw new ConfigurationErrorsException( SR.GetString(SR.FileName_does_not_exist, masterPageFile), ElementInformation.Properties["masterPageFile"].Source, ElementInformation.Properties["masterPageFile"].LineNumber); } string extension = UrlPath.GetExtension(masterPageFile); Type buildProviderType = CompilationUtil.GetBuildProviderTypeFromExtension(_virtualPath, extension, BuildProviderAppliesTo.Web, false); if (!typeof(MasterPageBuildProvider).IsAssignableFrom(buildProviderType)) { throw new ConfigurationErrorsException( SR.GetString(SR.Bad_masterPage_ext), ElementInformation.Properties["masterPageFile"].Source, ElementInformation.Properties["masterPageFile"].LineNumber); } // Convert it to appRelative format masterPageFile = masterPageVirtualPath.AppRelativeVirtualPathString; } else { masterPageFile = String.Empty; } _masterPageFile = masterPageFile; } return _masterPageFile; } } [ConfigurationProperty("theme", DefaultValue = "")] public string Theme { get { return (string)base[_propTheme]; } set { base[_propTheme] = value; } } internal string ThemeInternal { get { string themeName = Theme; if (!_themeChecked) { if ((!String.IsNullOrEmpty(themeName)) && (!Util.ThemeExists(themeName))) { throw new ConfigurationErrorsException( SR.GetString(SR.Page_theme_not_found, themeName), ElementInformation.Properties["theme"].Source, ElementInformation.Properties["theme"].LineNumber); } _themeChecked = true; } return themeName; } } [ConfigurationProperty("styleSheetTheme", DefaultValue = "")] public string StyleSheetTheme { get { return (string)base[_propStyleSheetTheme]; } set { base[_propStyleSheetTheme] = value; } } internal string StyleSheetThemeInternal { get { string styleSheetThemeName = StyleSheetTheme; if (!_styleSheetThemeChecked) { if (!String.IsNullOrEmpty(styleSheetThemeName) && (!Util.ThemeExists(styleSheetThemeName))) { throw new ConfigurationErrorsException( SR.GetString(SR.Page_theme_not_found, styleSheetThemeName), ElementInformation.Properties["styleSheetTheme"].Source, ElementInformation.Properties["styleSheetTheme"].LineNumber); } _styleSheetThemeChecked = true; } return styleSheetThemeName; } } [ConfigurationProperty("namespaces")] public NamespaceCollection Namespaces { get { return (NamespaceCollection)base[_propNamespaces]; } } [ConfigurationProperty("controls")] public TagPrefixCollection Controls { get { return (TagPrefixCollection)base[_propControls]; } } [ConfigurationProperty("maxPageStateFieldLength", DefaultValue = -1)] public int MaxPageStateFieldLength { get { return (int)base[_propMaxPageStateFieldLength]; } set { base[_propMaxPageStateFieldLength] = value; } } [ConfigurationProperty("tagMapping")] public TagMapCollection TagMapping { get { return (TagMapCollection)base[_propTagMapping]; } } [ConfigurationProperty("compilationMode", DefaultValue = CompilationMode.Always)] public CompilationMode CompilationMode { get { return (CompilationMode)base[_propCompilationMode]; } set { base[_propCompilationMode] = value; } } [ConfigurationProperty("viewStateEncryptionMode", DefaultValue = ViewStateEncryptionMode.Auto)] public ViewStateEncryptionMode ViewStateEncryptionMode { get { return (ViewStateEncryptionMode)base[_propViewStateEncryptionMode]; } set { base[_propViewStateEncryptionMode] = value; } } [ConfigurationProperty("asyncTimeout", DefaultValue = "00:00:45")] [TimeSpanValidator(MinValueString="00:00:00", MaxValueString=TimeSpanValidatorAttribute.TimeSpanMaxValue)] [TypeConverter(typeof(TimeSpanSecondsConverter))] public TimeSpan AsyncTimeout { get { return (TimeSpan)base[_propAsyncTimeout]; } set { base[_propAsyncTimeout] = value; } } [ConfigurationProperty("renderAllHiddenFieldsAtTopOfForm", DefaultValue = true)] public bool RenderAllHiddenFieldsAtTopOfForm { get { return (bool)base[_propRenderAllHiddenFieldsAtTopOfForm]; } set { base[_propRenderAllHiddenFieldsAtTopOfForm] = value; } } [SuppressMessage("Microsoft.Naming", "CA1706:ShortAcronymsShouldBeUppercase", MessageId="Member")] [ConfigurationProperty("clientIDMode", DefaultValue = ClientIDMode.Predictable)] public ClientIDMode ClientIDMode { get { if (_clientIDMode == null) { _clientIDMode = (ClientIDMode)base[_propClientIDMode]; } return (ClientIDMode)_clientIDMode; } set { base[_propClientIDMode] = value; _clientIDMode = value; } } [ConfigurationProperty("controlRenderingCompatibilityVersion", DefaultValue = VersionUtil.FrameworkDefaultString)] [ConfigurationValidator(typeof(VersionValidator))] [TypeConverter(typeof(VersionConverter))] public Version ControlRenderingCompatibilityVersion { get { if(_controlRenderingCompatibilityVersion == null) { _controlRenderingCompatibilityVersion = (Version)base[_propControlRenderingCompatibilityVersion]; } return _controlRenderingCompatibilityVersion; } set { if (value == null) { throw new ArgumentNullException("value"); } base[_propControlRenderingCompatibilityVersion] = value; _controlRenderingCompatibilityVersion = value; } } [ConfigurationProperty("ignoreDeviceFilters")] public IgnoreDeviceFilterElementCollection IgnoreDeviceFilters { get { return (IgnoreDeviceFilterElementCollection)base[_propIgnoreDeviceFilters]; } } internal TagNamespaceRegisterEntryTable TagNamespaceRegisterEntriesInternal { get { if (_tagNamespaceRegisterEntries == null) { lock (this) { if (_tagNamespaceRegisterEntries == null) { FillInRegisterEntries(); } } } return _tagNamespaceRegisterEntries; } } internal void FillInRegisterEntries() { // TagNamespaceRegisterEntryTable tagNamespaceRegisterEntries = new TagNamespaceRegisterEntryTable(); foreach (TagNamespaceRegisterEntry entry in DefaultTagNamespaceRegisterEntries) { tagNamespaceRegisterEntries[entry.TagPrefix] = new ArrayList(new object[] { entry }); } Hashtable userControlRegisterEntries = new Hashtable(StringComparer.OrdinalIgnoreCase); // Fill in the collection foreach (TagPrefixInfo tpi in Controls) { if (!String.IsNullOrEmpty(tpi.TagName)) { UserControlRegisterEntry ucRegisterEntry = new UserControlRegisterEntry(tpi.TagPrefix, tpi.TagName); ucRegisterEntry.ComesFromConfig = true; try { ucRegisterEntry.UserControlSource = VirtualPath.CreateNonRelative(tpi.Source); } catch (Exception e) { throw new ConfigurationErrorsException(e.Message, e, tpi.ElementInformation.Properties["src"].Source, tpi.ElementInformation.Properties["src"].LineNumber); } userControlRegisterEntries[ucRegisterEntry.Key] = ucRegisterEntry; } else if (!String.IsNullOrEmpty(tpi.Namespace)) { TagNamespaceRegisterEntry nsRegisterEntry = new TagNamespaceRegisterEntry(tpi.TagPrefix, tpi.Namespace, tpi.Assembly); ArrayList entries = null; entries = (ArrayList)tagNamespaceRegisterEntries[tpi.TagPrefix]; if (entries == null) { entries = new ArrayList(); tagNamespaceRegisterEntries[tpi.TagPrefix] = entries; } entries.Add(nsRegisterEntry); } } _tagNamespaceRegisterEntries = tagNamespaceRegisterEntries; _userControlRegisterEntries = userControlRegisterEntries; } internal static ICollection DefaultTagNamespaceRegisterEntries { get { TagNamespaceRegisterEntry aspEntry = new TagNamespaceRegisterEntry("asp", "System.Web.UI.WebControls", AssemblyRef.SystemWeb); TagNamespaceRegisterEntry mobileEntry = new TagNamespaceRegisterEntry("mobile", "System.Web.UI.MobileControls", AssemblyRef.SystemWebMobile); return new TagNamespaceRegisterEntry[] { aspEntry, mobileEntry }; } } internal Hashtable UserControlRegisterEntriesInternal { get { if (_userControlRegisterEntries == null) { lock (this) { if (_userControlRegisterEntries == null) { FillInRegisterEntries(); } } } return _userControlRegisterEntries; } } protected override void DeserializeSection(XmlReader reader) { WebContext context; base.DeserializeSection(reader); // Determine hosting context context = EvaluationContext.HostingContext as WebContext; if (context != null) { // Make sure it has a trailing slash as it is used as a base path to Combine with relative _virtualPath = VirtualPath.CreateNonRelativeTrailingSlashAllowNull(context.Path); } } // This is called as the last step of the deserialization process before the newly created section is seen by the consumer. // We can use it to change defaults on-the-fly. protected override void SetReadOnly() { // Unless overridden, set ConfigUtil.SetFX45DefaultValue(this, _propControlRenderingCompatibilityVersion, VersionUtil.Framework45); base.SetReadOnly(); } } }