You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4net-dev@logging.apache.org by ni...@apache.org on 2006/02/20 20:49:29 UTC

svn commit: r379212 - in /logging/log4net/trunk/src: Config/XmlConfiguratorAttribute.cs Core/DefaultRepositorySelector.cs Util/SystemInfo.cs

Author: nicko
Date: Mon Feb 20 11:49:25 2006
New Revision: 379212

URL: http://svn.apache.org/viewcvs?rev=379212&view=rev
Log:
Fix for LOG4NET-65 Unhandled SecurityException exception for FileIOPermission while loading configuration file
Added additional try/catch blocks to the DefaultRepositorySelector and the XmlConfiguratorAttribute to wrap any path discovery permission checks made by the AppDomain.

Modified:
    logging/log4net/trunk/src/Config/XmlConfiguratorAttribute.cs
    logging/log4net/trunk/src/Core/DefaultRepositorySelector.cs
    logging/log4net/trunk/src/Util/SystemInfo.cs

Modified: logging/log4net/trunk/src/Config/XmlConfiguratorAttribute.cs
URL: http://svn.apache.org/viewcvs/logging/log4net/trunk/src/Config/XmlConfiguratorAttribute.cs?rev=379212&r1=379211&r2=379212&view=diff
==============================================================================
--- logging/log4net/trunk/src/Config/XmlConfiguratorAttribute.cs (original)
+++ logging/log4net/trunk/src/Config/XmlConfiguratorAttribute.cs Mon Feb 20 11:49:25 2006
@@ -196,9 +196,18 @@
 		/// <exception cref="ArgumentOutOfRangeException">The <paramref name="repository" /> does not extend <see cref="Hierarchy"/>.</exception>
 		override public void Configure(Assembly sourceAssembly, ILoggerRepository targetRepository)
 		{
-			Uri applicationBaseDirectoryUri = new Uri(SystemInfo.ApplicationBaseDirectory);
+			string applicationBaseDirectory = null;
+			try
+			{
+				applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
+			}
+			catch
+			{
+				// Ignore this exception because it is only thrown when ApplicationBaseDirectory is a file
+				// and the application does not have PathDiscovery permission
+			}
 
-			if (applicationBaseDirectoryUri.IsFile)
+			if (applicationBaseDirectory == null || (new Uri(applicationBaseDirectory)).IsFile)
 			{
 				ConfigureFromFile(sourceAssembly, targetRepository);
 			}
@@ -226,7 +235,14 @@
 				if (m_configFileExtension == null || m_configFileExtension.Length == 0)
 				{
 					// Use the default .config file for the AppDomain
-					fullPath2ConfigFile = SystemInfo.ConfigurationFileLocation;
+					try
+					{
+						fullPath2ConfigFile = SystemInfo.ConfigurationFileLocation;
+					}
+					catch(Exception ex)
+					{
+						LogLog.Error("XmlConfiguratorAttribute: Exception getting ConfigurationFileLocation. Must be able to resolve ConfigurationFileLocation when ConfigFile and ConfigFileExtension properties are not set.", ex);
+					}
 				}
 				else
 				{
@@ -236,16 +252,49 @@
 						m_configFileExtension = "." + m_configFileExtension;
 					}
 
-					fullPath2ConfigFile = Path.Combine(SystemInfo.ApplicationBaseDirectory, SystemInfo.AssemblyFileName(sourceAssembly) + m_configFileExtension);
+					string applicationBaseDirectory = null;
+					try
+					{
+						applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
+					}
+					catch(Exception ex)
+					{
+						LogLog.Error("XmlConfiguratorAttribute: Exception getting ApplicationBaseDirectory. Must be able to resolve ApplicationBaseDirectory and AssemblyFileName when ConfigFileExtension property is set.", ex);
+					}
+
+					if (applicationBaseDirectory != null)
+					{
+						fullPath2ConfigFile = Path.Combine(applicationBaseDirectory, SystemInfo.AssemblyFileName(sourceAssembly) + m_configFileExtension);
+					}
 				}
 			}
 			else
 			{
-				// Just the base dir + the config file
-				fullPath2ConfigFile = Path.Combine(SystemInfo.ApplicationBaseDirectory, m_configFile);
+				string applicationBaseDirectory = null;
+				try
+				{
+					applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
+				}
+				catch(Exception ex)
+				{
+					LogLog.Warn("XmlConfiguratorAttribute: Exception getting ApplicationBaseDirectory. ConfigFile property path ["+m_configFile+"] will be treated as an absolute path.", ex);
+				}
+
+				if (applicationBaseDirectory != null)
+				{
+					// Just the base dir + the config file
+					fullPath2ConfigFile = Path.Combine(applicationBaseDirectory, m_configFile);
+				}
+				else
+				{
+					fullPath2ConfigFile = m_configFile;
+				}
 			}
 
