Merge "Verify querent for printing app links state" into sc-v2-dev am: 8e86f85849

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16549703

Change-Id: Ia5c19d9e0f71f6eb157e30a038f2c6e222dd24de
This commit is contained in:
Winson Chiu
2022-01-06 20:54:48 +00:00
committed by Automerger Merge Worker
4 changed files with 33 additions and 6 deletions

View File

@@ -4794,7 +4794,7 @@ public class PackageManagerService extends IPackageManager.Stub
try { try {
mDomainVerificationManager.printState(writer, packageName, mDomainVerificationManager.printState(writer, packageName,
UserHandle.USER_ALL, mSettings::getPackageLPr); UserHandle.USER_ALL, mSettings::getPackageLPr);
} catch (PackageManager.NameNotFoundException e) { } catch (Exception e) {
pw.println("Failure printing domain verification information"); pw.println("Failure printing domain verification information");
Slog.e(TAG, "Failure printing domain verification information", e); Slog.e(TAG, "Failure printing domain verification information", e);
} }

View File

@@ -70,8 +70,11 @@ public class DomainVerificationEnforcer {
break; break;
default: default:
if (!proxy.isCallerVerifier(callingUid)) { if (!proxy.isCallerVerifier(callingUid)) {
throw new SecurityException( mContext.enforcePermission(android.Manifest.permission.DUMP,
"Caller is not allowed to query domain verification state"); Binder.getCallingPid(), callingUid,
"Caller " + callingUid
+ " is not allowed to query domain verification state");
break;
} }
mContext.enforcePermission(android.Manifest.permission.QUERY_ALL_PACKAGES, mContext.enforcePermission(android.Manifest.permission.QUERY_ALL_PACKAGES,

View File

@@ -1193,6 +1193,7 @@ public class DomainVerificationService extends SystemService
@Nullable @UserIdInt Integer userId, @Nullable @UserIdInt Integer userId,
@NonNull Function<String, PackageSetting> pkgSettingFunction) @NonNull Function<String, PackageSetting> pkgSettingFunction)
throws NameNotFoundException { throws NameNotFoundException {
mEnforcer.assertApprovedQuerent(mConnection.getCallingUid(), mProxy);
synchronized (mLock) { synchronized (mLock) {
mDebug.printState(writer, packageName, userId, pkgSettingFunction, mAttachedPkgStates); mDebug.printState(writer, packageName, userId, pkgSettingFunction, mAttachedPkgStates);
} }

View File

@@ -19,6 +19,7 @@ package com.android.server.pm.test.verify.domain
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.content.pm.PackageParser.SigningDetails
import android.content.pm.PackageUserState import android.content.pm.PackageUserState
import android.content.pm.parsing.component.ParsedActivity import android.content.pm.parsing.component.ParsedActivity
import android.content.pm.parsing.component.ParsedIntentInfo import android.content.pm.parsing.component.ParsedIntentInfo
@@ -27,6 +28,7 @@ import android.content.pm.verify.domain.DomainVerificationState
import android.os.Build import android.os.Build
import android.os.Process import android.os.Process
import android.util.ArraySet import android.util.ArraySet
import android.util.IndentingPrintWriter
import android.util.SparseArray import android.util.SparseArray
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.platform.app.InstrumentationRegistry
import com.android.server.pm.PackageSetting import com.android.server.pm.PackageSetting
@@ -47,6 +49,7 @@ import org.mockito.Mockito.anyInt
import org.mockito.Mockito.anyLong import org.mockito.Mockito.anyLong
import org.mockito.Mockito.anyString import org.mockito.Mockito.anyString
import org.mockito.Mockito.eq import org.mockito.Mockito.eq
import org.mockito.Mockito.mock
import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.Mockito.verifyNoMoreInteractions
import java.io.File import java.io.File
import java.util.UUID import java.util.UUID
@@ -206,6 +209,14 @@ class DomainVerificationEnforcerTest {
service(Type.QUERENT, "getInfo") { service(Type.QUERENT, "getInfo") {
getDomainVerificationInfo(it.targetPackageName) getDomainVerificationInfo(it.targetPackageName)
}, },
service(Type.QUERENT, "printState") {
printState(mock(IndentingPrintWriter::class.java), null, null)
},
service(Type.QUERENT, "printStateInternal") {
printState(mock(IndentingPrintWriter::class.java), null, null) {
mockPkgSetting(it, UUID.randomUUID())
}
},
service(Type.VERIFIER, "setStatus") { service(Type.VERIFIER, "setStatus") {
setDomainVerificationStatus( setDomainVerificationStatus(
it.targetDomainSetId, it.targetDomainSetId,
@@ -311,6 +322,7 @@ class DomainVerificationEnforcerTest {
} }
) )
} }
whenever(signingDetails) { SigningDetails.UNKNOWN }
} }
fun mockPkgSetting(packageName: String, domainSetId: UUID) = spyThrowOnUnmocked( fun mockPkgSetting(packageName: String, domainSetId: UUID) = spyThrowOnUnmocked(
@@ -339,6 +351,7 @@ class DomainVerificationEnforcerTest {
whenever(readUserState(1)) { PackageUserState() } whenever(readUserState(1)) { PackageUserState() }
whenever(getInstantApp(anyInt())) { false } whenever(getInstantApp(anyInt())) { false }
whenever(isSystem()) { false } whenever(isSystem()) { false }
whenever(signingDetails) { SigningDetails.UNKNOWN }
} }
} }
@@ -385,6 +398,7 @@ class DomainVerificationEnforcerTest {
val allowUserState = AtomicBoolean(false) val allowUserState = AtomicBoolean(false)
val allowPreferredApps = AtomicBoolean(false) val allowPreferredApps = AtomicBoolean(false)
val allowQueryAll = AtomicBoolean(false) val allowQueryAll = AtomicBoolean(false)
val allowDump = AtomicBoolean(false)
val context: Context = mockThrowOnUnmocked { val context: Context = mockThrowOnUnmocked {
initPermission( initPermission(
allowUserState, allowUserState,
@@ -395,6 +409,7 @@ class DomainVerificationEnforcerTest {
android.Manifest.permission.SET_PREFERRED_APPLICATIONS android.Manifest.permission.SET_PREFERRED_APPLICATIONS
) )
initPermission(allowQueryAll, android.Manifest.permission.QUERY_ALL_PACKAGES) initPermission(allowQueryAll, android.Manifest.permission.QUERY_ALL_PACKAGES)
initPermission(allowDump, android.Manifest.permission.DUMP)
} }
val target = params.construct(context) val target = params.construct(context)
@@ -421,6 +436,10 @@ class DomainVerificationEnforcerTest {
allowQueryAll.set(true) allowQueryAll.set(true)
assertFails { runMethod(target, NON_VERIFIER_UID) } assertFails { runMethod(target, NON_VERIFIER_UID) }
allowDump.set(true)
runMethod(target, NON_VERIFIER_UID)
} }
private fun approvedVerifier() { private fun approvedVerifier() {
@@ -806,9 +825,13 @@ class DomainVerificationEnforcerTest {
} }
val valueAsInt = value as? Int val valueAsInt = value as? Int
if (valueAsInt != null && valueAsInt == DomainVerificationManager.STATUS_OK) { if (valueAsInt != null) {
if (valueAsInt == DomainVerificationManager.STATUS_OK) {
throw AssertionError("Expected call to return false, was $value") throw AssertionError("Expected call to return false, was $value")
} }
} else {
throw AssertionError("Expected call to fail")
}
} catch (e: SecurityException) { } catch (e: SecurityException) {
} catch (e: PackageManager.NameNotFoundException) { } catch (e: PackageManager.NameNotFoundException) {
// Any of these 2 exceptions are considered failures, which is expected // Any of these 2 exceptions are considered failures, which is expected
@@ -819,7 +842,7 @@ class DomainVerificationEnforcerTest {
// System/shell only // System/shell only
INTERNAL, INTERNAL,
// INTERNAL || non-legacy domain verification agent // INTERNAL || non-legacy domain verification agent || DUMP permission
QUERENT, QUERENT,
// INTERNAL || domain verification agent // INTERNAL || domain verification agent