From 9dde46834ca913a14e6b9d2e2e6e6c6146b86399 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Fri, 5 Feb 2021 21:46:33 +0000 Subject: [PATCH 1/9] 0.3.5: Begin dev cycle --- build.gradle | 2 +- changelogs/0.3.5.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 changelogs/0.3.5.md diff --git a/build.gradle b/build.gradle index 1ff6f10..91fe2f6 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ subprojects { group = 'org.cadixdev' archivesBaseName = project.name.toLowerCase() - version = '0.3.4' + version = '0.3.5-SNAPSHOT' repositories { mavenCentral() diff --git a/changelogs/0.3.5.md b/changelogs/0.3.5.md new file mode 100644 index 0000000..611152e --- /dev/null +++ b/changelogs/0.3.5.md @@ -0,0 +1,4 @@ +Bombe 0.3.5 +=== + +TODO From cc2c082082d54ea96cdd518b97cae65e3c1f4af4 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Fri, 5 Feb 2021 21:48:30 +0000 Subject: [PATCH 2/9] Deprecate legacy Jars utility Atlas has been the replacement for a while, everyone should migrate to it. This is mostly a formality that was missed. --- bombe/src/main/java/org/cadixdev/bombe/jar/Jars.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bombe/src/main/java/org/cadixdev/bombe/jar/Jars.java b/bombe/src/main/java/org/cadixdev/bombe/jar/Jars.java index 336dabf..2d4fa24 100644 --- a/bombe/src/main/java/org/cadixdev/bombe/jar/Jars.java +++ b/bombe/src/main/java/org/cadixdev/bombe/jar/Jars.java @@ -51,7 +51,9 @@ * * @author Jamie Mansfield * @since 0.3.0 + * @deprecated 0.3.5 - Migrate to Atlas */ +@Deprecated public final class Jars { /** From bcd1576ce8aecb1f286ab1eab252e77d85fc0141 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Fri, 5 Feb 2021 21:54:10 +0000 Subject: [PATCH 3/9] Allow transformers to mark entries for removal This change documents a feature previously added to Atlas [1], and introduces support (since the API is still available) to the legacy Jars utility. [1] https://github.com/CadixDev/Atlas/commit/bb22f810d0db318f6ac9843529b3a198c47efacf --- .../bombe/jar/JarEntryTransformer.java | 20 +++++++++++++++---- .../java/org/cadixdev/bombe/jar/Jars.java | 3 +++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/bombe/src/main/java/org/cadixdev/bombe/jar/JarEntryTransformer.java b/bombe/src/main/java/org/cadixdev/bombe/jar/JarEntryTransformer.java index 95f0865..8fea0f3 100644 --- a/bombe/src/main/java/org/cadixdev/bombe/jar/JarEntryTransformer.java +++ b/bombe/src/main/java/org/cadixdev/bombe/jar/JarEntryTransformer.java @@ -41,9 +41,12 @@ public interface JarEntryTransformer { /** * Transforms the given class entry. + *

+ * It is possible to remove entries by returning {@code null}, when this + * occurs no further transformers will process the entry. * * @param entry The class entry - * @return The transformed entry + * @return The transformed entry, or {@code null} if the entry should be removed */ default JarClassEntry transform(final JarClassEntry entry) { return entry; @@ -51,9 +54,12 @@ default JarClassEntry transform(final JarClassEntry entry) { /** * Transforms the given resource entry. + *

+ * It is possible to remove entries by returning {@code null}, when this + * occurs no further transformers will process the entry. * * @param entry The resource entry - * @return The transformed entry + * @return The transformed entry, or {@code null} if the entry should be removed */ default JarResourceEntry transform(final JarResourceEntry entry) { return entry; @@ -61,9 +67,12 @@ default JarResourceEntry transform(final JarResourceEntry entry) { /** * Transforms the given manifest entry. + *

+ * It is possible to remove entries by returning {@code null}, when this + * occurs no further transformers will process the entry. * * @param entry The manifest entry - * @return The transformed entry + * @return The transformed entry, or {@code null} if the entry should be removed */ default JarManifestEntry transform(final JarManifestEntry entry) { return entry; @@ -71,9 +80,12 @@ default JarManifestEntry transform(final JarManifestEntry entry) { /** * Transforms the given service provider configuration entry. + *

+ * It is possible to remove entries by returning {@code null}, when this + * occurs no further transformers will process the entry. * * @param entry The service provider configuration entry - * @return The transformed entry + * @return The transformed entry, or {@code null} if the entry should be removed */ default JarServiceProviderConfigurationEntry transform(final JarServiceProviderConfigurationEntry entry) { return entry; diff --git a/bombe/src/main/java/org/cadixdev/bombe/jar/Jars.java b/bombe/src/main/java/org/cadixdev/bombe/jar/Jars.java index 2d4fa24..bb81481 100644 --- a/bombe/src/main/java/org/cadixdev/bombe/jar/Jars.java +++ b/bombe/src/main/java/org/cadixdev/bombe/jar/Jars.java @@ -127,9 +127,12 @@ public static JarOutputStream transform(final JarFile jarFile, final JarOutputSt .map(entry -> { for (final JarEntryTransformer transformer : transformers) { entry = entry.accept(transformer); + + if (entry == null) return null; } return entry; }) + .filter(Objects::nonNull) .forEach(entry -> { try { if (!packages.contains(entry.getPackage())) { From d542c2085a0c5bfc3452f8cc7c0536e43d6e0ba4 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Fri, 5 Feb 2021 22:01:57 +0000 Subject: [PATCH 4/9] Allow transformers to introduce entries --- .../org/cadixdev/bombe/jar/JarEntryTransformer.java | 13 +++++++++++++ .../src/main/java/org/cadixdev/bombe/jar/Jars.java | 13 ++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/bombe/src/main/java/org/cadixdev/bombe/jar/JarEntryTransformer.java b/bombe/src/main/java/org/cadixdev/bombe/jar/JarEntryTransformer.java index 8fea0f3..a16bfac 100644 --- a/bombe/src/main/java/org/cadixdev/bombe/jar/JarEntryTransformer.java +++ b/bombe/src/main/java/org/cadixdev/bombe/jar/JarEntryTransformer.java @@ -30,6 +30,9 @@ package org.cadixdev.bombe.jar; +import java.util.Collections; +import java.util.List; + /** * A visitor for {@link AbstractJarEntry}, allowing them be be * transformed. @@ -91,4 +94,14 @@ default JarServiceProviderConfigurationEntry transform(final JarServiceProviderC return entry; } + /** + * Provides a list of {@link AbstractJarEntry jar entries} to add into the + * processed jar file. + * + * @return Entries to add into the final jar + */ + default List additions() { + return Collections.emptyList(); + } + } diff --git a/bombe/src/main/java/org/cadixdev/bombe/jar/Jars.java b/bombe/src/main/java/org/cadixdev/bombe/jar/Jars.java index bb81481..67ebb87 100644 --- a/bombe/src/main/java/org/cadixdev/bombe/jar/Jars.java +++ b/bombe/src/main/java/org/cadixdev/bombe/jar/Jars.java @@ -37,6 +37,8 @@ import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collection; import java.util.HashSet; import java.util.Objects; import java.util.Set; @@ -122,8 +124,7 @@ public static void transform(final Path input, final Path output, final JarEntry * @return The jar output stream */ public static JarOutputStream transform(final JarFile jarFile, final JarOutputStream jos, final JarEntryTransformer... transformers) { - final Set packages = new HashSet<>(); - walk(jarFile) + final Stream transformations = walk(jarFile) .map(entry -> { for (final JarEntryTransformer transformer : transformers) { entry = entry.accept(transformer); @@ -132,7 +133,13 @@ public static JarOutputStream transform(final JarFile jarFile, final JarOutputSt } return entry; }) - .filter(Objects::nonNull) + .filter(Objects::nonNull); + final Stream additions = Arrays.stream(transformers) + .map(JarEntryTransformer::additions) + .flatMap(Collection::stream); + + final Set packages = new HashSet<>(); + Stream.concat(transformations, additions) .forEach(entry -> { try { if (!packages.contains(entry.getPackage())) { From 44f1cedc3e861ecd684390cb196d8bc6ae1cf1bd Mon Sep 17 00:00:00 2001 From: Zach Levis Date: Fri, 5 Feb 2021 14:24:00 -0800 Subject: [PATCH 5/9] asm: Strip jar file signatures in the remapping transformer --- .../asm/jar/JarEntryRemappingTransformer.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/bombe-asm/src/main/java/org/cadixdev/bombe/asm/jar/JarEntryRemappingTransformer.java b/bombe-asm/src/main/java/org/cadixdev/bombe/asm/jar/JarEntryRemappingTransformer.java index 2cbd9bc..d70380f 100644 --- a/bombe-asm/src/main/java/org/cadixdev/bombe/asm/jar/JarEntryRemappingTransformer.java +++ b/bombe-asm/src/main/java/org/cadixdev/bombe/asm/jar/JarEntryRemappingTransformer.java @@ -33,6 +33,7 @@ import org.cadixdev.bombe.jar.JarClassEntry; import org.cadixdev.bombe.jar.JarEntryTransformer; import org.cadixdev.bombe.jar.JarManifestEntry; +import org.cadixdev.bombe.jar.JarResourceEntry; import org.cadixdev.bombe.jar.JarServiceProviderConfigurationEntry; import org.cadixdev.bombe.jar.ServiceProviderConfiguration; import org.objectweb.asm.ClassReader; @@ -41,7 +42,9 @@ import org.objectweb.asm.commons.ClassRemapper; import org.objectweb.asm.commons.Remapper; +import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.function.BiFunction; import java.util.jar.Attributes; import java.util.stream.Collectors; @@ -55,6 +58,8 @@ */ public class JarEntryRemappingTransformer implements JarEntryTransformer { + private static final Attributes.Name SHA_256_DIGEST = new Attributes.Name("SHA-256-Digest"); + private final Remapper remapper; private final BiFunction clsRemapper; @@ -96,6 +101,16 @@ public JarManifestEntry transform(final JarManifestEntry entry) { entry.getManifest().getMainAttributes().putValue("Main-Class", mainClassDeobf); } + // Remove all signature entries + for (final Iterator> it = entry.getManifest().getEntries().entrySet().iterator(); it.hasNext();) { + final Map.Entry section = it.next(); + if (section.getValue().remove(SHA_256_DIGEST) != null) { + if (section.getValue().isEmpty()) { + it.remove(); + } + } + } + return entry; } @@ -119,4 +134,15 @@ public JarServiceProviderConfigurationEntry transform(final JarServiceProviderCo return new JarServiceProviderConfigurationEntry(entry.getTime(), config); } + @Override + public JarResourceEntry transform(final JarResourceEntry entry) { + // Strip signature files from metadata + if (entry.getName().startsWith("META-INF")) { + if (entry.getExtension().equals("RSA") + || entry.getExtension().equals("SF")) { + return null; + } + } + return entry; + } } From fec8cd268e735d2b843d8409cc7c47cb8208924c Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Mon, 1 Feb 2021 14:20:34 +0000 Subject: [PATCH 6/9] Use Attributes.Name.MAIN_CLASS --- .../bombe/asm/jar/JarEntryRemappingTransformer.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/bombe-asm/src/main/java/org/cadixdev/bombe/asm/jar/JarEntryRemappingTransformer.java b/bombe-asm/src/main/java/org/cadixdev/bombe/asm/jar/JarEntryRemappingTransformer.java index d70380f..e9397e9 100644 --- a/bombe-asm/src/main/java/org/cadixdev/bombe/asm/jar/JarEntryRemappingTransformer.java +++ b/bombe-asm/src/main/java/org/cadixdev/bombe/asm/jar/JarEntryRemappingTransformer.java @@ -30,6 +30,8 @@ package org.cadixdev.bombe.asm.jar; +import static java.util.jar.Attributes.Name.MAIN_CLASS; + import org.cadixdev.bombe.jar.JarClassEntry; import org.cadixdev.bombe.jar.JarEntryTransformer; import org.cadixdev.bombe.jar.JarManifestEntry; @@ -91,14 +93,14 @@ public JarClassEntry transform(final JarClassEntry entry) { @Override public JarManifestEntry transform(final JarManifestEntry entry) { // Remap the Main-Class attribute, if present - if (entry.getManifest().getMainAttributes().containsKey(new Attributes.Name("Main-Class"))) { - final String mainClassObf = entry.getManifest().getMainAttributes().getValue("Main-Class") + if (entry.getManifest().getMainAttributes().containsKey(MAIN_CLASS)) { + final String mainClassObf = entry.getManifest().getMainAttributes().getValue(MAIN_CLASS) .replace('.', '/'); final String mainClassDeobf = this.remapper.map(mainClassObf) .replace('/', '.'); - // Since Manifest is mutable, we need'nt create a new entry \o/ - entry.getManifest().getMainAttributes().putValue("Main-Class", mainClassDeobf); + // Since Manifest is mutable, we needn't create a new entry \o/ + entry.getManifest().getMainAttributes().put(MAIN_CLASS, mainClassDeobf); } // Remove all signature entries From ae08b10d2dedf499d4fde918bb2a7976a1add5d1 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Tue, 9 Feb 2021 17:46:13 +0000 Subject: [PATCH 7/9] 0.3.5: Release Time --- .../bombe/analysis/InheritanceProvider.java | 2 +- build.gradle | 4 ++-- changelogs/0.3.5.md | 13 ++++++++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/bombe/src/main/java/org/cadixdev/bombe/analysis/InheritanceProvider.java b/bombe/src/main/java/org/cadixdev/bombe/analysis/InheritanceProvider.java index 03bf094..7d85bb4 100644 --- a/bombe/src/main/java/org/cadixdev/bombe/analysis/InheritanceProvider.java +++ b/bombe/src/main/java/org/cadixdev/bombe/analysis/InheritanceProvider.java @@ -432,7 +432,7 @@ public Map getMethods() { @Override public Set provideParents(final InheritanceProvider provider) { if (this.parents == null) { - ClassInfo.super.provideParents(provider, this.parents = new HashSet<>()); + super.provideParents(provider, this.parents = new HashSet<>()); } return this.parents; } diff --git a/build.gradle b/build.gradle index 91fe2f6..9269e69 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ subprojects { group = 'org.cadixdev' archivesBaseName = project.name.toLowerCase() - version = '0.3.5-SNAPSHOT' + version = '0.3.5' repositories { mavenCentral() @@ -106,7 +106,7 @@ subprojects { developer { id = 'jamierocks' name = 'Jamie Mansfield' - email = 'dev@jamierocks.uk' + email = 'jmansfield@cadixdev.org' url = 'https://www.jamiemansfield.me/' timezone = 'Europe/London' } diff --git a/changelogs/0.3.5.md b/changelogs/0.3.5.md index 611152e..5f44066 100644 --- a/changelogs/0.3.5.md +++ b/changelogs/0.3.5.md @@ -1,4 +1,15 @@ Bombe 0.3.5 === -TODO +Bombe 0.3.5 is a small release introducing some new APIs to bolster the +capabilities of the jar transformation framework, namely allowing entries to be +introduced. To accomplish this, a `JarEntryTransformer#additions()` method has +been introduced. The `Jars` utility has been updated to support this, and a +release of Atlas will be made shortly to implement this feature. + +The `Jars` utility has been deprecated in this version, advising consumers to +switch to Atlas. Jars was removed in 0.4.0, so this just serves as a final +notice to any lingering applications using the utility. + +The remapping transformer will additionally strip signature files and entries +in the manifest. This transformer may in future be available standalone. From 2137e8e0571198df024ecc5f1dd92ea0e008221e Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Tue, 9 Feb 2021 17:56:33 +0000 Subject: [PATCH 8/9] 0.4.4: Start dev cycle --- build.gradle | 2 +- changelogs/0.4.4.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 changelogs/0.4.4.md diff --git a/build.gradle b/build.gradle index ffa8610..06e565f 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ subprojects { group = 'org.cadixdev' archivesBaseName = project.name.toLowerCase() - version = '0.4.3' + version = '0.4.4-SNAPSHOT' repositories { mavenCentral() diff --git a/changelogs/0.4.4.md b/changelogs/0.4.4.md new file mode 100644 index 0000000..1f8ef90 --- /dev/null +++ b/changelogs/0.4.4.md @@ -0,0 +1,4 @@ +Bombe 0.4.4 +=== + +TODO From 66d436c79a738bbc8c6c43338312a9ff7aee61c5 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Tue, 9 Feb 2021 18:03:29 +0000 Subject: [PATCH 9/9] 0.4.4: Release Time --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 80d025d..952b7f6 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ subprojects { group = 'org.cadixdev' archivesBaseName = project.name.toLowerCase() - version = '0.4.4-SNAPSHOT' + version = '0.4.4' repositories { mavenCentral()