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)