Skip to content

Commit ef23996

Browse files
authored
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.
1 parent 68aec3a commit ef23996

File tree

4 files changed

+27
-1
lines changed

4 files changed

+27
-1
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Fixed
11+
12+
- Preserve modified date when unzip files ([#176])
13+
1014
## [1.1.0] - 2025-05-21
1115

1216
### Added
@@ -66,3 +70,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6670
[#120]: https://github.com/FossifyOrg/File-Manager/issues/120
6771
[#149]: https://github.com/FossifyOrg/File-Manager/issues/149
6872
[#150]: https://github.com/FossifyOrg/File-Manager/issues/150
73+
[#176]: https://github.com/FossifyOrg/File-Manager/issues/176

app/src/main/kotlin/org/fossify/filemanager/activities/DecompressActivity.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import org.fossify.filemanager.R
2626
import org.fossify.filemanager.adapters.DecompressItemsAdapter
2727
import org.fossify.filemanager.databinding.ActivityDecompressBinding
2828
import org.fossify.filemanager.extensions.config
29+
import org.fossify.filemanager.extensions.setLastModified
2930
import org.fossify.filemanager.models.ListItem
3031
import java.io.BufferedInputStream
3132
import java.io.File
@@ -171,7 +172,9 @@ class DecompressActivity : SimpleActivity() {
171172
continue
172173
}
173174

174-
val isVulnerableForZipPathTraversal = !File(newPath).canonicalPath.startsWith(parent)
175+
val outputFile = File(newPath)
176+
177+
val isVulnerableForZipPathTraversal = !outputFile.canonicalPath.startsWith(parent)
175178
if (isVulnerableForZipPathTraversal) {
176179
continue
177180
}
@@ -187,6 +190,7 @@ class DecompressActivity : SimpleActivity() {
187190
fos!!.write(buffer, 0, count)
188191
}
189192
fos!!.close()
193+
outputFile.setLastModified(entry)
190194
}
191195

192196
toast(R.string.decompression_successful)

app/src/main/kotlin/org/fossify/filemanager/adapters/ItemsAdapter.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ import org.fossify.filemanager.extensions.config
101101
import org.fossify.filemanager.extensions.isPathOnRoot
102102
import org.fossify.filemanager.extensions.isZipFile
103103
import org.fossify.filemanager.extensions.setAs
104+
import org.fossify.filemanager.extensions.setLastModified
104105
import org.fossify.filemanager.extensions.sharePaths
105106
import org.fossify.filemanager.extensions.toggleItemVisibility
106107
import org.fossify.filemanager.extensions.tryOpenPathIntent
@@ -693,6 +694,7 @@ class ItemsAdapter(
693694
val fos = activity.getFileOutputStreamSync(newPath, newPath.getMimeType())
694695
if (fos != null) {
695696
zipInputStream.copyTo(fos)
697+
File(newPath).setLastModified(entry)
696698
}
697699
}
698700
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.fossify.filemanager.extensions
2+
3+
import net.lingala.zip4j.model.LocalFileHeader
4+
import java.io.File
5+
6+
fun File.setLastModified(localFileHeader: LocalFileHeader) {
7+
setLastModified(localFileHeader.lastModifiedOrCurrentTimeMillis)
8+
}
9+
10+
private val LocalFileHeader.lastModifiedOrCurrentTimeMillis
11+
get() = if (lastModifiedTimeEpoch == 0L) {
12+
System.currentTimeMillis()
13+
} else {
14+
lastModifiedTimeEpoch
15+
}

0 commit comments

Comments
 (0)