Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46bd1525 authored by Mark Renouf's avatar Mark Renouf Committed by Android (Google) Code Review
Browse files

Merge "Prevent sharesheet from previewing unowned URIs"

parents ffdba811 2a08fce4
Loading
Loading
Loading
Loading
+33 −2
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_CANT
import static android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_CANT_SHARE_WITH_PERSONAL;
import static android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_CANT_SHARE_WITH_PERSONAL;
import static android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_CANT_SHARE_WITH_WORK;
import static android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_CANT_SHARE_WITH_WORK;
import static android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_CROSS_PROFILE_BLOCKED_TITLE;
import static android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_CROSS_PROFILE_BLOCKED_TITLE;
import static android.content.ContentProvider.getUserIdFromUri;
import static android.stats.devicepolicy.DevicePolicyEnums.RESOLVER_EMPTY_STATE_NO_SHARING_TO_PERSONAL;
import static android.stats.devicepolicy.DevicePolicyEnums.RESOLVER_EMPTY_STATE_NO_SHARING_TO_PERSONAL;
import static android.stats.devicepolicy.DevicePolicyEnums.RESOLVER_EMPTY_STATE_NO_SHARING_TO_WORK;
import static android.stats.devicepolicy.DevicePolicyEnums.RESOLVER_EMPTY_STATE_NO_SHARING_TO_WORK;


@@ -161,6 +162,7 @@ import java.util.List;
import java.util.Map;
import java.util.Map;
import java.util.Objects;
import java.util.Objects;
import java.util.function.Supplier;
import java.util.function.Supplier;
import java.util.stream.Collectors;


/**
/**
 * The Chooser Activity handles intent resolution specifically for sharing intents -
 * The Chooser Activity handles intent resolution specifically for sharing intents -
@@ -1397,7 +1399,7 @@ public class ChooserActivity extends ResolverActivity implements


            ImageView previewThumbnailView = contentPreviewLayout.findViewById(
            ImageView previewThumbnailView = contentPreviewLayout.findViewById(
                    R.id.content_preview_thumbnail);
                    R.id.content_preview_thumbnail);
            if (previewThumbnail == null) {
            if (!validForContentPreview(previewThumbnail)) {
                previewThumbnailView.setVisibility(View.GONE);
                previewThumbnailView.setVisibility(View.GONE);
            } else {
            } else {
                mPreviewCoord = new ContentPreviewCoordinator(contentPreviewLayout, false);
                mPreviewCoord = new ContentPreviewCoordinator(contentPreviewLayout, false);
@@ -1427,6 +1429,10 @@ public class ChooserActivity extends ResolverActivity implements
        String action = targetIntent.getAction();
        String action = targetIntent.getAction();
        if (Intent.ACTION_SEND.equals(action)) {
        if (Intent.ACTION_SEND.equals(action)) {
            Uri uri = targetIntent.getParcelableExtra(Intent.EXTRA_STREAM, android.net.Uri.class);
            Uri uri = targetIntent.getParcelableExtra(Intent.EXTRA_STREAM, android.net.Uri.class);
            if (!validForContentPreview(uri)) {
                imagePreview.setVisibility(View.GONE);
                return contentPreviewLayout;
            }
            imagePreview.findViewById(R.id.content_preview_image_1_large)
            imagePreview.findViewById(R.id.content_preview_image_1_large)
                    .setTransitionName(ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME);
                    .setTransitionName(ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME);
            mPreviewCoord.loadUriIntoView(R.id.content_preview_image_1_large, uri, 0);
            mPreviewCoord.loadUriIntoView(R.id.content_preview_image_1_large, uri, 0);
@@ -1436,7 +1442,7 @@ public class ChooserActivity extends ResolverActivity implements
            List<Uri> uris = targetIntent.getParcelableArrayListExtra(Intent.EXTRA_STREAM, android.net.Uri.class);
            List<Uri> uris = targetIntent.getParcelableArrayListExtra(Intent.EXTRA_STREAM, android.net.Uri.class);
            List<Uri> imageUris = new ArrayList<>();
            List<Uri> imageUris = new ArrayList<>();
            for (Uri uri : uris) {
            for (Uri uri : uris) {
                if (isImageType(resolver.getType(uri))) {
                if (validForContentPreview(uri) && isImageType(resolver.getType(uri))) {
                    imageUris.add(uri);
                    imageUris.add(uri);
                }
                }
            }
            }
@@ -1546,9 +1552,16 @@ public class ChooserActivity extends ResolverActivity implements
        String action = targetIntent.getAction();
        String action = targetIntent.getAction();
        if (Intent.ACTION_SEND.equals(action)) {
        if (Intent.ACTION_SEND.equals(action)) {
            Uri uri = targetIntent.getParcelableExtra(Intent.EXTRA_STREAM, android.net.Uri.class);
            Uri uri = targetIntent.getParcelableExtra(Intent.EXTRA_STREAM, android.net.Uri.class);
            if (!validForContentPreview(uri)) {
                contentPreviewLayout.setVisibility(View.GONE);
                return contentPreviewLayout;
            }
            loadFileUriIntoView(uri, contentPreviewLayout);
            loadFileUriIntoView(uri, contentPreviewLayout);
        } else {
        } else {
            List<Uri> uris = targetIntent.getParcelableArrayListExtra(Intent.EXTRA_STREAM, android.net.Uri.class);
            List<Uri> uris = targetIntent.getParcelableArrayListExtra(Intent.EXTRA_STREAM, android.net.Uri.class);
            uris = uris.stream()
                    .filter(ChooserActivity::validForContentPreview)
                    .collect(Collectors.toList());
            int uriCount = uris.size();
            int uriCount = uris.size();


            if (uriCount == 0) {
            if (uriCount == 0) {
@@ -1607,6 +1620,24 @@ public class ChooserActivity extends ResolverActivity implements
        }
        }
    }
    }


    /**
     * Indicate if the incoming content URI should be allowed.
     *
     * @param uri the uri to test
     * @return true if the URI is allowed for content preview
     */
    private static boolean validForContentPreview(Uri uri) throws SecurityException {
        if (uri == null) {
            return false;
        }
        int userId = getUserIdFromUri(uri, UserHandle.USER_CURRENT);
        if (userId != UserHandle.USER_CURRENT && userId != UserHandle.myUserId()) {
            Log.e(TAG, "dropped invalid content URI belonging to user " + userId);
            return false;
        }
        return true;
    }

    @VisibleForTesting
    @VisibleForTesting
    protected boolean isImageType(String mimeType) {
    protected boolean isImageType(String mimeType) {
        return mimeType != null && mimeType.startsWith("image/");
        return mimeType != null && mimeType.startsWith("image/");