File size: 2,784 Bytes
5bbfb59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package com.amaze.filemanager.ui.activities

import android.content.Intent
import android.os.Build
import android.os.Build.VERSION_CODES.LOLLIPOP
import android.os.Build.VERSION_CODES.P
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.amaze.filemanager.shadows.ShadowMultiDex
import io.mockk.every
import io.mockk.spyk
import org.awaitility.Awaitility.await
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.Robolectric
import org.robolectric.annotation.Config
import org.robolectric.shadows.ShadowStorageManager
import org.robolectric.util.ReflectionHelpers
import java.io.File
import java.util.concurrent.TimeUnit

/**
 * Tests for [DatabaseViewerActivity].
 */
@RunWith(AndroidJUnit4::class)
@Config(
    sdk = [LOLLIPOP, P, Build.VERSION_CODES.R],
    shadows = [ShadowMultiDex::class, ShadowStorageManager::class],
)
class DatabaseViewerActivityTest {
    /**
     * Tests that the activity sanitizes the path in the intent to prevent malicious payloads
     * from being executed.
     */
    @Test
    fun testSanitizePathInIntent() {
        val maliciousPayload = "/sdcard/fake.db; uname -a > /sdcard/system_info.txt; echo"

        val intent = Intent().putExtra("path", maliciousPayload)

        val activity =
            Robolectric.buildActivity(
                DatabaseViewerActivity::class.java,
                intent,
            )
                .create().start().visible().get()

        await().atMost(10, TimeUnit.SECONDS).until {
            activity.isFinishing &&
                ReflectionHelpers.getField<File>(activity, "pathFile") == null
        }
    }

    /**
     * Tests that the activity does not crash when the path in the intent is valid.
     */
    @Test
    fun testValidPathInIntent() {
        // Create a temporary valid database file
        val validDbFile = File.createTempFile("test", ".db")
        validDbFile.deleteOnExit()

        val intent = Intent().putExtra("path", validDbFile.absolutePath)

        val activityController =
            Robolectric.buildActivity(
                DatabaseViewerActivity::class.java,
                intent,
            )
                .create()

        val activity = activityController.get()
        val spyActivity = spyk(activity, recordPrivateCalls = true)

        // Mock the load method to do nothing
        every { spyActivity invoke ("load") withArguments listOf(any<File>()) } returns Unit

        activityController.start().visible()

        await().atMost(5, TimeUnit.SECONDS).until {
            !spyActivity.isFinishing &&
                ReflectionHelpers
                    .getField<File>(spyActivity, "pathFile")?.absolutePath == validDbFile.absolutePath
        }

        // Clean up
        validDbFile.delete()
    }
}