Skip to content

Commit a892aa6

Browse files
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
1 parent 5a6b3cb commit a892aa6

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

app/src/main/java/fr/free/nrw/commons/filepicker/FilePicker.kt

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -296,10 +296,19 @@ object FilePicker : Constants {
296296
* https://github.com/commons-app/apps-android-commons/issues/6357
297297
*/
298298
private fun takePersistableUriPermissions(context: Context, result: ActivityResult) {
299-
result.data?.data?.also { uri ->
300-
val takeFlags: Int = (Intent.FLAG_GRANT_READ_URI_PERMISSION
301-
or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
302-
context.contentResolver.takePersistableUriPermission(uri, takeFlags)
299+
result.data?.let { intentData ->
300+
val takeFlags: Int = (Intent.FLAG_GRANT_READ_URI_PERMISSION)
301+
// Persist the URI permission for all URIs in the clip data
302+
// if multiple images are selected,
303+
// or for the single URI if only one image is selected
304+
intentData.clipData?.let { clipData ->
305+
for (i in 0 until clipData.itemCount) {
306+
context.contentResolver.takePersistableUriPermission(
307+
clipData.getItemAt(i).uri, takeFlags)
308+
}
309+
} ?: intentData.data?.let { uri ->
310+
context.contentResolver.takePersistableUriPermission(uri, takeFlags)
311+
}
303312
}
304313
}
305314

@@ -358,6 +367,7 @@ object FilePicker : Constants {
358367
callbacks: Callbacks
359368
) {
360369
if (result.resultCode == Activity.RESULT_OK && !isPhoto(result.data)) {
370+
takePersistableUriPermissions(activity, result)
361371
try {
362372
val files = getFilesFromGalleryPictures(result.data, activity)
363373
callbacks.onImagesPicked(files, ImageSource.GALLERY, restoreType(activity))

app/src/main/java/fr/free/nrw/commons/upload/worker/UploadWorker.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,12 @@ class UploadWorker(
393393
makeWikiDataEdit(uploadResult, contribution)
394394
}
395395
showSuccessNotification(contribution)
396+
if (appContext.contentResolver.persistedUriPermissions.any {
397+
it.uri == contribution.contentUri }) {
398+
appContext.contentResolver.releasePersistableUriPermission(
399+
contribution.contentUri!!, Intent.FLAG_GRANT_READ_URI_PERMISSION
400+
)
401+
}
396402
} else {
397403
Timber.e("Stash Upload failed")
398404
showFailedNotification(contribution)

0 commit comments

Comments
 (0)