From 3afad96aa7874dfc19845518f9fde849f4c62460 Mon Sep 17 00:00:00 2001 From: Ronald Barendse Date: Wed, 9 Mar 2022 11:06:30 +0100 Subject: [PATCH 1/2] Move created packages out of webroot --- .../Constants-SystemDirectories.cs | 6 +-- .../Packaging/PackagesRepository.cs | 34 +++++++------- .../CreatedPackageSchemaRepository.cs | 45 ++++++++----------- 3 files changed, 37 insertions(+), 48 deletions(-) diff --git a/src/Umbraco.Core/Constants-SystemDirectories.cs b/src/Umbraco.Core/Constants-SystemDirectories.cs index 6950326e146c..f70dd199fc02 100644 --- a/src/Umbraco.Core/Constants-SystemDirectories.cs +++ b/src/Umbraco.Core/Constants-SystemDirectories.cs @@ -45,15 +45,11 @@ public static class SystemDirectories public const string AppPlugins = "/App_Plugins"; - [Obsolete("Use PluginIcons instead")] public static string AppPluginIcons => "/Backoffice/Icons"; public const string PluginIcons = "/backoffice/icons"; - public const string CreatedPackages = "/created-packages"; - - public const string MvcViews = "~/Views"; public const string PartialViews = MvcViews + "/Partials/"; @@ -62,6 +58,8 @@ public static class SystemDirectories public const string Packages = Data + "/packages"; + public const string CreatedPackages = Data + "/CreatedPackages"; + public const string Preview = Data + "/preview"; /// diff --git a/src/Umbraco.Core/Packaging/PackagesRepository.cs b/src/Umbraco.Core/Packaging/PackagesRepository.cs index 36b7a5d5d5fe..ac09655476c0 100644 --- a/src/Umbraco.Core/Packaging/PackagesRepository.cs +++ b/src/Umbraco.Core/Packaging/PackagesRepository.cs @@ -5,7 +5,6 @@ using System.IO; using System.IO.Compression; using System.Linq; -using System.Text; using System.Xml.Linq; using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; @@ -33,7 +32,7 @@ public class PackagesRepository : ICreatedPackagesRepository private readonly IEntityXmlSerializer _serializer; private readonly IHostingEnvironment _hostingEnvironment; private readonly string _packageRepositoryFileName; - private readonly string _mediaFolderPath; + private readonly string _createdPackagesFolderPath; private readonly string _packagesFolderPath; private readonly string _tempFolderPath; private readonly PackageDefinitionXmlParser _parser; @@ -93,7 +92,7 @@ public PackagesRepository( _tempFolderPath = tempFolderPath ?? Constants.SystemDirectories.TempData.EnsureEndsWith('/') + "PackageFiles"; _packagesFolderPath = packagesFolderPath ?? Constants.SystemDirectories.Packages; - _mediaFolderPath = mediaFolderPath ?? Path.Combine(globalSettings.Value.UmbracoMediaPhysicalRootPath, Constants.SystemDirectories.CreatedPackages); + _createdPackagesFolderPath = mediaFolderPath ?? Constants.SystemDirectories.CreatedPackages; _parser = new PackageDefinitionXmlParser(); _mediaService = mediaService; @@ -250,15 +249,8 @@ public string ExportPackage(PackageDefinition definition) } } - - - var directoryName = - _hostingEnvironment.MapPathWebRoot(Path.Combine(_mediaFolderPath, definition.Name.Replace(' ', '_'))); - - if (Directory.Exists(directoryName) == false) - { - Directory.CreateDirectory(directoryName); - } + var directoryName = _hostingEnvironment.MapPathContentRoot(Path.Combine(_createdPackagesFolderPath, definition.Name.Replace(' ', '_'))); + Directory.CreateDirectory(directoryName); var finalPackagePath = Path.Combine(directoryName, fileName); @@ -276,14 +268,14 @@ public string ExportPackage(PackageDefinition definition) } finally { - //Clean up + // Clean up Directory.Delete(temporaryPath, true); } } private void ValidatePackage(PackageDefinition definition) { - //ensure it's valid + // ensure it's valid var context = new ValidationContext(definition, serviceProvider: null, items: null); var results = new List(); var isValid = Validator.TryValidateObject(definition, context, results); @@ -732,7 +724,6 @@ private static XDocument CreateCompiledPackageXml(out XElement root) private XDocument EnsureStorage(out string packagesFile) { var packagesFolder = _hostingEnvironment.MapPathContentRoot(_packagesFolderPath); - //ensure it exists Directory.CreateDirectory(packagesFolder); packagesFile = _hostingEnvironment.MapPathContentRoot(CreatedPackagesFile); @@ -740,6 +731,8 @@ private XDocument EnsureStorage(out string packagesFile) { var xml = new XDocument(new XElement("packages")); xml.Save(packagesFile); + + return xml; } var packagesXml = XDocument.Load(packagesFile); @@ -749,9 +742,16 @@ private XDocument EnsureStorage(out string packagesFile) public void DeleteLocalRepositoryFiles() { var packagesFile = _hostingEnvironment.MapPathContentRoot(CreatedPackagesFile); - File.Delete(packagesFile); + if (File.Exists(packagesFile)) + { + File.Delete(packagesFile); + } + var packagesFolder = _hostingEnvironment.MapPathContentRoot(_packagesFolderPath); - Directory.Delete(packagesFolder); + if (Directory.Exists(packagesFolder)) + { + Directory.Delete(packagesFolder); + } } } } diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/CreatedPackageSchemaRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/CreatedPackageSchemaRepository.cs index be1a31c2c9d2..788482658207 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/CreatedPackageSchemaRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/CreatedPackageSchemaRepository.cs @@ -39,7 +39,7 @@ public class CreatedPackageSchemaRepository : ICreatedPackagesRepository private readonly IMacroService _macroService; private readonly IContentTypeService _contentTypeService; private readonly string _tempFolderPath; - private readonly string _mediaFolderPath; + private readonly string _createdPackagesFolderPath; /// /// Initializes a new instance of the class. @@ -76,9 +76,8 @@ public CreatedPackageSchemaRepository( _macroService = macroService; _contentTypeService = contentTypeService; _xmlParser = new PackageDefinitionXmlParser(); - _mediaFolderPath = mediaFolderPath ?? Path.Combine(globalSettings.Value.UmbracoMediaPhysicalRootPath, Constants.SystemDirectories.CreatedPackages); - _tempFolderPath = - tempFolderPath ?? Constants.SystemDirectories.TempData.EnsureEndsWith('/') + "PackageFiles"; + _createdPackagesFolderPath = mediaFolderPath ?? Constants.SystemDirectories.CreatedPackages; + _tempFolderPath = tempFolderPath ?? Constants.SystemDirectories.TempData + "/PackageFiles"; } public IEnumerable GetAll() @@ -192,17 +191,12 @@ public bool SavePackage(PackageDefinition definition) public string ExportPackage(PackageDefinition definition) { - // Ensure it's valid ValidatePackage(definition); // Create a folder for building this package - var temporaryPath = - _hostingEnvironment.MapPathContentRoot(_tempFolderPath.EnsureEndsWith('/') + Guid.NewGuid()); - if (Directory.Exists(temporaryPath) == false) - { - Directory.CreateDirectory(temporaryPath); - } + var temporaryPath = _hostingEnvironment.MapPathContentRoot(Path.Combine(_tempFolderPath, Guid.NewGuid().ToString())); + Directory.CreateDirectory(temporaryPath); try { @@ -218,8 +212,7 @@ public string ExportPackage(PackageDefinition definition) PackageTemplates(definition, root); PackageStylesheets(definition, root); PackageStaticFiles(definition.Scripts, root, "Scripts", "Script", _fileSystems.ScriptsFileSystem); - PackageStaticFiles(definition.PartialViews, root, "PartialViews", "View", - _fileSystems.PartialViewsFileSystem); + PackageStaticFiles(definition.PartialViews, root, "PartialViews", "View", _fileSystems.PartialViewsFileSystem); PackageMacros(definition, root); PackageDictionaryItems(definition, root); PackageLanguages(definition, root); @@ -265,27 +258,25 @@ public string ExportPackage(PackageDefinition definition) } } - var directoryName = - _hostingEnvironment.MapPathWebRoot( - Path.Combine(_mediaFolderPath, definition.Name.Replace(' ', '_'))); - - if (Directory.Exists(directoryName) == false) - { - Directory.CreateDirectory(directoryName); - } + var directoryName = _hostingEnvironment.MapPathContentRoot(Path.Combine(_createdPackagesFolderPath, definition.Name.Replace(' ', '_'))); + Directory.CreateDirectory(directoryName); var finalPackagePath = Path.Combine(directoryName, fileName); - if (File.Exists(finalPackagePath)) + // Clean existing XML and ZIP files + foreach (var packagePath in new[] { - File.Delete(finalPackagePath); - } - - if (File.Exists(finalPackagePath.Replace("zip", "xml"))) + Path.ChangeExtension(finalPackagePath, "xml"), + Path.ChangeExtension(finalPackagePath, "zip") + }) { - File.Delete(finalPackagePath.Replace("zip", "xml")); + if (File.Exists(packagePath)) + { + File.Delete(packagePath); + } } + // Move to final package path File.Move(tempPackagePath, finalPackagePath); definition.PackagePath = finalPackagePath; From 7e8f23e5142132af0dc0f8dfe01eb4b5ad225741 Mon Sep 17 00:00:00 2001 From: Ronald Barendse Date: Wed, 9 Mar 2022 11:38:52 +0100 Subject: [PATCH 2/2] Properly clean existing package files --- .../Implement/CreatedPackageSchemaRepository.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/CreatedPackageSchemaRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/CreatedPackageSchemaRepository.cs index 788482658207..b705bcabcafd 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/CreatedPackageSchemaRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/CreatedPackageSchemaRepository.cs @@ -263,11 +263,11 @@ public string ExportPackage(PackageDefinition definition) var finalPackagePath = Path.Combine(directoryName, fileName); - // Clean existing XML and ZIP files + // Clean existing files foreach (var packagePath in new[] { - Path.ChangeExtension(finalPackagePath, "xml"), - Path.ChangeExtension(finalPackagePath, "zip") + definition.PackagePath, + finalPackagePath }) { if (File.Exists(packagePath))