Skip to content

Commit

Permalink
Merge branch '3.0.x' into 3.1.x
Browse files Browse the repository at this point in the history
Closes gh-37588
  • Loading branch information
scottfrederick committed Sep 26, 2023
2 parents 8dac667 + a03e332 commit 4f8684f
Show file tree
Hide file tree
Showing 6 changed files with 118 additions and 15 deletions.
Expand Up @@ -47,6 +47,7 @@
*
* @author Andy Wilkinson
* @author Phillip Webb
* @author Scott Frederick
* @see BootJar
* @see BootWar
*/
Expand Down Expand Up @@ -124,16 +125,18 @@ CopyAction createCopyAction(Jar jar, ResolvedDependencies resolvedDependencies,
File output = jar.getArchiveFile().get().getAsFile();
Manifest manifest = jar.getManifest();
boolean preserveFileTimestamps = jar.isPreserveFileTimestamps();
Integer dirMode = jar.getDirMode();
Integer fileMode = jar.getFileMode();
boolean includeDefaultLoader = isUsingDefaultLoader(jar);
Spec<FileTreeElement> requiresUnpack = this.requiresUnpack.getAsSpec();
Spec<FileTreeElement> exclusions = this.exclusions.getAsExcludeSpec();
LaunchScriptConfiguration launchScript = this.launchScript;
Spec<FileCopyDetails> librarySpec = this.librarySpec;
Function<FileCopyDetails, ZipCompression> compressionResolver = this.compressionResolver;
String encoding = jar.getMetadataCharset();
CopyAction action = new BootZipCopyAction(output, manifest, preserveFileTimestamps, includeDefaultLoader,
layerToolsLocation, requiresUnpack, exclusions, launchScript, librarySpec, compressionResolver,
encoding, resolvedDependencies, layerResolver);
CopyAction action = new BootZipCopyAction(output, manifest, preserveFileTimestamps, dirMode, fileMode,
includeDefaultLoader, layerToolsLocation, requiresUnpack, exclusions, launchScript, librarySpec,
compressionResolver, encoding, resolvedDependencies, layerResolver);
return jar.isReproducibleFileOrder() ? new ReproducibleOrderingCopyAction(action) : action;
}