-			ConfigureFromFile(targetRepository, new FileInfo(fullPath2ConfigFile));
+			if (fullPath2ConfigFile != null)
+			{
+				ConfigureFromFile(targetRepository, new FileInfo(fullPath2ConfigFile));
+			}
 		}
 
 		/// <summary>
@@ -281,9 +330,6 @@
 		/// <param name="targetRepository">The repository to configure.</param>
 		private void ConfigureFromUri(Assembly sourceAssembly, ILoggerRepository targetRepository)
 		{
-			Uri applicationBaseDirectoryUri = new Uri(SystemInfo.ApplicationBaseDirectory);
-			Uri systemConfigFileUri = new Uri(SystemInfo.ConfigurationFileLocation);
-
 			// Work out the full path to the config file
 			Uri fullPath2ConfigFile = null;
 			
@@ -292,8 +338,23 @@
 			{
 				if (m_configFileExtension == null || m_configFileExtension.Length == 0)
 				{
-					// Use the default .config file for the AppDomain
-					fullPath2ConfigFile = systemConfigFileUri;
+					string systemConfigFilePath = null;
+					try
+					{
+						systemConfigFilePath = SystemInfo.ConfigurationFileLocation;
+					}
+					catch(Exception ex)
+					{
+						LogLog.Error("XmlConfiguratorAttribute: Exception getting ConfigurationFileLocation. Must be able to resolve ConfigurationFileLocation when ConfigFile and ConfigFileExtension properties are not set.", ex);
+					}
+
+					if (systemConfigFilePath != null)
+					{
+						Uri systemConfigFileUri = new Uri(systemConfigFilePath);
+
+						// Use the default .config file for the AppDomain
+						fullPath2ConfigFile = systemConfigFileUri;
+					}
 				}
 				else
 				{
@@ -303,40 +364,73 @@
 						m_configFileExtension = "." + m_configFileExtension;
 					}
 
-					UriBuilder builder = new UriBuilder(systemConfigFileUri);
-
-					// Remove the current extension from the systemConfigFileUri path
-					string path = builder.Path;
-                    int startOfExtension = path.LastIndexOf(".");
-					if (startOfExtension >= 0)
+					string systemConfigFilePath = null;
+					try
+					{
+						systemConfigFilePath = SystemInfo.ConfigurationFileLocation;
+					}
+					catch(Exception ex)
 					{
-						path = path.Substring(0, startOfExtension);
+						LogLog.Error("XmlConfiguratorAttribute: Exception getting ConfigurationFileLocation. Must be able to resolve ConfigurationFileLocation when the ConfigFile property are not set.", ex);
 					}
-					path += m_configFileExtension;
 
-					builder.Path = path;
-					fullPath2ConfigFile = builder.Uri;
+					if (systemConfigFilePath != null)
+					{
+						UriBuilder builder = new UriBuilder(new Uri(systemConfigFilePath));
+
+						// Remove the current extension from the systemConfigFileUri path
+						string path = builder.Path;
+						int startOfExtension = path.LastIndexOf(".");
+						if (startOfExtension >= 0)
+						{
+							path = path.Substring(0, startOfExtension);
+						}
+						path += m_configFileExtension;
+
+						builder.Path = path;
+						fullPath2ConfigFile = builder.Uri;
+					}
 				}
 			}
 			else
 			{
-				// Just the base dir + the config file
-				fullPath2ConfigFile = new Uri(applicationBaseDirectoryUri, m_configFile);
-			}
+				string applicationBaseDirectory = null;
+				try
+				{
+					applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
+				}
+				catch(Exception ex)
+				{
+					LogLog.Warn("XmlConfiguratorAttribute: Exception getting ApplicationBaseDirectory. ConfigFile property path ["+m_configFile+"] will be treated as an absolute URI.", ex);
+				}
 
