From 81620f1349569da200da8064583713b7c675ec26 Mon Sep 17 00:00:00 2001 From: Cedric Mailleux Date: Wed, 18 Aug 2021 15:31:44 -0400 Subject: [PATCH 1/2] Ensure that if entryName contains / char they are replaced by "File.separator" --- .../plexus/archiver/AbstractUnArchiver.java | 2 +- .../plexus/archiver/AbstractUnArchiverTest.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/codehaus/plexus/archiver/AbstractUnArchiver.java b/src/main/java/org/codehaus/plexus/archiver/AbstractUnArchiver.java index 0f2861b69..e448d6868 100644 --- a/src/main/java/org/codehaus/plexus/archiver/AbstractUnArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/AbstractUnArchiver.java @@ -409,7 +409,7 @@ protected boolean shouldExtractEntry( File targetDirectory, File targetFileName, "" ) + suffix; boolean fileOnDiskIsNewerThanEntry = targetFileName.lastModified() >= entryDate.getTime(); - boolean differentCasing = !entryName.equals( relativeCanonicalDestPath ); + boolean differentCasing = !entryName.replace("/", File.separator).equals( relativeCanonicalDestPath ); String casingMessage = String.format( "Archive entry '%s' and existing file '%s' names differ only by case." + " This may lead to an unexpected outcome on case-insensitive filesystems.", entryName, canonicalDestPath ); diff --git a/src/test/java/org/codehaus/plexus/archiver/AbstractUnArchiverTest.java b/src/test/java/org/codehaus/plexus/archiver/AbstractUnArchiverTest.java index 8435fdf33..144e955cf 100644 --- a/src/test/java/org/codehaus/plexus/archiver/AbstractUnArchiverTest.java +++ b/src/test/java/org/codehaus/plexus/archiver/AbstractUnArchiverTest.java @@ -200,6 +200,22 @@ public void shouldNotWarnAboutDifferentCasingForDirectoryEntries() throws IOExce assertThat( this.log.getWarns(), not( hasItem( new LogMessageMatcher( "names differ only by case" ) ) ) ); } + + @Test + public void shouldExtractWhenCasingDifferOnlyInEntryNamePath() throws IOException + { + // given + File file = new File( temporaryFolder.getRoot() + File.separator + "folder", "whatever.txt" ); // does not create the file! + file.mkdirs(); + file.createNewFile(); + String entryname = "folder/whatever.txt"; + Date entryDate = new Date(System.currentTimeMillis()+5000); + + // when & then + this.abstractUnArchiver.setOverwrite( true ); + assertThat( this.abstractUnArchiver.shouldExtractEntry( temporaryFolder.getRoot(), file, entryname, entryDate ), is ( true ) ); + } + static class LogMessageMatcher extends BaseMatcher { private final StringContains delegateMatcher; From 1e2c9e4879fb9d001518518b19b05ab26fe2e2d3 Mon Sep 17 00:00:00 2001 From: Cedric Mailleux Date: Thu, 27 Oct 2022 14:22:48 -0400 Subject: [PATCH 2/2] Replace folder by directory --- .../org/codehaus/plexus/archiver/AbstractUnArchiverTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/codehaus/plexus/archiver/AbstractUnArchiverTest.java b/src/test/java/org/codehaus/plexus/archiver/AbstractUnArchiverTest.java index 144e955cf..b479affe7 100644 --- a/src/test/java/org/codehaus/plexus/archiver/AbstractUnArchiverTest.java +++ b/src/test/java/org/codehaus/plexus/archiver/AbstractUnArchiverTest.java @@ -205,10 +205,10 @@ public void shouldNotWarnAboutDifferentCasingForDirectoryEntries() throws IOExce public void shouldExtractWhenCasingDifferOnlyInEntryNamePath() throws IOException { // given - File file = new File( temporaryFolder.getRoot() + File.separator + "folder", "whatever.txt" ); // does not create the file! + File file = new File( temporaryFolder.getRoot() + File.separator + "directory", "whatever.txt" ); // does not create the file! file.mkdirs(); file.createNewFile(); - String entryname = "folder/whatever.txt"; + String entryname = "directory/whatever.txt"; Date entryDate = new Date(System.currentTimeMillis()+5000); // when & then