From b446bf275c75a03a1906643a272861d14f85ce7e Mon Sep 17 00:00:00 2001 From: Skylot Date: Tue, 26 Mar 2019 23:04:00 +0300 Subject: [PATCH] refactor: move filesystem case sensitivity value to JadxArgs --- jadx-cli/src/main/java/jadx/cli/JadxCLI.java | 20 ++++++++++++++- .../src/main/java/jadx/api/JadxArgs.java | 15 +++++++++++ .../jadx/core/dex/visitors/RenameVisitor.java | 4 +-- .../java/jadx/core/utils/files/FileUtils.java | 25 ++++++++++++++++--- .../java/jadx/tests/api/IntegrationTest.java | 1 + .../src/main/java/jadx/gui/JadxWrapper.java | 13 +++++++--- 6 files changed, 67 insertions(+), 11 deletions(-) diff --git a/jadx-cli/src/main/java/jadx/cli/JadxCLI.java b/jadx-cli/src/main/java/jadx/cli/JadxCLI.java index 1106f5d6..b79c2444 100644 --- a/jadx-cli/src/main/java/jadx/cli/JadxCLI.java +++ b/jadx-cli/src/main/java/jadx/cli/JadxCLI.java @@ -1,10 +1,16 @@ package jadx.cli; +import java.io.File; +import java.util.ArrayList; +import java.util.List; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import jadx.api.JadxArgs; import jadx.api.JadxDecompiler; import jadx.core.utils.exceptions.JadxArgsValidateException; +import jadx.core.utils.files.FileUtils; public class JadxCLI { private static final Logger LOG = LoggerFactory.getLogger(JadxCLI.class); @@ -25,7 +31,9 @@ public class JadxCLI { } static int processAndSave(JadxCLIArgs inputArgs) { - JadxDecompiler jadx = new JadxDecompiler(inputArgs.toJadxArgs()); + JadxArgs args = inputArgs.toJadxArgs(); + args.setFsCaseSensitive(getFsCaseSensitivity(args)); + JadxDecompiler jadx = new JadxDecompiler(args); try { jadx.load(); } catch (JadxArgsValidateException e) { @@ -42,4 +50,14 @@ public class JadxCLI { } return errorsCount; } + + private static boolean getFsCaseSensitivity(JadxArgs args) { + List testDirList = new ArrayList<>(3); + testDirList.add(args.getOutDir()); + testDirList.add(args.getOutDirSrc()); + if (!args.getInputFiles().isEmpty()) { + testDirList.add(args.getInputFiles().get(0)); + } + return FileUtils.isCaseSensitiveFS(testDirList); + } } diff --git a/jadx-core/src/main/java/jadx/api/JadxArgs.java b/jadx-core/src/main/java/jadx/api/JadxArgs.java index 6011cc2a..a60d559d 100644 --- a/jadx-core/src/main/java/jadx/api/JadxArgs.java +++ b/jadx-core/src/main/java/jadx/api/JadxArgs.java @@ -2,6 +2,7 @@ package jadx.api; import java.io.File; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class JadxArgs { @@ -44,6 +45,8 @@ public class JadxArgs { private boolean respectBytecodeAccModifiers = false; private boolean exportAsGradleProject = false; + private boolean isFsCaseSensitive; + public JadxArgs() { // use default options } @@ -58,6 +61,10 @@ public class JadxArgs { return inputFiles; } + public void setInputFile(File inputFile) { + this.inputFiles = Collections.singletonList(inputFile); + } + public void setInputFiles(List inputFiles) { this.inputFiles = inputFiles; } @@ -230,6 +237,14 @@ public class JadxArgs { this.exportAsGradleProject = exportAsGradleProject; } + public boolean isFsCaseSensitive() { + return isFsCaseSensitive; + } + + public void setFsCaseSensitive(boolean fsCaseSensitive) { + isFsCaseSensitive = fsCaseSensitive; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("JadxArgs{"); diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java index 5551dc95..1ae7d620 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java @@ -20,7 +20,6 @@ import jadx.core.dex.nodes.DexNode; import jadx.core.dex.nodes.FieldNode; import jadx.core.dex.nodes.MethodNode; import jadx.core.dex.nodes.RootNode; -import jadx.core.utils.files.FileUtils; import jadx.core.utils.files.InputFile; public class RenameVisitor extends AbstractVisitor { @@ -45,8 +44,7 @@ public class RenameVisitor extends AbstractVisitor { if (deobfuscationOn) { deobfuscator.execute(); } - boolean isCaseSensitive = FileUtils.isCaseSensitiveFS(new File(inputPath)); // args.getOutDir() - not set in gui - checkClasses(root, isCaseSensitive); + checkClasses(root, args.isFsCaseSensitive()); } private void checkClasses(RootNode root, boolean caseSensitive) { diff --git a/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java b/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java index a8f8a4fb..5ab76f88 100644 --- a/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import java.util.zip.ZipEntry; @@ -198,8 +199,26 @@ public class FileUtils { } } + /** + * Checks dirs in order, fist success result returned + */ + public static boolean isCaseSensitiveFS(List testDirList) { + for (File dir : testDirList) { + Optional result = isCaseSensitiveFSInternal(dir); + if (result.isPresent()) { + return result.get(); + } + } + return IOCase.SYSTEM.isCaseSensitive(); + } + public static boolean isCaseSensitiveFS(File testDir) { - if (testDir != null) { + Optional result = isCaseSensitiveFSInternal(testDir); + return result.orElseGet(IOCase.SYSTEM::isCaseSensitive); + } + + private static Optional isCaseSensitiveFSInternal(@Nullable File testDir) { + if (testDir != null && testDir.exists() && testDir.isDirectory()) { File caseCheckUpper = new File(testDir, "CaseCheck"); File caseCheckLow = new File(testDir, "casecheck"); try { @@ -208,7 +227,7 @@ public class FileUtils { boolean caseSensitive = !caseCheckLow.exists(); LOG.debug("Filesystem at {} is {}case-sensitive", testDir.getAbsolutePath(), (caseSensitive ? "" : "NOT ")); - return caseSensitive; + return Optional.of(caseSensitive); } else { LOG.debug("Failed to create file: {}", caseCheckUpper.getAbsolutePath()); } @@ -223,7 +242,7 @@ public class FileUtils { } } } - return IOCase.SYSTEM.isCaseSensitive(); + return Optional.empty(); } public static File toFile(String path) { diff --git a/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java b/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java index 01798235..7d25c30e 100644 --- a/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java +++ b/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java @@ -78,6 +78,7 @@ public abstract class IntegrationTest extends TestUtils { args.setShowInconsistentCode(true); args.setThreadsCount(1); args.setSkipResources(true); + args.setFsCaseSensitive(false); // use same value on all systems } public ClassNode getClassNode(Class clazz) { diff --git a/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java b/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java index acd49331..5fa6eb6f 100644 --- a/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java +++ b/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java @@ -1,5 +1,6 @@ package jadx.gui; +import javax.swing.*; import java.io.File; import java.util.ArrayList; import java.util.Arrays; @@ -8,8 +9,6 @@ import java.util.List; import java.util.concurrent.ThreadPoolExecutor; import java.util.stream.Collectors; -import javax.swing.ProgressMonitor; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,6 +17,7 @@ import jadx.api.JadxDecompiler; import jadx.api.JavaClass; import jadx.api.JavaPackage; import jadx.api.ResourceFile; +import jadx.core.utils.files.FileUtils; import jadx.gui.settings.JadxSettings; public class JadxWrapper { @@ -34,8 +34,12 @@ public class JadxWrapper { public void openFile(File file) { this.openFile = file; try { - this.decompiler = new JadxDecompiler(settings.toJadxArgs()); - this.decompiler.getArgs().setInputFiles(Collections.singletonList(file)); + JadxArgs jadxArgs = settings.toJadxArgs(); + jadxArgs.setInputFile(file); + // output folder not known yet => use input dir as a best choice + jadxArgs.setFsCaseSensitive(FileUtils.isCaseSensitiveFS(file.getParentFile())); + + this.decompiler = new JadxDecompiler(jadxArgs); this.decompiler.load(); } catch (Exception e) { LOG.error("Jadx init error", e); @@ -97,6 +101,7 @@ public class JadxWrapper { }).collect(Collectors.toList()); } + // TODO: move to CLI and filter classes in JadxDecompiler public List getExcludedPackages() { String excludedPackages = settings.getExcludedPackages().trim(); if (excludedPackages.isEmpty()) { -- GitLab