diff --git a/src/main/java/org/embeddedt/modernfix/common/mixin/core/BootstrapMixin.java b/src/main/java/org/embeddedt/modernfix/common/mixin/core/BootstrapMixin.java index 52e582ba..1a108612 100644 --- a/src/main/java/org/embeddedt/modernfix/common/mixin/core/BootstrapMixin.java +++ b/src/main/java/org/embeddedt/modernfix/common/mixin/core/BootstrapMixin.java @@ -2,6 +2,7 @@ package org.embeddedt.modernfix.common.mixin.core; import net.minecraft.server.Bootstrap; import net.minecraftforge.network.NetworkConstants; +import org.embeddedt.modernfix.forge.classloading.ManifestCompactor; import org.slf4j.Logger; import org.embeddedt.modernfix.forge.load.ModWorkManagerQueue; import org.embeddedt.modernfix.util.TimeFormatter; @@ -25,6 +26,7 @@ public class BootstrapMixin { if(!isBootstrapped) { LOGGER.info("ModernFix reached bootstrap stage ({} after launch)", TimeFormatter.formatNanos(ManagementFactory.getRuntimeMXBean().getUptime() * 1000L * 1000L)); ModWorkManagerQueue.replace(); + ManifestCompactor.compactManifests(); } } diff --git a/src/main/java/org/embeddedt/modernfix/forge/classloading/ManifestCompactor.java b/src/main/java/org/embeddedt/modernfix/forge/classloading/ManifestCompactor.java new file mode 100644 index 00000000..24bf22b9 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/forge/classloading/ManifestCompactor.java @@ -0,0 +1,32 @@ +package org.embeddedt.modernfix.forge.classloading; + +import cpw.mods.jarhandling.impl.Jar; +import net.minecraftforge.fml.loading.LoadingModList; + +import java.util.HashSet; +import java.util.Set; +import java.util.jar.Attributes; + +public class ManifestCompactor { + public static void compactManifests() { + for (var mfi : LoadingModList.get().getModFiles()) { + if (!(mfi.getFile().getSecureJar() instanceof Jar jar)) { + continue; + } + var manifest = jar.getManifest(); + if (manifest == null) { + continue; + } + var entries = jar.getManifest().getEntries(); + var entryKeys = new HashSet<>(entries.keySet()); + var digests = Set.of(new Attributes.Name("SHA-256-Digest"), new Attributes.Name("SHA-384-Digest")); + entryKeys.forEach(key -> entries.compute(key, (k, attrs) -> { + if (attrs != null && attrs.keySet().stream().anyMatch(n -> n != null && !digests.contains(n))) { + return attrs; + } else { + return null; + } + })); + } + } +}