AmazeFileManager / app /src /test /java /com /amaze /filemanager /filesystem /compressed /B0rkenZipTest.java
| /* | |
| * Copyright (C) 2014-2024 Arpit Khurana <arpitkh96@gmail.com>, Vishal Nehra <vishalmeham2@gmail.com>, | |
| * Emmanuel Messulam<emmanuelbendavid@gmail.com>, Raymond Lai <airwave209gt at gmail.com> and Contributors. | |
| * | |
| * This file is part of Amaze File Manager. | |
| * | |
| * Amaze File Manager is free software: you can redistribute it and/or modify | |
| * it under the terms of the GNU General Public License as published by | |
| * the Free Software Foundation, either version 3 of the License, or | |
| * (at your option) any later version. | |
| * | |
| * This program is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| * GNU General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU General Public License | |
| * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| */ | |
| package com.amaze.filemanager.filesystem.compressed; | |
| import static android.os.Build.VERSION_CODES.LOLLIPOP; | |
| import static android.os.Build.VERSION_CODES.P; | |
| import static kotlin.io.ConstantsKt.DEFAULT_BUFFER_SIZE; | |
| import static org.junit.Assert.assertEquals; | |
| import static org.junit.Assert.assertTrue; | |
| import java.io.File; | |
| import java.io.FileOutputStream; | |
| import java.util.List; | |
| import org.junit.Before; | |
| import org.junit.Test; | |
| import org.junit.runner.RunWith; | |
| import org.robolectric.annotation.Config; | |
| import org.robolectric.shadows.ShadowLooper; | |
| import org.robolectric.shadows.ShadowToast; | |
| import com.amaze.filemanager.R; | |
| import com.amaze.filemanager.adapters.data.CompressedObjectParcelable; | |
| import com.amaze.filemanager.asynchronous.asynctasks.compress.ZipHelperCallable; | |
| import com.amaze.filemanager.asynchronous.management.ServiceWatcherUtil; | |
| import com.amaze.filemanager.filesystem.compressed.extractcontents.Extractor; | |
| import com.amaze.filemanager.filesystem.compressed.extractcontents.helpers.ZipExtractor; | |
| import com.amaze.filemanager.shadows.ShadowMultiDex; | |
| import android.os.Build; | |
| import android.os.Environment; | |
| import androidx.test.core.app.ApplicationProvider; | |
| import androidx.test.ext.junit.runners.AndroidJUnit4; | |
| import kotlin.io.ByteStreamsKt; | |
| public class B0rkenZipTest { | |
| private File zipfile1 = new File(Environment.getExternalStorageDirectory(), "zip-slip.zip"); | |
| private File zipfile2 = new File(Environment.getExternalStorageDirectory(), "zip-slip-win.zip"); | |
| private File zipfile3 = | |
| new File(Environment.getExternalStorageDirectory(), "test-slashprefix.zip"); | |
| private Extractor.OnUpdate emptyListener = | |
| new Extractor.OnUpdate() { | |
| public void onStart(long totalBytes, String firstEntryName) {} | |
| public void onUpdate(String entryPath) {} | |
| public void onFinish() {} | |
| public boolean isCancelled() { | |
| return false; | |
| } | |
| }; | |
| public void setUp() throws Exception { | |
| ByteStreamsKt.copyTo( | |
| getClass().getClassLoader().getResourceAsStream("zip-slip.zip"), | |
| new FileOutputStream(zipfile1), | |
| DEFAULT_BUFFER_SIZE); | |
| ByteStreamsKt.copyTo( | |
| getClass().getClassLoader().getResourceAsStream("zip-slip-win.zip"), | |
| new FileOutputStream(zipfile2), | |
| DEFAULT_BUFFER_SIZE); | |
| ByteStreamsKt.copyTo( | |
| getClass().getClassLoader().getResourceAsStream("test-slashprefix.zip"), | |
| new FileOutputStream(zipfile3), | |
| DEFAULT_BUFFER_SIZE); | |
| } | |
| public void testExtractZipWithWrongPathUnix() throws Exception { | |
| Extractor extractor = | |
| new ZipExtractor( | |
| ApplicationProvider.getApplicationContext(), | |
| zipfile1.getAbsolutePath(), | |
| Environment.getExternalStorageDirectory().getAbsolutePath(), | |
| emptyListener, | |
| ServiceWatcherUtil.UPDATE_POSITION); | |
| extractor.extractEverything(); | |
| assertEquals(1, extractor.getInvalidArchiveEntries().size()); | |
| assertTrue(new File(Environment.getExternalStorageDirectory(), "good.txt").exists()); | |
| } | |
| public void testExtractZipWithWrongPathWindows() throws Exception { | |
| Extractor extractor = | |
| new ZipExtractor( | |
| ApplicationProvider.getApplicationContext(), | |
| zipfile2.getAbsolutePath(), | |
| Environment.getExternalStorageDirectory().getAbsolutePath(), | |
| emptyListener, | |
| ServiceWatcherUtil.UPDATE_POSITION); | |
| extractor.extractEverything(); | |
| assertEquals(1, extractor.getInvalidArchiveEntries().size()); | |
| assertTrue(new File(Environment.getExternalStorageDirectory(), "good.txt").exists()); | |
| } | |
| public void testExtractZipWithSlashPrefixEntry() throws Exception { | |
| Extractor extractor = | |
| new ZipExtractor( | |
| ApplicationProvider.getApplicationContext(), | |
| zipfile3.getAbsolutePath(), | |
| Environment.getExternalStorageDirectory().getAbsolutePath(), | |
| emptyListener, | |
| ServiceWatcherUtil.UPDATE_POSITION); | |
| extractor.extractFiles(new String[] {"/test.txt"}); | |
| assertEquals(0, extractor.getInvalidArchiveEntries().size()); | |
| assertTrue(new File(Environment.getExternalStorageDirectory(), "test.txt").exists()); | |
| } | |
| public void testZipHelperTaskShouldOmitInvalidEntries() throws Exception { | |
| ZipHelperCallable task = | |
| new ZipHelperCallable( | |
| ApplicationProvider.getApplicationContext(), zipfile1.getAbsolutePath(), null, false); | |
| List<CompressedObjectParcelable> result = task.call(); | |
| assertEquals(1, result.size()); | |
| assertEquals("good.txt", result.get(0).path); | |
| ShadowLooper.idleMainLooper(); | |
| assertEquals( | |
| ApplicationProvider.getApplicationContext() | |
| .getString(R.string.multiple_invalid_archive_entries), | |
| ShadowToast.getTextOfLatestToast()); | |
| } | |
| public void testZipHelperTaskShouldOmitInvalidEntriesWithBackslash() throws Exception { | |
| ZipHelperCallable task = | |
| new ZipHelperCallable( | |
| ApplicationProvider.getApplicationContext(), zipfile2.getAbsolutePath(), null, false); | |
| List<CompressedObjectParcelable> result = task.call(); | |
| ShadowLooper.idleMainLooper(); | |
| assertEquals(1, result.size()); | |
| assertEquals("good.txt", result.get(0).path); | |
| assertEquals( | |
| ApplicationProvider.getApplicationContext() | |
| .getString(R.string.multiple_invalid_archive_entries), | |
| ShadowToast.getTextOfLatestToast()); | |
| } | |
| } | |