From 0721a6b0507b19258ad77ea0e2d8ccfd2dd1da8a Mon Sep 17 00:00:00 2001 From: Jan S Date: Sat, 25 Jun 2022 21:24:53 +0200 Subject: [PATCH] fix(gui): QuarkReport data validation added and other minor improvements (PR #1556) * QuarkReport: data validation added and other minor improvements * checkStyle --- .../gui/plugins/quark/QuarkReportData.java | 36 +++++++++++++++++++ .../gui/plugins/quark/QuarkReportNode.java | 13 ++++--- .../gui/plugins/quark/QuarkReportPanel.java | 4 +-- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportData.java b/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportData.java index 95145610..eae4c9c6 100644 --- a/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportData.java +++ b/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportData.java @@ -10,6 +10,7 @@ import jadx.core.utils.Utils; @SuppressWarnings("MemberName") public class QuarkReportData { + public static class Crime { public String crime; public String confidence; @@ -18,6 +19,23 @@ public class QuarkReportData { List native_api; List combination; List> register; + + public int parseConfidence() { + return Integer.parseInt(confidence.replace("%", "")); + } + + @Override + public String toString() { + final StringBuffer sb = new StringBuffer("Crime{"); + sb.append("crime='").append(crime).append('\''); + sb.append(", confidence='").append(confidence).append('\''); + sb.append(", permissions=").append(permissions); + sb.append(", native_api=").append(native_api); + sb.append(", combination=").append(combination); + sb.append(", register=").append(register); + sb.append('}'); + return sb.toString(); + } } public static class Method { @@ -46,4 +64,22 @@ public class QuarkReportData { String threat_level; int total_score; List crimes; + + public void validate() { + if (crimes == null) { + throw new RuntimeException("Invalid data: \"crimes\" list missing"); + } + for (Crime crime : crimes) { + if (crime.confidence == null) { + throw new RuntimeException("Confidence value missing: " + crime); + } + try { + crime.parseConfidence(); + } catch (Exception e) { + throw new RuntimeException("Invalid crime entry: " + crime); + } + } + + } + } diff --git a/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportNode.java b/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportNode.java index 43c295ad..91cb2ce9 100644 --- a/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportNode.java +++ b/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportNode.java @@ -1,5 +1,6 @@ package jadx.gui.plugins.quark; +import java.io.BufferedReader; import java.nio.file.Files; import java.nio.file.Path; @@ -33,12 +34,12 @@ public class QuarkReportNode extends JNode { private static final ImageIcon ICON = UiUtils.openSvgIcon("ui/quark"); - private final Path apkFile; + private final Path reportFile; private ICodeInfo errorContent; - public QuarkReportNode(Path apkFile) { - this.apkFile = apkFile; + public QuarkReportNode(Path reportFile) { + this.reportFile = reportFile; } @Override @@ -59,7 +60,11 @@ public class QuarkReportNode extends JNode { @Override public ContentPanel getContentPanel(TabbedPane tabbedPane) { try { - QuarkReportData data = GSON.fromJson(Files.newBufferedReader(apkFile), QuarkReportData.class); + QuarkReportData data; + try (BufferedReader reader = Files.newBufferedReader(reportFile)) { + data = GSON.fromJson(reader, QuarkReportData.class); + } + data.validate(); return new QuarkReportPanel(tabbedPane, this, data); } catch (Exception e) { LOG.error("Quark report parse error", e); diff --git a/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportPanel.java b/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportPanel.java index 5d680060..8507cc39 100644 --- a/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportPanel.java +++ b/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportPanel.java @@ -70,7 +70,7 @@ public class QuarkReportPanel extends ContentPanel { } private void prepareData() { - data.crimes.sort(Comparator.comparingInt(c -> -Integer.parseInt(c.confidence.replace("%", "")))); + data.crimes.sort(Comparator.comparingInt(c -> -c.parseConfidence())); } private void initUI() { @@ -290,7 +290,7 @@ public class QuarkReportPanel extends ContentPanel { } return new MethodTreeNode(javaMethod); } catch (Exception e) { - LOG.error("Failed to parse method descriptor string", e); + LOG.error("Failed to parse method descriptor string: {}", descr, e); return new TextTreeNode(descr); } } -- GitLab