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

Commit 0af8c46c authored by Winson's avatar Winson
Browse files

Migrate legacy intent filter verification settings

These legacy settings need to be migrated once to the new domain
verification API, so this pulls the parsing out of the legacy classes
into a DomainVerificationLegacySettings.

This does NOT handle serializing the legacy settings. It's assumed
that migration is a one-time best effort attempt, and that dropping
the legacy settings is an acceptable fallback.

The old setting was a result of an unexplained and unintuitive user
path, set through ResolverActivity, and so it's not clear whether we
should migrate at all.

Worst case, the user can always re-do their preferences.

NOTE: This change should only be merged if merged together with the
change that removes the legacy code. It's invalid to run these
separately, as this change breaks the legacy manager class. These are
only separate to make review easier, to separate their concerns.

Exempt-From-Owner-Approval: Already approved by owners on main branch

Bug: 171251883

Test: TODO

Change-Id: Iefde9f2cd8ab73cb5f592abc7d2163dd7d244789
parent c89bd75a
Loading
Loading
Loading
Loading
+0 −14
Original line number Diff line number Diff line
@@ -77,8 +77,6 @@ public class PackageUserState {
    public boolean virtualPreload;
    public int enabled;
    public String lastDisableAppCaller;
    public int domainVerificationStatus;
    public int appLinkGeneration;
    public int categoryHint = ApplicationInfo.CATEGORY_UNDEFINED;
    public int installReason;
    public @PackageManager.UninstallReason int uninstallReason;
@@ -100,8 +98,6 @@ public class PackageUserState {
        hidden = false;
        suspended = false;
        enabled = COMPONENT_ENABLED_STATE_DEFAULT;
        domainVerificationStatus =
                PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
        installReason = PackageManager.INSTALL_REASON_UNKNOWN;
        uninstallReason = PackageManager.UNINSTALL_REASON_UNKNOWN;
    }
@@ -120,8 +116,6 @@ public class PackageUserState {
        virtualPreload = o.virtualPreload;
        enabled = o.enabled;
        lastDisableAppCaller = o.lastDisableAppCaller;
        domainVerificationStatus = o.domainVerificationStatus;
        appLinkGeneration = o.appLinkGeneration;
        categoryHint = o.categoryHint;
        installReason = o.installReason;
        uninstallReason = o.uninstallReason;
@@ -416,12 +410,6 @@ public class PackageUserState {
                        && !lastDisableAppCaller.equals(oldState.lastDisableAppCaller))) {
            return false;
        }
        if (domainVerificationStatus != oldState.domainVerificationStatus) {
            return false;
        }
        if (appLinkGeneration != oldState.appLinkGeneration) {
            return false;
        }
        if (categoryHint != oldState.categoryHint) {
            return false;
        }
@@ -481,8 +469,6 @@ public class PackageUserState {
        hashCode = 31 * hashCode + Boolean.hashCode(virtualPreload);
        hashCode = 31 * hashCode + enabled;
        hashCode = 31 * hashCode + Objects.hashCode(lastDisableAppCaller);
        hashCode = 31 * hashCode + domainVerificationStatus;
        hashCode = 31 * hashCode + appLinkGeneration;
        hashCode = 31 * hashCode + categoryHint;
        hashCode = 31 * hashCode + installReason;
        hashCode = 31 * hashCode + uninstallReason;
+14 −17
Original line number Diff line number Diff line
@@ -238,7 +238,6 @@ import android.content.pm.VersionedPackage;
import android.content.pm.dex.ArtManager;
import android.content.pm.dex.DexMetadataHelper;
import android.content.pm.dex.IArtManager;
import android.content.pm.domain.verify.DomainVerificationManager;
import android.content.pm.parsing.ApkLiteParseUtils;
import android.content.pm.parsing.PackageLite;
import android.content.pm.parsing.ParsingPackageUtils;
@@ -386,7 +385,6 @@ import com.android.server.pm.domain.verify.proxy.DomainVerificationProxyV2;
import com.android.server.pm.intent.verify.legacy.IntentFilterVerificationManager;
import com.android.server.pm.intent.verify.legacy.IntentFilterVerificationParams;
import com.android.server.pm.intent.verify.legacy.IntentVerifierProxy;
import com.android.server.pm.intent.verify.legacy.IntentVerifyUtils;
import com.android.server.pm.parsing.PackageCacher;
import com.android.server.pm.parsing.PackageInfoUtils;
import com.android.server.pm.parsing.PackageParser2;
@@ -1814,7 +1812,7 @@ public class PackageManagerService extends IPackageManager.Stub
                @NonNull
                @Override
                public WatchedSparseIntArray getNextAppLinkGeneration() {
                    return mSettings.mNextAppLinkGeneration;
                    return null;
                }
                @NonNull
@@ -2753,7 +2751,8 @@ public class PackageManagerService extends IPackageManager.Stub
                    }
                    // Try to get the status from User settings first
                    long packedStatus = IntentVerifyUtils.getDomainVerificationStatus(ps, userId);
                    long packedStatus = 0;
                    //IntentVerifyUtils.getDomainVerificationStatus(ps, userId);
                    int status = (int)(packedStatus >> 32);
                    int linkGeneration = (int)(packedStatus & 0xFFFFFFFF);
                    if (status == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS) {
@@ -2980,8 +2979,8 @@ public class PackageManagerService extends IPackageManager.Stub
                    result.wereAnyDomainsVerificationApproved |= mDomainVerificationManager
                            .isApprovedForDomain(ps, intent, riTargetUser.targetUserId);
                } else {
                    long verificationState =
                            IntentVerifyUtils.getDomainVerificationStatus(ps, parentUserId);
                    long verificationState = 0;
                    //IntentVerifyUtils.getDomainVerificationStatus(ps, parentUserId);
                    int status = (int) (verificationState >> 32);
                    result.bestDomainVerificationStatus = bestDomainVerificationStatus(status,
                            result.bestDomainVerificationStatus);
@@ -3257,8 +3256,8 @@ public class PackageManagerService extends IPackageManager.Stub
                            }
                        }
                        final long packedStatus =
                                IntentVerifyUtils.getDomainVerificationStatus(ps, userId);
                        final long packedStatus = 0;
                        //IntentVerifyUtils.getDomainVerificationStatus(ps, userId);
                        final int status = (int)(packedStatus >> 32);
                        if (status == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER) {
                            // there's a local instant application installed, but, the user has
@@ -4202,8 +4201,8 @@ public class PackageManagerService extends IPackageManager.Stub
                            }
                        } else {
                            // Try to get the status from User settings first
                            final long packedStatus =
                                    IntentVerifyUtils.getDomainVerificationStatus(ps, userId);
                            final long packedStatus = 0;
                            //IntentVerifyUtils.getDomainVerificationStatus(ps, userId);
                            final int status = (int) (packedStatus >> 32);
                            if (status == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS
                                    || status
@@ -9655,8 +9654,8 @@ public class PackageManagerService extends IPackageManager.Stub
                                return ri;
                            }
                        } else {
                            final long packedStatus =
                                    IntentVerifyUtils.getDomainVerificationStatus(ps, userId);
                            final long packedStatus = 0;
                            //IntentVerifyUtils.getDomainVerificationStatus(ps, userId);
                            final int status = (int) (packedStatus >> 32);
                            if (status != INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK) {
                                return ri;
@@ -16447,13 +16446,13 @@ public class PackageManagerService extends IPackageManager.Stub
    @Override
    public int getIntentVerificationStatus(String packageName, int userId) {
        return mIntentFilterVerificationManager.getIntentVerificationStatus(packageName, userId);
        return mDomainVerificationManager.getLegacyState(packageName, userId);
    }
    @Override
    public boolean updateIntentVerificationStatus(String packageName, int status, int userId) {
        return mIntentFilterVerificationManager.updateIntentVerificationStatus(packageName, status,
                userId);
        mDomainVerificationManager.setLegacyUserState(packageName, userId, status);
        return true;
    }
    @Override
@@ -21681,8 +21680,6 @@ public class PackageManagerService extends IPackageManager.Stub
                    null /*lastDisableAppCaller*/,
                    null /*enabledComponents*/,
                    null /*disabledComponents*/,
                    ps.readUserState(nextUserId).domainVerificationStatus,
                    0 /*linkGeneration*/,
                    PackageManager.INSTALL_REASON_UNKNOWN,
                    PackageManager.UNINSTALL_REASON_UNKNOWN,
                    null /*harmfulAppWarning*/);
+1 −49
Original line number Diff line number Diff line
@@ -133,8 +133,6 @@ public abstract class PackageSettingBase extends SettingBase {
    /** Whether or not an update is available. Ostensibly only for instant apps. */
    boolean updateAvailable;

    IntentFilterVerificationInfo verificationInfo;

    boolean forceQueryableOverride;

    @NonNull
@@ -260,7 +258,6 @@ public abstract class PackageSettingBase extends SettingBase {
        for (int i = 0; i < orig.mUserState.size(); i++) {
            mUserState.put(orig.mUserState.keyAt(i), orig.mUserState.valueAt(i));
        }
        verificationInfo = orig.verificationInfo;
        versionCode = orig.versionCode;
        volumeUuid = orig.volumeUuid;
        categoryHint = orig.categoryHint;
@@ -354,12 +351,6 @@ public abstract class PackageSettingBase extends SettingBase {

    /**
     * Only use for testing. Do NOT use in production code.
     *
     * Unless you're {@link DomainVerificationService} and you need to migrate legacy state.
     * This is done rather than passing in the user IDs to
     * {@link DomainVerificationManagerInternal#addPackage(PackageSetting)} to make the v2 APIs
     * completely correct, without legacy details, since that method inherently does not care about
     * the users on the device.
     */
    @VisibleForTesting
    @Deprecated
@@ -507,8 +498,7 @@ public abstract class PackageSettingBase extends SettingBase {
            ArrayMap<String, PackageUserState.SuspendParams> suspendParams, boolean instantApp,
            boolean virtualPreload, String lastDisableAppCaller,
            ArraySet<String> enabledComponents, ArraySet<String> disabledComponents,
            int domainVerifState, int linkGeneration, int installReason, int uninstallReason,
            String harmfulAppWarning) {
            int installReason, int uninstallReason, String harmfulAppWarning) {
        PackageUserState state = modifyUserState(userId);
        state.ceDataInode = ceDataInode;
        state.enabled = enabled;
@@ -522,8 +512,6 @@ public abstract class PackageSettingBase extends SettingBase {
        state.lastDisableAppCaller = lastDisableAppCaller;
        state.enabledComponents = enabledComponents;
        state.disabledComponents = disabledComponents;
        state.domainVerificationStatus = domainVerifState;
        state.appLinkGeneration = linkGeneration;
        state.installReason = installReason;
        state.uninstallReason = uninstallReason;
        state.instantApp = instantApp;
@@ -539,7 +527,6 @@ public abstract class PackageSettingBase extends SettingBase {
                otherState.instantApp,
                otherState.virtualPreload, otherState.lastDisableAppCaller,
                otherState.enabledComponents, otherState.disabledComponents,
                otherState.domainVerificationStatus, otherState.appLinkGeneration,
                otherState.installReason, otherState.uninstallReason, otherState.harmfulAppWarning);
    }

@@ -655,40 +642,6 @@ public abstract class PackageSettingBase extends SettingBase {
        return excludedUserIds;
    }

    public IntentFilterVerificationInfo getIntentFilterVerificationInfo() {
        return verificationInfo;
    }

    public void setIntentFilterVerificationInfo(IntentFilterVerificationInfo info) {
        verificationInfo = info;
        onChanged();
    }

    // Returns a packed value as a long:
    //
    // high 'int'-sized word: link status: undefined/ask/never/always.
    // low 'int'-sized word: relative priority among 'always' results.
    public long getDomainVerificationStatusForUser(int userId) {
        PackageUserState state = readUserState(userId);
        long result = (long) state.appLinkGeneration;
        result |= ((long) state.domainVerificationStatus) << 32;
        return result;
    }

    public void setDomainVerificationStatusForUser(final int status, int generation, int userId) {
        PackageUserState state = modifyUserState(userId);
        state.domainVerificationStatus = status;
        if (status == PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS) {
            state.appLinkGeneration = generation;
            onChanged();
        }
    }

    public void clearDomainVerificationStatusForUser(int userId) {
        modifyUserState(userId).domainVerificationStatus =
                PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
    }

    protected void writeUsersInfoToProto(ProtoOutputStream proto, long fieldId) {
        int count = mUserState.size();
        for (int i = 0; i < count; i++) {
@@ -856,7 +809,6 @@ public abstract class PackageSettingBase extends SettingBase {
        this.volumeUuid = other.volumeUuid;
        this.categoryHint = other.categoryHint;
        this.updateAvailable = other.updateAvailable;
        this.verificationInfo = other.verificationInfo;
        this.forceQueryableOverride = other.forceQueryableOverride;
        this.incrementalStates = other.incrementalStates;

+12 −42
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
import static android.content.pm.PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
import static android.content.pm.PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY;
import static android.content.pm.PackageManager.UNINSTALL_REASON_UNKNOWN;
import static android.content.pm.PackageManager.UNINSTALL_REASON_USER_TYPE;
@@ -106,6 +105,7 @@ import com.android.permission.persistence.RuntimePermissionsState;
import com.android.server.LocalServices;
import com.android.server.backup.PreferredActivityBackupHelper;
import com.android.server.pm.Installer.InstallerException;
import com.android.server.pm.domain.verify.DomainVerificationLegacySettings;
import com.android.server.pm.domain.verify.DomainVerificationManagerInternal;
import com.android.server.pm.domain.verify.DomainVerificationPersistence;
import com.android.server.pm.intent.verify.legacy.IntentFilterVerificationManager;
@@ -557,7 +557,6 @@ public final class Settings implements Watchable, Snappable {
        mOtherAppIds.registerObserver(mObserver);
        mRenamedPackages.registerObserver(mObserver);
        mDefaultBrowserApp.registerObserver(mObserver);
        mNextAppLinkGeneration.registerObserver(mObserver);

        Watchable.verifyWatchedAttributes(this, mObserver);
    }
@@ -610,7 +609,6 @@ public final class Settings implements Watchable, Snappable {
        mOtherAppIds.registerObserver(mObserver);
        mRenamedPackages.registerObserver(mObserver);
        mDefaultBrowserApp.registerObserver(mObserver);
        mNextAppLinkGeneration.registerObserver(mObserver);

        Watchable.verifyWatchedAttributes(this, mObserver);
    }
@@ -659,7 +657,6 @@ public final class Settings implements Watchable, Snappable {
        mKeySetRefs.putAll(r.mKeySetRefs);
        mRenamedPackages.snapshot(r.mRenamedPackages);
        mDefaultBrowserApp.snapshot(r.mDefaultBrowserApp);
        mNextAppLinkGeneration.snapshot(r.mNextAppLinkGeneration);
        // mReadMessages
        mPendingPackages.addAll(r.mPendingPackages);
        mSystemDir = null;
@@ -938,8 +935,6 @@ public final class Settings implements Watchable, Snappable {
                                null /*lastDisableAppCaller*/,
                                null /*enabledComponents*/,
                                null /*disabledComponents*/,
                                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED,
                                0 /*linkGeneration*/,
                                PackageManager.INSTALL_REASON_UNKNOWN,
                                PackageManager.UNINSTALL_REASON_UNKNOWN,
                                null /*harmfulAppWarning*/);
@@ -1182,12 +1177,6 @@ public final class Settings implements Watchable, Snappable {
                replaceAppIdLPw(p.appId, sharedUser);
            }
        }

        IntentFilterVerificationInfo info =
                mIntentFilterVerificationManager.getRestoredIntentFilterVerificationInfo(p.name);
        if (info != null) {
            p.setIntentFilterVerificationInfo(info);
        }
    }

    int removePackageLPw(String name) {
@@ -1582,8 +1571,6 @@ public final class Settings implements Watchable, Snappable {
                                null /*lastDisableAppCaller*/,
                                null /*enabledComponents*/,
                                null /*disabledComponents*/,
                                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED,
                                0 /*linkGeneration*/,
                                PackageManager.INSTALL_REASON_UNKNOWN,
                                PackageManager.UNINSTALL_REASON_UNKNOWN,
                                null /*harmfulAppWarning*/);
@@ -1608,8 +1595,6 @@ public final class Settings implements Watchable, Snappable {
                return;
            }

            int maxAppLinkGeneration = 0;

            int outerDepth = parser.getDepth();
            PackageSetting ps = null;
            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
@@ -1672,11 +1657,6 @@ public final class Settings implements Watchable, Snappable {
                    final int verifState = parser.getAttributeInt(null,
                            ATTR_DOMAIN_VERIFICATON_STATE,
                            PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED);
                    final int linkGeneration =
                            parser.getAttributeInt(null, ATTR_APP_LINK_GENERATION, 0);
                    if (linkGeneration > maxAppLinkGeneration) {
                        maxAppLinkGeneration = linkGeneration;
                    }
                    final int installReason = parser.getAttributeInt(null, ATTR_INSTALL_REASON,
                            PackageManager.INSTALL_REASON_UNKNOWN);
                    final int uninstallReason = parser.getAttributeInt(null, ATTR_UNINSTALL_REASON,
@@ -1752,9 +1732,10 @@ public final class Settings implements Watchable, Snappable {
                    }
                    ps.setUserState(userId, ceDataInode, enabled, installed, stopped, notLaunched,
                            hidden, distractionFlags, suspended, suspendParamsMap,
                            instantApp, virtualPreload,
                            enabledCaller, enabledComponents, disabledComponents, verifState,
                            linkGeneration, installReason, uninstallReason, harmfulAppWarning);
                            instantApp, virtualPreload, enabledCaller, enabledComponents,
                            disabledComponents, installReason, uninstallReason, harmfulAppWarning);

                    mDomainVerificationManager.setLegacyUserState(name, userId, verifState);
                } else if (tagName.equals("preferred-activities")) {
                    readPreferredActivitiesLPw(parser, userId);
                } else if (tagName.equals(TAG_PERSISTENT_PREFERRED_ACTIVITIES)) {
@@ -1773,9 +1754,6 @@ public final class Settings implements Watchable, Snappable {
            }

            str.close();

            mNextAppLinkGeneration.put(userId, maxAppLinkGeneration + 1);

        } catch (XmlPullParserException e) {
            mReadMessages.append("Error reading: " + e.toString());
            PackageManagerService.reportSettingsProblem(Log.ERROR,
@@ -2002,15 +1980,6 @@ public final class Settings implements Watchable, Snappable {
                                ustate.lastDisableAppCaller);
                    }
                }
                if (ustate.domainVerificationStatus !=
                        PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED) {
                    serializer.attributeInt(null, ATTR_DOMAIN_VERIFICATON_STATE,
                            ustate.domainVerificationStatus);
                }
                if (ustate.appLinkGeneration != 0) {
                    serializer.attributeInt(null, ATTR_APP_LINK_GENERATION,
                            ustate.appLinkGeneration);
                }
                if (ustate.installReason != PackageManager.INSTALL_REASON_UNKNOWN) {
                    serializer.attributeInt(null, ATTR_INSTALL_REASON, ustate.installReason);
                }
@@ -2747,8 +2716,7 @@ public final class Settings implements Watchable, Snappable {
        writeSigningKeySetLPr(serializer, pkg.keySetData);
        writeUpgradeKeySetsLPr(serializer, pkg.keySetData);
        writeKeySetAliasesLPr(serializer, pkg.keySetData);
        mIntentFilterVerificationManager.writeDomainVerificationsLPr(serializer,
                pkg.verificationInfo);
        mDomainVerificationManager.writeLegacySettings(serializer, pkg.name);
        writeMimeGroupLPr(serializer, pkg.mimeGroups);

        serializer.endTag(null, "package");
@@ -2924,6 +2892,9 @@ public final class Settings implements Watchable, Snappable {
                    ver.fingerprint = XmlUtils.readStringAttribute(parser, ATTR_FINGERPRINT);
                } else if (tagName.equals(DomainVerificationPersistence.TAG_DOMAIN_VERIFICATIONS)) {
                    mDomainVerificationManager.readSettings(parser);
                } else if (tagName.equals(
                        DomainVerificationLegacySettings.TAG_DOMAIN_VERIFICATIONS_LEGACY)) {
                    mDomainVerificationManager.readLegacySettings(parser);
                } else {
                    Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: "
                            + parser.getName());
@@ -3739,9 +3710,8 @@ public final class Settings implements Watchable, Snappable {
                    packageSetting.installSource =
                            packageSetting.installSource.setInitiatingPackageSignatures(signatures);
                } else if (tagName.equals(TAG_DOMAIN_VERIFICATION)) {
                    IntentFilterVerificationInfo ivi =
                            mIntentFilterVerificationManager.readDomainVerificationLPw(parser);
                    packageSetting.setIntentFilterVerificationInfo(ivi);
                    IntentFilterVerificationInfo ivi = new IntentFilterVerificationInfo(parser);
                    mDomainVerificationManager.addLegacySetting(packageSetting.name, ivi);
                    if (DEBUG_PARSER) {
                        Log.d(TAG, "Read domain verification for package: " + ivi.getPackageName());
                    }
+2 −18
Original line number Diff line number Diff line
@@ -88,9 +88,8 @@ public class DomainVerificationCollector {
    @NonNull
    private ArraySet<String> collectDomains(@NonNull AndroidPackage pkg,
            boolean checkAutoVerify) {
        @SuppressWarnings("ConstantConditions")
        boolean restrictDomains = Binder.withCleanCallingIdentity(
                () -> mPlatformCompat.isChangeEnabled(RESTRICT_DOMAINS, buildMockAppInfo(pkg)));
        boolean restrictDomains =
                DomainVerificationUtils.isChangeEnabled(mPlatformCompat, pkg, RESTRICT_DOMAINS);

        ArraySet<String> domains = new ArraySet<>();

@@ -198,19 +197,4 @@ public class DomainVerificationCollector {
            }
        }
    }

    /**
     * Passed to {@link PlatformCompat} because this can be invoked mid-install process, and
     * {@link PlatformCompat} will not be able to query the pending {@link ApplicationInfo} from
     * {@link PackageManager}.
     *
     * TODO(b/177613575): Can a different API be used?
     */
    @NonNull
    private ApplicationInfo buildMockAppInfo(@NonNull AndroidPackage pkg) {
        ApplicationInfo appInfo = new ApplicationInfo();
        appInfo.packageName = pkg.getPackageName();
        appInfo.targetSdkVersion = pkg.getTargetSdkVersion();
        return appInfo;
    }
}
Loading