diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/Utils.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/Utils.java index 63831b6f062ce..8903e1a6aa0b8 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/Utils.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/Utils.java @@ -24,9 +24,11 @@ import java.util.HexFormat; import java.util.Locale; import java.util.function.Function; +import java.util.jar.Attributes; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; +import java.util.jar.Manifest; import java.util.stream.Collectors; import static org.objectweb.asm.ClassWriter.COMPUTE_FRAMES; @@ -60,6 +62,10 @@ public String toString() { } } + public static void patchJar(File inputJar, File outputJar, Collection patchers) { + patchJar(inputJar, outputJar, patchers, false); + } + /** * Patches the classes in the input JAR file, using the collection of patchers. Each patcher specifies a target class (its jar entry * name) and the SHA256 digest on the class bytes. @@ -69,8 +75,11 @@ public String toString() { * @param inputFile the JAR file to patch * @param outputFile the output (patched) JAR file * @param patchers list of patcher info (classes to patch (jar entry name + optional SHA256 digest) and ASM visitor to transform them) + * @param unsignJar whether to remove class signatures from the JAR Manifest; set this to true when patching a signed JAR, + * otherwise the patched classes will fail to load at runtime due to mismatched signatures. + * @see Understanding Signing and Verification */ - public static void patchJar(File inputFile, File outputFile, Collection patchers) { + public static void patchJar(File inputFile, File outputFile, Collection patchers, boolean unsignJar) { var classPatchers = patchers.stream().collect(Collectors.toMap(PatcherInfo::jarEntryName, Function.identity())); var mismatchedClasses = new ArrayList(); try (JarFile jarFile = new JarFile(inputFile); JarOutputStream jos = new JarOutputStream(new FileOutputStream(outputFile))) { @@ -101,9 +110,23 @@ public static void patchJar(File inputFile, File outputFile, Collection