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

Commit aa437e99 authored by Philip P. Moltmann's avatar Philip P. Moltmann
Browse files

Do not restore location permission grants P->Q

During the upgrade from P->Q all location permissions will be revoked.
The same should happen when restoring a backed up P permission state on
a Q platform.

Test: atest --test-mapping pacakges/apps/PermissionController/src/com/android/packageinstaller/permission/service:presubmit
Change-Id: I050bc69aca5f5c17ebe9ff2af78dac7732af7928
parent e575787c
Loading
Loading
Loading
Loading
+22 −5
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static android.content.pm.PackageManager.GET_PERMISSIONS;
import static android.util.Xml.newSerializer;

import static com.android.packageinstaller.Constants.DELAYED_RESTORE_PERMISSIONS_FILE;
import static com.android.packageinstaller.permission.utils.Utils.getGroupOfPlatformPermission;

import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
import static org.xmlpull.v1.XmlPullParser.END_TAG;
@@ -30,6 +31,7 @@ import static org.xmlpull.v1.XmlPullParser.START_TAG;

import static java.nio.charset.StandardCharsets.UTF_8;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
@@ -37,11 +39,13 @@ import android.os.Build;
import android.os.UserHandle;
import android.permission.PermissionManager;
import android.permission.PermissionManager.SplitPermissionInfo;
import android.text.TextUtils;
import android.util.Log;
import android.util.Xml;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.os.BuildCompat;

import com.android.packageinstaller.Constants;
import com.android.packageinstaller.permission.model.AppPermissionGroup;
@@ -56,6 +60,7 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
@@ -252,8 +257,15 @@ public class BackupHelper {
        serializer.startDocument(null, true);

        serializer.startTag(null, TAG_PERMISSION_BACKUP);

        if (BuildCompat.isAtLeastQ()) {
            // STOPSHIP: Remove compatibility code once Q SDK level is declared
            serializer.attribute(null, ATTR_PLATFORM_VERSION,
                    Integer.valueOf(Build.VERSION_CODES.Q).toString());
        } else {
            serializer.attribute(null, ATTR_PLATFORM_VERSION,
                    Integer.valueOf(Build.VERSION.SDK_INT).toString());
        }

        serializer.startTag(null, TAG_ALL_GRANTS);

@@ -392,7 +404,7 @@ public class BackupHelper {
         *
         * @return The state
         */
        static @NonNull ArrayList<BackupPermissionState> parseFromXml(@NonNull XmlPullParser parser,
        static @NonNull List<BackupPermissionState> parseFromXml(@NonNull XmlPullParser parser,
                @NonNull Context context, int backupPlatformVersion)
                throws XmlPullParserException {
            String permName = parser.getAttributeValue(null, ATTR_PERMISSION_NAME);
@@ -401,6 +413,13 @@ public class BackupHelper {
                        + ATTR_PERMISSION_NAME);
            }

            // Clear location permission on upgrade to Q or later
            String group = getGroupOfPlatformPermission(permName);
            if (backupPlatformVersion < Build.VERSION_CODES.Q && TextUtils.equals(group,
                    Manifest.permission_group.LOCATION)) {
                return Collections.emptyList();
            }

            ArrayList<String> expandedPermissions = new ArrayList<>();
            expandedPermissions.add(permName);

@@ -429,8 +448,6 @@ public class BackupHelper {
                        "true".equals(parser.getAttributeValue(null, ATTR_WAS_REVIEWED))));
            }

            // TODO: Implement special behavior for location

            return parsedPermissions;
        }