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

Commit 346d2769 authored by Winson's avatar Winson
Browse files

Add DomainVerificationProxyV1

Backporting the new per-domain state to the old v1 intent filter
verification agent API.

Uses a new STATE_LEGACY_FAILURE to track the failedDomains returned by
the v1 verification agent, to support per-domain state with the old API.

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

Bug: 170321181

Test: TBD in later change when proxies are combined

Change-Id: I2953f7e0100d425dcb806c607fdeae101803d8f4
parent 0cab1296
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -27,9 +27,6 @@ import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.UserHandle;
import android.util.AndroidException;
import android.util.ArrayMap;

import com.android.server.pm.domain.verify.models.DomainVerificationPkgState;

import java.util.List;
import java.util.Set;
+22 −3
Original line number Diff line number Diff line
@@ -381,6 +381,7 @@ import com.android.server.pm.dex.ViewCompiler;
import com.android.server.pm.domain.verify.DomainVerificationManagerInternal;
import com.android.server.pm.domain.verify.DomainVerificationService;
import com.android.server.pm.domain.verify.proxy.DomainVerificationProxy;
import com.android.server.pm.domain.verify.proxy.DomainVerificationProxyV1;
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;
@@ -1827,7 +1828,8 @@ public class PackageManagerService extends IPackageManager.Stub
            new DomainVerificationConnection();
    private class DomainVerificationConnection implements
            DomainVerificationService.Connection, DomainVerificationProxy.Connection {
            DomainVerificationService.Connection, DomainVerificationProxyV1.Connection,
            DomainVerificationProxyV2.Connection {
        @Override
        public void scheduleWriteSettings() {
@@ -1882,6 +1884,12 @@ public class PackageManagerService extends IPackageManager.Stub
        public AndroidPackage getPackageLocked(@NonNull String pkgName) {
            return PackageManagerService.this.getPackage(pkgName);
        }
        @Nullable
        @Override
        public AndroidPackage getPackage(@NonNull String packageName) {
            return getPackageLocked(packageName);
        }
    }
    /**
@@ -7073,8 +7081,17 @@ public class PackageManagerService extends IPackageManager.Stub
                                    domainVerificationAgent));
                } else {
                    // TODO(b/159952358): DomainVerificationProxyV1
                    ComponentName intentFilterVerifierComponent =
                            getIntentFilterVerifierComponentNameLPr();
                    if (intentFilterVerifierComponent != null) {
                        mDomainVerificationManager.setProxy(
                                new DomainVerificationProxyV1(mContext, mDomainVerificationManager,
                                        mDomainVerificationManager.getCollector(),
                                        mDomainVerificationConnection,
                                        intentFilterVerifierComponent));
                        mIntentFilterVerificationManager.setVerifierComponent(
                            getIntentFilterVerifierComponentNameLPr());
                                intentFilterVerifierComponent);
                    }
                }
                mServicesExtensionPackageName = getRequiredServicesExtensionPackageLPr();
@@ -16427,6 +16444,8 @@ public class PackageManagerService extends IPackageManager.Stub
    @Override
    public void verifyIntentFilter(int id, int verificationCode, List<String> failedDomains) {
        DomainVerificationProxyV1.queueLegacyVerifyResult(mContext, mDomainVerificationConnection,
                id, verificationCode, failedDomains, Binder.getCallingUid());
        mIntentFilterVerificationManager.queueVerifyResult(id, verificationCode, failedDomains);
    }
+18 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.pm.domain.verify;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.UserIdInt;
import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -34,6 +35,7 @@ import com.android.server.pm.domain.verify.proxy.DomainVerificationProxy;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.util.Set;
import java.util.UUID;

public interface DomainVerificationManagerInternal extends DomainVerificationManager {
@@ -57,7 +59,7 @@ public interface DomainVerificationManagerInternal extends DomainVerificationMan
    void setProxy(@NonNull DomainVerificationProxy proxy);

    /**
     * @see DomainVerificationProxy.Connection#runMessage(int, Object)
     * @see DomainVerificationProxy.BaseConnection#runMessage(int, Object)
     */
    boolean runMessage(int messageCode, Object object);

@@ -159,6 +161,9 @@ public interface DomainVerificationManagerInternal extends DomainVerificationMan
    @NonNull
    DomainVerificationShell getShell();

    @NonNull
    DomainVerificationCollector getCollector();

    /**
     * Check if a resolving URI is approved to takeover the domain as the sole resolved target.
     * This can be because the domain was auto-verified for the package, or if the user manually
@@ -166,4 +171,16 @@ public interface DomainVerificationManagerInternal extends DomainVerificationMan
     */
    boolean isApprovedForDomain(@NonNull PackageSetting pkgSetting, @NonNull Intent intent,
            @UserIdInt int userId);

    /**
     * @return the domain verification set ID for the given package, or null if the ID is
     * unavailable
     */
    @Nullable
    UUID getDomainVerificationSetId(@NonNull String packageName);

    @RequiresPermission(android.Manifest.permission.DOMAIN_VERIFICATION_AGENT)
    void setDomainVerificationStatusInternal(int callingUid, @NonNull UUID domainSetId,
            @NonNull Set<String> domains, int state)
            throws InvalidDomainSetException, NameNotFoundException;
}
+1 −0
Original line number Diff line number Diff line
@@ -31,4 +31,5 @@ import com.android.server.pm.domain.verify.proxy.DomainVerificationProxy;
public final class DomainVerificationMessageCodes {

    public static final int SEND_REQUEST = 1;
    public static final int LEGACY_ON_INTENT_FILTER_VERIFIED = 2;
}
+29 −2
Original line number Diff line number Diff line
@@ -175,6 +175,19 @@ public class DomainVerificationService extends SystemService
        return packageNames;
    }

    @Nullable
    @Override
    public UUID getDomainVerificationSetId(@NonNull String packageName) {
        synchronized (mLock) {
            DomainVerificationPkgState pkgState = mAttachedPkgStates.get(packageName);
            if (pkgState != null) {
                return pkgState.getId();
            } else {
                return null;
            }
        }
    }

    @Nullable
    @Override
    public DomainVerificationSet getDomainVerificationSet(@NonNull String packageName)
