Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(806)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/UrlUtilities.java

Issue 1059413004: Add a validator for intent:// URLs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/UrlUtilities.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/UrlUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/UrlUtilities.java
index 1eca2c96dce9aba68b4853176d8e0fab675a370f..059b27b3e487e8b83af1ddd3b9360dd7bd6705ac 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/UrlUtilities.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/UrlUtilities.java
@@ -11,6 +11,7 @@ import org.chromium.base.CollectionUtil;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashSet;
+import java.util.regex.Pattern;
/**
* Utilities for working with URIs (and URLs). These methods may be used in security-sensitive
@@ -207,6 +208,63 @@ public class UrlUtilities {
return nativeGetDomainAndRegistry(uri, includePrivateRegistries);
}
+ /**
+ * @param url An Android intent:// URL to validate.
+ *
+ * @throws URISyntaxException if url is not a valid Android intent://
+ * URL, as specified at
+ * https://developer.chrome.com/multidevice/android/intents#syntax.
+ */
+ public static boolean validateIntentUrl(String url) {
+ URI parsed = null;
+ try {
+ parsed = new URI(url);
+ } catch (URISyntaxException e) {
+ return false;
+ }
+
+ if (!parsed.getScheme().equals("intent")) {
+ return false;
+ }
+ if (!Pattern.matches("^[\\w\\.-]*$", parsed.getHost())) {
Yaron 2015/04/24 16:04:18 I would build a Matcher and use that since it's re
palmer 2015/04/24 18:05:22 Not exactly; note the allowed "-" (which is legal
+ return false;
+ }
+ if (!parsed.getPath().isEmpty() && !parsed.getPath().equals("/")) {
+ return false;
+ }
+
+ String[] parts = parsed.getFragment().split(";");
+ if (parts.length < 3
+ || parts.length > 7
Jaekyun Seok (inactive) 2015/04/24 02:05:52 parts.length could be bigger than 7 because extra
palmer 2015/04/24 18:05:22 Done.
+ || !parts[0].equals("Intent")
+ || !parts[parts.length - 1].equals("end")) {
+ return false;
+ }
+
+ for (int i = 1; i < parts.length - 1; ++i) {
+ // This is OK *only* because no valid package, action, category,
+ // component, or scheme contains "=".
+ String[] pair = parts[i].split("=");
+ if (2 != pair.length) return false;
+
+ if (pair[0].equals("package")) {
+ if (!Pattern.matches("^[\\w\\.]+$", pair[1])) return false;
+ } else if (pair[0].equals("action")) {
+ if (!Pattern.matches("^[\\w\\.]+$", pair[1])) return false;
+ } else if (pair[0].equals("category")) {
+ if (!Pattern.matches("^[\\w\\.]+$", pair[1])) return false;
+ } else if (pair[0].equals("component")) {
+ if (!Pattern.matches("^[\\w\\.]+$", pair[1])) return false;
+ } else if (pair[0].equals("scheme")) {
+ if (!Pattern.matches("^[a-zA-Z]+$", pair[1])) return false;
+ } else {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
private static native boolean nativeSameDomainOrHost(String primaryUrl, String secondaryUrl,
boolean includePrivateRegistries);
private static native String nativeGetDomainAndRegistry(String url,

Powered by Google App Engine
This is Rietveld 408576698