From c62513bd04d1a60f4a6a2e14a21ae52aacb2044e Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 16 Oct 2017 18:26:03 +0200 Subject: [PATCH] Remove ISharpZipLib dependencies where possible --- src/Umbraco.Core/IO/IOHelper.cs | 48 ++------------ .../Packaging/PackageExtraction.cs | 64 ++++++++----------- src/Umbraco.Core/Umbraco.Core.csproj | 3 +- src/Umbraco.Examine/Umbraco.Examine.csproj | 1 - .../Packaging/PackageExtractionTests.cs | 47 ++++++++++++++ src/Umbraco.Tests/Umbraco.Tests.csproj | 1 + src/Umbraco.Web/Umbraco.Web.csproj | 43 ++----------- 7 files changed, 89 insertions(+), 118 deletions(-) create mode 100644 src/Umbraco.Tests/Packaging/PackageExtractionTests.cs diff --git a/src/Umbraco.Core/IO/IOHelper.cs b/src/Umbraco.Core/IO/IOHelper.cs index 57abeaeb12..2175ac4e89 100644 --- a/src/Umbraco.Core/IO/IOHelper.cs +++ b/src/Umbraco.Core/IO/IOHelper.cs @@ -7,7 +7,7 @@ using System.Configuration; using System.Linq; using System.Web; using System.Web.Hosting; -using ICSharpCode.SharpZipLib.Zip; +using System.IO.Compression; namespace Umbraco.Core.IO { @@ -23,47 +23,11 @@ namespace Umbraco.Core.IO internal static void UnZip(string zipFilePath, string unPackDirectory, bool deleteZipFile) { // Unzip - string tempDir = unPackDirectory; + var tempDir = unPackDirectory; Directory.CreateDirectory(tempDir); - - //TODO: Get rid of SharpZipLib library - using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath))) - { - ZipEntry theEntry; - while ((theEntry = s.GetNextEntry()) != null) - { - string directoryName = Path.GetDirectoryName(theEntry.Name); - string fileName = Path.GetFileName(theEntry.Name); - - if (fileName != String.Empty) - { - FileStream streamWriter = File.Create(tempDir + Path.DirectorySeparatorChar + fileName); - - int size = 2048; - byte[] data = new byte[2048]; - while (true) - { - size = s.Read(data, 0, data.Length); - if (size > 0) - { - streamWriter.Write(data, 0, size); - } - else - { - break; - } - } - - streamWriter.Close(); - - } - } - - // Clean up - s.Close(); - if (deleteZipFile) - File.Delete(zipFilePath); - } + ZipFile.ExtractToDirectory(zipFilePath, unPackDirectory); + if (deleteZipFile) + File.Delete(zipFilePath); } //helper to try and match the old path to a new virtual one @@ -83,7 +47,7 @@ namespace Umbraco.Core.IO //Replaces tildes with the root dir public static string ResolveUrl(string virtualPath) { - if (virtualPath.StartsWith("~")) + if (virtualPath.StartsWith("~")) return virtualPath.Replace("~", SystemDirectories.Root).Replace("//", "/"); else if (Uri.IsWellFormedUriString(virtualPath, UriKind.Absolute)) return virtualPath; diff --git a/src/Umbraco.Core/Packaging/PackageExtraction.cs b/src/Umbraco.Core/Packaging/PackageExtraction.cs index cbbc3d3fa6..752cc80697 100644 --- a/src/Umbraco.Core/Packaging/PackageExtraction.cs +++ b/src/Umbraco.Core/Packaging/PackageExtraction.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using ICSharpCode.SharpZipLib.Zip; +using System.IO.Compression; namespace Umbraco.Core.Packaging { @@ -14,17 +14,17 @@ namespace Umbraco.Core.Packaging bool fileFound = false; string foundDir = null; - ReadZipfileEntries(packageFilePath, (entry, stream) => + ReadZipfileEntries(packageFilePath, entry => { string fileName = Path.GetFileName(entry.Name); - if (string.IsNullOrEmpty(fileName) == false && - fileName.Equals(fileToRead, StringComparison.CurrentCultureIgnoreCase)) + if (string.IsNullOrEmpty(fileName) == false && fileName.Equals(fileToRead, StringComparison.CurrentCultureIgnoreCase)) { foundDir = entry.Name.Substring(0, entry.Name.Length - fileName.Length); fileFound = true; - using (var reader = new StreamReader(stream)) + using (var entryStream = entry.Open()) + using (var reader = new StreamReader(entryStream)) { retVal = reader.ReadToEnd(); return false; @@ -77,7 +77,7 @@ namespace Umbraco.Core.Packaging var d = sourceDestination.ToDictionary(k => k.Key.ToLower(), v => v.Value); - ReadZipfileEntries(packageFilePath, (entry, stream) => + ReadZipfileEntries(packageFilePath, entry => { string fileName = (Path.GetFileName(entry.Name) ?? string.Empty).ToLower(); if (fileName == string.Empty) { return true; } @@ -86,8 +86,9 @@ namespace Umbraco.Core.Packaging if (string.IsNullOrEmpty(fileName) == false && d.TryGetValue(fileName, out destination)) { using (var streamWriter = File.Open(destination, FileMode.Create)) + using (var entryStream = entry.Open()) { - stream.CopyTo(streamWriter); + entryStream.CopyTo(streamWriter); } d.Remove(fileName); @@ -106,7 +107,7 @@ namespace Umbraco.Core.Packaging { var retVal = expectedFiles.ToList(); - ReadZipfileEntries(packageFilePath, (zipEntry, stream) => + ReadZipfileEntries(packageFilePath, zipEntry => { string fileName = Path.GetFileName(zipEntry.Name); @@ -125,7 +126,7 @@ namespace Umbraco.Core.Packaging var dictionary = new Dictionary>(); - ReadZipfileEntries(packageFilePath, (entry, stream) => + ReadZipfileEntries(packageFilePath, entry => { string fileName = (Path.GetFileName(entry.Name) ?? string.Empty).ToLower(); @@ -148,53 +149,42 @@ namespace Umbraco.Core.Packaging { CheckPackageExists(packageFilePath); - var files = new HashSet(filesToGet.Select(f => f.ToLower())); + var files = new HashSet(filesToGet.Select(f => f.ToLowerInvariant())); using (var fs = File.OpenRead(packageFilePath)) + using (var zipArchive = new ZipArchive(fs)) { - using (var zipInputStream = new ZipInputStream(fs)) + foreach (var zipEntry in zipArchive.Entries) { - ZipEntry zipEntry; - while ((zipEntry = zipInputStream.GetNextEntry()) != null) + if (zipEntry.Name.IsNullOrWhiteSpace() && zipEntry.FullName.EndsWith("/")) continue; + + if (files.Contains(zipEntry.Name.ToLowerInvariant())) { - - if (zipEntry.IsDirectory) continue; - - if (files.Contains(zipEntry.Name)) + using (var memStream = new MemoryStream()) + using (var entryStream = zipEntry.Open()) { - using (var memStream = new MemoryStream()) - { - zipInputStream.CopyTo(memStream); - yield return memStream.ToArray(); - memStream.Close(); - } + entryStream.CopyTo(memStream); + memStream.Close(); + yield return memStream.ToArray(); } } - - zipInputStream.Close(); } - fs.Close(); } } - private void ReadZipfileEntries(string packageFilePath, Func entryFunc, bool skipsDirectories = true) + private void ReadZipfileEntries(string packageFilePath, Func entryFunc, bool skipsDirectories = true) { CheckPackageExists(packageFilePath); using (var fs = File.OpenRead(packageFilePath)) + using (var zipArchive = new ZipArchive(fs)) { - using (var zipInputStream = new ZipInputStream(fs)) + foreach (var zipEntry in zipArchive.Entries) { - ZipEntry zipEntry; - while ((zipEntry = zipInputStream.GetNextEntry()) != null) - { - if (zipEntry.IsDirectory && skipsDirectories) continue; - if (entryFunc(zipEntry, zipInputStream) == false) break; - } - - zipInputStream.Close(); + if (zipEntry.Name.IsNullOrWhiteSpace() && zipEntry.FullName.EndsWith("/") && skipsDirectories) + continue; + if (entryFunc(zipEntry) == false) break; } - fs.Close(); } } } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 26042fb478..8cdea3809a 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -38,6 +38,8 @@ + + @@ -78,7 +80,6 @@ - 4.4.0 diff --git a/src/Umbraco.Examine/Umbraco.Examine.csproj b/src/Umbraco.Examine/Umbraco.Examine.csproj index 0ddf146739..4bf61c3689 100644 --- a/src/Umbraco.Examine/Umbraco.Examine.csproj +++ b/src/Umbraco.Examine/Umbraco.Examine.csproj @@ -47,7 +47,6 @@ - diff --git a/src/Umbraco.Tests/Packaging/PackageExtractionTests.cs b/src/Umbraco.Tests/Packaging/PackageExtractionTests.cs new file mode 100644 index 0000000000..a1bdb0979d --- /dev/null +++ b/src/Umbraco.Tests/Packaging/PackageExtractionTests.cs @@ -0,0 +1,47 @@ +using System; +using System.IO; +using System.Linq; +using NUnit.Framework; +using Umbraco.Core.Packaging; + +namespace Umbraco.Tests.Packaging +{ + [TestFixture] + class PackageExtractionTests + { + private const string PackageFileName = "Document_Type_Picker_1.1.umb"; + + private static string GetTestPackagePath(string packageName) + { + const string testPackagesDirName = "Packaging\\Packages"; + string path = Path.Combine(Core.Configuration.GlobalSettings.FullpathToRoot, testPackagesDirName, packageName); + return path; + } + + [Test] + public void ReadFilesFromArchive_NumberOfFilesIs1_SearchingForPackageXmlFile() + { + // Arrange + var sut = new PackageExtraction(); + + // Act + var result = sut.ReadFilesFromArchive(GetTestPackagePath(PackageFileName), new[] { "Package.xml" }); + + // Assert + Assert.AreEqual(1, result.Count()); + } + + [Test] + public void FindMissingFiles_1_UnknownFile() + { + // Arrange + var sut = new PackageExtraction(); + + // Act + var result = sut.FindMissingFiles(GetTestPackagePath(PackageFileName), new[] { "DoesNotExists.XYZ" }); + + // Assert + Assert.AreEqual(1, result.Count()); + } + } +} diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index a4653ac45d..83ecf0e946 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -237,6 +237,7 @@ + diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 96271abf97..fdd83b8aa4 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -99,7 +99,6 @@ - @@ -1691,7 +1690,6 @@ - - - + $(PlatformTargetAsMSBuildArchitecture) - - + - - - - - - - - + + - \ No newline at end of file