From bd982e7e4b0096380b9bdb0fa8ad33ab2c652c1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Sun, 21 Jan 2024 17:54:12 +0100 Subject: [PATCH] [MSHADE-420] fix time when read from extra field --- pom.xml | 5 ++++ .../maven/plugins/shade/DefaultShader.java | 27 +++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 87051b8c..754b1944 100644 --- a/pom.xml +++ b/pom.xml @@ -255,6 +255,11 @@ 3.3.0 test + + org.apache.commons + commons-compress + 1.23.0 + diff --git a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java index 3d14fd21..c4b22bf1 100644 --- a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java +++ b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java @@ -43,6 +43,7 @@ import java.util.List; import java.util.Objects; import java.util.Set; +import java.util.TimeZone; import java.util.concurrent.Callable; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -55,6 +56,9 @@ import org.apache.commons.collections4.MultiValuedMap; import org.apache.commons.collections4.multimap.HashSetValuedHashMap; +import org.apache.commons.compress.archivers.zip.ExtraFieldUtils; +import org.apache.commons.compress.archivers.zip.X5455_ExtendedTimestamp; +import org.apache.commons.compress.archivers.zip.ZipExtraField; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.shade.filter.Filter; import org.apache.maven.plugins.shade.relocation.Relocator; @@ -89,6 +93,25 @@ public DefaultShader(final Logger logger) { this.logger = Objects.requireNonNull(logger); } + // workaround for MSHADE-420 + private long getTime(ZipEntry entry) { + if (entry.getExtra() != null) { + try { + ZipExtraField[] fields = + ExtraFieldUtils.parse(entry.getExtra(), true, ExtraFieldUtils.UnparseableExtraField.SKIP); + for (ZipExtraField field : fields) { + if (X5455_ExtendedTimestamp.HEADER_ID.equals(field.getHeaderId())) { + // extended timestamp extra field: need to translate UTC to local time for Reproducible Builds + return entry.getTime() - TimeZone.getDefault().getRawOffset(); + } + } + } catch (ZipException ze) { + // ignore + } + } + return entry.getTime(); + } + public void shade(ShadeRequest shadeRequest) throws IOException, MojoExecutionException { Set resources = new HashSet<>(); @@ -332,7 +355,7 @@ public InputStream call() throws Exception { } }, name, - entry.getTime(), + getTime(entry), entry.getMethod()); } catch (Exception e) { throw new IOException(String.format("Problem shading JAR %s entry %s: %s", jar, name, e), e); @@ -423,7 +446,7 @@ private void goThroughAllJarEntriesForManifestTransformer( resources.add(resource); try (InputStream inputStream = jarFile.getInputStream(entry)) { manifestTransformer.processResource( - resource, inputStream, shadeRequest.getRelocators(), entry.getTime()); + resource, inputStream, shadeRequest.getRelocators(), getTime(entry)); } break; }