diff options
3 files changed, 33 insertions, 1 deletions
diff --git a/core/java/android/content/ClipData.java b/core/java/android/content/ClipData.java index e271cf4f60ec..4e292d0b7d18 100644 --- a/core/java/android/content/ClipData.java +++ b/core/java/android/content/ClipData.java @@ -221,6 +221,12 @@ public class ClipData implements Parcelable { // if the data is obtained from {@link #copyForTransferWithActivityInfo} private ActivityInfo mActivityInfo; + private boolean mTokenVerificationEnabled; + + void setTokenVerificationEnabled() { + mTokenVerificationEnabled = true; + } + /** * A builder for a ClipData Item. */ @@ -398,7 +404,9 @@ public class ClipData implements Parcelable { * Retrieve the raw Intent contained in this Item. */ public Intent getIntent() { - Intent.maybeMarkAsMissingCreatorToken(mIntent); + if (mTokenVerificationEnabled) { + Intent.maybeMarkAsMissingCreatorToken(mIntent); + } return mIntent; } @@ -1353,6 +1361,12 @@ public class ClipData implements Parcelable { } } + void setTokenVerificationEnabled() { + for (int i = 0; i < mItems.size(); ++i) { + mItems.get(i).setTokenVerificationEnabled(); + } + } + @Override public int describeContents() { return 0; diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 350048df3112..01e24d81a7cd 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -12506,6 +12506,9 @@ public class Intent implements Parcelable, Cloneable { if (intent.mExtras != null) { intent.mExtras.enableTokenVerification(); } + if (intent.mClipData != null) { + intent.mClipData.setTokenVerificationEnabled(); + } }; /** @hide */ @@ -12517,6 +12520,9 @@ public class Intent implements Parcelable, Cloneable { // mark trusted creator token present. mExtras.enableTokenVerification(); } + if (mClipData != null) { + mClipData.setTokenVerificationEnabled(); + } } /** @hide */ diff --git a/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java index 6defadf44d05..35ab2d233563 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java @@ -1454,6 +1454,18 @@ public class ActivityManagerServiceTest { assertThat(tokenForFullIntent.getKeyFields()).isEqualTo(tokenForCloneIntent.getKeyFields()); } + @Test + public void testCanLaunchClipDataIntent() { + ClipData clipData = ClipData.newIntent("test", new Intent("test")); + clipData.prepareToLeaveProcess(true); + // skip mimicking sending clipData to another app because it will just be parceled and + // un-parceled. + Intent intent = clipData.getItemAt(0).getIntent(); + // default intent redirect protection won't block an intent nested in a top level ClipData. + assertThat(intent.getExtendedFlags() + & Intent.EXTENDED_FLAG_MISSING_CREATOR_OR_INVALID_TOKEN).isEqualTo(0); + } + private void verifyWaitingForNetworkStateUpdate(long curProcStateSeq, long lastNetworkUpdatedProcStateSeq, final long procStateSeqToWait, boolean expectWait) throws Exception { |