Skip to content

Commit a2875f4

Browse files
rich canningsAndroid (Google) Code Review
authored andcommitted
Merge "Notify verifiers that verification is complete" into jb-mr1-dev
2 parents 6cab600 + d1b5cfc commit a2875f4

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.
@@ -2361,12 +2369,19 @@ public abstract int installExistingPackage(String packageName)
23612369
* {@link PackageManager#EXTRA_VERIFICATION_ID} Intent extra
23622370
* @param verificationCodeAtTimeout either
23632371
* {@link PackageManager#VERIFICATION_ALLOW} or
2372+
* {@link PackageManager#VERIFICATION_REJECT}. If
2373+
* {@code verificationCodeAtTimeout} is neither
2374+
* {@link PackageManager#VERIFICATION_ALLOW} or
2375+
* {@link PackageManager#VERIFICATION_REJECT}, then
2376+
* {@code verificationCodeAtTimeout} will default to
23642377
* {@link PackageManager#VERIFICATION_REJECT}.
23652378
* @param millisecondsToDelay the amount of time requested for the timeout.
23662379
* Must be positive and less than
2380+
* {@link PackageManager#MAXIMUM_VERIFICATION_TIMEOUT}. If
2381+
* {@code millisecondsToDelay} is out of bounds,
2382+
* {@code millisecondsToDelay} will be set to the closest in
2383+
* bounds value; namely, 0 or
23672384
* {@link PackageManager#MAXIMUM_VERIFICATION_TIMEOUT}.
2368-
* @throws IllegalArgumentException if {@code millisecondsToDelay} is out
2369-
* of bounds or {@code verificationCodeAtTimeout} is unknown.
23702385
* @throws SecurityException if the caller does not have the
23712386
* {@link android.Manifest.permission#PACKAGE_VERIFICATION_AGENT}
23722387
* 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) {
@@ -5641,13 +5648,15 @@ public void extendVerificationTimeout(int id, int verificationCodeAtTimeout,
56415648
final PackageVerificationResponse response = new PackageVerificationResponse(
56425649
verificationCodeAtTimeout, Binder.getCallingUid());
56435650

5644-
if ((millisecondsToDelay > PackageManager.MAXIMUM_VERIFICATION_TIMEOUT)
5645-
|| (millisecondsToDelay < 0)) {
5646-
throw new IllegalArgumentException("millisecondsToDelay is out of bounds.");
5651+
if (millisecondsToDelay > PackageManager.MAXIMUM_VERIFICATION_TIMEOUT) {
5652+
millisecondsToDelay = PackageManager.MAXIMUM_VERIFICATION_TIMEOUT;
5653+
}
5654+
if (millisecondsToDelay < 0) {
5655+
millisecondsToDelay = 0;
56475656
}
56485657
if ((verificationCodeAtTimeout != PackageManager.VERIFICATION_ALLOW)
5649-
|| (verificationCodeAtTimeout != PackageManager.VERIFICATION_REJECT)) {
5650-
throw new IllegalArgumentException("verificationCodeAtTimeout is unknown.");
5658+
&& (verificationCodeAtTimeout != PackageManager.VERIFICATION_REJECT)) {
5659+
verificationCodeAtTimeout = PackageManager.VERIFICATION_REJECT;
56515660
}
56525661

56535662
if ((state != null) && !state.timeoutExtended()) {
@@ -5660,6 +5669,17 @@ public void extendVerificationTimeout(int id, int verificationCodeAtTimeout,
56605669
}
56615670
}
56625671

5672+
private void broadcastPackageVerified(int verificationId, Uri packageUri,
5673+
int verificationCode) {
5674+
final Intent intent = new Intent(Intent.ACTION_PACKAGE_VERIFIED);
5675+
intent.setDataAndType(packageUri, PACKAGE_MIME_TYPE);
5676+
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
5677+
intent.putExtra(PackageManager.EXTRA_VERIFICATION_ID, verificationId);
5678+
intent.putExtra(PackageManager.EXTRA_VERIFICATION_RESULT, verificationCode);
5679+
5680+
mContext.sendBroadcast(intent, android.Manifest.permission.PACKAGE_VERIFICATION_AGENT);
5681+
}
5682+
56635683
private ComponentName matchComponentForVerifier(String packageName,
56645684
List<ResolveInfo> receivers) {
56655685
ActivityInfo targetReceiver = null;

0 commit comments

Comments
 (0)