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

Commit a31246dc authored by John Wu's avatar John Wu
Browse files

Always parse sharedUserId and sharedUserLabel

In preparation to guard the "leaving shared UID" feature behind a flag,
we should always parse shared UID related attributes. With these
changes, we can disable the ability to leave shared UID simply by
ignoring the "sharedUserMaxSdkVersion" attribute during parsing.

Test: atest SharedUserMigrationTest
Bug: 220015249
Change-Id: Ia355f334311533158c706dd052d6f7b4eb611cca
parent 4769e90c
Loading
Loading
Loading
Loading
+14 −15
Original line number Original line Diff line number Diff line
@@ -36,7 +36,6 @@ import static android.content.pm.PackageManager.INSTALL_REASON_DEVICE_RESTORE;
import static android.content.pm.PackageManager.INSTALL_REASON_DEVICE_SETUP;
import static android.content.pm.PackageManager.INSTALL_REASON_DEVICE_SETUP;
import static android.content.pm.PackageManager.INSTALL_SUCCEEDED;
import static android.content.pm.PackageManager.INSTALL_SUCCEEDED;
import static android.content.pm.PackageManager.UNINSTALL_REASON_UNKNOWN;
import static android.content.pm.PackageManager.UNINSTALL_REASON_UNKNOWN;
import static android.content.pm.PackageManagerInternal.PACKAGE_SETUP_WIZARD;
import static android.content.pm.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V4;
import static android.content.pm.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V4;
import static android.content.pm.parsing.ApkLiteParseUtils.isApkFile;
import static android.content.pm.parsing.ApkLiteParseUtils.isApkFile;
import static android.os.PowerExemptionManager.REASON_PACKAGE_REPLACED;
import static android.os.PowerExemptionManager.REASON_PACKAGE_REPLACED;
@@ -183,7 +182,6 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.Collections;
import java.util.List;
import java.util.List;
import java.util.Map;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ExecutorService;


@@ -1596,18 +1594,16 @@ final class InstallPackageHelper {
                        parsedPackage.setRestrictUpdateHash(oldPackage.getRestrictUpdateHash());
                        parsedPackage.setRestrictUpdateHash(oldPackage.getRestrictUpdateHash());
                    }
                    }


                    // Check for shared user id changes
                    // APK should not change its sharedUserId declarations
                    if (!Objects.equals(oldPackage.getSharedUserId(),
                    final var oldSharedUid = oldPackage.getSharedUserId() != null
                            parsedPackage.getSharedUserId())
                            ? oldPackage.getSharedUserId() : "<nothing>";
                            // Don't mark as invalid if the app is trying to
                    final var newSharedUid = parsedPackage.getSharedUserId() != null
                            // leave a sharedUserId
                            ? parsedPackage.getSharedUserId() : "<nothing>";
                            && parsedPackage.getSharedUserId() != null) {
                    if (!oldSharedUid.equals(newSharedUid)) {
                        throw new PrepareFailure(INSTALL_FAILED_UID_CHANGED,
                        throw new PrepareFailure(INSTALL_FAILED_UID_CHANGED,
                                "Package " + parsedPackage.getPackageName()
                                "Package " + parsedPackage.getPackageName()
                                        + " shared user changed from "
                                        + " shared user changed from "
                                        + (oldPackage.getSharedUserId() != null
                                        + oldSharedUid + " to " + newSharedUid);
                                        ? oldPackage.getSharedUserId() : "<nothing>")
                                        + " to " + parsedPackage.getSharedUserId());
                    }
                    }


                    // In case of rollback, remember per-user/profile install state
                    // In case of rollback, remember per-user/profile install state
