Merge "Now we check that distribution URL in wrapper file comes from gradle.org." into studio-1.0-release
diff --git a/android/src/com/android/tools/idea/gradle/util/GradleUtil.java b/android/src/com/android/tools/idea/gradle/util/GradleUtil.java
index 50be66b..3671add 100644
--- a/android/src/com/android/tools/idea/gradle/util/GradleUtil.java
+++ b/android/src/com/android/tools/idea/gradle/util/GradleUtil.java
@@ -835,7 +835,9 @@
       if (wrapperPropertiesFile != null) {
         String gradleVersion = null;
         try {
-          gradleVersion = getGradleWrapperVersion(wrapperPropertiesFile);
+          Properties properties = PropertiesUtil.getProperties(wrapperPropertiesFile);
+          String url = properties.getProperty(DISTRIBUTION_URL_PROPERTY);
+          gradleVersion = getGradleWrapperVersionOnlyIfComingForGradleDotOrg(url);
         }
         catch (IOException e) {
           LOG.warn("Failed to read file " + wrapperPropertiesFile.getPath());
@@ -857,6 +859,31 @@
     }
   }
 
+  @VisibleForTesting
+  @Nullable
+  static String getGradleWrapperVersionOnlyIfComingForGradleDotOrg(@Nullable String url) {
+    if (url != null) {
+      int foundIndex = url.indexOf("://");
+      if (foundIndex != -1) {
+        String protocol = url.substring(0, foundIndex);
+        if (protocol.equals("http") || protocol.equals("https")) {
+          String expectedPrefix = protocol + "://services.gradle.org/distributions/gradle-";
+          if (url.startsWith(expectedPrefix)) {
+            // look for "-" before "bin" or "all"
+            foundIndex = url.indexOf('-', expectedPrefix.length());
+            if (foundIndex != -1) {
+              String version = url.substring(expectedPrefix.length(), foundIndex);
+              if (StringUtil.isNotEmpty(version)) {
+                return version;
+              }
+            }
+          }
+        }
+      }
+    }
+    return null;
+  }
+
   // Currently, the latest Gradle version is 2.2.1, and we consider 2.2 and 2.2.1 as compatible.
   private static boolean isCompatibleWithEmbeddedGradleVersion(@NotNull String gradleVersion) {
     return gradleVersion.equals(SdkConstants.GRADLE_MINIMUM_VERSION) || gradleVersion.equals(GRADLE_LATEST_VERSION);
diff --git a/android/testSrc/com/android/tools/idea/gradle/util/GradleUtilTest.java b/android/testSrc/com/android/tools/idea/gradle/util/GradleUtilTest.java
index cf81874..83afe05 100644
--- a/android/testSrc/com/android/tools/idea/gradle/util/GradleUtilTest.java
+++ b/android/testSrc/com/android/tools/idea/gradle/util/GradleUtilTest.java
@@ -223,4 +223,60 @@
     String initScript = FileUtil.loadFile(initScriptPath);
     assertEquals(expectedScript, initScript);
   }
+
+  public void testGetGradleWrapperVersionWithUrl() {
+    // Tries both http and https, bin and all. Also versions 2.2.1, 2.2 and 1.12
+    String url = "https://services.gradle.org/distributions/gradle-2.2.1-all.zip";
+    String version = GradleUtil.getGradleWrapperVersionOnlyIfComingForGradleDotOrg(url);
+    assertEquals("2.2.1", version);
+
+    url = "https://services.gradle.org/distributions/gradle-2.2.1-bin.zip";
+    version = GradleUtil.getGradleWrapperVersionOnlyIfComingForGradleDotOrg(url);
+    assertEquals("2.2.1", version);
+
+    url = "http://services.gradle.org/distributions/gradle-2.2.1-all.zip";
+    version = GradleUtil.getGradleWrapperVersionOnlyIfComingForGradleDotOrg(url);
+    assertEquals("2.2.1", version);
+
+    url = "http://services.gradle.org/distributions/gradle-2.2.1-bin.zip";
+    version = GradleUtil.getGradleWrapperVersionOnlyIfComingForGradleDotOrg(url);
+    assertEquals("2.2.1", version);
+
+    url = "https://services.gradle.org/distributions/gradle-2.2-all.zip";
+    version = GradleUtil.getGradleWrapperVersionOnlyIfComingForGradleDotOrg(url);
+    assertEquals("2.2", version);
+
+    url = "https://services.gradle.org/distributions/gradle-2.2-bin.zip";
+    version = GradleUtil.getGradleWrapperVersionOnlyIfComingForGradleDotOrg(url);
+    assertEquals("2.2", version);
+
+    url = "http://services.gradle.org/distributions/gradle-2.2-all.zip";
+    version = GradleUtil.getGradleWrapperVersionOnlyIfComingForGradleDotOrg(url);
+    assertEquals("2.2", version);
+
+    url = "http://services.gradle.org/distributions/gradle-2.2-bin.zip";
+    version = GradleUtil.getGradleWrapperVersionOnlyIfComingForGradleDotOrg(url);
+    assertEquals("2.2", version);
+
+    url = "https://services.gradle.org/distributions/gradle-1.12-all.zip";
+    version = GradleUtil.getGradleWrapperVersionOnlyIfComingForGradleDotOrg(url);
+    assertEquals("1.12", version);
+
+    url = "https://services.gradle.org/distributions/gradle-1.12-bin.zip";
+    version = GradleUtil.getGradleWrapperVersionOnlyIfComingForGradleDotOrg(url);
+    assertEquals("1.12", version);
+
+    url = "http://services.gradle.org/distributions/gradle-1.12-all.zip";
+    version = GradleUtil.getGradleWrapperVersionOnlyIfComingForGradleDotOrg(url);
+    assertEquals("1.12", version);
+
+    url = "http://services.gradle.org/distributions/gradle-1.12-bin.zip";
+    version = GradleUtil.getGradleWrapperVersionOnlyIfComingForGradleDotOrg(url);
+    assertEquals("1.12", version);
+
+    // Use custom URL.
+    url = "http://myown.com/gradle-2.2.1-bin.zip";
+    version = GradleUtil.getGradleWrapperVersionOnlyIfComingForGradleDotOrg(url);
+    assertNull(version);
+  }
 }