summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/content/ClipData.java16
-rw-r--r--core/java/android/content/Intent.java6
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java12
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 {