-			if (fullPath2ConfigFile.IsFile)
-			{
-				// The m_configFile could be an absolute local path, therefore we have to be
-				// prepared to switch back to using FileInfos here
-				ConfigureFromFile(targetRepository, new FileInfo(fullPath2ConfigFile.LocalPath));
+				if (applicationBaseDirectory != null)
+				{
+					// Just the base dir + the config file
+					fullPath2ConfigFile = new Uri(new Uri(applicationBaseDirectory), m_configFile);
+				}
+				else
+				{
+					fullPath2ConfigFile = new Uri(m_configFile);
+				}
 			}
-			else
+
+			if (fullPath2ConfigFile != null)
 			{
-				if (m_configureAndWatch)
+				if (fullPath2ConfigFile.IsFile)
 				{
-					LogLog.Warn("XmlConfiguratorAttribute: Unable to watch config file loaded from a URI");
+					// The m_configFile could be an absolute local path, therefore we have to be
+					// prepared to switch back to using FileInfos here
+					ConfigureFromFile(targetRepository, new FileInfo(fullPath2ConfigFile.LocalPath));
+				}
+				else
+				{
+					if (m_configureAndWatch)
+					{
+						LogLog.Warn("XmlConfiguratorAttribute: Unable to watch config file loaded from a URI");
+					}
+					XmlConfigurator.Configure(targetRepository, fullPath2ConfigFile);
 				}
-				XmlConfigurator.Configure(targetRepository, fullPath2ConfigFile);
 			}
 		}
 

Modified: logging/log4net/trunk/src/Core/DefaultRepositorySelector.cs
URL: http://svn.apache.org/viewcvs/logging/log4net/trunk/src/Core/DefaultRepositorySelector.cs?rev=379212&r1=379211&r2=379212&view=diff
==============================================================================
--- logging/log4net/trunk/src/Core/DefaultRepositorySelector.cs (original)
+++ logging/log4net/trunk/src/Core/DefaultRepositorySelector.cs Mon Feb 20 11:49:25 2006
@@ -290,20 +290,26 @@
 					rep = m_name2repositoryMap[actualRepositoryName] as ILoggerRepository;
 					if (rep == null)
 					{
-
 						// Create the repository
 						rep = CreateRepository(actualRepositoryName, actualRepositoryType);
 
 						if (readAssemblyAttributes)
 						{
-							// Look for aliasing attributes
-							LoadAliases(repositoryAssembly, rep);
-
-							// Look for plugins defined on the assembly
-							LoadPlugins(repositoryAssembly, rep);
-
-							// Configure the repository using the assembly attributes
-							ConfigureRepository(repositoryAssembly, rep);
+							try
+							{
+								// Look for aliasing attributes
+								LoadAliases(repositoryAssembly, rep);
+
+								// Look for plugins defined on the assembly
+								LoadPlugins(repositoryAssembly, rep);
+
+								// Configure the repository using the assembly attributes
+								ConfigureRepository(repositoryAssembly, rep);
+							}
+							catch (Exception ex)
+							{
+								LogLog.Error("DefaultRepositorySelector: Failed to configure repository [" + actualRepositoryName + "] from assembly attributes.", ex);
+							}
 						}
 					}
 					else
@@ -312,8 +318,15 @@
 
 						if (readAssemblyAttributes)
 						{
-							// Look for plugins defined on the assembly
-							LoadPlugins(repositoryAssembly, rep);
+							try
+							{
+								// Look for plugins defined on the assembly
+								LoadPlugins(repositoryAssembly, rep);
+							}
+							catch (Exception ex)
+							{
+								LogLog.Error("DefaultRepositorySelector: Failed to configure repository [" + actualRepositoryName + "] from assembly attributes.", ex);
+							}
 						}
 					}
 					m_assembly2repositoryMap[repositoryAssembly] = rep;
