From a8c47b5091158585162d92b81dd37debbf110010 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Sun, 28 Jul 2019 10:20:04 -0400 Subject: [PATCH] Guard media reads with a permissions check. --- .../securesms/mediasend/MediaRepository.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/org/thoughtcrime/securesms/mediasend/MediaRepository.java b/src/org/thoughtcrime/securesms/mediasend/MediaRepository.java index 8d9303fc1b..0c62128f9d 100644 --- a/src/org/thoughtcrime/securesms/mediasend/MediaRepository.java +++ b/src/org/thoughtcrime/securesms/mediasend/MediaRepository.java @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.mediasend; +import android.Manifest; import android.annotation.TargetApi; import android.content.Context; import android.database.Cursor; @@ -17,6 +18,7 @@ import com.annimon.stream.Stream; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.mms.PartAuthority; +import org.thoughtcrime.securesms.permissions.Permissions; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.concurrent.SignalExecutors; @@ -69,6 +71,10 @@ class MediaRepository { @WorkerThread private @NonNull List getFolders(@NonNull Context context) { + if (!Permissions.hasAll(context, Manifest.permission.READ_EXTERNAL_STORAGE)) { + return Collections.emptyList(); + } + FolderResult imageFolders = getFolders(context, Images.Media.EXTERNAL_CONTENT_URI); FolderResult videoFolders = getFolders(context, Video.Media.EXTERNAL_CONTENT_URI); Map folders = new HashMap<>(imageFolders.getFolderData()); @@ -151,6 +157,10 @@ class MediaRepository { @WorkerThread private @NonNull List getMediaInBucket(@NonNull Context context, @NonNull String bucketId) { + if (!Permissions.hasAll(context, Manifest.permission.READ_EXTERNAL_STORAGE)) { + return Collections.emptyList(); + } + List images = getMediaInBucket(context, bucketId, Images.Media.EXTERNAL_CONTENT_URI, true); List videos = getMediaInBucket(context, bucketId, Video.Media.EXTERNAL_CONTENT_URI, false); List media = new ArrayList<>(images.size() + videos.size()); @@ -201,6 +211,10 @@ class MediaRepository { @WorkerThread private List getPopulatedMedia(@NonNull Context context, @NonNull List media) { + if (!Permissions.hasAll(context, Manifest.permission.READ_EXTERNAL_STORAGE)) { + return media; + } + return Stream.of(media).map(m -> { try { if (isPopulated(m)) { @@ -218,6 +232,10 @@ class MediaRepository { @WorkerThread private Optional getMostRecentItem(@NonNull Context context) { + if (!Permissions.hasAll(context, Manifest.permission.READ_EXTERNAL_STORAGE)) { + return Optional.absent(); + } + List media = getMediaInBucket(context, Media.ALL_MEDIA_BUCKET_ID, Images.Media.EXTERNAL_CONTENT_URI, true); return media.size() > 0 ? Optional.of(media.get(0)) : Optional.absent(); }