diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/DecompressActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/DecompressActivity.kt index 39d03354..dfb108ad 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/DecompressActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/DecompressActivity.kt @@ -155,6 +155,7 @@ class DecompressActivity : SimpleActivity() { zipInputStream.setPassword(password?.toCharArray()) } val buffer = ByteArray(1024) + val foldersTimestamp = mutableListOf>() zipInputStream.use { while (true) { @@ -163,6 +164,7 @@ class DecompressActivity : SimpleActivity() { val parent = "$destination/$filename" val newPath = "$parent/${entry.fileName.trimEnd('/')}" + if (!getDoesFilePathExist(parent)) { if (!createDirectorySync(parent)) { continue @@ -170,9 +172,13 @@ class DecompressActivity : SimpleActivity() { } if (entry.isDirectory) { + val dir = File(newPath) + if (!dir.exists()) { + dir.mkdirs() + } + foldersTimestamp.add(Pair(dir, entry)) continue } - val outputFile = File(newPath) val isVulnerableForZipPathTraversal = !outputFile.canonicalPath.startsWith(parent) @@ -193,7 +199,9 @@ class DecompressActivity : SimpleActivity() { fos!!.close() outputFile.setLastModified(entry) } - + for ((dir, entry) in foldersTimestamp.asReversed()) { + dir.setLastModified(entry) + } toast(R.string.decompression_successful) finish() } diff --git a/app/src/main/kotlin/org/fossify/filemanager/adapters/ItemsAdapter.kt b/app/src/main/kotlin/org/fossify/filemanager/adapters/ItemsAdapter.kt index bea52946..90b471f4 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/adapters/ItemsAdapter.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/adapters/ItemsAdapter.kt @@ -720,6 +720,8 @@ class ItemsAdapter( paths.forEach { path -> val zipInputStream = ZipInputStream(BufferedInputStream(activity.getFileInputStreamSync(path))) + + val foldersTimestamp = mutableListOf>() zipInputStream.use { try { var entry = zipInputStream.nextEntry @@ -740,7 +742,7 @@ class ItemsAdapter( if (activity.getIsPathDirectory(path)) { activity.deleteFolderBg(fileDirItem, false) { if (it) { - extractEntry(newPath, entry, zipInputStream) + extractEntry(newPath, entry, zipInputStream, foldersTimestamp) } else { callback(false) } @@ -748,18 +750,21 @@ class ItemsAdapter( } else { activity.deleteFileBg(fileDirItem, false, false) { if (it) { - extractEntry(newPath, entry, zipInputStream) + extractEntry(newPath, entry, zipInputStream, foldersTimestamp) } else { callback(false) } } } } else if (!doesPathExist) { - extractEntry(newPath, entry, zipInputStream) + extractEntry(newPath, entry, zipInputStream, foldersTimestamp) } entry = zipInputStream.nextEntry } + for ((dir, header) in foldersTimestamp.asReversed()) { + dir.setLastModified(header) + } callback(true) } catch (e: Exception) { activity.showErrorToast(e) @@ -772,13 +777,16 @@ class ItemsAdapter( private fun extractEntry( newPath: String, entry: LocalFileHeader, - zipInputStream: ZipInputStream + zipInputStream: ZipInputStream, + foldersTimestamp: MutableList> ) { if (entry.isDirectory) { if (!activity.createDirectorySync(newPath) && !activity.getDoesFilePathExist(newPath)) { val error = String.format(activity.getString(R.string.could_not_create_file), newPath) activity.showErrorToast(error) + } else { + foldersTimestamp.add(Pair(File(newPath), entry)) } } else { val fos = activity.getFileOutputStreamSync(newPath, newPath.getMimeType())