Skip to content
This repository has been archived by the owner on Nov 1, 2022. It is now read-only.

Closes #8967 prevent handling invalid requests in FilePicker #8968

Merged
merged 1 commit into from
Nov 16, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@ import android.provider.MediaStore.EXTRA_OUTPUT
import androidx.annotation.VisibleForTesting
import androidx.annotation.VisibleForTesting.PRIVATE
import androidx.fragment.app.Fragment
import mozilla.components.browser.state.selector.findTabOrCustomTabOrSelectedTab
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.concept.engine.prompt.PromptRequest
import mozilla.components.concept.engine.prompt.PromptRequest.File
import mozilla.components.feature.prompts.PromptContainer
import mozilla.components.feature.prompts.consumePromptFrom
import mozilla.components.support.base.feature.OnNeedToRequestPermissions
import mozilla.components.support.base.feature.PermissionsFeature
import mozilla.components.support.base.log.logger.Logger
import mozilla.components.support.ktx.android.content.isPermissionGranted
import mozilla.components.support.ktx.android.net.isUnderPrivateAppDirectory

Expand All @@ -39,6 +41,8 @@ internal class FilePicker(
override val onNeedToRequestPermissions: OnNeedToRequestPermissions
) : PermissionsFeature {

private val logger = Logger("FilePicker")

/**
* The image capture intent doesn't return the URI where the image is saved,
* so we track it here.
Expand Down Expand Up @@ -107,19 +111,24 @@ internal class FilePicker(
* @param intent The result of the request.
*/
fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
if (requestCode == FILE_PICKER_ACTIVITY_REQUEST_CODE) {
val request = getActivePromptRequest() ?: return
if (requestCode == FILE_PICKER_ACTIVITY_REQUEST_CODE && request is File) {
store.consumePromptFrom(sessionId) {
val request = it as File

if (resultCode == RESULT_OK) {
handleFilePickerIntentResult(intent, request)
} else {
request.onDismiss()
}
}
}
if (request !is File) {
logger.error("Invalid PromptRequest expected File but $request was provided")
}
}

private fun getActivePromptRequest(): PromptRequest? =
store.state.findTabOrCustomTabOrSelectedTab(sessionId)?.content?.promptRequest

/**
* Notifies the feature that the permissions request was completed. It will then
* either process or dismiss the prompt request.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,25 @@ class FilePickerTest {
verify(store).dispatch(ContentAction.ConsumePromptRequestAction(selected.id))
}

@Test
fun `onActivityResult will not process any PromptRequest that is not a File request`() {
var wasConfirmed = false
var wasDismissed = false
val onConfirm: (Boolean) -> Unit = { wasConfirmed = true }
val onDismiss = { wasDismissed = true }
val invalidRequest = PromptRequest.Alert("", "", false, onDismiss, onConfirm)
val spiedFilePicker = spy(filePicker)
val selected = prepareSelectedSession(invalidRequest)
val intent = Intent()

spiedFilePicker.onActivityResult(FILE_PICKER_ACTIVITY_REQUEST_CODE, RESULT_OK, intent)

assertFalse(wasConfirmed)
assertFalse(wasDismissed)
verify(store, never()).dispatch(ContentAction.ConsumePromptRequestAction(selected.id))
verify(spiedFilePicker, never()).handleFilePickerIntentResult(intent, request)
}

@Test
fun `onRequestPermissionsResult with FILE_PICKER_REQUEST and PERMISSION_GRANTED will call onPermissionsGranted`() {
stubContext()
Expand Down
3 changes: 3 additions & 0 deletions docs/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ permalink: /changelog/
* **feature-sitepermissions**
* 🚒 Bug fixed [issue #8943](https://github.com/mozilla-mobile/android-components/issues/8943) Refactor `SwipeRefreshFeature` to not use `EngineSession.Observer`, this result in multiple site permissions bugs getting fixed see [fenix#8987](https://github.com/mozilla-mobile/fenix/issues/8987) and [fenix#16411](https://github.com/mozilla-mobile/fenix/issues/16411).

* **feature-prompts**
* 🚒 Bug fixed [issue #8967](https://github.com/mozilla-mobile/android-components/issues/8967) Crash when trying to upload a file see [fenix#16537](https://github.com/mozilla-mobile/fenix/issues/16537), for more information.

# 66.0.0

* [Commits](https://github.com/mozilla-mobile/android-components/compare/v65.0.0...v66.0.0)
Expand Down