From 5110c0a7c866406c4cf01eeb7a74f1183db96826 Mon Sep 17 00:00:00 2001 From: Sonal Yadav Date: Sat, 16 Aug 2025 18:29:34 +0530 Subject: [PATCH] Fix SecurityException crash when accessing picker URIs after app restart --- .../commons/upload/ImageProcessingService.kt | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ImageProcessingService.kt b/app/src/main/java/fr/free/nrw/commons/upload/ImageProcessingService.kt index cbec7559f..476c926c8 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ImageProcessingService.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/ImageProcessingService.kt @@ -129,11 +129,38 @@ class ImageProcessingService @Inject constructor( */ fun checkIfFileAlreadyExists(originalFilePath: Uri, modifiedFilePath: Uri): Single { return Single.zip( - checkDuplicateImage(inputStream = appContext.contentResolver.openInputStream(originalFilePath)!!), - checkDuplicateImage(inputStream = fileUtilsWrapper.getFileInputStream(modifiedFilePath.path)) + // Handle SecurityException for picker URIs that have lost permission + Single.defer { + try { + val inputStream = appContext.contentResolver.openInputStream(originalFilePath) + if (inputStream != null) { + checkDuplicateImage(inputStream = inputStream) + } else { + Single.just(IMAGE_OK) + } + } catch (e: SecurityException) { + Timber.w(e, "Security exception accessing picker URI - permission lost after app restart") + Single.just(IMAGE_OK) + } catch (e: Exception) { + Timber.e(e, "Error accessing original file URI") + Single.just(IMAGE_OK) + } + }, + // Handle exceptions for modified file path + Single.defer { + try { + checkDuplicateImage(inputStream = fileUtilsWrapper.getFileInputStream(modifiedFilePath.path)) + } catch (e: Exception) { + Timber.e(e, "Error accessing modified file") + Single.just(IMAGE_OK) + } + } ) { resultForOriginal, resultForDuplicate -> return@zip if (resultForOriginal == IMAGE_DUPLICATE || resultForDuplicate == IMAGE_DUPLICATE) IMAGE_DUPLICATE else IMAGE_OK + }.onErrorReturn { error -> + Timber.e(error, "Error during duplicate file check") + IMAGE_OK } }