From 8fad61e329b5b974a5433485cee61268f569b45d Mon Sep 17 00:00:00 2001 From: Sucukdeluxe Date: Tue, 3 Mar 2026 17:32:22 +0100 Subject: [PATCH] Restore multipart RAR open strategy for JVM extractor Bring back callback-first RAR multipart opening with explicit RAR5/RAR fallback while keeping 7z.001 on VolumedArchiveInStream to improve 7z-JBinding compatibility on split RAR sets. --- .../extractor/JBindExtractorMain.class | Bin 19231 -> 20639 bytes .../extractor/JBindExtractorMain.java | 66 +++++++++++++++++- 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/resources/extractor-jvm/classes/com/sucukdeluxe/extractor/JBindExtractorMain.class b/resources/extractor-jvm/classes/com/sucukdeluxe/extractor/JBindExtractorMain.class index 321cb68412026ba8df12922a52c87cb83ae5cdc3..a6fa276959891ba0f5fe8c8a5c3619ea02444491 100644 GIT binary patch literal 20639 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 CRH<|T diff --git a/resources/extractor-jvm/src/com/sucukdeluxe/extractor/JBindExtractorMain.java b/resources/extractor-jvm/src/com/sucukdeluxe/extractor/JBindExtractorMain.java index 64e4dca..7ed46ec 100644 --- a/resources/extractor-jvm/src/com/sucukdeluxe/extractor/JBindExtractorMain.java +++ b/resources/extractor-jvm/src/com/sucukdeluxe/extractor/JBindExtractorMain.java @@ -11,6 +11,7 @@ import net.sf.sevenzipjbinding.IInStream; import net.sf.sevenzipjbinding.ISequentialOutStream; import net.sf.sevenzipjbinding.ICryptoGetTextPassword; import net.sf.sevenzipjbinding.PropID; +import net.sf.sevenzipjbinding.ArchiveFormat; import net.sf.sevenzipjbinding.SevenZip; import net.sf.sevenzipjbinding.SevenZipException; import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream; @@ -42,6 +43,8 @@ public final class JBindExtractorMain { private static final Pattern NUMBERED_ZIP_SPLIT_RE = Pattern.compile("(?i).*\\.zip\\.\\d{3}$"); private static final Pattern OLD_ZIP_SPLIT_RE = Pattern.compile("(?i).*\\.z\\d{2,3}$"); private static final Pattern SEVEN_ZIP_SPLIT_RE = Pattern.compile("(?i).*\\.7z\\.001$"); + private static final Pattern RAR_MULTIPART_RE = Pattern.compile("(?i).*\\.part\\d+\\.rar$"); + private static final Pattern RAR_OLDSPLIT_RE = Pattern.compile("(?i).*\\.r\\d{2,3}$"); private static volatile boolean sevenZipInitialized = false; private JBindExtractorMain() { @@ -327,21 +330,78 @@ public final class JBindExtractorMain { SevenZipVolumeCallback callback = new SevenZipVolumeCallback(archiveFile, effectivePassword); // VolumedArchiveInStream is ONLY for .7z.001 split archives. + // It internally checks for the ".7z.001" suffix and rejects everything else. if (SEVEN_ZIP_SPLIT_RE.matcher(nameLower).matches()) { VolumedArchiveInStream volumed = new VolumedArchiveInStream(archiveFile.getName(), callback); IInArchive archive = SevenZip.openInArchive(null, volumed, callback); return new SevenZipArchiveContext(archive, null, volumed, callback); } - // All other archives (including multi-part RAR): use RandomAccessFileInStream - // with auto-detection. The IArchiveOpenVolumeCallback handles additional - // volumes when 7z-JBinding requests them. + // Multi-part RAR (.part1.rar, .part2.rar or old-style .rar/.r01/.r02): + // The first stream MUST be obtained via the callback so the volume name + // tracker is properly initialized. 7z-JBinding uses getProperty(NAME) + // to compute subsequent volume filenames. + boolean isMultiPartRar = RAR_MULTIPART_RE.matcher(nameLower).matches() + || hasOldStyleRarSplits(archiveFile); + + if (isMultiPartRar) { + IInStream inStream = callback.getStream(archiveFile.getAbsolutePath()); + if (inStream == null) { + throw new IOException("Archiv konnte nicht geoeffnet werden: " + archiveFile.getAbsolutePath()); + } + // Try RAR5 first (modern), then RAR4, then auto-detect + Exception lastError = null; + ArchiveFormat[] rarFormats = { ArchiveFormat.RAR5, ArchiveFormat.RAR, null }; + for (ArchiveFormat fmt : rarFormats) { + try { + inStream.seek(0L, 0); + IInArchive archive = SevenZip.openInArchive(fmt, inStream, callback); + return new SevenZipArchiveContext(archive, null, null, callback); + } catch (Exception e) { + lastError = e; + } + } + callback.close(); + throw lastError != null ? lastError : new IOException("Archiv konnte nicht geoeffnet werden"); + } + + // Single-file archives: open directly with auto-detection RandomAccessFile raf = new RandomAccessFile(archiveFile, "r"); RandomAccessFileInStream stream = new RandomAccessFileInStream(raf); IInArchive archive = SevenZip.openInArchive(null, stream, callback); return new SevenZipArchiveContext(archive, stream, null, callback); } + private static boolean hasOldStyleRarSplits(File archiveFile) { + // Old-style RAR splits: main.rar + main.r01, main.r02, ... + String name = archiveFile.getName(); + if (!name.toLowerCase(Locale.ROOT).endsWith(".rar")) { + return false; + } + File parent = archiveFile.getParentFile(); + if (parent == null || !parent.exists()) { + return false; + } + File[] siblings = parent.listFiles(); + if (siblings == null) { + return false; + } + String stem = name.substring(0, name.length() - 4); + for (File sibling : siblings) { + if (!sibling.isFile()) { + continue; + } + String sibName = sibling.getName(); + if (sibName.length() > stem.length() + 1 && sibName.substring(0, stem.length()).equalsIgnoreCase(stem)) { + String suffix = sibName.substring(stem.length()); + if (RAR_OLDSPLIT_RE.matcher(suffix).matches() || suffix.toLowerCase(Locale.ROOT).matches("\\.r\\d{2,3}")) { + return true; + } + } + } + return false; + } + private static boolean isWrongPassword(ZipException error, boolean encrypted) { if (error == null) { return false;