From 6041bc5bb0191d505b4727586d3ce18fc4146154 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 11 Sep 2018 20:09:20 +0100 Subject: [PATCH] Correct the permissions of scripts in archives of boot distribution Closes gh-14158 --- .../plugin/ApplicationPluginAction.java | 2 +- ...plicationPluginActionIntegrationTests.java | 32 +++++++++++++++++++ ...Tests-scriptsHaveCorrectPermissions.gradle | 13 ++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/ApplicationPluginActionIntegrationTests-scriptsHaveCorrectPermissions.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ApplicationPluginAction.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ApplicationPluginAction.java index 0a9b8398964..fb4345321b3 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ApplicationPluginAction.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ApplicationPluginAction.java @@ -80,7 +80,7 @@ final class ApplicationPluginAction implements PluginApplicationAction { bootStartScripts.getConventionMapping().map("defaultJvmOpts", applicationConvention::getApplicationDefaultJvmArgs); CopySpec binCopySpec = project.copySpec().into("bin").from(bootStartScripts); - binCopySpec.setFileMode(0x755); + binCopySpec.setFileMode(0755); distribution.getContents().with(binCopySpec); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/ApplicationPluginActionIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/ApplicationPluginActionIntegrationTests.java index 9fc22f37e59..a8dfbb3c5b0 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/ApplicationPluginActionIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/ApplicationPluginActionIntegrationTests.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; +import java.util.function.Consumer; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -156,6 +157,26 @@ public class ApplicationPluginActionIntegrationTests { "custom-boot/bin/custom.bat"); } + @Test + public void scriptsHaveCorrectPermissions() throws IOException { + assertThat( + this.gradleBuild.build("bootDistTar").task(":bootDistTar").getOutcome()) + .isEqualTo(TaskOutcome.SUCCESS); + String name = this.gradleBuild.getProjectDir().getName(); + File distribution = new File(this.gradleBuild.getProjectDir(), + "build/distributions/" + name + "-boot.tar"); + assertThat(distribution).isFile(); + tarEntries(distribution, (entry) -> { + int filePermissions = entry.getMode() & 0777; + if (entry.isFile() && !entry.getName().startsWith(name + "-boot/bin/")) { + assertThat(filePermissions).isEqualTo(0644); + } + else { + assertThat(filePermissions).isEqualTo(0755); + } + }); + } + private List zipEntryNames(File distribution) throws IOException { List entryNames = new ArrayList<>(); try (ZipFile zipFile = new ZipFile(distribution)) { @@ -179,4 +200,15 @@ public class ApplicationPluginActionIntegrationTests { return entryNames; } + private void tarEntries(File distribution, Consumer consumer) + throws IOException { + try (TarArchiveInputStream input = new TarArchiveInputStream( + new FileInputStream(distribution))) { + TarArchiveEntry entry; + while ((entry = input.getNextTarEntry()) != null) { + consumer.accept(entry); + } + } + } + } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/ApplicationPluginActionIntegrationTests-scriptsHaveCorrectPermissions.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/ApplicationPluginActionIntegrationTests-scriptsHaveCorrectPermissions.gradle new file mode 100644 index 00000000000..3f06faff0e9 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/ApplicationPluginActionIntegrationTests-scriptsHaveCorrectPermissions.gradle @@ -0,0 +1,13 @@ +buildscript { + dependencies { + classpath files(pluginClasspath.split(',')) + } +} + +apply plugin: 'org.springframework.boot' +apply plugin: 'application' +apply plugin: 'java' + +bootJar { + mainClassName = 'com.example.ExampleApplication' +}