2020-03-17 16:26:56 +01:00
|
|
|
|
using System.Configuration;
|
|
|
|
|
|
using System.IO;
|
2020-09-02 14:44:01 +02:00
|
|
|
|
using Umbraco.Core.Hosting;
|
2020-08-21 14:52:47 +01:00
|
|
|
|
using Umbraco.Core.Configuration.Models;
|
2020-03-17 16:26:56 +01:00
|
|
|
|
using Umbraco.Core.IO;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Umbraco.Core.Configuration
|
|
|
|
|
|
{
|
|
|
|
|
|
public static class ModelsBuilderConfigExtensions
|
|
|
|
|
|
{
|
|
|
|
|
|
private static string _modelsDirectoryAbsolute = null;
|
|
|
|
|
|
|
2020-09-10 14:01:38 +02:00
|
|
|
|
public static string ModelsDirectoryAbsolute(this ModelsBuilderConfig modelsBuilderConfig, IHostingEnvironment hostingEnvironment)
|
2020-03-17 16:26:56 +01:00
|
|
|
|
{
|
|
|
|
|
|
if (_modelsDirectoryAbsolute is null)
|
|
|
|
|
|
{
|
|
|
|
|
|
var modelsDirectory = modelsBuilderConfig.ModelsDirectory;
|
2020-09-02 14:44:01 +02:00
|
|
|
|
var root = hostingEnvironment.MapPathContentRoot("~/");
|
2020-03-17 16:26:56 +01:00
|
|
|
|
|
|
|
|
|
|
_modelsDirectoryAbsolute = GetModelsDirectory(root, modelsDirectory,
|
|
|
|
|
|
modelsBuilderConfig.AcceptUnsafeModelsDirectory);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return _modelsDirectoryAbsolute;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// internal for tests
|
|
|
|
|
|
internal static string GetModelsDirectory(string root, string config, bool acceptUnsafe)
|
|
|
|
|
|
{
|
|
|
|
|
|
// making sure it is safe, ie under the website root,
|
|
|
|
|
|
// unless AcceptUnsafeModelsDirectory and then everything is OK.
|
|
|
|
|
|
|
|
|
|
|
|
if (!Path.IsPathRooted(root))
|
|
|
|
|
|
throw new ConfigurationErrorsException($"Root is not rooted \"{root}\".");
|
|
|
|
|
|
|
|
|
|
|
|
if (config.StartsWith("~/"))
|
|
|
|
|
|
{
|
|
|
|
|
|
var dir = Path.Combine(root, config.TrimStart("~/"));
|
|
|
|
|
|
|
|
|
|
|
|
// sanitize - GetFullPath will take care of any relative
|
|
|
|
|
|
// segments in path, eg '../../foo.tmp' - it may throw a SecurityException
|
|
|
|
|
|
// if the combined path reaches illegal parts of the filesystem
|
|
|
|
|
|
dir = Path.GetFullPath(dir);
|
|
|
|
|
|
root = Path.GetFullPath(root);
|
|
|
|
|
|
|
|
|
|
|
|
if (!dir.StartsWith(root) && !acceptUnsafe)
|
|
|
|
|
|
throw new ConfigurationErrorsException($"Invalid models directory \"{config}\".");
|
|
|
|
|
|
|
|
|
|
|
|
return dir;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (acceptUnsafe)
|
|
|
|
|
|
return Path.GetFullPath(config);
|
|
|
|
|
|
|
|
|
|
|
|
throw new ConfigurationErrorsException($"Invalid models directory \"{config}\".");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|