2009-06-05 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.Configuration_2.0 / WebConfigurationHost.cs
index 2de223f764646d9a82ddc15b13dcf17c6265c1ac..24cd3b01150530ebcc5bbb35763415652ceff83f 100644 (file)
 #if NET_2_0
 
 using System;
+using System.Collections;
 using System.IO;
 using System.Security;
 using System.Configuration;
 using System.Configuration.Internal;
+using System.Web.Hosting;
 using System.Web.Util;
 using System.Reflection;
 
@@ -65,10 +67,11 @@ namespace System.Web.Configuration
                
                public virtual object CreateDeprecatedConfigContext (string configPath)
                {
-                       throw new NotImplementedException ();
+                       return new HttpConfigurationContext(configPath);
                }
                
-               public virtual string DecryptSection (string encryptedXml, ProtectedConfigurationProvider protectionProvider, ProtectedConfigurationSection protectedSection)
+               public virtual string DecryptSection (string encryptedXml, ProtectedConfigurationProvider protectionProvider,
+                                                     ProtectedConfigurationSection protectedSection)
                {
                        throw new NotImplementedException ();
                }
@@ -78,7 +81,8 @@ namespace System.Web.Configuration
                        File.Delete (streamName);
                }
                
-               public virtual string EncryptSection (string encryptedXml, ProtectedConfigurationProvider protectionProvider, ProtectedConfigurationSection protectedSection)
+               public virtual string EncryptSection (string encryptedXml, ProtectedConfigurationProvider protectionProvider,
+                                                     ProtectedConfigurationSection protectedSection)
                {
                        throw new NotImplementedException ();
                }
@@ -87,45 +91,10 @@ namespace System.Web.Configuration
                {
                        return configPath + "/" + locatinSubPath;
                }
-
-               private static string privateBinPath;
-
-               private static string PrivateBinPath {
-                       get {
-                               if (privateBinPath != null)
-                                       return privateBinPath;
-                               
-                               AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
-                               privateBinPath = Path.Combine(setup.ApplicationBase, setup.PrivateBinPath);
-                               return privateBinPath;
-                       }
-               }
-               
-               private Type LoadType(string typeName)
-               {
-                       Type type = Type.GetType (typeName);
-                       if (type != null)
-                               return type;
-
-                       if (!Directory.Exists (PrivateBinPath))
-                               return null;
-                       
-                       string[] binDlls = Directory.GetFiles(PrivateBinPath, "*.dll");
-                       foreach (string s in binDlls) {
-                               Assembly binA = Assembly.LoadFrom (s);
-                               type = binA.GetType (typeName);
-                               if (type == null)
-                                       continue;
-                               
-                               return type;
-                       }
-                       
-                       return null;
-               }
                
                public virtual Type GetConfigType (string typeName, bool throwOnError)
                {
-                       Type type = LoadType(typeName);
+                       Type type = HttpApplication.LoadType (typeName);
                        if (type == null && throwOnError)
                                throw new ConfigurationErrorsException ("Type not found: '" + typeName + "'");
                        return type;
@@ -136,7 +105,8 @@ namespace System.Web.Configuration
                        return t.AssemblyQualifiedName;
                }
                
-               public virtual void GetRestrictedPermissions (IInternalConfigRecord configRecord, out PermissionSet permissionSet, out bool isHostReady)
+               public virtual void GetRestrictedPermissions (IInternalConfigRecord configRecord, out PermissionSet permissionSet,
+                                                             out bool isHostReady)
                {
                        throw new NotImplementedException ();
                }
@@ -152,8 +122,20 @@ namespace System.Web.Configuration
                                string mdir;
 
                                if (map == null)
-#if TARGET_JVM
-                                       return "/web.config";
+#if TARGET_J2EE
+                               {
+                                       // check META-INF/web.config exists
+                                       java.lang.ClassLoader cl = (java.lang.ClassLoader) AppDomain.CurrentDomain.GetData ("GH_ContextClassLoader");
+                                       if (cl == null)
+                                               return null;
+                                       java.io.InputStream wcs = cl.getResourceAsStream ("META-INF/web.config");
+                                       if (wcs == null)
+                                               return null;
+
+                                       wcs.close ();
+
+                                       return "/META-INF/web.config";
+                               }
 #else
                                        mdir = Path.GetDirectoryName (System.Runtime.InteropServices.RuntimeEnvironment.SystemConfigurationFile);
 #endif
@@ -186,27 +168,29 @@ namespace System.Web.Configuration
                {
                }
                
