Loading core/java/android/content/ClipData.java +15 −1 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -398,7 +404,9 @@ public class ClipData implements Parcelable { * Retrieve the raw Intent contained in this Item. */ public Intent getIntent() { if (mTokenVerificationEnabled) { Intent.maybeMarkAsMissingCreatorToken(mIntent); } return mIntent; } Loading Loading @@ -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; Loading core/java/android/content/Intent.java +6 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -12517,6 +12520,9 @@ public class Intent implements Parcelable, Cloneable { // mark trusted creator token present. mExtras.enableTokenVerification(); } if (mClipData != null) { mClipData.setTokenVerificationEnabled(); } } /** @hide */ services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java +12 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading
core/java/android/content/ClipData.java +15 −1 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -398,7 +404,9 @@ public class ClipData implements Parcelable { * Retrieve the raw Intent contained in this Item. */ public Intent getIntent() { if (mTokenVerificationEnabled) { Intent.maybeMarkAsMissingCreatorToken(mIntent); } return mIntent; } Loading Loading @@ -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; Loading
core/java/android/content/Intent.java +6 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -12517,6 +12520,9 @@ public class Intent implements Parcelable, Cloneable { // mark trusted creator token present. mExtras.enableTokenVerification(); } if (mClipData != null) { mClipData.setTokenVerificationEnabled(); } } /** @hide */
services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java +12 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading