Skip to content

Commit d1b5cfc

Browse files
author
rich cannings
committed
Notify verifiers that verification is complete
Send the Intent.ACTION_PACKAGE_VERIFIED to all verifiers when verification is complete (either one verifier verified the package or a timeout occurred). Details of what occurred is in a new extra, PackageManager.EXTRA_VERIFICATION_RESULT. Bug: 7048930 Change-Id: I4f9855a29b0eb6d77f469891402c69e2e8922945
1 parent 0fa814d commit d1b5cfc

File tree

5 files changed

+54
-7
lines changed

5 files changed

+54
-7
lines changed

api/current.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5758,6 +5758,7 @@ package android.content {
57585758
field public static final java.lang.String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
57595759
field public static final java.lang.String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED";
57605760
field public static final java.lang.String ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED";
5761+
field public static final java.lang.String ACTION_PACKAGE_VERIFIED = "android.intent.action.PACKAGE_VERIFIED";
57615762
field public static final java.lang.String ACTION_PASTE = "android.intent.action.PASTE";
57625763
field public static final java.lang.String ACTION_PICK = "android.intent.action.PICK";
57635764
field public static final java.lang.String ACTION_PICK_ACTIVITY = "android.intent.action.PICK_ACTIVITY";
@@ -6550,6 +6551,7 @@ package android.content.pm {
65506551
field public static final int COMPONENT_ENABLED_STATE_ENABLED = 1; // 0x1
65516552
field public static final int DONT_KILL_APP = 1; // 0x1
65526553
field public static final java.lang.String EXTRA_VERIFICATION_ID = "android.content.pm.extra.VERIFICATION_ID";
6554+
field public static final java.lang.String EXTRA_VERIFICATION_RESULT = "android.content.pm.extra.VERIFICATION_RESULT";
65536555
field public static final java.lang.String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency";
65546556
field public static final java.lang.String FEATURE_BLUETOOTH = "android.hardware.bluetooth";
65556557
field public static final java.lang.String FEATURE_CAMERA = "android.hardware.camera";

core/java/android/content/Intent.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1640,6 +1640,15 @@ public static Intent createChooser(Intent target, CharSequence title) {
16401640
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
16411641
public static final String ACTION_PACKAGE_NEEDS_VERIFICATION = "android.intent.action.PACKAGE_NEEDS_VERIFICATION";
16421642

1643+
/**
1644+
* Broadcast Action: Sent to the system package verifier when a package is
1645+
* verified. The data contains the package URI.
1646+
* <p class="note">
1647+
* This is a protected intent that can only be sent by the system.
1648+
*/
1649+
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1650+
public static final String ACTION_PACKAGE_VERIFIED = "android.intent.action.PACKAGE_VERIFIED";
1651+
16431652
/**
16441653
* Broadcast Action: Resources for a set of packages (which were
16451654
* previously unavailable) are currently

core/java/android/content/pm/PackageManager.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,6 +1150,14 @@ public NameNotFoundException(String name) {
11501150
public static final String EXTRA_VERIFICATION_INSTALL_FLAGS
11511151
= "android.content.pm.extra.VERIFICATION_INSTALL_FLAGS";
11521152

1153+
/**
1154+
* Extra field name for the result of a verification, either
1155+
* {@link #VERIFICATION_ALLOW}, or {@link #VERIFICATION_REJECT}.
1156+
* Passed to package verifiers after a package is verified.
1157+
*/
1158+
public static final String EXTRA_VERIFICATION_RESULT
1159+
= "android.content.pm.extra.VERIFICATION_RESULT";
1160+
11531161
/**
11541162
* Retrieve overall information about an application package that is
11551163
* installed on the system.
@@ -2341,12 +2349,19 @@ public abstract int installExistingPackage(String packageName)
23412349
* {@link PackageManager#EXTRA_VERIFICATION_ID} Intent extra
23422350
* @param verificationCodeAtTimeout either
23432351
* {@link PackageManager#VERIFICATION_ALLOW} or
2352+
* {@link PackageManager#VERIFICATION_REJECT}. If
2353+
* {@code verificationCodeAtTimeout} is neither
2354+
* {@link PackageManager#VERIFICATION_ALLOW} or
2355+
* {@link PackageManager#VERIFICATION_REJECT}, then
2356+
* {@code verificationCodeAtTimeout} will default to
23442357
* {@link PackageManager#VERIFICATION_REJECT}.
23452358
* @param millisecondsToDelay the amount of time requested for the timeout.
23462359
* Must be positive and less than
2360+
* {@link PackageManager#MAXIMUM_VERIFICATION_TIMEOUT}. If
2361+
* {@code millisecondsToDelay} is out of bounds,
2362+
* {@code millisecondsToDelay} will be set to the closest in
2363+
* bounds value; namely, 0 or
23472364
* {@link PackageManager#MAXIMUM_VERIFICATION_TIMEOUT}.
2348-
* @throws IllegalArgumentException if {@code millisecondsToDelay} is out
2349-
* of bounds or {@code verificationCodeAtTimeout} is unknown.
23502365
* @throws SecurityException if the caller does not have the
23512366
* {@link android.Manifest.permission#PACKAGE_VERIFICATION_AGENT}
23522367
* permission.

core/res/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
<protected-broadcast android:name="android.intent.action.PACKAGE_DATA_CLEARED" />
4444
<protected-broadcast android:name="android.intent.action.PACKAGE_FIRST_LAUNCH" />
4545
<protected-broadcast android:name="android.intent.action.PACKAGE_NEEDS_VERIFICATION" />
46+
<protected-broadcast android:name="android.intent.action.PACKAGE_VERIFIED" />
4647
<protected-broadcast android:name="android.intent.action.UID_REMOVED" />
4748
<protected-broadcast android:name="android.intent.action.CONFIGURATION_CHANGED" />
4849
<protected-broadcast android:name="android.intent.action.LOCALE_CHANGED" />

services/java/com/android/server/pm/PackageManagerService.java

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -851,11 +851,16 @@ void doHandleMessage(Message msg) {
851851
+ args.packageURI.toString());
852852
state.setVerifierResponse(Binder.getCallingUid(),
853853
PackageManager.VERIFICATION_ALLOW_WITHOUT_SUFFICIENT);
854+
broadcastPackageVerified(verificationId, args.packageURI,
855+
PackageManager.VERIFICATION_ALLOW);
854856
try {
855857
ret = args.copyApk(mContainerService, true);
856858
} catch (RemoteException e) {
857859
Slog.e(TAG, "Could not contact the ContainerService");
858860
}
861+
} else {
862+
broadcastPackageVerified(verificationId, args.packageURI,
863+
PackageManager.VERIFICATION_REJECT);
859864
}
860865

861866
processPendingInstall(args, ret);
@@ -884,6 +889,8 @@ void doHandleMessage(Message msg) {
884889
int ret;
885890
if (state.isInstallAllowed()) {
886891
ret = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
892+
broadcastPackageVerified(verificationId, args.packageURI,
893+
response.code);
887894
try {
888895
ret = args.copyApk(mContainerService, true);
889896
} catch (RemoteException e) {
@@ -5602,13 +5609,15 @@ public void extendVerificationTimeout(int id, int verificationCodeAtTimeout,
56025609
final PackageVerificationResponse response = new PackageVerificationResponse(
56035610
verificationCodeAtTimeout, Binder.getCallingUid());
56045611

5605-
if ((millisecondsToDelay > PackageManager.MAXIMUM_VERIFICATION_TIMEOUT)
5606-
|| (millisecondsToDelay < 0)) {
5607-
throw new IllegalArgumentException("millisecondsToDelay is out of bounds.");
5612+
if (millisecondsToDelay > PackageManager.MAXIMUM_VERIFICATION_TIMEOUT) {
5613+
millisecondsToDelay = PackageManager.MAXIMUM_VERIFICATION_TIMEOUT;
5614+
}
5615+
if (millisecondsToDelay < 0) {
5616+
millisecondsToDelay = 0;
56085617
}
56095618
if ((verificationCodeAtTimeout != PackageManager.VERIFICATION_ALLOW)
5610-
|| (verificationCodeAtTimeout != PackageManager.VERIFICATION_REJECT)) {
5611-
throw new IllegalArgumentException("verificationCodeAtTimeout is unknown.");
5619+
&& (verificationCodeAtTimeout != PackageManager.VERIFICATION_REJECT)) {
5620+
verificationCodeAtTimeout = PackageManager.VERIFICATION_REJECT;
56125621
}
56135622

56145623
if ((state != null) && !state.timeoutExtended()) {
@@ -5621,6 +5630,17 @@ public void extendVerificationTimeout(int id, int verificationCodeAtTimeout,
56215630
}
56225631
}
56235632

5633+
private void broadcastPackageVerified(int verificationId, Uri packageUri,
5634+
int verificationCode) {
5635+
final Intent intent = new Intent(Intent.ACTION_PACKAGE_VERIFIED);
5636+
intent.setDataAndType(packageUri, PACKAGE_MIME_TYPE);
5637+
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
5638+
intent.putExtra(PackageManager.EXTRA_VERIFICATION_ID, verificationId);
5639+
intent.putExtra(PackageManager.EXTRA_VERIFICATION_RESULT, verificationCode);
5640+
5641+
mContext.sendBroadcast(intent, android.Manifest.permission.PACKAGE_VERIFICATION_AGENT);
5642+
}
5643+
56245644
private ComponentName matchComponentForVerifier(String packageName,
56255645
List<ResolveInfo> receivers) {
56265646
ActivityInfo targetReceiver = null;

0 commit comments

Comments
 (0)