@@ -213,7 +226,6 @@ public class DomainVerificationService extends SystemService
    @Override
    public void setDomainVerificationStatus(@NonNull UUID domainSetId, @NonNull Set<String> domains,
            int state) throws InvalidDomainSetException, NameNotFoundException {
        mEnforcer.assertApprovedVerifier(mConnection.get().getCallingUid(), mProxy);
        if (state < DomainVerificationState.STATE_FIRST_VERIFIER_DEFINED) {
            if (state != DomainVerificationState.STATE_SUCCESS) {
                throw new IllegalArgumentException(
@@ -222,6 +234,15 @@ public class DomainVerificationService extends SystemService
            }
        }

        setDomainVerificationStatusInternal(mConnection.get().getCallingUid(), domainSetId, domains,
                state);
    }

    @Override
    public void setDomainVerificationStatusInternal(int callingUid, @NonNull UUID domainSetId,
            @NonNull Set<String> domains, int state)
            throws InvalidDomainSetException, NameNotFoundException {
        mEnforcer.assertApprovedVerifier(callingUid, mProxy);
        synchronized (mLock) {
            DomainVerificationPkgState pkgState = getAndValidateAttachedLocked(domainSetId, domains,
                    true /* forAutoVerify */);
@@ -811,6 +832,12 @@ public class DomainVerificationService extends SystemService
        return mShell;
    }

    @NonNull
    @Override
    public DomainVerificationCollector getCollector() {
        return mCollector;
    }

    private void sendBroadcastForPackage(@NonNull String packageName) {
        mProxy.sendBroadcastForPackages(Collections.singleton(packageName));
    }
@@ -1139,7 +1166,7 @@ public class DomainVerificationService extends SystemService
        int getCallingUserId();

        /**
         * @see DomainVerificationProxy.Connection#schedule(int, java.lang.Object)
         * @see DomainVerificationProxy.BaseConnection#schedule(int, java.lang.Object)
         */
        void schedule(int code, @Nullable Object object);

Loading