@@ -556,51 +569,65 @@
 				throw new ArgumentNullException("assembly");
 			}
 
-			LogLog.Debug("DefaultRepositorySelector: Assembly [" + assembly.FullName + "] Loaded From [" + SystemInfo.AssemblyLocationInfo(assembly) + "]");
-
-			// Look for the RepositoryAttribute on the assembly 
-			object[] repositoryAttributes = Attribute.GetCustomAttributes(assembly, typeof(log4net.Config.RepositoryAttribute), false);
-			if (repositoryAttributes == null || repositoryAttributes.Length == 0)
+			try
 			{
-				// This is not a problem, but its nice to know what is going on.
-				LogLog.Debug("DefaultRepositorySelector: Assembly [" + assembly + "] does not have a RepositoryAttribute specified.");
+				LogLog.Debug("DefaultRepositorySelector: Assembly [" + assembly.FullName + "] Loaded From [" + SystemInfo.AssemblyLocationInfo(assembly) + "]");
 			}
-			else
+			catch
 			{
-				if (repositoryAttributes.Length > 1)
-				{
-					LogLog.Error("DefaultRepositorySelector: Assembly [" + assembly + "] has multiple log4net.Config.RepositoryAttribute assembly attributes. Only using first occurrence.");
-				}
-
-				log4net.Config.RepositoryAttribute domAttr = repositoryAttributes[0] as log4net.Config.RepositoryAttribute;
+				// Ignore exception from debug call
+			}
 
-				if (domAttr == null)
+			try
+			{
+				// Look for the RepositoryAttribute on the assembly 
+				object[] repositoryAttributes = Attribute.GetCustomAttributes(assembly, typeof(log4net.Config.RepositoryAttribute), false);
+				if (repositoryAttributes == null || repositoryAttributes.Length == 0)
 				{
-					LogLog.Error("DefaultRepositorySelector: Assembly [" + assembly + "] has a RepositoryAttribute but it does not!.");
+					// This is not a problem, but its nice to know what is going on.
+					LogLog.Debug("DefaultRepositorySelector: Assembly [" + assembly + "] does not have a RepositoryAttribute specified.");
 				}
 				else
 				{
-					// If the Name property is set then override the default
-					if (domAttr.Name != null)
+					if (repositoryAttributes.Length > 1)
 					{
-						repositoryName = domAttr.Name;
+						LogLog.Error("DefaultRepositorySelector: Assembly [" + assembly + "] has multiple log4net.Config.RepositoryAttribute assembly attributes. Only using first occurrence.");
 					}
 
-					// If the RepositoryType property is set then override the default
-					if (domAttr.RepositoryType != null)
+					log4net.Config.RepositoryAttribute domAttr = repositoryAttributes[0] as log4net.Config.RepositoryAttribute;
+
+					if (domAttr == null)
 					{
-						// Check that the type is a repository
-						if (typeof(ILoggerRepository).IsAssignableFrom(domAttr.RepositoryType))
+						LogLog.Error("DefaultRepositorySelector: Assembly [" + assembly + "] has a RepositoryAttribute but it does not!.");
+					}
+					else
+					{
+						// If the Name property is set then override the default
+						if (domAttr.Name != null)
 						{
-							repositoryType = domAttr.RepositoryType;
+							repositoryName = domAttr.Name;
 						}
-						else
+
+						// If the RepositoryType property is set then override the default
+						if (domAttr.RepositoryType != null)
 						{
-							LogLog.Error("DefaultRepositorySelector: Repository Type [" + domAttr.RepositoryType + "] must implement the ILoggerRepository interface.");
+							// Check that the type is a repository
+							if (typeof(ILoggerRepository).IsAssignableFrom(domAttr.RepositoryType))
+							{
+								repositoryType = domAttr.RepositoryType;
+							}
+							else
+							{
+								LogLog.Error("DefaultRepositorySelector: Repository Type [" + domAttr.RepositoryType + "] must implement the ILoggerRepository interface.");
+							}
 						}
 					}
 				}
 			}
