6357: Fix java.lang.SecurityException for multi-uploads (#6402)

* Fix java.lang.SecurityException for ACTION_OPEN_DOCUMENT

* Handle SecurityException in case of multi-upload

* Remove unused import

* Clean up code

* Clean up code

* Handle SecurityException for other upload methods

* Release persisted URI permissions for successful uploads

* Remove persistable permission for custom picker as it's not required

* Remove persistable permission for in-app camera as it's not required
This commit is contained in:
Ritika Pahwa 2025-08-19 21:16:02 +05:30 committed by GitHub
parent 5a6b3cbf09
commit a892aa6dee
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 20 additions and 4 deletions

View file

@ -296,12 +296,21 @@ object FilePicker : Constants {
* https://github.com/commons-app/apps-android-commons/issues/6357 * https://github.com/commons-app/apps-android-commons/issues/6357
*/ */
private fun takePersistableUriPermissions(context: Context, result: ActivityResult) { private fun takePersistableUriPermissions(context: Context, result: ActivityResult) {
result.data?.data?.also { uri -> result.data?.let { intentData ->
val takeFlags: Int = (Intent.FLAG_GRANT_READ_URI_PERMISSION val takeFlags: Int = (Intent.FLAG_GRANT_READ_URI_PERMISSION)
or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) // Persist the URI permission for all URIs in the clip data
// if multiple images are selected,
// or for the single URI if only one image is selected
intentData.clipData?.let { clipData ->
for (i in 0 until clipData.itemCount) {
context.contentResolver.takePersistableUriPermission(
clipData.getItemAt(i).uri, takeFlags)
}
} ?: intentData.data?.let { uri ->
context.contentResolver.takePersistableUriPermission(uri, takeFlags) context.contentResolver.takePersistableUriPermission(uri, takeFlags)
} }
} }
}
/** /**
* onPictureReturnedFromCustomSelector. * onPictureReturnedFromCustomSelector.
@ -358,6 +367,7 @@ object FilePicker : Constants {
callbacks: Callbacks callbacks: Callbacks
) { ) {
if (result.resultCode == Activity.RESULT_OK && !isPhoto(result.data)) { if (result.resultCode == Activity.RESULT_OK && !isPhoto(result.data)) {
takePersistableUriPermissions(activity, result)
try { try {
val files = getFilesFromGalleryPictures(result.data, activity) val files = getFilesFromGalleryPictures(result.data, activity)
callbacks.onImagesPicked(files, ImageSource.GALLERY, restoreType(activity)) callbacks.onImagesPicked(files, ImageSource.GALLERY, restoreType(activity))

View file

@ -393,6 +393,12 @@ class UploadWorker(
makeWikiDataEdit(uploadResult, contribution) makeWikiDataEdit(uploadResult, contribution)
} }
showSuccessNotification(contribution) showSuccessNotification(contribution)
if (appContext.contentResolver.persistedUriPermissions.any {
it.uri == contribution.contentUri }) {
appContext.contentResolver.releasePersistableUriPermission(
contribution.contentUri!!, Intent.FLAG_GRANT_READ_URI_PERMISSION
)
}
} else { } else {
Timber.e("Stash Upload failed") Timber.e("Stash Upload failed")
showFailedNotification(contribution) showFailedNotification(contribution)