mirror of
https://github.com/FossifyOrg/File-Manager.git
synced 2025-12-23 23:57:55 -05:00
fix: preserve timestamps when decompressing ZIP files
* Preserve modified date when unzip files. * Preserve modified date when unzip files via actions menu - Additionally handle the case with 0 last modified time.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -171,7 +172,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 +190,7 @@ class DecompressActivity : SimpleActivity() {
|
||||
fos!!.write(buffer, 0, count)
|
||||
}
|
||||
fos!!.close()
|
||||
outputFile.setLastModified(entry)
|
||||
}
|
||||
|
||||
toast(R.string.decompression_successful)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user