+			catch (Exception ex)
+			{
+				LogLog.Error("DefaultRepositorySelector: Unhandled exception in GetInfoForAssembly", ex);
+			}
 		}
 
 		/// <summary>
@@ -625,7 +652,7 @@
 				throw new ArgumentNullException("repository");
 			}
 
-			// Look for the Configurator attributes (e.g. DOMConfiguratorAttribute) on the assembly
+			// Look for the Configurator attributes (e.g. XmlConfiguratorAttribute) on the assembly
 			object[] configAttributes = Attribute.GetCustomAttributes(assembly, typeof(log4net.Config.ConfiguratorAttribute), false);
 			if (configAttributes != null && configAttributes.Length > 0)
 			{
@@ -635,7 +662,17 @@
 				// Delegate to the attribute the job of configuring the repository
 				foreach(log4net.Config.ConfiguratorAttribute configAttr in configAttributes)
 				{
-					configAttr.Configure(assembly, repository);
+					if (configAttr != null)
+					{
+						try
+						{
+							configAttr.Configure(assembly, repository);
+						}
+						catch (Exception ex)
+						{
+							LogLog.Error("DefaultRepositorySelector: Exception calling ["+configAttr.GetType().FullName+"] .Configure method.", ex);
+						}
+					}
 				}
 			}
 
@@ -648,15 +685,30 @@
 				string repositoryConfigFile = SystemInfo.GetAppSetting("log4net.Config");
 				if (repositoryConfigFile != null && repositoryConfigFile.Length > 0)
 				{
-					// Resolve the config path relative to the application base directory URI
-					Uri applicationBaseDirectoryUri = new Uri(SystemInfo.ApplicationBaseDirectory);
+					string applicationBaseDirectory = null;
+					try
+					{
+						applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
+					}
+					catch(Exception ex)
+					{
+						LogLog.Warn("DefaultRepositorySelector: Exception getting ApplicationBaseDirectory. appSettings log4net.Config path ["+repositoryConfigFile+"] will be treated as an absolute URI", ex);
+					}
 
 					// As we are not going to watch the config file it is easiest to just resolve it as a 
 					// URI and pass that to the Configurator
 					Uri repositoryConfigUri = null;
 					try
 					{
-						repositoryConfigUri = new Uri(applicationBaseDirectoryUri, repositoryConfigFile);
+						if (applicationBaseDirectory != null)
+						{
+							// Resolve the config path relative to the application base directory URI
+							repositoryConfigUri = new Uri(new Uri(applicationBaseDirectory), repositoryConfigFile);
+						}
+						else
+						{
+							repositoryConfigUri = new Uri(repositoryConfigFile);
+						}
 					}
 					catch(Exception ex)
 					{
@@ -667,8 +719,15 @@
 					{
 						LogLog.Debug("DefaultRepositorySelector: Loading configuration for default repository from AppSettings specified Config URI ["+repositoryConfigUri.ToString()+"]");
 
-						// TODO: Support other types of configurator
-						XmlConfigurator.Configure(repository, repositoryConfigUri);
+						try
+						{
+							// TODO: Support other types of configurator
+							XmlConfigurator.Configure(repository, repositoryConfigUri);
+						}
+						catch (Exception ex)
+						{
+							LogLog.Error("DefaultRepositorySelector: Exception calling XmlConfigurator.Configure method with ConfigUri ["+repositoryConfigUri+"]", ex);
+						}
 					}
 				}
 			}

Modified: logging/log4net/trunk/src/Util/SystemInfo.cs
URL: http://svn.apache.org/viewcvs/logging/log4net/trunk/src/Util/SystemInfo.cs?rev=379212&r1=379211&r2=379212&view=diff
==============================================================================
--- logging/log4net/trunk/src/Util/SystemInfo.cs (original)
+++ logging/log4net/trunk/src/Util/SystemInfo.cs Mon Feb 20 11:49:25 2006
@@ -888,7 +888,7 @@
 			}
 			catch
 			{
-				// ignore uri exceptions
+				// Ignore URI exceptions & SecurityExceptions from SystemInfo.ApplicationBaseDirectory
 			}
 
 			if (baseDirectory != null && baseDirectory.Length > 0)