Skip to content

Commit a10b5a3

Browse files
committed
NFC-137 Filter external file URIs by content/file scheme
1 parent 7bea0f2 commit a10b5a3

2 files changed

Lines changed: 78 additions & 4 deletions

File tree

utils-lib/src/main/kotlin/ee/ria/DigiDoc/utilsLib/file/FileUtil.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import javax.xml.parsers.SAXParserFactory
6262

6363
object FileUtil {
6464
private val LOG_TAG = javaClass.simpleName
65+
private val ALLOWED_FILE_SCHEMES = setOf("content", "file")
6566

6667
/**
6768
* Check if file path is in cache directory
@@ -471,10 +472,10 @@ object FileUtil {
471472

472473
fun getExternalFileUris(intent: Intent): List<Uri> {
473474
val externalFileUris = mutableListOf<Uri>()
474-
intent.data?.let { externalFileUris.add(it) }
475+
intent.data?.takeIf { it.scheme in ALLOWED_FILE_SCHEMES }?.let { externalFileUris.add(it) }
475476
intent.clipData?.let { clipData ->
476477
for (i in 0 until clipData.itemCount) {
477-
clipData.getItemAt(i)?.uri?.let { externalFileUris.add(it) }
478+
clipData.getItemAt(i)?.uri?.takeIf { it.scheme in ALLOWED_FILE_SCHEMES }?.let { externalFileUris.add(it) }
478479
}
479480
}
480481
return externalFileUris

utils-lib/src/test/kotlin/ee/ria/DigiDoc/utilsLib/file/FileUtilTest.kt

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,17 +78,61 @@ class FileUtilTest {
7878
}
7979

8080
@Test
81-
fun fileUtil_getExternalFileUris_successWithSingleUriIntentData() =
81+
fun fileUtil_getExternalFileUris_successWithContentSchemeUri() =
8282
runBlocking {
8383
val mockIntent = mock(Intent::class.java)
8484
val mockUri = mock(Uri::class.java)
8585

86+
`when`(mockUri.scheme).thenReturn("content")
8687
`when`(mockIntent.data).thenReturn(mockUri)
8788

8889
val externalFileUris = FileUtil.getExternalFileUris(mockIntent)
8990

9091
assertEquals(1, externalFileUris.size)
91-
assertEquals(externalFileUris.first(), mockIntent.data)
92+
assertEquals(mockUri, externalFileUris.first())
93+
}
94+
95+
@Test
96+
fun fileUtil_getExternalFileUris_successWithFileSchemeUri() =
97+
runBlocking {
98+
val mockIntent = mock(Intent::class.java)
99+
val mockUri = mock(Uri::class.java)
100+
101+
`when`(mockUri.scheme).thenReturn("file")
102+
`when`(mockIntent.data).thenReturn(mockUri)
103+
104+
val externalFileUris = FileUtil.getExternalFileUris(mockIntent)
105+
106+
assertEquals(1, externalFileUris.size)
107+
assertEquals(mockUri, externalFileUris.first())
108+
}
109+
110+
@Test
111+
fun fileUtil_getExternalFileUris_excludesHttpsSchemeUri() =
112+
runBlocking {
113+
val mockIntent = mock(Intent::class.java)
114+
val mockUri = mock(Uri::class.java)
115+
116+
`when`(mockUri.scheme).thenReturn("https")
117+
`when`(mockIntent.data).thenReturn(mockUri)
118+
119+
val externalFileUris = FileUtil.getExternalFileUris(mockIntent)
120+
121+
assertEquals(0, externalFileUris.size)
122+
}
123+
124+
@Test
125+
fun fileUtil_getExternalFileUris_excludesCustomSchemeUri() =
126+
runBlocking {
127+
val mockIntent = mock(Intent::class.java)
128+
val mockUri = mock(Uri::class.java)
129+
130+
`when`(mockUri.scheme).thenReturn("web-eid-mobile")
131+
`when`(mockIntent.data).thenReturn(mockUri)
132+
133+
val externalFileUris = FileUtil.getExternalFileUris(mockIntent)
134+
135+
assertEquals(0, externalFileUris.size)
92136
}
93137

94138
@Test
@@ -112,6 +156,8 @@ class FileUtilTest {
112156
val mockUri1 = mock(Uri::class.java)
113157
val mockUri2 = mock(Uri::class.java)
114158

159+
`when`(mockUri1.scheme).thenReturn("content")
160+
`when`(mockUri2.scheme).thenReturn("file")
115161
`when`(mockClipDataItem1.uri).thenReturn(mockUri1)
116162
`when`(mockClipDataItem2.uri).thenReturn(mockUri2)
117163

@@ -128,6 +174,33 @@ class FileUtilTest {
128174
assertEquals(mockUri2, externalFileUris.last())
129175
}
130176

177+
@Test
178+
fun fileUtil_getExternalFileUris_clipDataFiltersOutNonAllowedSchemes() =
179+
runBlocking {
180+
val mockIntent = mock(Intent::class.java)
181+
val mockClipData = mock(ClipData::class.java)
182+
val mockClipDataItem1 = mock(ClipData.Item::class.java)
183+
val mockClipDataItem2 = mock(ClipData.Item::class.java)
184+
val mockUri1 = mock(Uri::class.java)
185+
val mockUri2 = mock(Uri::class.java)
186+
187+
`when`(mockUri1.scheme).thenReturn("content")
188+
`when`(mockUri2.scheme).thenReturn("https")
189+
`when`(mockClipDataItem1.uri).thenReturn(mockUri1)
190+
`when`(mockClipDataItem2.uri).thenReturn(mockUri2)
191+
192+
`when`(mockClipData.getItemAt(0)).thenReturn(mockClipDataItem1)
193+
`when`(mockClipData.getItemAt(1)).thenReturn(mockClipDataItem2)
194+
`when`(mockClipData.itemCount).thenReturn(2)
195+
196+
`when`(mockIntent.clipData).thenReturn(mockClipData)
197+
198+
val externalFileUris = FileUtil.getExternalFileUris(mockIntent)
199+
200+
assertEquals(1, externalFileUris.size)
201+
assertEquals(mockUri1, externalFileUris.first())
202+
}
203+
131204
@Test
132205
fun fileUtil_getExternalFileUris_returnEmptyListWithoutIntentClipData() =
133206
runBlocking {

0 commit comments

Comments
 (0)