@@ -11,20 +11,22 @@ import com.simplemobiletools.commons.helpers.ensureBackgroundThread
1111import com.simplemobiletools.commons.helpers.isOreoPlus
1212import com.simplemobiletools.filemanager.pro.R
1313import com.simplemobiletools.filemanager.pro.adapters.DecompressItemsAdapter
14+ import com.simplemobiletools.filemanager.pro.databinding.ActivityDecompressBinding
1415import com.simplemobiletools.filemanager.pro.extensions.config
1516import com.simplemobiletools.filemanager.pro.models.ListItem
16- import kotlinx.android.synthetic.main.activity_decompress.*
1717import net.lingala.zip4j.exception.ZipException
1818import net.lingala.zip4j.exception.ZipException.Type
1919import net.lingala.zip4j.io.inputstream.ZipInputStream
2020import net.lingala.zip4j.model.LocalFileHeader
2121import java.io.BufferedInputStream
22+ import java.io.File
2223
2324class DecompressActivity : SimpleActivity () {
2425 companion object {
2526 private const val PASSWORD = " password"
2627 }
2728
29+ private val binding by lazy(LazyThreadSafetyMode .NONE ) { ActivityDecompressBinding .inflate(layoutInflater) }
2830 private val allFiles = ArrayList <ListItem >()
2931 private var currentPath = " "
3032 private var uri: Uri ? = null
@@ -34,10 +36,12 @@ class DecompressActivity : SimpleActivity() {
3436 override fun onCreate (savedInstanceState : Bundle ? ) {
3537 isMaterialActivity = true
3638 super .onCreate(savedInstanceState)
37- setContentView(R .layout.activity_decompress )
39+ setContentView(binding.root )
3840 setupOptionsMenu()
39- updateMaterialActivityViews(decompress_coordinator, decompress_list, useTransparentNavigation = true , useTopSearchMenu = false )
40- setupMaterialScrollListener(decompress_list, decompress_toolbar)
41+ binding.apply {
42+ updateMaterialActivityViews(decompressCoordinator, decompressList, useTransparentNavigation = true , useTopSearchMenu = false )
43+ setupMaterialScrollListener(decompressList, decompressToolbar)
44+ }
4145
4246 uri = intent.data
4347 if (uri == null ) {
@@ -48,13 +52,13 @@ class DecompressActivity : SimpleActivity() {
4852 password = savedInstanceState?.getString(PASSWORD , null )
4953
5054 val realPath = getRealPathFromURI(uri!! )
51- decompress_toolbar .title = realPath?.getFilenameFromPath() ? : Uri .decode(uri.toString().getFilenameFromPath())
55+ binding.decompressToolbar .title = realPath?.getFilenameFromPath() ? : Uri .decode(uri.toString().getFilenameFromPath())
5256 setupFilesList()
5357 }
5458
5559 override fun onResume () {
5660 super .onResume()
57- setupToolbar(decompress_toolbar , NavigationIcon .Arrow )
61+ setupToolbar(binding.decompressToolbar , NavigationIcon .Arrow )
5862 }
5963
6064 override fun onSaveInstanceState (outState : Bundle ) {
@@ -63,7 +67,7 @@ class DecompressActivity : SimpleActivity() {
6367 }
6468
6569 private fun setupOptionsMenu () {
66- decompress_toolbar .setOnMenuItemClickListener { menuItem ->
70+ binding.decompressToolbar .setOnMenuItemClickListener { menuItem ->
6771 when (menuItem.itemId) {
6872 R .id.decompress -> decompressFiles()
6973 else -> return @setOnMenuItemClickListener false
@@ -90,12 +94,12 @@ class DecompressActivity : SimpleActivity() {
9094 currentPath = path
9195 try {
9296 val listItems = getFolderItems(currentPath)
93- DecompressItemsAdapter (this , listItems, decompress_list ) {
97+ DecompressItemsAdapter (this , listItems, binding.decompressList ) {
9498 if ((it as ListItem ).isDirectory) {
9599 updateCurrentPath(it.path)
96100 }
97101 }.apply {
98- decompress_list .adapter = this
102+ binding.decompressList .adapter = this
99103 }
100104 } catch (e: Exception ) {
101105 showErrorToast(e)
@@ -141,6 +145,11 @@ class DecompressActivity : SimpleActivity() {
141145 continue
142146 }
143147
148+ val isVulnerableForZipPathTraversal = ! File (newPath).canonicalPath.startsWith(parent)
149+ if (isVulnerableForZipPathTraversal) {
150+ continue
151+ }
152+
144153 val fos = getFileOutputStreamSync(newPath, newPath.getMimeType())
145154 var count: Int
146155 while (true ) {
0 commit comments