Merge "Verify querent for printing app links state" into sc-v2-dev
This commit is contained in:
@@ -4792,7 +4792,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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,8 +825,12 @@ class DomainVerificationEnforcerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val valueAsInt = value as? Int
|
val valueAsInt = value as? Int
|
||||||
if (valueAsInt != null && valueAsInt == DomainVerificationManager.STATUS_OK) {
|
if (valueAsInt != null) {
|
||||||
throw AssertionError("Expected call to return false, was $value")
|
if (valueAsInt == DomainVerificationManager.STATUS_OK) {
|
||||||
|
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) {
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user