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

Commit 7049e651 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Mark deprecated APIs, support column greylisting.

Update MediaStore APIs that are effectively no-ops, including
MiniThumbFile which is no longer used.

Add support for "greylisted" columns to SQLiteQueryBuilder, so that
we can support abusive columns that match specific regex patterns
while in "strict" mode, such as COUNT(*).

Bug: 111268862
Test: atest MediaProviderTests
Test: atest cts/tests/tests/provider/src/android/provider/cts/MediaStore*
Change-Id: I364ef5bfa338ef8492b0b29c2a5c13c4189467ee
parent 8068dfe6
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -36589,9 +36589,9 @@ package android.provider {
    field public static final java.lang.String IS_PRIVATE = "isprivate";
    field public static final java.lang.String LATITUDE = "latitude";
    field public static final java.lang.String LONGITUDE = "longitude";
    field public static final java.lang.String MINI_THUMB_MAGIC = "mini_thumb_magic";
    field public static final deprecated java.lang.String MINI_THUMB_MAGIC = "mini_thumb_magic";
    field public static final java.lang.String ORIENTATION = "orientation";
    field public static final java.lang.String PICASA_ID = "picasa_id";
    field public static final deprecated java.lang.String PICASA_ID = "picasa_id";
  }
  public static final class MediaStore.Images.Media implements android.provider.MediaStore.Images.ImageColumns {
@@ -36694,7 +36694,7 @@ package android.provider {
    field public static final java.lang.String LANGUAGE = "language";
    field public static final java.lang.String LATITUDE = "latitude";
    field public static final java.lang.String LONGITUDE = "longitude";
    field public static final java.lang.String MINI_THUMB_MAGIC = "mini_thumb_magic";
    field public static final deprecated java.lang.String MINI_THUMB_MAGIC = "mini_thumb_magic";
    field public static final java.lang.String RESOLUTION = "resolution";
    field public static final java.lang.String TAGS = "tags";
  }
+32 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import libcore.util.EmptyArray;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
@@ -50,6 +51,8 @@ public class SQLiteQueryBuilder {
            Pattern.compile("\\s*\\d+\\s*(,\\s*\\d+\\s*)?");

    private Map<String, String> mProjectionMap = null;
    private List<Pattern> mProjectionGreylist = null;

    @UnsupportedAppUsage
    private String mTables = "";
    @UnsupportedAppUsage
@@ -163,6 +166,17 @@ public class SQLiteQueryBuilder {
        mProjectionMap = columnMap;
    }

    /**
     * Sets a projection greylist of columns that will be allowed through, even
     * when {@link #setStrict(boolean)} is enabled. This provides a way for
     * abusive custom columns like {@code COUNT(*)} to continue working.
     *
     * @hide
     */
    public void setProjectionGreylist(List<Pattern> projectionGreylist) {
        mProjectionGreylist = projectionGreylist;
    }

    /**
     * Sets the cursor factory to be used for the query.  You can use
     * one factory for all queries on a database but it is normally
@@ -809,6 +823,24 @@ public class SQLiteQueryBuilder {
                        continue;
                    }

                    // If greylist is configured, we might be willing to let
                    // this custom column bypass our strict checks.
                    if (mProjectionGreylist != null) {
                        boolean match = false;
                        for (Pattern p : mProjectionGreylist) {
                            if (p.matcher(userColumn).matches()) {
                                match = true;
                                break;
                            }
                        }

                        if (match) {
                            Log.w(TAG, "Allowing abusive custom column: " + userColumn);
                            projection[i] = userColumn;
                            continue;
                        }
                    }

                    throw new IllegalArgumentException("Invalid column "
                            + projectionIn[i]);
                }
+14 −0
Original line number Diff line number Diff line
@@ -717,7 +717,11 @@ public final class MediaStore {
            /**
             * The picasa id of the image
             * <P>Type: TEXT</P>
             *
             * @deprecated this value was only relevant for images hosted on
             *             Picasa, which are no longer supported.
             */
            @Deprecated
            public static final String PICASA_ID = "picasa_id";

            /**
@@ -755,7 +759,12 @@ public final class MediaStore {
            /**
             * The mini thumb id.
             * <P>Type: INTEGER</P>
             *
             * @deprecated all thumbnails should be obtained via
             *             {@link Images.Thumbnails#getThumbnail}, as this
             *             value is no longer supported.
             */
            @Deprecated
            public static final String MINI_THUMB_MAGIC = "mini_thumb_magic";

            /**
@@ -1947,7 +1956,12 @@ public final class MediaStore {
            /**
             * The mini thumb id.
             * <P>Type: INTEGER</P>
             *
             * @deprecated all thumbnails should be obtained via
             *             {@link Images.Thumbnails#getThumbnail}, as this
             *             value is no longer supported.
             */
            @Deprecated
            public static final String MINI_THUMB_MAGIC = "mini_thumb_magic";

            /**
+9 −0
Original line number Diff line number Diff line
@@ -18,9 +18,12 @@ package android.media;

import android.annotation.UnsupportedAppUsage;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.util.Log;

import dalvik.system.VMRuntime;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
@@ -42,7 +45,10 @@ import java.util.Hashtable;
 *
 * @hide This file is shared between MediaStore and MediaProvider and should remained internal use
 *       only.
 * @deprecated thumbnails are now maintained in separate files, and this file
 *             format is no longer used.
 */
@Deprecated
public class MiniThumbFile {
    private static final String TAG = "MiniThumbFile";
    private static final int MINI_THUMB_DATA_FILE_VERSION = 4;
@@ -69,6 +75,9 @@ public class MiniThumbFile {
    }

    public static synchronized MiniThumbFile instance(Uri uri) {
        if (VMRuntime.getRuntime().getTargetSdkVersion() >= Build.VERSION_CODES.Q) {
            throw new UnsupportedOperationException();
        }
        String type = uri.getPathSegments().get(1);
        MiniThumbFile file = sThumbFiles.get(type);
        // Log.v(TAG, "get minithumbfile for type: "+type);