From 6bcc3d23798fc4dc8ee36dae151eafbc8a0399ef Mon Sep 17 00:00:00 2001 From: Anders Wallgren Date: Sun, 8 Apr 2018 13:00:02 -0700 Subject: [PATCH 1/3] Test case and proposed fix for https://github.com/codehaus-plexus/plexus-utils/issues/38 --- .../org/codehaus/plexus/util/FileUtils.java | 26 ++++++++--------- .../codehaus/plexus/util/FileUtilsTest.java | 29 ++++++++++++------- 2 files changed, 32 insertions(+), 23 deletions(-) mode change 100644 => 100755 src/main/java/org/codehaus/plexus/util/FileUtils.java mode change 100644 => 100755 src/test/java/org/codehaus/plexus/util/FileUtilsTest.java diff --git a/src/main/java/org/codehaus/plexus/util/FileUtils.java b/src/main/java/org/codehaus/plexus/util/FileUtils.java old mode 100644 new mode 100755 index 6b910b29..1a1f5af8 --- a/src/main/java/org/codehaus/plexus/util/FileUtils.java +++ b/src/main/java/org/codehaus/plexus/util/FileUtils.java @@ -58,21 +58,11 @@ import org.codehaus.plexus.util.io.InputStreamFacade; import org.codehaus.plexus.util.io.URLInputStreamFacade; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.Reader; -import java.io.Writer; +import java.io.*; import java.net.URL; import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.nio.file.attribute.DosFileAttributes; import java.security.SecureRandom; import java.text.DecimalFormat; import java.util.ArrayList; @@ -1094,6 +1084,16 @@ public static void copyFile( final File source, final File destination ) private static void doCopyFile( File source, File destination ) throws IOException { + // Special-case for Windows read-only file attribute -- if it's set, unset it so that replacement of the + // destination doesn't fail. Files.copy will apparently not REPLACE_EXISTING in that case, at least on Windows. + if (Os.isFamily(Os.FAMILY_WINDOWS) + && destination.exists() + && !destination.canWrite() + && Files.readAttributes(destination.toPath(), DosFileAttributes.class) + .isReadOnly()) { + destination.setWritable(true); + } + // offload to operating system if supported if ( Java7Detector.isJava7() ) { diff --git a/src/test/java/org/codehaus/plexus/util/FileUtilsTest.java b/src/test/java/org/codehaus/plexus/util/FileUtilsTest.java old mode 100644 new mode 100755 index 2ba6682b..00557f8a --- a/src/test/java/org/codehaus/plexus/util/FileUtilsTest.java +++ b/src/test/java/org/codehaus/plexus/util/FileUtilsTest.java @@ -16,17 +16,11 @@ * limitations under the License. */ -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.Reader; -import java.io.Writer; +import org.junit.Assume; + +import java.io.*; import java.net.URL; +import java.nio.file.Files; import java.util.Properties; /** @@ -394,6 +388,21 @@ public void testCopyFile3() assertTrue( "Check Exist", destination.exists() ); assertTrue( "Check Full copy", destination.length() == testFile2Size ); } + + public void testCopyOverReadOnlyFile() + throws IOException + { + final File destination = new File( getTestDirectory(), "copy2.txt" ); + + // Make sure file exists and is read-only + assertTrue(destination.createNewFile()); + assertTrue(destination.setReadOnly());; + + // Copy + FileUtils.copyFile( testFile1, destination ); + assertTrue( "Check Exist", destination.exists() ); + assertTrue( "Check Full copy", destination.length() == testFile2Size ); + } // copyFileIfModified From 33ad51c2ecbc345a10602b45239d85b670280b02 Mon Sep 17 00:00:00 2001 From: Anders Wallgren Date: Sun, 8 Apr 2018 13:09:40 -0700 Subject: [PATCH 2/3] Test case and proposed fix for https://github.com/codehaus-plexus/plexus-utils/issues/38 --- .../java/org/codehaus/plexus/util/FileUtils.java | 14 +++++++++++++- .../org/codehaus/plexus/util/FileUtilsTest.java | 14 ++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/codehaus/plexus/util/FileUtils.java b/src/main/java/org/codehaus/plexus/util/FileUtils.java index 1a1f5af8..9f1e0c5f 100755 --- a/src/main/java/org/codehaus/plexus/util/FileUtils.java +++ b/src/main/java/org/codehaus/plexus/util/FileUtils.java @@ -58,7 +58,19 @@ import org.codehaus.plexus.util.io.InputStreamFacade; import org.codehaus.plexus.util.io.URLInputStreamFacade; -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Reader; +import java.io.Writer; import java.net.URL; import java.nio.channels.FileChannel; import java.nio.file.Files; diff --git a/src/test/java/org/codehaus/plexus/util/FileUtilsTest.java b/src/test/java/org/codehaus/plexus/util/FileUtilsTest.java index 00557f8a..8e3440c6 100755 --- a/src/test/java/org/codehaus/plexus/util/FileUtilsTest.java +++ b/src/test/java/org/codehaus/plexus/util/FileUtilsTest.java @@ -16,11 +16,17 @@ * limitations under the License. */ -import org.junit.Assume; - -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Reader; +import java.io.Writer; import java.net.URL; -import java.nio.file.Files; import java.util.Properties; /** From 3ac758f8d92db08106806c2ebb7a5395ec4d8ef8 Mon Sep 17 00:00:00 2001 From: Anders Wallgren Date: Thu, 14 Jun 2018 12:41:23 -0700 Subject: [PATCH 3/3] Patch --- pom.xml | 2 +- .../org/codehaus/plexus/util/FileUtils.java | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 4f7a4979..4efe5984 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ limitations under the License. - 6 + 7 diff --git a/src/main/java/org/codehaus/plexus/util/FileUtils.java b/src/main/java/org/codehaus/plexus/util/FileUtils.java index 9f1e0c5f..c00b28e2 100755 --- a/src/main/java/org/codehaus/plexus/util/FileUtils.java +++ b/src/main/java/org/codehaus/plexus/util/FileUtils.java @@ -1096,8 +1096,18 @@ public static void copyFile( final File source, final File destination ) private static void doCopyFile( File source, File destination ) throws IOException { - // Special-case for Windows read-only file attribute -- if it's set, unset it so that replacement of the - // destination doesn't fail. Files.copy will apparently not REPLACE_EXISTING in that case, at least on Windows. + // If the source file is read-only on windows, that's probably not what we want in the destination. e.g. + // jetty won't start if the web.xml or jetty-web.xml is read-only, for some reason. So after we copy, + // clear the read-only flag. + boolean setWriteable = Os.isFamily(Os.FAMILY_WINDOWS) + && source.exists() + && !source.canWrite() + && Files.readAttributes(source.toPath(), DosFileAttributes.class) + .isReadOnly(); + + // Special-case for Windows read-only file attribute on the destination file -- if it's set, unset it so + // that replacement of the destination doesn't fail. Files.copy will apparently not REPLACE_EXISTING in + // that case, at least on Windows. if (Os.isFamily(Os.FAMILY_WINDOWS) && destination.exists() && !destination.canWrite() @@ -1115,6 +1125,10 @@ private static void doCopyFile( File source, File destination ) { doCopyFileUsingLegacyIO( source, destination ); } + + if (setWriteable) { + destination.setWritable(true); + } } private static void doCopyFileUsingLegacyIO( File source, File destination )