From a4f84607d95dec0fa6b15791e6799dd43ad24921 Mon Sep 17 00:00:00 2001 From: terofeev Date: Wed, 21 May 2025 00:04:47 +0400 Subject: [PATCH 1/2] Preserve modified date when unzip files. --- CHANGELOG.md | 5 +++++ .../org/fossify/filemanager/activities/DecompressActivity.kt | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33daf2c0..c4318adb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- Preserve modified date when unzip files ([#176]) + ## [1.1.0] - 2025-05-21 ### Added @@ -66,3 +70,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#120]: https://github.com/FossifyOrg/File-Manager/issues/120 [#149]: https://github.com/FossifyOrg/File-Manager/issues/149 [#150]: https://github.com/FossifyOrg/File-Manager/issues/150 +[#176]: https://github.com/FossifyOrg/File-Manager/issues/176 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 9df832c1..fef1ff93 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/DecompressActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/DecompressActivity.kt @@ -171,7 +171,9 @@ class DecompressActivity : SimpleActivity() { continue } - val isVulnerableForZipPathTraversal = !File(newPath).canonicalPath.startsWith(parent) + val outputFile = File(newPath) + + val isVulnerableForZipPathTraversal = !outputFile.canonicalPath.startsWith(parent) if (isVulnerableForZipPathTraversal) { continue } @@ -187,6 +189,7 @@ class DecompressActivity : SimpleActivity() { fos!!.write(buffer, 0, count) } fos!!.close() + outputFile.setLastModified(entry.lastModifiedTimeEpoch) } toast(R.string.decompression_successful) From dd6a1837f02b3ebc8c400252e8d5b037729182d8 Mon Sep 17 00:00:00 2001 From: terofeev Date: Sat, 24 May 2025 20:13:53 +0400 Subject: [PATCH 2/2] Preserve modified date when unzip files via actions menu - Additionally handle the case with 0 last modified time. --- .../filemanager/activities/DecompressActivity.kt | 3 ++- .../fossify/filemanager/adapters/ItemsAdapter.kt | 2 ++ .../org/fossify/filemanager/extensions/Zip4j.kt | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 app/src/main/kotlin/org/fossify/filemanager/extensions/Zip4j.kt 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 fef1ff93..90dc83e9 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/DecompressActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/DecompressActivity.kt @@ -26,6 +26,7 @@ import org.fossify.filemanager.R import org.fossify.filemanager.adapters.DecompressItemsAdapter import org.fossify.filemanager.databinding.ActivityDecompressBinding import org.fossify.filemanager.extensions.config +import org.fossify.filemanager.extensions.setLastModified import org.fossify.filemanager.models.ListItem import java.io.BufferedInputStream import java.io.File @@ -189,7 +190,7 @@ class DecompressActivity : SimpleActivity() { fos!!.write(buffer, 0, count) } fos!!.close() - outputFile.setLastModified(entry.lastModifiedTimeEpoch) + outputFile.setLastModified(entry) } toast(R.string.decompression_successful) 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 f6213c01..9b052b8c 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/adapters/ItemsAdapter.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/adapters/ItemsAdapter.kt @@ -101,6 +101,7 @@ import org.fossify.filemanager.extensions.config import org.fossify.filemanager.extensions.isPathOnRoot import org.fossify.filemanager.extensions.isZipFile import org.fossify.filemanager.extensions.setAs +import org.fossify.filemanager.extensions.setLastModified import org.fossify.filemanager.extensions.sharePaths import org.fossify.filemanager.extensions.toggleItemVisibility import org.fossify.filemanager.extensions.tryOpenPathIntent @@ -693,6 +694,7 @@ class ItemsAdapter( val fos = activity.getFileOutputStreamSync(newPath, newPath.getMimeType()) if (fos != null) { zipInputStream.copyTo(fos) + File(newPath).setLastModified(entry) } } } diff --git a/app/src/main/kotlin/org/fossify/filemanager/extensions/Zip4j.kt b/app/src/main/kotlin/org/fossify/filemanager/extensions/Zip4j.kt new file mode 100644 index 00000000..01b78ffe --- /dev/null +++ b/app/src/main/kotlin/org/fossify/filemanager/extensions/Zip4j.kt @@ -0,0 +1,15 @@ +package org.fossify.filemanager.extensions + +import net.lingala.zip4j.model.LocalFileHeader +import java.io.File + +fun File.setLastModified(localFileHeader: LocalFileHeader) { + setLastModified(localFileHeader.lastModifiedOrCurrentTimeMillis) +} + +private val LocalFileHeader.lastModifiedOrCurrentTimeMillis + get() = if (lastModifiedTimeEpoch == 0L) { + System.currentTimeMillis() + } else { + lastModifiedTimeEpoch + }