@@ -3694,10 +3690,13 @@ final class InstallPackageHelper {
            }
            }
            disabledPkgSetting = mPm.mSettings.getDisabledSystemPkgLPr(
            disabledPkgSetting = mPm.mSettings.getDisabledSystemPkgLPr(
                    parsedPackage.getPackageName());
                    parsedPackage.getPackageName());
            sharedUserSetting = (parsedPackage.getSharedUserId() != null)
            if (parsedPackage.getSharedUserId() != null && !parsedPackage.isLeavingSharedUid()) {
                    ? mPm.mSettings.getSharedUserLPw(parsedPackage.getSharedUserId(),
                sharedUserSetting = mPm.mSettings.getSharedUserLPw(
                    0 /*pkgFlags*/, 0 /*pkgPrivateFlags*/, true)
                        parsedPackage.getSharedUserId(),
                    : null;
                        0 /*pkgFlags*/, 0 /*pkgPrivateFlags*/, true /*create*/);
            } else {
                sharedUserSetting = null;
            }
            if (DEBUG_PACKAGE_SCANNING
            if (DEBUG_PACKAGE_SCANNING
                    && (parseFlags & ParsingPackageUtils.PARSE_CHATTY) != 0
                    && (parseFlags & ParsingPackageUtils.PARSE_CHATTY) != 0
                    && sharedUserSetting != null) {
                    && sharedUserSetting != null) {
+3 −0
Original line number Original line Diff line number Diff line
@@ -290,6 +290,9 @@ public interface ParsingPackage extends ParsingPackageRead {
    /** @see R#styleable.AndroidManifest_inheritKeyStoreKeys */
    /** @see R#styleable.AndroidManifest_inheritKeyStoreKeys */
    ParsingPackage setInheritKeyStoreKeys(boolean inheritKeyStoreKeys);
    ParsingPackage setInheritKeyStoreKeys(boolean inheritKeyStoreKeys);


    /** @see R#styleable.AndroidManifest_sharedUserMaxSdkVersion */
    ParsingPackage setLeavingSharedUid(boolean leavingSharedUid);

    ParsingPackage setLabelRes(int labelRes);
    ParsingPackage setLabelRes(int labelRes);


    ParsingPackage setLargestWidthLimitDp(int largestWidthLimitDp);
    ParsingPackage setLargestWidthLimitDp(int largestWidthLimitDp);
+11 −0
Original line number Original line Diff line number Diff line
@@ -549,6 +549,7 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden,
        private static final long SDK_LIBRARY = 1L << 49;
        private static final long SDK_LIBRARY = 1L << 49;
        private static final long INHERIT_KEYSTORE_KEYS = 1L << 50;
        private static final long INHERIT_KEYSTORE_KEYS = 1L << 50;
        private static final long ENABLE_ON_BACK_INVOKED_CALLBACK = 1L << 51;
        private static final long ENABLE_ON_BACK_INVOKED_CALLBACK = 1L << 51;
        private static final long LEAVING_SHARED_UID = 1L << 52;
    }
    }


    private ParsingPackageImpl setBoolean(@Booleans.Values long flag, boolean value) {
    private ParsingPackageImpl setBoolean(@Booleans.Values long flag, boolean value) {
@@ -2402,6 +2403,11 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden,
        return getBoolean(Booleans.ENABLE_ON_BACK_INVOKED_CALLBACK);
        return getBoolean(Booleans.ENABLE_ON_BACK_INVOKED_CALLBACK);
    }
    }


    @Override
    public boolean isLeavingSharedUid() {
        return getBoolean(Booleans.LEAVING_SHARED_UID);
    }

    @Override
    @Override
    public ParsingPackageImpl setBaseRevisionCode(int value) {
    public ParsingPackageImpl setBaseRevisionCode(int value) {
        baseRevisionCode = value;
        baseRevisionCode = value;
@@ -2550,6 +2556,11 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden,
        return setBoolean(Booleans.INHERIT_KEYSTORE_KEYS, value);
        return setBoolean(Booleans.INHERIT_KEYSTORE_KEYS, value);
    }
    }


    @Override
    public ParsingPackageImpl setLeavingSharedUid(boolean value) {
        return setBoolean(Booleans.LEAVING_SHARED_UID, value);
    }

    @Override
    @Override
    public ParsingPackageImpl setLabelRes(int value) {
    public ParsingPackageImpl setLabelRes(int value) {
        labelRes = value;
        labelRes = value;
+7 −0
Original line number Original line Diff line number Diff line
@@ -360,4 +360,11 @@ public interface ParsingPackageRead extends PkgWithoutStateAppInfo, PkgWithoutSt
     * @see R.styleable.AndroidManifestApplication_enableOnBackInvokedCallback
     * @see R.styleable.AndroidManifestApplication_enableOnBackInvokedCallback
     */
     */
    boolean isOnBackInvokedCallbackEnabled();
    boolean isOnBackInvokedCallbackEnabled();

    /**
     * Returns true if R.styleable#AndroidManifest_sharedUserMaxSdkVersion is set to a value
     * smaller than the current SDK version.
     * @see R.styleable#AndroidManifest_sharedUserMaxSdkVersion
     */
    boolean isLeavingSharedUid();
}
}
+4 −5
Original line number Original line Diff line number Diff line
@@ -1032,11 +1032,6 @@ public class ParsingPackageUtils {


    private static ParseResult<ParsingPackage> parseSharedUser(ParseInput input,
    private static ParseResult<ParsingPackage> parseSharedUser(ParseInput input,
            ParsingPackage pkg, TypedArray sa) {
            ParsingPackage pkg, TypedArray sa) {
        int maxSdkVersion = anInteger(0, R.styleable.AndroidManifest_sharedUserMaxSdkVersion, sa);
        if ((maxSdkVersion != 0) && maxSdkVersion < Build.VERSION.RESOURCES_SDK_INT) {
            return input.success(pkg);
        }

        String str = nonConfigString(0, R.styleable.AndroidManifest_sharedUserId, sa);
        String str = nonConfigString(0, R.styleable.AndroidManifest_sharedUserId, sa);
        if (TextUtils.isEmpty(str)) {
        if (TextUtils.isEmpty(str)) {
            return input.success(pkg);
            return input.success(pkg);
@@ -1052,7 +1047,11 @@ public class ParsingPackageUtils {
            }
            }
        }
        }


        int maxSdkVersion = anInteger(0, R.styleable.AndroidManifest_sharedUserMaxSdkVersion, sa);
        boolean leaving = (maxSdkVersion != 0) && (maxSdkVersion < Build.VERSION.RESOURCES_SDK_INT);

        return input.success(pkg
        return input.success(pkg
                .setLeavingSharedUid(leaving)
                .setSharedUserId(str.intern())
                .setSharedUserId(str.intern())
                .setSharedUserLabel(resId(R.styleable.AndroidManifest_sharedUserLabel, sa)));
                .setSharedUserLabel(resId(R.styleable.AndroidManifest_sharedUserLabel, sa)));
    }
    }
Loading