Expand Down
Expand Up @@ -87,6 +87,10 @@ class BootZipCopyAction implements CopyAction {

private final boolean preserveFileTimestamps;

private final Integer dirMode;

private final Integer fileMode;

private final boolean includeDefaultLoader;

private final String layerToolsLocation;
Expand All @@ -107,14 +111,16 @@ class BootZipCopyAction implements CopyAction {

private final LayerResolver layerResolver;

BootZipCopyAction(File output, Manifest manifest, boolean preserveFileTimestamps, boolean includeDefaultLoader,
String layerToolsLocation, Spec<FileTreeElement> requiresUnpack, Spec<FileTreeElement> exclusions,
LaunchScriptConfiguration launchScript, Spec<FileCopyDetails> librarySpec,
BootZipCopyAction(File output, Manifest manifest, boolean preserveFileTimestamps, Integer dirMode, Integer fileMode,
boolean includeDefaultLoader, String layerToolsLocation, Spec<FileTreeElement> requiresUnpack,
Spec<FileTreeElement> exclusions, LaunchScriptConfiguration launchScript, Spec<FileCopyDetails> librarySpec,
Function<FileCopyDetails, ZipCompression> compressionResolver, String encoding,
ResolvedDependencies resolvedDependencies, LayerResolver layerResolver) {
this.output = output;
this.manifest = manifest;
this.preserveFileTimestamps = preserveFileTimestamps;
this.dirMode = dirMode;
this.fileMode = fileMode;
this.includeDefaultLoader = includeDefaultLoader;
this.layerToolsLocation = layerToolsLocation;
this.requiresUnpack = requiresUnpack;
Expand Down Expand Up @@ -240,7 +246,7 @@ private boolean skipProcessing(FileCopyDetails details) {
private void processDirectory(FileCopyDetails details) throws IOException {
String name = details.getRelativePath().getPathString();
ZipArchiveEntry entry = new ZipArchiveEntry(name + '/');
prepareEntry(entry, name, getTime(details), UnixStat.FILE_FLAG | details.getMode());
prepareEntry(entry, name, getTime(details), getFileMode(details));
this.out.putArchiveEntry(entry);
this.out.closeArchiveEntry();
this.writtenDirectories.add(name);
Expand All @@ -249,7 +255,7 @@ private void processDirectory(FileCopyDetails details) throws IOException {
private void processFile(FileCopyDetails details) throws IOException {
String name = details.getRelativePath().getPathString();
ZipArchiveEntry entry = new ZipArchiveEntry(name);
prepareEntry(entry, name, getTime(details), UnixStat.FILE_FLAG | details.getMode());
prepareEntry(entry, name, getTime(details), getFileMode(details));
ZipCompression compression = BootZipCopyAction.this.compressionResolver.apply(details);
if (compression == ZipCompression.STORED) {
prepareStoredEntry(details, entry);
Expand All @@ -273,7 +279,7 @@ private void writeParentDirectoriesIfNecessary(String name, Long time) throws IO
String parentDirectory = getParentDirectory(name);
if (parentDirectory != null && this.writtenDirectories.add(parentDirectory)) {
ZipArchiveEntry entry = new ZipArchiveEntry(parentDirectory + '/');
prepareEntry(entry, parentDirectory, time, UnixStat.DIR_FLAG | UnixStat.DEFAULT_DIR_PERM);
prepareEntry(entry, parentDirectory, time, getDirMode());
this.out.putArchiveEntry(entry);
this.out.closeArchiveEntry();
}
Expand Down Expand Up @@ -304,7 +310,7 @@ private void writeLoaderEntriesIfNecessary(FileCopyDetails details) throws IOExc
// Always write loader entries after META-INF directory (see gh-16698)
return;
}
LoaderZipEntries loaderEntries = new LoaderZipEntries(getTime());
LoaderZipEntries loaderEntries = new LoaderZipEntries(getTime(), getDirMode(), getFileMode());
this.writtenLoaderEntries = loaderEntries.writeTo(this.out);
if (BootZipCopyAction.this.layerResolver != null) {
for (String name : this.writtenLoaderEntries.getFiles()) {
Expand Down Expand Up @@ -393,7 +399,7 @@ private void writeEntry(String name, ZipEntryContentWriter entryWriter, boolean
private void writeEntry(String name, ZipEntryContentWriter entryWriter, boolean addToLayerIndex,
ZipEntryCustomizer entryCustomizer) throws IOException {
ZipArchiveEntry entry = new ZipArchiveEntry(name);
prepareEntry(entry, name, getTime(), UnixStat.FILE_FLAG | UnixStat.DEFAULT_FILE_PERM);
prepareEntry(entry, name, getTime(), getFileMode());
entryCustomizer.customize(entry);
this.out.putArchiveEntry(entry);
entryWriter.writeTo(this.out);
Expand Down Expand Up @@ -437,6 +443,21 @@ private Long getTime(FileCopyDetails details) {
return null;
}

private int getDirMode() {
return (BootZipCopyAction.this.dirMode != null) ? BootZipCopyAction.this.dirMode
: UnixStat.DIR_FLAG | UnixStat.DEFAULT_DIR_PERM;
}

private int getFileMode() {
return (BootZipCopyAction.this.fileMode != null) ? BootZipCopyAction.this.fileMode
: UnixStat.FILE_FLAG | UnixStat.DEFAULT_FILE_PERM;
}

private int getFileMode(FileCopyDetails details) {
return (BootZipCopyAction.this.fileMode != null) ? BootZipCopyAction.this.fileMode
: UnixStat.FILE_FLAG | details.getMode();
}

}

/**
Expand Down
Expand Up @@ -24,7 +24,6 @@
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import org.apache.commons.compress.archivers.zip.UnixStat;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.gradle.api.file.FileTreeElement;
Expand All @@ -42,8 +41,14 @@ class LoaderZipEntries {

private final Long entryTime;

LoaderZipEntries(Long entryTime) {
private final int dirMode;

private final int fileMode;

LoaderZipEntries(Long entryTime, int dirMode, int fileMode) {
this.entryTime = entryTime;
this.dirMode = dirMode;
this.fileMode = fileMode;
}

WrittenEntries writeTo(ZipArchiveOutputStream out) throws IOException {
Expand All @@ -67,13 +72,13 @@ else if (entry.getName().endsWith(".class")) {
}

private void writeDirectory(ZipArchiveEntry entry, ZipArchiveOutputStream out) throws IOException {
prepareEntry(entry, UnixStat.DIR_FLAG | UnixStat.DEFAULT_DIR_PERM);
prepareEntry(entry, this.dirMode);
out.putArchiveEntry(entry);
out.closeArchiveEntry();
}

private void writeClass(ZipArchiveEntry entry, ZipInputStream in, ZipArchiveOutputStream out) throws IOException {
prepareEntry(entry, UnixStat.FILE_FLAG | UnixStat.DEFAULT_FILE_PERM);
prepareEntry(entry, this.fileMode);
out.putArchiveEntry(entry);
copy(in, out);
out.closeArchiveEntry();
Expand Down
Expand Up @@ -29,6 +29,7 @@
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
Expand All @@ -44,6 +45,9 @@
import java.util.stream.Stream;
import java.util.zip.ZipEntry;

import org.apache.commons.compress.archivers.zip.UnixStat;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.gradle.testkit.runner.BuildResult;
import org.gradle.testkit.runner.TaskOutcome;
import org.junit.jupiter.api.TestTemplate;
Expand All @@ -61,6 +65,7 @@
*
* @author Andy Wilkinson
* @author Madhura Bhave
* @author Scott Frederick
*/
abstract class AbstractBootArchiveIntegrationTests {

Expand Down Expand Up @@ -523,6 +528,48 @@ void javaVersionIsSetInManifest() throws IOException {
}
}

@TestTemplate
void defaultDirAndFileModesAreUsed() throws IOException {
BuildResult result = this.gradleBuild.build(this.taskName);
assertThat(result.task(":" + this.taskName).getOutcome()).isEqualTo(TaskOutcome.SUCCESS);
try (ZipFile jarFile = new ZipFile(new File(this.gradleBuild.getProjectDir(), "build/libs").listFiles()[0])) {
Enumeration<ZipArchiveEntry> entries = jarFile.getEntries();
while (entries.hasMoreElements()) {
ZipArchiveEntry entry = entries.nextElement();
if (entry.getName().startsWith("META-INF/")) {
continue;
}
if (entry.isDirectory()) {
assertEntryMode(entry, UnixStat.DIR_FLAG | UnixStat.DEFAULT_DIR_PERM);
}
else {
assertEntryMode(entry, UnixStat.FILE_FLAG | UnixStat.DEFAULT_FILE_PERM);
}
}
}
}

@TestTemplate
void dirModeAndFileModeAreApplied() throws IOException {
BuildResult result = this.gradleBuild.build(this.taskName);
assertThat(result.task(":" + this.taskName).getOutcome()).isEqualTo(TaskOutcome.SUCCESS);
try (ZipFile jarFile = new ZipFile(new File(this.gradleBuild.getProjectDir(), "build/libs").listFiles()[0])) {
Enumeration<ZipArchiveEntry> entries = jarFile.getEntries();
while (entries.hasMoreElements()) {
ZipArchiveEntry entry = entries.nextElement();
if (entry.getName().startsWith("META-INF/")) {
continue;
}
if (entry.isDirectory()) {
assertEntryMode(entry, 0500);
}
else {
assertEntryMode(entry, 0400);
}
}
}
}

private void copyMainClassApplication() throws IOException {
copyApplication("main");
}
Expand Down Expand Up @@ -660,4 +707,11 @@ private boolean isInIndex(List<String> index, String file) {
return false;
}

private static void assertEntryMode(ZipArchiveEntry entry, int expectedMode) {
assertThat(entry.getUnixMode())
.withFailMessage(() -> "Expected mode " + Integer.toOctalString(expectedMode) + " for entry "
+ entry.getName() + " but actual is " + Integer.toOctalString(entry.getUnixMode()))
.isEqualTo(expectedMode);
}

}
@@ -0,0 +1,10 @@
plugins {
id 'java'
id 'org.springframework.boot' version '{version}'
}

tasks.named("bootJar") {
fileMode = 0400
dirMode = 0500
mainClass = 'com.example.Application'
}
@@ -0,0 +1,10 @@
plugins {
id 'war'
id 'org.springframework.boot' version '{version}'
}

tasks.named("bootWar") {
fileMode = 0400
dirMode = 0500
mainClass = 'com.example.Application'
}

0 comments on commit 4f8684f

Please sign in to comment.