fix: resolve some sonar warnings

This commit is contained in:
Skylot
2018-09-01 19:20:04 +03:00
parent 7bd428cf6d
commit bc3af8e64d
18 changed files with 213 additions and 318 deletions
+1 -6
View File
@@ -2,20 +2,15 @@ package jadx.gui;
import javax.swing.*;
import jadx.gui.utils.LangLocale;
import jadx.gui.utils.NLS;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jadx.gui.settings.JadxSettings;
import jadx.gui.settings.JadxSettingsAdapter;
import jadx.gui.ui.MainWindow;
import jadx.gui.utils.NLS;
import jadx.gui.utils.logs.LogCollector;
import java.util.Locale;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
public class JadxGUI {
private static final Logger LOG = LoggerFactory.getLogger(JadxGUI.class);
@@ -1,7 +1,6 @@
package jadx.gui.settings;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.prefs.Preferences;
import com.google.gson.ExclusionStrategy;
@@ -1,21 +1,33 @@
package jadx.gui.treemodel;
import javax.swing.*;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jadx.api.ResourceFile;
import jadx.core.utils.files.ZipSecurity;
import jadx.gui.utils.CertificateManager;
import jadx.gui.utils.NLS;
import jadx.gui.utils.Utils;
import javax.swing.*;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public class JCertificate extends JNode {
private static final long serialVersionUID = 4308696770188518731L;
private static final Logger LOG = LoggerFactory.getLogger(JCertificate.class);
private static final ImageIcon CERTIFICATE_ICON = Utils.openIcon("certificate_obj");
private final transient ResourceFile rf;
private final transient ResourceFile rf;
public JCertificate(ResourceFile resFile) {
this.rf = resFile;
this.rf = resFile;
}
@Override
@@ -35,7 +47,6 @@ public class JCertificate extends JNode {
@Override
public String getContent() {
try {
ResourceFile.ZipRef zipRef = rf.getZipRef();
if (zipRef == null) {
@@ -53,17 +64,13 @@ public class JCertificate extends JNode {
return null;
}
try (InputStream inputStream = new BufferedInputStream(zipFile.getInputStream(entry))) {
return CertificateManager.decode(inputStream);
return CertificateManager.decode(inputStream);
}
}
}
} catch (Exception e) {
e.printStackTrace();
// throw new JadxException("Error decode: " + rf.getName(), e);
LOG.error("Certificate decode error: {}", rf.getName(), e);
return "Decode error: " + e.getMessage();
}
return null;
}
}
@@ -1,10 +1,10 @@
package jadx.gui.ui;
import jadx.gui.treemodel.JNode;
import javax.swing.*;
import java.awt.*;
import jadx.gui.treemodel.JNode;
public class CertificatePanel extends ContentPanel {
CertificatePanel(TabbedPane panel, JNode jnode) {
super(panel, jnode);
@@ -28,7 +28,6 @@ import java.util.Arrays;
import java.util.Timer;
import java.util.TimerTask;
import jadx.gui.treemodel.*;
import org.fife.ui.rsyntaxtextarea.Theme;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,6 +39,12 @@ import jadx.gui.jobs.DecompileJob;
import jadx.gui.jobs.IndexJob;
import jadx.gui.settings.JadxSettings;
import jadx.gui.settings.JadxSettingsWindow;
import jadx.gui.treemodel.JCertificate;
import jadx.gui.treemodel.JClass;
import jadx.gui.treemodel.JLoadableNode;
import jadx.gui.treemodel.JNode;
import jadx.gui.treemodel.JResource;
import jadx.gui.treemodel.JRoot;
import jadx.gui.update.JadxUpdate;
import jadx.gui.update.JadxUpdate.IUpdateCallback;
import jadx.gui.update.data.Release;
@@ -1,33 +1,19 @@
package jadx.gui.ui;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.plaf.basic.BasicButtonUI;
import javax.swing.text.BadLocationException;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicButtonUI;
import javax.swing.text.BadLocationException;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jadx.api.ResourceFile;
import jadx.api.ResourceType;
@@ -57,19 +43,17 @@ class TabbedPane extends JTabbedPane {
setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
addMouseWheelListener(new MouseWheelListener() {
public void mouseWheelMoved(MouseWheelEvent e) {
int direction = e.getWheelRotation();
int index = getSelectedIndex();
int maxIndex = getTabCount() - 1;
if ((index == 0 && direction < 0)
|| (index == maxIndex && direction > 0)) {
index = maxIndex - index;
} else {
index += direction;
}
setSelectedIndex(index);
addMouseWheelListener(e -> {
int direction = e.getWheelRotation();
int index = getSelectedIndex();
int maxIndex = getTabCount() - 1;
if ((index == 0 && direction < 0)
|| (index == maxIndex && direction > 0)) {
index = maxIndex - index;
} else {
index += direction;
}
setSelectedIndex(index);
});
}
@@ -82,23 +66,20 @@ class TabbedPane extends JTabbedPane {
if (contentPanel == null) {
return;
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
setSelectedComponent(contentPanel);
CodeArea codeArea = contentPanel.getCodeArea();
int line = pos.getLine();
if (line < 0) {
try {
line = 1 + codeArea.getLineOfOffset(-line);
} catch (BadLocationException e) {
LOG.error("Can't get line for: {}", pos, e);
line = pos.getNode().getLine();
}
SwingUtilities.invokeLater(() -> {
setSelectedComponent(contentPanel);
CodeArea codeArea = contentPanel.getCodeArea();
int line = pos.getLine();
if (line < 0) {
try {
line = 1 + codeArea.getLineOfOffset(-line);
} catch (BadLocationException e) {
LOG.error("Can't get line for: {}", pos, e);
line = pos.getNode().getLine();
}
codeArea.scrollToLine(line);
codeArea.requestFocus();
}
codeArea.scrollToLine(line);
codeArea.requestFocus();
});
}
@@ -107,12 +88,7 @@ class TabbedPane extends JTabbedPane {
if (contentPanel == null) {
return;
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
setSelectedComponent(contentPanel);
}
});
SwingUtilities.invokeLater(() -> setSelectedComponent(contentPanel));
}
public void showCertificate(JCertificate cert) {
@@ -120,15 +96,9 @@ class TabbedPane extends JTabbedPane {
if (contentPanel == null) {
return;
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
setSelectedComponent(contentPanel);
}
});
SwingUtilities.invokeLater(() -> setSelectedComponent(contentPanel));
}
public void codeJump(Position pos) {
Position curPos = getCurrentPosition();
if (curPos != null) {
@@ -198,11 +168,9 @@ class TabbedPane extends JTabbedPane {
return null;
}
}
if(node instanceof JCertificate)
{
return new CertificatePanel(this,node);
if (node instanceof JCertificate) {
return new CertificatePanel(this, node);
}
return new CodePanel(this, node);
}
@@ -232,12 +200,7 @@ class TabbedPane extends JTabbedPane {
button.setFocusable(false);
button.setBorder(null);
button.setBorderPainted(false);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
closeCodePanel(contentPanel);
}
});
button.addActionListener(e -> closeCodePanel(contentPanel));
panel.addMouseListener(new MouseAdapter() {
@Override
@@ -248,7 +211,6 @@ class TabbedPane extends JTabbedPane {
JPopupMenu menu = createTabPopupMenu(contentPanel);
menu.show(panel, e.getX(), e.getY());
} else {
// TODO: make correct event delegation to tabbed pane
setSelectedComponent(contentPanel);
}
}
@@ -264,45 +226,27 @@ class TabbedPane extends JTabbedPane {
JPopupMenu menu = new JPopupMenu();
JMenuItem copyRootClassName = new JMenuItem(NLS.str("tabs.copy_class_name"));
copyRootClassName.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
copyRootClassName();
}
});
copyRootClassName.addActionListener(actionEvent -> copyRootClassName());
menu.add(copyRootClassName);
JMenuItem closeTab = new JMenuItem(NLS.str("tabs.close"));
closeTab.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
closeCodePanel(contentPanel);
}
});
closeTab.addActionListener(e -> closeCodePanel(contentPanel));
menu.add(closeTab);
if (openTabs.size() > 1) {
JMenuItem closeOther = new JMenuItem(NLS.str("tabs.closeOthers"));
closeOther.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
List<ContentPanel> contentPanels = new ArrayList<>(openTabs.values());
for (ContentPanel panel : contentPanels) {
if (panel != contentPanel) {
closeCodePanel(panel);
}
closeOther.addActionListener(e -> {
List<ContentPanel> contentPanels = new ArrayList<>(openTabs.values());
for (ContentPanel panel : contentPanels) {
if (panel != contentPanel) {
closeCodePanel(panel);
}
}
});
menu.add(closeOther);
JMenuItem closeAll = new JMenuItem(NLS.str("tabs.closeAll"));
closeAll.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
closeAllTabs();
}
});
closeAll.addActionListener(e -> closeAllTabs());
menu.add(closeAll);
menu.addSeparator();
@@ -315,12 +259,7 @@ class TabbedPane extends JTabbedPane {
JNode node = entry.getKey();
final String clsName = node.makeLongString();
JMenuItem item = new JMenuItem(clsName);
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setSelectedComponent(cp);
}
});
item.addActionListener(e -> setSelectedComponent(cp));
item.setIcon(node.getIcon());
menu.add(item);
}
@@ -335,13 +274,15 @@ class TabbedPane extends JTabbedPane {
}
}
public void copyRootClassName(){
public void copyRootClassName() {
ContentPanel selectedPanel = getSelectedCodePanel();
JNode node = selectedPanel.getNode();
JClass jClass = node.getRootClass();
if (jClass != null){
String name = jClass.getFullName();
Utils.setClipboardString(name);
if (selectedPanel != null) {
JNode node = selectedPanel.getNode();
JClass jClass = node.getRootClass();
if (jClass != null) {
String name = jClass.getFullName();
Utils.setClipboardString(name);
}
}
}
@@ -1,4 +1,5 @@
package jadx.gui.utils;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@@ -11,112 +12,95 @@ import java.security.cert.X509Certificate;
import java.security.interfaces.DSAPublicKey;
import java.security.interfaces.RSAPublicKey;
import java.util.Collection;
import java.util.Collections;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CertificateManager {
private static final Logger LOG = LoggerFactory.getLogger(CertificateManager.class);
private static final String CERTIFICATE_TYPE_NAME = "X.509";
static public String decode(InputStream in){
private X509Certificate x509cert;
private Certificate cert;
public static String decode(InputStream in) {
StringBuilder strBuild = new StringBuilder();
Collection<? extends Certificate> certificates = readCertificates(in);
if(certificates!=null) {
if (certificates != null) {
for (Certificate cert : certificates) {
CertificateManager certificateManager= new CertificateManager(cert);
CertificateManager certificateManager = new CertificateManager(cert);
strBuild.append(certificateManager.generateText());
}
}
return strBuild.toString();
}
static Collection<? extends Certificate> readCertificates(InputStream in) {
CertificateFactory cf;
static Collection<? extends Certificate> readCertificates(InputStream in) {
try {
cf = CertificateFactory.getInstance("X.509");
Collection<? extends Certificate> certs = cf.generateCertificates(in);
in.close();
return certs;
CertificateFactory cf = CertificateFactory.getInstance(CERTIFICATE_TYPE_NAME);
return cf.generateCertificates(in);
} catch (Exception e) {
e.printStackTrace();
LOG.error("Certificate read error", e);
}
return null;
return Collections.emptyList();
}
private X509Certificate x509cert;
private Certificate cert;
public CertificateManager(Certificate cert)
{
public CertificateManager(Certificate cert) {
this.cert = cert;
String type = cert.getType();
if (type.equals("X.509")) {
if (cert instanceof X509Certificate) {
x509cert = (X509Certificate) cert;
}
if (type.equals(CERTIFICATE_TYPE_NAME) && cert instanceof X509Certificate) {
x509cert = (X509Certificate) cert;
}
}
String generateHeader()
{
String generateHeader() {
StringBuilder builder = new StringBuilder();
append(builder, NLS.str("certificate.cert_type"), x509cert.getType());
append(builder, NLS.str("certificate.serialSigVer"),((Integer) x509cert.getVersion()).toString());
// seral number
append(builder, NLS.str("certificate.serialSigVer"), ((Integer) x509cert.getVersion()).toString());
// serial number
append(builder, NLS.str("certificate.serialNumber"), "0x" + x509cert.getSerialNumber().toString(16));
// Get subject
Principal subjectDN = x509cert.getSubjectDN();
append(builder, NLS.str("certificate.cert_subject"), subjectDN.getName());
// Get issuer
// Principal issuerDN = x509cert.getIssuerDN();
// append(str, NLS.str("certificate.cert_issuer"), issuerDN.getName());
append(builder, NLS.str("certificate.serialValidFrom"), x509cert.getNotBefore().toString());
append(builder, NLS.str("certificate.serialValidUntil"), x509cert.getNotAfter().toString());
return builder.toString();
return builder.toString();
}
String generateSignature()
{
String generateSignature() {
StringBuilder builder = new StringBuilder();
append(builder, NLS.str("certificate.serialSigType"), x509cert.getSigAlgName());
append(builder, NLS.str("certificate.serialSigOID"), x509cert.getSigAlgOID());
return builder.toString();
return builder.toString();
}
String generateFingerprint()
{
String generateFingerprint() {
StringBuilder builder = new StringBuilder();
try {
append(builder, NLS.str("certificate.serialMD5"), getThumbPrint(x509cert, "MD5"));
append(builder, NLS.str("certificate.serialSHA1"), getThumbPrint(x509cert, "SHA-1"));
append(builder, NLS.str("certificate.serialSHA256"), getThumbPrint(x509cert, "SHA-256"));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (CertificateEncodingException e) {
e.printStackTrace();
} catch (Exception e) {
LOG.error("Failed to parse fingerprint", e);
}
return builder.toString();
return builder.toString();
}
String generatePublicKey()
{
String generatePublicKey() {
PublicKey publicKey = x509cert.getPublicKey();
if(publicKey instanceof RSAPublicKey)
{
if (publicKey instanceof RSAPublicKey) {
return generateRSAPublicKey();
}
if(publicKey instanceof DSAPublicKey)
{
if (publicKey instanceof DSAPublicKey) {
return generateDSAPublicKey();
}
return "";
}
String generateRSAPublicKey()
{
String generateRSAPublicKey() {
RSAPublicKey pub = (RSAPublicKey) cert.getPublicKey();
StringBuilder builder = new StringBuilder();
@@ -127,21 +111,18 @@ public class CertificateManager {
return builder.toString();
}
String generateDSAPublicKey()
{
String generateDSAPublicKey() {
DSAPublicKey pub = (DSAPublicKey) cert.getPublicKey();
StringBuilder builder = new StringBuilder();
append(builder, NLS.str("certificate.serialPubKeyType"), pub.getAlgorithm());
append(builder, NLS.str("certificate.serialPubKeyY"), pub.getY().toString(10));
return builder.toString();
}
String generateTextForX509()
{
String generateTextForX509() {
StringBuilder builder = new StringBuilder();
if(x509cert!=null){
if (x509cert != null) {
builder.append(generateHeader());
builder.append("\n");
@@ -151,31 +132,23 @@ public class CertificateManager {
builder.append(generateSignature());
builder.append("\n");
builder.append(generateFingerprint());
}
return builder.toString();
}
private String generateText() {
private String generateText() {
StringBuilder str = new StringBuilder();
String type = cert.getType();
if (!type.equals("X.509")) {
str.append(cert.toString());
} else {
if (type.equals(CERTIFICATE_TYPE_NAME)) {
str.append(generateTextForX509());
} else {
str.append(cert.toString());
}
return str.toString();
}
static void append(StringBuilder str, String name, String value) {
str.append(name + ": " + value + "\n");
str.append(name).append(": ").append(value).append("\n");
}
public static String getThumbPrint(X509Certificate cert, String type)
@@ -185,23 +158,16 @@ public class CertificateManager {
md.update(der);
byte[] digest = md.digest();
return hexify(digest);
}
public static String hexify(byte bytes[]) {
char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F'};
public static String hexify(byte[] bytes) {
char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
StringBuilder buf = new StringBuilder(bytes.length * 3);
for (int i = 0; i < bytes.length; ++i) {
buf.append(hexDigits[(bytes[i] & 0xf0) >> 4]);
buf.append(hexDigits[bytes[i] & 0x0f]);
for (byte aByte : bytes) {
buf.append(hexDigits[(aByte & 0xf0) >> 4]);
buf.append(hexDigits[aByte & 0x0f]);
buf.append(' ');
}
return buf.toString();
}
}
@@ -1,22 +1,16 @@
package jadx.gui.utils;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.awt.Font;
import java.awt.Toolkit;
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.io.InputStream;
import java.net.URL;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.KeyStroke;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jadx.core.dex.info.AccessInfo;
import jadx.core.dex.instructions.args.ArgType;