From cb8823eb0b446d5c1b9b580e5578866e691771d8 Mon Sep 17 00:00:00 2001 From: liach Date: Wed, 15 May 2019 22:03:13 -0700 Subject: Feature/weave (#138) * Add weave/stitch style command system to enigma Also fixed divide by zero stupidity Signed-off-by: liach * Add tests for package access index and command Signed-off-by: liach * Minor tweaks Signed-off-by: liach --- .../enigma/command/CheckMappingsCommand.java | 62 ++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/main/java/cuchaz/enigma/command/CheckMappingsCommand.java (limited to 'src/main/java/cuchaz/enigma/command/CheckMappingsCommand.java') diff --git a/src/main/java/cuchaz/enigma/command/CheckMappingsCommand.java b/src/main/java/cuchaz/enigma/command/CheckMappingsCommand.java new file mode 100644 index 0000000..7ec7679 --- /dev/null +++ b/src/main/java/cuchaz/enigma/command/CheckMappingsCommand.java @@ -0,0 +1,62 @@ +package cuchaz.enigma.command; + +import cuchaz.enigma.Deobfuscator; +import cuchaz.enigma.ProgressListener; +import cuchaz.enigma.analysis.index.JarIndex; +import cuchaz.enigma.translation.mapping.EntryMapping; +import cuchaz.enigma.translation.mapping.serde.MappingFormat; +import cuchaz.enigma.translation.mapping.tree.EntryTree; +import cuchaz.enigma.translation.representation.entry.ClassEntry; + +import java.io.File; +import java.nio.file.Path; +import java.util.Set; +import java.util.jar.JarFile; +import java.util.stream.Collectors; + +public class CheckMappingsCommand extends Command { + + public CheckMappingsCommand() { + super("checkmappings"); + } + + @Override + public String getUsage() { + return " "; + } + + @Override + public boolean isValidArgument(int length) { + return length == 2; + } + + @Override + public void run(String... args) throws Exception { + File fileJarIn = getReadableFile(getArg(args, 0, "in jar", true)); + Path fileMappings = getReadablePath(getArg(args, 1, "mappings file", true)); + + System.out.println("Reading JAR..."); + Deobfuscator deobfuscator = new Deobfuscator(new JarFile(fileJarIn)); + System.out.println("Reading mappings..."); + + MappingFormat format = chooseEnigmaFormat(fileMappings); + EntryTree mappings = format.read(fileMappings, ProgressListener.VOID); + deobfuscator.setMappings(mappings); + + JarIndex idx = deobfuscator.getJarIndex(); + + boolean error = false; + + for (Set partition : idx.getPackageVisibilityIndex().getPartitions()) { + long packages = partition.stream().map(deobfuscator.getMapper()::deobfuscate).map(ClassEntry::getPackageName).distinct().count(); + if (packages > 1) { + error = true; + System.err.println("ERROR: Must be in one package:\n" + partition.stream().map(deobfuscator.getMapper()::deobfuscate).map(ClassEntry::toString).sorted().collect(Collectors.joining("\n"))); + } + } + + if (error) { + throw new IllegalStateException("Errors in package visibility detected, see SysErr above"); + } + } +} -- cgit v1.2.3