From efa798321976ec73521ef327e13ae64502c55c40 Mon Sep 17 00:00:00 2001 From: Carmelo Messina Date: Thu, 3 Oct 2024 12:27:40 +0200 Subject: [PATCH] Add flag to disable external intent requests: enable "tel:" schema (#1489) merge "Revert Delete block-external-form-redirects" patch --- build/cromite_patches_list.txt | 1 - ...-to-disable-external-intent-requests.patch | 130 +++++++++++++++++- ...Delete-block-external-form-redirects.patch | 128 ----------------- 3 files changed, 125 insertions(+), 134 deletions(-) delete mode 100644 build/patches/Revert-Delete-block-external-form-redirects.patch diff --git a/build/cromite_patches_list.txt b/build/cromite_patches_list.txt index e673a8e4..87a64299 100644 --- a/build/cromite_patches_list.txt +++ b/build/cromite_patches_list.txt @@ -117,7 +117,6 @@ User-agent-customization.patch Add-AllowUserCertificates-flag.patch Add-IsCleartextPermitted-flag.patch Add-flag-for-omnibox-autocomplete-filtering.patch -Revert-Delete-block-external-form-redirects.patch Add-flag-to-disable-external-intent-requests.patch Enable-share-intent.patch Logcat-crash-reports-UI.patch diff --git a/build/patches/Add-flag-to-disable-external-intent-requests.patch b/build/patches/Add-flag-to-disable-external-intent-requests.patch index 8c896f96..8af98e72 100644 --- a/build/patches/Add-flag-to-disable-external-intent-requests.patch +++ b/build/patches/Add-flag-to-disable-external-intent-requests.patch @@ -3,20 +3,29 @@ Date: Tue, 25 May 2021 19:46:14 +0200 Subject: Add flag to disable external intent requests Adds a new flag that allows to control the switch with same name; -when flag is disabled no external intent will ever be allowed, for any URL. +when flag is disabled no external intent will ever be allowed, +for any URL except for the tel: schema. +This also reverts commit b710cefb53b558a8bcd884f6baf0229ba4225721 and +enables IntentBlockExternalFormRedirectsNoGesture. License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html --- .../java/res/xml/privacy_preferences.xml | 7 +++- - .../ExternalNavigationDelegateImpl.java | 3 +- + .../ExternalNavigationDelegateImpl.java | 4 ++- .../cromite/sAllowExternalIntentRequests.java | 33 +++++++++++++++++++ ...g-to-disable-external-intent-requests.grdp | 9 +++++ + .../android/external_intents_features.cc | 7 +++- + .../android/external_intents_features.h | 1 + + .../ExternalIntentsFeatures.java | 6 ++++ + .../ExternalNavigationHandler.java | 21 ++++++++++++ ...ag-to-disable-external-intent-requests.inc | 13 ++++++++ + ...t-Delete-block-external-form-redirects.inc | 15 +++++++++ ...ag-to-disable-external-intent-requests.inc | 3 ++ - 6 files changed, 66 insertions(+), 2 deletions(-) + 11 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sAllowExternalIntentRequests.java create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Add-flag-to-disable-external-intent-requests.grdp create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Add-flag-to-disable-external-intent-requests.inc + create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Revert-Delete-block-external-form-redirects.inc create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Add-flag-to-disable-external-intent-requests.inc diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml @@ -47,11 +56,12 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/Ext import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; -@@ -103,7 +104,7 @@ public class ExternalNavigationDelegateImpl implements ExternalNavigationDelegat +@@ -103,7 +104,8 @@ public class ExternalNavigationDelegateImpl implements ExternalNavigationDelegat @Override public boolean shouldDisableExternalIntentRequestsForUrl(GURL url) { - return false; ++ if ("tel".equals(url.getScheme())) return false; + return !sAllowExternalIntentRequests.getInstance().isEnabled(); } @@ -105,9 +115,99 @@ new file mode 100644 + Allow forward URL requests to external intents + + -+ If disabled, URL requests will never allow redirection to an external intent, such as open application or dialer. Caution: since no verification is possible on the information, allows linkage between browser browsing and activity on the application. ++ If disabled, URL requests will never allow redirection to an external intent, such as open application. Caution: since no verification is possible on the information, allows linkage between browser browsing and activity on the application. + + +diff --git a/components/external_intents/android/external_intents_features.cc b/components/external_intents/android/external_intents_features.cc +--- a/components/external_intents/android/external_intents_features.cc ++++ b/components/external_intents/android/external_intents_features.cc +@@ -27,7 +27,6 @@ namespace { + const base::Feature* kFeaturesExposedToJava[] = { + &kExternalNavigationDebugLogs, &kBlockFrameRenavigations, + &kBlockIntentsToSelf, &kTrustedClientGestureBypass}; +- + } // namespace + + // Alphabetical: +@@ -48,7 +47,13 @@ BASE_FEATURE(kTrustedClientGestureBypass, + "TrustedClientGestureBypass", + base::FEATURE_ENABLED_BY_DEFAULT); + ++CROMITE_FEATURE(kIntentBlockExternalFormRedirectsNoGesture, ++ "IntentBlockExternalFormRedirectsNoGesture", ++ base::FEATURE_ENABLED_BY_DEFAULT); ++ + static jlong JNI_ExternalIntentsFeatures_GetFeature(JNIEnv* env, jint ordinal) { ++ if (ordinal == -1) ++ return reinterpret_cast(&kIntentBlockExternalFormRedirectsNoGesture); + return reinterpret_cast(kFeaturesExposedToJava[ordinal]); + } + +diff --git a/components/external_intents/android/external_intents_features.h b/components/external_intents/android/external_intents_features.h +--- a/components/external_intents/android/external_intents_features.h ++++ b/components/external_intents/android/external_intents_features.h +@@ -9,6 +9,7 @@ + + namespace external_intents { + ++BASE_DECLARE_FEATURE(kIntentBlockExternalFormRedirectsNoGesture); + BASE_DECLARE_FEATURE(kExternalNavigationDebugLogs); + BASE_DECLARE_FEATURE(kBlockFrameRenavigations); + BASE_DECLARE_FEATURE(kBlockIntentsToSelf); +diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java +--- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java ++++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java +@@ -18,6 +18,12 @@ import org.chromium.base.Features; + */ + @JNINamespace("external_intents") + public class ExternalIntentsFeatures extends Features { ++ public static final String INTENT_BLOCK_EXTERNAL_FORM_REDIRECT_NO_GESTURE_NAME = ++ "IntentBlockExternalFormRedirectsNoGesture"; ++ ++ public static final ExternalIntentsFeatures INTENT_BLOCK_EXTERNAL_FORM_REDIRECT_NO_GESTURE = ++ new ExternalIntentsFeatures(-1, INTENT_BLOCK_EXTERNAL_FORM_REDIRECT_NO_GESTURE_NAME); ++ + public static final String EXTERNAL_NAVIGATION_DEBUG_LOGS_NAME = "ExternalNavigationDebugLogs"; + public static final String BLOCK_FRAME_RENAVIGATIONS_NAME = "BlockFrameRenavigations3"; + public static final String BLOCK_INTENTS_TO_SELF_NAME = "BlockIntentsToSelf"; +diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java +--- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java ++++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java +@@ -1560,6 +1560,12 @@ public class ExternalNavigationHandler { + || ignoreBackForwardNav(params); + } + ++ /** Wrapper of check against the feature to support overriding for testing. */ ++ @VisibleForTesting ++ boolean blockExternalFormRedirectsWithoutGesture() { ++ return ExternalIntentsFeatures.INTENT_BLOCK_EXTERNAL_FORM_REDIRECT_NO_GESTURE.isEnabled(); ++ } ++ + private OverrideUrlLoadingResult shouldOverrideUrlLoadingInternal( + ExternalNavigationParams params, + Intent targetIntent, +@@ -1623,6 +1629,21 @@ public class ExternalNavigationHandler { + return OverrideUrlLoadingResult.forNoOverride(); + } + ++ // http://crbug.com/839751: Require user gestures for form submits to external ++ // protocols. ++ // TODO(tedchoc): Turn this on by default once we verify this change does ++ // not break the world. ++ int pageTransitionCore = params.getPageTransition() & PageTransition.CORE_MASK; ++ boolean isFormSubmit = pageTransitionCore == PageTransition.FORM_SUBMIT; ++ boolean isRedirectFromFormSubmit = isFormSubmit && params.isRedirect(); ++ if (isRedirectFromFormSubmit && !incomingIntentRedirect && !params.hasUserGesture() ++ && blockExternalFormRedirectsWithoutGesture()) { ++ if (debug()) { ++ Log.i(TAG, "Incoming form intent attempting to redirect without user gesture"); ++ } ++ return OverrideUrlLoadingResult.forNoOverride(); ++ } ++ + if (hasInternalScheme(params.getUrl(), targetIntent) + || hasContentScheme(params.getUrl(), targetIntent) + || hasFileSchemeInIntentURI(params.getUrl(), targetIntent)) { diff --git a/cromite_flags/chrome/browser/about_flags_cc/Add-flag-to-disable-external-intent-requests.inc b/cromite_flags/chrome/browser/about_flags_cc/Add-flag-to-disable-external-intent-requests.inc new file mode 100644 --- /dev/null @@ -126,6 +226,26 @@ new file mode 100644 +#endif + +#endif +diff --git a/cromite_flags/chrome/browser/about_flags_cc/Revert-Delete-block-external-form-redirects.inc b/cromite_flags/chrome/browser/about_flags_cc/Revert-Delete-block-external-form-redirects.inc +new file mode 100644 +--- /dev/null ++++ b/cromite_flags/chrome/browser/about_flags_cc/Revert-Delete-block-external-form-redirects.inc +@@ -0,0 +1,15 @@ ++#if BUILDFLAG(IS_ANDROID) ++ ++#ifdef FLAG_SECTION ++ ++ {"block-external-form-redirects-no-gesture", ++ "Block intents from form submissions without user gesture", ++ "Require a user gesture that triggered a form submission in order to " ++ "allow for redirecting to an external intent.", ++ kOsAndroid, ++ FEATURE_VALUE_TYPE( ++ external_intents::kIntentBlockExternalFormRedirectsNoGesture)}, ++ ++#endif ++ ++#endif diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Add-flag-to-disable-external-intent-requests.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Add-flag-to-disable-external-intent-requests.inc new file mode 100644 --- /dev/null diff --git a/build/patches/Revert-Delete-block-external-form-redirects.patch b/build/patches/Revert-Delete-block-external-form-redirects.patch deleted file mode 100644 index 945c22ed..00000000 --- a/build/patches/Revert-Delete-block-external-form-redirects.patch +++ /dev/null @@ -1,128 +0,0 @@ -From: csagan5 <32685696+csagan5@users.noreply.github.com> -Date: Thu, 16 Jun 2022 23:23:43 +0200 -Subject: Revert "Delete block-external-form-redirects" - -This reverts commit b710cefb53b558a8bcd884f6baf0229ba4225721 and -enables IntentBlockExternalFormRedirectsNoGesture. - -License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html ---- - .../android/external_intents_features.cc | 7 ++++++- - .../android/external_intents_features.h | 1 + - .../ExternalIntentsFeatures.java | 6 ++++++ - .../ExternalNavigationHandler.java | 21 +++++++++++++++++++ - ...t-Delete-block-external-form-redirects.inc | 15 +++++++++++++ - 5 files changed, 49 insertions(+), 1 deletion(-) - create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Revert-Delete-block-external-form-redirects.inc - -diff --git a/components/external_intents/android/external_intents_features.cc b/components/external_intents/android/external_intents_features.cc ---- a/components/external_intents/android/external_intents_features.cc -+++ b/components/external_intents/android/external_intents_features.cc -@@ -27,7 +27,6 @@ namespace { - const base::Feature* kFeaturesExposedToJava[] = { - &kExternalNavigationDebugLogs, &kBlockFrameRenavigations, - &kBlockIntentsToSelf, &kTrustedClientGestureBypass}; -- - } // namespace - - // Alphabetical: -@@ -48,7 +47,13 @@ BASE_FEATURE(kTrustedClientGestureBypass, - "TrustedClientGestureBypass", - base::FEATURE_ENABLED_BY_DEFAULT); - -+CROMITE_FEATURE(kIntentBlockExternalFormRedirectsNoGesture, -+ "IntentBlockExternalFormRedirectsNoGesture", -+ base::FEATURE_ENABLED_BY_DEFAULT); -+ - static jlong JNI_ExternalIntentsFeatures_GetFeature(JNIEnv* env, jint ordinal) { -+ if (ordinal == -1) -+ return reinterpret_cast(&kIntentBlockExternalFormRedirectsNoGesture); - return reinterpret_cast(kFeaturesExposedToJava[ordinal]); - } - -diff --git a/components/external_intents/android/external_intents_features.h b/components/external_intents/android/external_intents_features.h ---- a/components/external_intents/android/external_intents_features.h -+++ b/components/external_intents/android/external_intents_features.h -@@ -9,6 +9,7 @@ - - namespace external_intents { - -+BASE_DECLARE_FEATURE(kIntentBlockExternalFormRedirectsNoGesture); - BASE_DECLARE_FEATURE(kExternalNavigationDebugLogs); - BASE_DECLARE_FEATURE(kBlockFrameRenavigations); - BASE_DECLARE_FEATURE(kBlockIntentsToSelf); -diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java ---- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java -+++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java -@@ -18,6 +18,12 @@ import org.chromium.base.Features; - */ - @JNINamespace("external_intents") - public class ExternalIntentsFeatures extends Features { -+ public static final String INTENT_BLOCK_EXTERNAL_FORM_REDIRECT_NO_GESTURE_NAME = -+ "IntentBlockExternalFormRedirectsNoGesture"; -+ -+ public static final ExternalIntentsFeatures INTENT_BLOCK_EXTERNAL_FORM_REDIRECT_NO_GESTURE = -+ new ExternalIntentsFeatures(-1, INTENT_BLOCK_EXTERNAL_FORM_REDIRECT_NO_GESTURE_NAME); -+ - public static final String EXTERNAL_NAVIGATION_DEBUG_LOGS_NAME = "ExternalNavigationDebugLogs"; - public static final String BLOCK_FRAME_RENAVIGATIONS_NAME = "BlockFrameRenavigations3"; - public static final String BLOCK_INTENTS_TO_SELF_NAME = "BlockIntentsToSelf"; -diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java ---- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java -+++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java -@@ -1560,6 +1560,12 @@ public class ExternalNavigationHandler { - || ignoreBackForwardNav(params); - } - -+ /** Wrapper of check against the feature to support overriding for testing. */ -+ @VisibleForTesting -+ boolean blockExternalFormRedirectsWithoutGesture() { -+ return ExternalIntentsFeatures.INTENT_BLOCK_EXTERNAL_FORM_REDIRECT_NO_GESTURE.isEnabled(); -+ } -+ - private OverrideUrlLoadingResult shouldOverrideUrlLoadingInternal( - ExternalNavigationParams params, - Intent targetIntent, -@@ -1623,6 +1629,21 @@ public class ExternalNavigationHandler { - return OverrideUrlLoadingResult.forNoOverride(); - } - -+ // http://crbug.com/839751: Require user gestures for form submits to external -+ // protocols. -+ // TODO(tedchoc): Turn this on by default once we verify this change does -+ // not break the world. -+ int pageTransitionCore = params.getPageTransition() & PageTransition.CORE_MASK; -+ boolean isFormSubmit = pageTransitionCore == PageTransition.FORM_SUBMIT; -+ boolean isRedirectFromFormSubmit = isFormSubmit && params.isRedirect(); -+ if (isRedirectFromFormSubmit && !incomingIntentRedirect && !params.hasUserGesture() -+ && blockExternalFormRedirectsWithoutGesture()) { -+ if (debug()) { -+ Log.i(TAG, "Incoming form intent attempting to redirect without user gesture"); -+ } -+ return OverrideUrlLoadingResult.forNoOverride(); -+ } -+ - if (hasInternalScheme(params.getUrl(), targetIntent) - || hasContentScheme(params.getUrl(), targetIntent) - || hasFileSchemeInIntentURI(params.getUrl(), targetIntent)) { -diff --git a/cromite_flags/chrome/browser/about_flags_cc/Revert-Delete-block-external-form-redirects.inc b/cromite_flags/chrome/browser/about_flags_cc/Revert-Delete-block-external-form-redirects.inc -new file mode 100644 ---- /dev/null -+++ b/cromite_flags/chrome/browser/about_flags_cc/Revert-Delete-block-external-form-redirects.inc -@@ -0,0 +1,15 @@ -+#if BUILDFLAG(IS_ANDROID) -+ -+#ifdef FLAG_SECTION -+ -+ {"block-external-form-redirects-no-gesture", -+ "Block intents from form submissions without user gesture", -+ "Require a user gesture that triggered a form submission in order to " -+ "allow for redirecting to an external intent.", -+ kOsAndroid, -+ FEATURE_VALUE_TYPE( -+ external_intents::kIntentBlockExternalFormRedirectsNoGesture)}, -+ -+#endif -+ -+#endif ---