From 4bc3afe4ff08b9f0c08952ec7f6e0ac930280cc5 Mon Sep 17 00:00:00 2001 From: asie Date: Sat, 8 Dec 2018 11:21:18 +0100 Subject: add barebones plugin framework, cleanup --- src/main/java/cuchaz/enigma/gui/CodeReader.java | 1 + .../java/cuchaz/enigma/gui/EnigmaSyntaxKit.java | 42 +++++++++++ src/main/java/cuchaz/enigma/gui/Gui.java | 41 +++++------ src/main/java/cuchaz/enigma/gui/GuiController.java | 81 +++++++++++++++++----- .../java/cuchaz/enigma/gui/MinecraftSyntaxKit.java | 42 ----------- .../enigma/gui/highlight/BoxHighlightPainter.java | 13 ++-- .../highlight/DeobfuscatedHighlightPainter.java | 21 ------ .../gui/highlight/ObfuscatedHighlightPainter.java | 21 ------ .../gui/highlight/OtherHighlightPainter.java | 21 ------ 9 files changed, 129 insertions(+), 154 deletions(-) create mode 100644 src/main/java/cuchaz/enigma/gui/EnigmaSyntaxKit.java delete mode 100644 src/main/java/cuchaz/enigma/gui/MinecraftSyntaxKit.java delete mode 100644 src/main/java/cuchaz/enigma/gui/highlight/DeobfuscatedHighlightPainter.java delete mode 100644 src/main/java/cuchaz/enigma/gui/highlight/ObfuscatedHighlightPainter.java delete mode 100644 src/main/java/cuchaz/enigma/gui/highlight/OtherHighlightPainter.java (limited to 'src/main/java/cuchaz/enigma/gui') diff --git a/src/main/java/cuchaz/enigma/gui/CodeReader.java b/src/main/java/cuchaz/enigma/gui/CodeReader.java index ac45b4a..137c730 100644 --- a/src/main/java/cuchaz/enigma/gui/CodeReader.java +++ b/src/main/java/cuchaz/enigma/gui/CodeReader.java @@ -143,6 +143,7 @@ public class CodeReader extends JEditorPane { { // decompile it + CompilationUnit sourceTree = deobfuscator.getSourceTree(classEntry.getOutermostClassName()); String source = deobfuscator.getSource(sourceTree); setCode(source); diff --git a/src/main/java/cuchaz/enigma/gui/EnigmaSyntaxKit.java b/src/main/java/cuchaz/enigma/gui/EnigmaSyntaxKit.java new file mode 100644 index 0000000..5ea0bc2 --- /dev/null +++ b/src/main/java/cuchaz/enigma/gui/EnigmaSyntaxKit.java @@ -0,0 +1,42 @@ +package cuchaz.enigma.gui; + +import cuchaz.enigma.config.Config; +import de.sciss.syntaxpane.components.LineNumbersRuler; +import de.sciss.syntaxpane.syntaxkits.JavaSyntaxKit; +import de.sciss.syntaxpane.util.Configuration; + +public class EnigmaSyntaxKit extends JavaSyntaxKit { + private static Configuration configuration = null; + + @Override + public Configuration getConfig() { + if(configuration == null){ + initConfig(super.getConfig(JavaSyntaxKit.class)); + } + return configuration; + } + + public void initConfig(Configuration baseConfig){ + configuration = baseConfig; + //See de.sciss.syntaxpane.TokenType + configuration.put("Style.KEYWORD", Config.getInstance().highlightColor + ", 0"); + configuration.put("Style.KEYWORD2", Config.getInstance().highlightColor + ", 3"); + configuration.put("Style.STRING", Config.getInstance().stringColor + ", 0"); + configuration.put("Style.STRING2", Config.getInstance().stringColor + ", 1"); + configuration.put("Style.NUMBER", Config.getInstance().numberColor + ", 1"); + configuration.put("Style.OPERATOR", Config.getInstance().operatorColor + ", 0"); + configuration.put("Style.DELIMITER", Config.getInstance().delimiterColor + ", 1"); + configuration.put("Style.TYPE", Config.getInstance().typeColor + ", 2"); + configuration.put("Style.TYPE2", Config.getInstance().typeColor + ", 1"); + configuration.put("Style.IDENTIFIER", Config.getInstance().identifierColor + ", 0"); + configuration.put("Style.DEFAULT", Config.getInstance().defaultTextColor + ", 0"); + configuration.put(LineNumbersRuler.PROPERTY_BACKGROUND, Config.getInstance().lineNumbersBackground + ""); + configuration.put(LineNumbersRuler.PROPERTY_FOREGROUND, Config.getInstance().lineNumbersForeground + ""); + configuration.put(LineNumbersRuler.PROPERTY_CURRENT_BACK, Config.getInstance().lineNumbersSelected + ""); + configuration.put("RightMarginColumn", "999"); //No need to have a right margin, if someone wants it add a config + } + + public static void invalidate(){ + configuration = null; + } +} diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java index 06e7842..8ec58f9 100644 --- a/src/main/java/cuchaz/enigma/gui/Gui.java +++ b/src/main/java/cuchaz/enigma/gui/Gui.java @@ -22,9 +22,7 @@ import cuchaz.enigma.gui.elements.MenuBar; import cuchaz.enigma.gui.elements.PopupMenuBar; import cuchaz.enigma.gui.filechooser.FileChooserAny; import cuchaz.enigma.gui.filechooser.FileChooserFolder; -import cuchaz.enigma.gui.highlight.DeobfuscatedHighlightPainter; -import cuchaz.enigma.gui.highlight.ObfuscatedHighlightPainter; -import cuchaz.enigma.gui.highlight.OtherHighlightPainter; +import cuchaz.enigma.gui.highlight.BoxHighlightPainter; import cuchaz.enigma.gui.highlight.SelectionHighlightPainter; import cuchaz.enigma.gui.node.ClassSelectorPackageNode; import cuchaz.enigma.gui.panels.PanelDeobf; @@ -48,10 +46,8 @@ import java.awt.*; import java.awt.event.*; import java.io.File; import java.io.IOException; -import java.util.Collection; -import java.util.Collections; +import java.util.*; import java.util.List; -import java.util.Vector; import java.util.function.Function; public class Gui { @@ -75,9 +71,7 @@ public class Gui { private JPanel classesPanel; private JSplitPane splitClasses; private PanelIdentifier infoPanel; - public ObfuscatedHighlightPainter obfuscatedHighlightPainter; - public DeobfuscatedHighlightPainter deobfuscatedHighlightPainter; - public OtherHighlightPainter otherHighlightPainter; + public Map boxHighlightPainters; private SelectionHighlightPainter selectionHighlightPainter; private JTree inheritanceTree; private JTree implementationsTree; @@ -145,7 +139,7 @@ public class Gui { selectionHighlightPainter = new SelectionHighlightPainter(); this.editor = new PanelEditor(this); JScrollPane sourceScroller = new JScrollPane(this.editor); - this.editor.setContentType("text/minecraft"); + this.editor.setContentType("text/enigma-sources"); this.editor.setBackground(new Color(Config.getInstance().editorBackground)); DefaultSyntaxKit kit = (DefaultSyntaxKit) this.editor.getEditorKit(); kit.toggleComponent(this.editor, "de.sciss.syntaxpane.components.TokenMarker"); @@ -311,11 +305,11 @@ public class Gui { return this.controller; } - public void onStartOpenJar() { + public void onStartOpenJar(String message) { this.classesPanel.removeAll(); JPanel panel = new JPanel(); panel.setLayout(new FlowLayout()); - panel.add(new JLabel("Loading...")); + panel.add(new JLabel(message)); this.classesPanel.add(panel); redraw(); @@ -407,20 +401,17 @@ public class Gui { showToken(sortedTokens.get(0)); } - public void setHighlightedTokens(Iterable obfuscatedTokens, Iterable deobfuscatedTokens, Iterable otherTokens) { - + public void setHighlightedTokens(Map> tokens) { // remove any old highlighters this.editor.getHighlighter().removeAllHighlights(); - // color things based on the index - if (obfuscatedTokens != null) { - setHighlightedTokens(obfuscatedTokens, obfuscatedHighlightPainter); - } - if (deobfuscatedTokens != null) { - setHighlightedTokens(deobfuscatedTokens, deobfuscatedHighlightPainter); - } - if (otherTokens != null) { - setHighlightedTokens(otherTokens, otherHighlightPainter); + if (boxHighlightPainters != null) { + for (String s : tokens.keySet()) { + BoxHighlightPainter painter = boxHighlightPainters.get(s); + if (painter != null) { + setHighlightedTokens(tokens.get(s), painter); + } + } } redraw(); @@ -582,7 +573,7 @@ public class Gui { // init the text box final JTextField text = new JTextField(); - text.setText(reference.getNamableName()); + text.setText(reference.getNameableName()); text.setPreferredSize(new Dimension(360, text.getPreferredSize().height)); text.addKeyListener(new KeyAdapter() { @Override @@ -633,7 +624,7 @@ public class Gui { // abort the rename JPanel panel = (JPanel) infoPanel.getComponent(0); panel.remove(panel.getComponentCount() - 1); - panel.add(Utils.unboldLabel(new JLabel(reference.getNamableName(), JLabel.LEFT))); + panel.add(Utils.unboldLabel(new JLabel(reference.getNameableName(), JLabel.LEFT))); this.editor.grabFocus(); diff --git a/src/main/java/cuchaz/enigma/gui/GuiController.java b/src/main/java/cuchaz/enigma/gui/GuiController.java index 6e15bb0..e2f332d 100644 --- a/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/src/main/java/cuchaz/enigma/gui/GuiController.java @@ -11,13 +11,14 @@ package cuchaz.enigma.gui; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Queues; import com.strobel.decompiler.languages.java.ast.CompilationUnit; import cuchaz.enigma.Deobfuscator; import cuchaz.enigma.analysis.*; +import cuchaz.enigma.api.EnigmaPlugin; import cuchaz.enigma.config.Config; -import cuchaz.enigma.config.Themes; import cuchaz.enigma.gui.dialog.ProgressDialog; import cuchaz.enigma.mapping.*; import cuchaz.enigma.mapping.entry.ClassEntry; @@ -30,9 +31,7 @@ import cuchaz.enigma.utils.ReadableToken; import java.awt.event.ItemEvent; import java.io.File; import java.io.IOException; -import java.util.Collection; -import java.util.Deque; -import java.util.List; +import java.util.*; import java.util.jar.JarFile; public class GuiController { @@ -58,8 +57,10 @@ public class GuiController { } public void openJar(final JarFile jar) throws IOException { - this.gui.onStartOpenJar(); - this.deobfuscator = new Deobfuscator(jar); + this.gui.onStartOpenJar("Loading JAR..."); + this.deobfuscator = new Deobfuscator(jar, (msg) -> { + this.gui.onStartOpenJar(msg); + }); this.gui.onFinishOpenJar(jar.getName()); refreshClasses(); } @@ -162,7 +163,7 @@ public class GuiController { } public boolean referenceIsRenameable(EntryReference deobfReference) { - return this.deobfuscator.isRenameable(this.deobfuscator.obfuscateReference(deobfReference), true); + return this.deobfuscator.isRenameable(this.deobfuscator.obfuscateReference(deobfReference)); } public ClassInheritanceTreeNode getClassInheritance(ClassEntry deobfClassEntry) { @@ -334,29 +335,73 @@ public class GuiController { } String source = deobfuscator.getSource(sourceTree); index = deobfuscator.getSourceIndex(sourceTree, source); - gui.setSource(index.getSource()); - if (obfReference != null) { - showReference(obfReference); - } + + String sourceString = index.getSource(); // set the highlighted tokens List obfuscatedTokens = Lists.newArrayList(); + List proposedTokens = Lists.newArrayList(); List deobfuscatedTokens = Lists.newArrayList(); List otherTokens = Lists.newArrayList(); - for (Token token : index.referenceTokens()) { - EntryReference reference = index.getDeobfReference(token); + + int offset = 0; + Map tokenRemap = new IdentityHashMap<>(); + boolean remapped = false; + + for (Token inToken : index.referenceTokens()) { + EntryReference reference = index.getDeobfReference(inToken); + Token token = inToken.move(offset); + if (referenceIsRenameable(reference)) { - if (entryHasDeobfuscatedName(reference.getNameableEntry())) { - deobfuscatedTokens.add(token); - } else { - obfuscatedTokens.add(token); + boolean renamed = false; + + if (!entryHasDeobfuscatedName(reference.getNameableEntry())) { + Entry obfEntry = deobfuscator.obfuscateEntry(reference.getNameableEntry()); + if (obfEntry instanceof FieldEntry) { + for (EnigmaPlugin plugin : deobfuscator.getPlugins()) { + String proposal = plugin.proposeFieldName(obfEntry.getClassName(), obfEntry.getName(), ((FieldEntry) obfEntry).getDesc().toString()); + if (proposal != null) { + proposedTokens.add(token); + offset += token.getRenameOffset(proposal); + sourceString = token.rename(sourceString, proposal); + renamed = true; + remapped = true; + break; + } + } + } + } + + if (!renamed) { + if (entryHasDeobfuscatedName(reference.getNameableEntry())) { + deobfuscatedTokens.add(token); + } else { + obfuscatedTokens.add(token); + } } } else { otherTokens.add(token); } + + tokenRemap.put(inToken, token); + } + + if (remapped) { + index.remap(sourceString, tokenRemap); + } + + gui.setSource(sourceString); + if (obfReference != null) { + showReference(obfReference); } + gui.setEditorTheme(Config.getInstance().lookAndFeel); - gui.setHighlightedTokens(obfuscatedTokens, deobfuscatedTokens, otherTokens); + gui.setHighlightedTokens(ImmutableMap.of( + "obfuscated", obfuscatedTokens, + "proposed", proposedTokens, + "deobfuscated", deobfuscatedTokens, + "other", otherTokens + )); }).start(); } diff --git a/src/main/java/cuchaz/enigma/gui/MinecraftSyntaxKit.java b/src/main/java/cuchaz/enigma/gui/MinecraftSyntaxKit.java deleted file mode 100644 index d9fcee5..0000000 --- a/src/main/java/cuchaz/enigma/gui/MinecraftSyntaxKit.java +++ /dev/null @@ -1,42 +0,0 @@ -package cuchaz.enigma.gui; - -import cuchaz.enigma.config.Config; -import de.sciss.syntaxpane.components.LineNumbersRuler; -import de.sciss.syntaxpane.syntaxkits.JavaSyntaxKit; -import de.sciss.syntaxpane.util.Configuration; - -public class MinecraftSyntaxKit extends JavaSyntaxKit { - private static Configuration configuration = null; - - @Override - public Configuration getConfig() { - if(configuration == null){ - initConfig(super.getConfig(JavaSyntaxKit.class)); - } - return configuration; - } - - public void initConfig(Configuration baseConfig){ - configuration = baseConfig; - //See de.sciss.syntaxpane.TokenType - configuration.put("Style.KEYWORD", Config.getInstance().highlightColor + ", 0"); - configuration.put("Style.KEYWORD2", Config.getInstance().highlightColor + ", 3"); - configuration.put("Style.STRING", Config.getInstance().stringColor + ", 0"); - configuration.put("Style.STRING2", Config.getInstance().stringColor + ", 1"); - configuration.put("Style.NUMBER", Config.getInstance().numberColor + ", 1"); - configuration.put("Style.OPERATOR", Config.getInstance().operatorColor + ", 0"); - configuration.put("Style.DELIMITER", Config.getInstance().delimiterColor + ", 1"); - configuration.put("Style.TYPE", Config.getInstance().typeColor + ", 2"); - configuration.put("Style.TYPE2", Config.getInstance().typeColor + ", 1"); - configuration.put("Style.IDENTIFIER", Config.getInstance().identifierColor + ", 0"); - configuration.put("Style.DEFAULT", Config.getInstance().defaultTextColor + ", 0"); - configuration.put(LineNumbersRuler.PROPERTY_BACKGROUND, Config.getInstance().lineNumbersBackground + ""); - configuration.put(LineNumbersRuler.PROPERTY_FOREGROUND, Config.getInstance().lineNumbersForeground + ""); - configuration.put(LineNumbersRuler.PROPERTY_CURRENT_BACK, Config.getInstance().lineNumbersSelected + ""); - configuration.put("RightMarginColumn", "999"); //No need to have a right margin, if someone wants it add a config - } - - public static void invalidate(){ - configuration = null; - } -} diff --git a/src/main/java/cuchaz/enigma/gui/highlight/BoxHighlightPainter.java b/src/main/java/cuchaz/enigma/gui/highlight/BoxHighlightPainter.java index 976c215..10366ce 100644 --- a/src/main/java/cuchaz/enigma/gui/highlight/BoxHighlightPainter.java +++ b/src/main/java/cuchaz/enigma/gui/highlight/BoxHighlightPainter.java @@ -11,13 +11,14 @@ package cuchaz.enigma.gui.highlight; +import cuchaz.enigma.config.Config; + import javax.swing.text.BadLocationException; import javax.swing.text.Highlighter; import javax.swing.text.JTextComponent; import java.awt.*; -public abstract class BoxHighlightPainter implements Highlighter.HighlightPainter { - +public class BoxHighlightPainter implements Highlighter.HighlightPainter { private Color fillColor; private Color borderColor; @@ -26,6 +27,10 @@ public abstract class BoxHighlightPainter implements Highlighter.HighlightPainte this.borderColor = borderColor; } + public static BoxHighlightPainter create(Config.AlphaColorEntry entry, Config.AlphaColorEntry entryOutline) { + return new BoxHighlightPainter(entry != null ? entry.get() : null, entryOutline != null ? entryOutline.get() : null); + } + public static Rectangle getBounds(JTextComponent text, int start, int end) { try { // determine the bounds of the text @@ -59,8 +64,4 @@ public abstract class BoxHighlightPainter implements Highlighter.HighlightPainte g.drawRoundRect(bounds.x, bounds.y, bounds.width, bounds.height, 4, 4); } - protected static Color getColor(int rgb, float alpha){ - Color baseColor = new Color(rgb); - return new Color(baseColor.getRed(), baseColor.getGreen(), baseColor.getBlue(), (int)(255 * alpha)); - } } diff --git a/src/main/java/cuchaz/enigma/gui/highlight/DeobfuscatedHighlightPainter.java b/src/main/java/cuchaz/enigma/gui/highlight/DeobfuscatedHighlightPainter.java deleted file mode 100644 index 41aa97f..0000000 --- a/src/main/java/cuchaz/enigma/gui/highlight/DeobfuscatedHighlightPainter.java +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Jeff Martin. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser General Public - * License v3.0 which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/lgpl.html - *

- * Contributors: - * Jeff Martin - initial API and implementation - ******************************************************************************/ - -package cuchaz.enigma.gui.highlight; - -import cuchaz.enigma.config.Config; - -public class DeobfuscatedHighlightPainter extends BoxHighlightPainter { - - public DeobfuscatedHighlightPainter() { - super(getColor(Config.getInstance().deobfuscatedColor, Config.getInstance().deobfuscatedHiglightAlpha), getColor(Config.getInstance().deobfuscatedColorOutline, Config.getInstance().deobfuscatedOutlineAlpha)); - } -} diff --git a/src/main/java/cuchaz/enigma/gui/highlight/ObfuscatedHighlightPainter.java b/src/main/java/cuchaz/enigma/gui/highlight/ObfuscatedHighlightPainter.java deleted file mode 100644 index d735874..0000000 --- a/src/main/java/cuchaz/enigma/gui/highlight/ObfuscatedHighlightPainter.java +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Jeff Martin. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser General Public - * License v3.0 which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/lgpl.html - *

- * Contributors: - * Jeff Martin - initial API and implementation - ******************************************************************************/ - -package cuchaz.enigma.gui.highlight; - -import cuchaz.enigma.config.Config; - -public class ObfuscatedHighlightPainter extends BoxHighlightPainter { - - public ObfuscatedHighlightPainter() { - super(getColor(Config.getInstance().obfuscatedColor, Config.getInstance().obfuscatedHiglightAlpha), getColor(Config.getInstance().obfuscatedColorOutline, Config.getInstance().obfuscatedOutlineAlpha)); - } -} diff --git a/src/main/java/cuchaz/enigma/gui/highlight/OtherHighlightPainter.java b/src/main/java/cuchaz/enigma/gui/highlight/OtherHighlightPainter.java deleted file mode 100644 index f4ae235..0000000 --- a/src/main/java/cuchaz/enigma/gui/highlight/OtherHighlightPainter.java +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Jeff Martin. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser General Public - * License v3.0 which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/lgpl.html - *

- * Contributors: - * Jeff Martin - initial API and implementation - ******************************************************************************/ - -package cuchaz.enigma.gui.highlight; - -import cuchaz.enigma.config.Config; - -public class OtherHighlightPainter extends BoxHighlightPainter { - - public OtherHighlightPainter() { - super(null, getColor(Config.getInstance().otherColorOutline, Config.getInstance().otherOutlineAlpha)); - } -} -- cgit v1.2.3