-               public virtual void InitForConfiguration (ref string locationSubPath, out string configPath, out string locationConfigPath, IInternalConfigRoot root, params object[] hostInitConfigurationParams)
+               public virtual void InitForConfiguration (ref string locationSubPath, out string configPath,
+                                                         out string locationConfigPath, IInternalConfigRoot root,
+                                                         params object[] hostInitConfigurationParams)
                {
                        string fullPath = (string) hostInitConfigurationParams [1];
-                       
                        map = (WebConfigurationFileMap) hostInitConfigurationParams [0];
-                       
+
                        if (locationSubPath == MachineWebPath) {
                                locationSubPath = MachinePath;
                                configPath = MachineWebPath;
                                locationConfigPath = null;
-                       }
-                       else if (locationSubPath == MachinePath) {
+                       } else if (locationSubPath == MachinePath) {
                                locationSubPath = null;
                                configPath = MachinePath;
                                locationConfigPath = null;
-                       }
-                       else {
-                               
+                       } else {
                                int i;
                                if (locationSubPath == null)
+                               {
                                        configPath = fullPath;
+                                       if (configPath.Length > 1)
+                                               configPath = VirtualPathUtility.RemoveTrailingSlash (configPath);
+                               }
                                else
                                        configPath = locationSubPath;
 
@@ -215,7 +199,7 @@ namespace System.Web.Configuration
                                        i = -1;
                                else
                                        i = configPath.LastIndexOf ("/");
-                               
+
                                if (i != -1) {
                                        locationConfigPath = configPath.Substring (i+1);
                                        
@@ -232,18 +216,24 @@ namespace System.Web.Configuration
                
                public string MapPath (string virtualPath)
                {
+                       if (!String.IsNullOrEmpty (virtualPath)) {
+                               if (virtualPath.StartsWith (System.Web.Compilation.BuildManager.FAKE_VIRTUAL_PATH_PREFIX, StringComparison.Ordinal))
+                                       return HttpRuntime.AppDomainAppPath;
+                       }
+                       
                        if (map != null)
                                return MapPathFromMapper (virtualPath);
-                       else if (HttpContext.Current != null
-                                && HttpContext.Current.Request != null)
+                       else if (HttpContext.Current != null && HttpContext.Current.Request != null)
                                return HttpContext.Current.Request.MapPath (virtualPath);
-                       else if (HttpRuntime.AppDomainAppVirtualPath != null && virtualPath.StartsWith (HttpRuntime.AppDomainAppVirtualPath)) {
+                       else if (HttpRuntime.AppDomainAppVirtualPath != null &&
+                                virtualPath.StartsWith (HttpRuntime.AppDomainAppVirtualPath)) {
                                if (virtualPath == HttpRuntime.AppDomainAppVirtualPath)
                                        return HttpRuntime.AppDomainAppPath;
-                               return UrlUtils.Combine (HttpRuntime.AppDomainAppPath, virtualPath.Substring (HttpRuntime.AppDomainAppVirtualPath.Length));
+                               return UrlUtils.Combine (HttpRuntime.AppDomainAppPath,
+                                                        virtualPath.Substring (HttpRuntime.AppDomainAppVirtualPath.Length));
                        }
-                       else
-                               return virtualPath;
+                       
+                       return virtualPath;
                }
                
                public string NormalizeVirtualPath (string virtualPath)
@@ -290,19 +280,68 @@ namespace System.Web.Configuration
                        throw new HttpException ("Invalid virtual directory: " + virtualPath);
                }
 
-               string GetWebConfigFileName (string dir)
+               internal static string GetWebConfigFileName (string dir)
                {
-                       string[] filenames = new string[] {"Web.Config", "Web.config", "web.config" };
+#if TARGET_J2EE
+                       DirectoryInfo d = GetCaseSensitiveExistingDirectory (new DirectoryInfo (dir));
+                       if (d == null)
+                               return null;
 
-                       foreach (string fn in filenames) {
-                               string file = Path.Combine (dir, fn);
-                               if (File.Exists (file))
-                                       return file;
-                       }
+                       FileInfo file = (FileInfo) FindByName ("web.config", d.GetFiles ("W*"));
+                       if (file == null)
+                               file = (FileInfo) FindByName ("web.config", d.GetFiles ("w*"));
 
+                       if (file != null)
+                               return file.FullName;
+#else
+                       AppDomain domain = AppDomain.CurrentDomain;
+                       bool hosted = (domain.GetData (ApplicationHost.MonoHostedDataKey) as string) == "yes";
+
+                       if (hosted) {
+                               foreach (string fn in ApplicationHost.WebConfigFileNames) {
+                                       string file = Path.Combine (dir, fn);
+                                       if (File.Exists (file))
+                                               return file;
+                               }
+                       } else {
+                               Assembly asm = Assembly.GetEntryAssembly () ?? Assembly.GetCallingAssembly ();
+                               string name = Path.GetFileName (asm.Location);
+                               string[] fileNames = new string[] {name + ".config", name + ".Config"};
+                               string appDir = domain.BaseDirectory;
+                               string file;
+
+                               foreach (string fn in fileNames) {
+                                       file = Path.Combine (appDir, fn);
+                                       if (File.Exists (file))
+                                               return file;
+                               }
+                       }
+#endif                 
                        return null;
                }
+#if TARGET_J2EE
+               static DirectoryInfo GetCaseSensitiveExistingDirectory (DirectoryInfo dir) {
+                       if (dir == null)
+                               return null;
+                       if (dir.Exists)
+                               return dir;
+
+                       DirectoryInfo parent = GetCaseSensitiveExistingDirectory (dir.Parent);
+                       if (parent == null)
+                               return null;
+
+                       return (DirectoryInfo) FindByName (dir.Name, parent.GetDirectories ());
+               }
                
+               static FileSystemInfo FindByName (string name, FileSystemInfo [] infos)
+               {
+                       for (int i = 0; i < infos.Length; i++) {
+                               if (String.Compare (name, infos [i].Name, StringComparison.OrdinalIgnoreCase) == 0)
+                                       return infos [i];
+                       }
+                       return null;
+               }
+#endif
                public virtual bool IsAboveApplication (string configPath)
                {
                        throw new NotImplementedException ();
@@ -313,14 +352,19 @@ namespace System.Web.Configuration
                        throw new NotImplementedException ();
                }
                
-               public virtual bool IsDefinitionAllowed (string configPath, ConfigurationAllowDefinition allowDefinition, ConfigurationAllowExeDefinition allowExeDefinition)
+               public virtual bool IsDefinitionAllowed (string configPath, ConfigurationAllowDefinition allowDefinition,
+                                                        ConfigurationAllowExeDefinition allowExeDefinition)
                {
                        switch (allowDefinition) {
                                case ConfigurationAllowDefinition.MachineOnly:
                                        return configPath == MachinePath || configPath == MachineWebPath;
                                case ConfigurationAllowDefinition.MachineToWebRoot:
                                case ConfigurationAllowDefinition.MachineToApplication:
-                                       return configPath == MachinePath || configPath == MachineWebPath || configPath == "/";
+                                       return (String.Compare (configPath, MachinePath, StringComparison.Ordinal) == 0) ||
+                                               (String.Compare (configPath, MachineWebPath, StringComparison.Ordinal) == 0) ||
+                                               (String.Compare (configPath, "/", StringComparison.Ordinal) == 0) ||
+                                               (String.Compare (configPath, "~", StringComparison.Ordinal) == 0) ||
+                                               (String.Compare (configPath, HttpRuntime.AppDomainAppVirtualPath) == 0);
                                default:
                                        return true;
                        }
@@ -340,13 +384,14 @@ namespace System.Web.Configuration
                {
                        if (!File.Exists (streamName)) {
 #if TARGET_J2EE
-                               if (streamName != null && (streamName.EndsWith ("machine.config") || streamName.EndsWith ("web.config"))) {
+                               if (streamName != null && (streamName.EndsWith ("machine.config") ||
+                                                          streamName.EndsWith ("web.config"))) {
                                        if (streamName.StartsWith ("/"))
                                                streamName = streamName.Substring (1);
                                        java.lang.ClassLoader cl = (java.lang.ClassLoader) AppDomain.CurrentDomain.GetData ("GH_ContextClassLoader");
                                        if (cl != null) {
                                                java.io.InputStream inputStream = cl.getResourceAsStream (streamName);
-                                               return (Stream) vmw.common.IOUtils.getStream (inputStream);
+                                               return new System.Web.J2EE.J2EEUtils.InputStreamWrapper (inputStream);
                                        }
                                }
 #endif
@@ -368,7 +413,8 @@ namespace System.Web.Configuration
                }
 
                [MonoTODO ("Not implemented")]
-               public virtual Stream OpenStreamForWrite (string streamName, string templateStreamName, ref object writeContext, bool assertPermissions)
+               public virtual Stream OpenStreamForWrite (string streamName, string templateStreamName, ref object writeContext,
+                                                         bool assertPermissions)
                {
                        throw new NotImplementedException ();
                }
@@ -399,7 +445,9 @@ namespace System.Web.Configuration
                        throw new NotImplementedException ();
                }
                
-               public virtual void VerifyDefinitionAllowed (string configPath, ConfigurationAllowDefinition allowDefinition, ConfigurationAllowExeDefinition allowExeDefinition, IConfigErrorInfo errorInfo)
+               public virtual void VerifyDefinitionAllowed (string configPath, ConfigurationAllowDefinition allowDefinition,
+                                                            ConfigurationAllowExeDefinition allowExeDefinition,
+                                                            IConfigErrorInfo errorInfo)
                {
                        if (!IsDefinitionAllowed (configPath, allowDefinition, allowExeDefinition))
                                throw new ConfigurationErrorsException ("The section can't be defined in this file (the allowed definition context is '" + allowDefinition + "').", errorInfo.Filename, errorInfo.LineNumber);