Skip to content

Commit 630e2d0

Browse files
committed
Correct the permissions of scripts in archives of boot distribution
Closes gh-14158
1 parent e84d6cd commit 630e2d0

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed

spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ApplicationPluginAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public void execute(Project project) {
8080
bootStartScripts.getConventionMapping().map("defaultJvmOpts",
8181
applicationConvention::getApplicationDefaultJvmArgs);
8282
CopySpec binCopySpec = project.copySpec().into("bin").from(bootStartScripts);
83-
binCopySpec.setFileMode(0x755);
83+
binCopySpec.setFileMode(0755);
8484
distribution.getContents().with(binCopySpec);
8585
}
8686

spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/ApplicationPluginActionIntegrationTests.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.ArrayList;
2323
import java.util.Enumeration;
2424
import java.util.List;
25+
import java.util.function.Consumer;
2526
import java.util.zip.ZipEntry;
2627
import java.util.zip.ZipFile;
2728

@@ -156,6 +157,26 @@ public void applicationNameCanBeUsedToCustomizeDistributionName() throws IOExcep
156157
"custom-boot/bin/custom.bat");
157158
}
158159

160+
@Test
161+
public void scriptsHaveCorrectPermissions() throws IOException {
162+
assertThat(
163+
this.gradleBuild.build("bootDistTar").task(":bootDistTar").getOutcome())
164+
.isEqualTo(TaskOutcome.SUCCESS);
165+
String name = this.gradleBuild.getProjectDir().getName();
166+
File distribution = new File(this.gradleBuild.getProjectDir(),
167+
"build/distributions/" + name + "-boot.tar");
168+
assertThat(distribution).isFile();
169+
tarEntries(distribution, (entry) -> {
170+
int filePermissions = entry.getMode() & 0777;
171+
if (entry.isFile() && !entry.getName().startsWith(name + "-boot/bin/")) {
172+
assertThat(filePermissions).isEqualTo(0644);
173+
}
174+
else {
175+
assertThat(filePermissions).isEqualTo(0755);
176+
}
177+
});
178+
}
179+
159180
private List<String> zipEntryNames(File distribution) throws IOException {
160181
List<String> entryNames = new ArrayList<>();
161182
try (ZipFile zipFile = new ZipFile(distribution)) {
@@ -179,4 +200,15 @@ private List<String> tarEntryNames(File distribution) throws IOException {
179200
return entryNames;
180201
}
181202

203+
private void tarEntries(File distribution, Consumer<TarArchiveEntry> consumer)
204+
throws IOException {
205+
try (TarArchiveInputStream input = new TarArchiveInputStream(
206+
new FileInputStream(distribution))) {
207+
TarArchiveEntry entry;
208+
while ((entry = input.getNextTarEntry()) != null) {
209+
consumer.accept(entry);
210+
}
211+
}
212+
}
213+
182214
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
buildscript {
2+
dependencies {
3+
classpath files(pluginClasspath.split(','))
4+
}
5+
}
6+
7+
apply plugin: 'org.springframework.boot'
8+
apply plugin: 'application'
9+
apply plugin: 'java'
10+
11+
bootJar {
12+
mainClassName = 'com.example.ExampleApplication'
13+
}

0 commit comments

Comments
 (0)