diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelper.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelper.java index 6b6e51d22a76..0f6ef0399041 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelper.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelper.java @@ -15,6 +15,7 @@ */ package org.jetbrains.plugins.gradle.service.execution; +import com.google.common.annotations.VisibleForTesting; import com.intellij.execution.configurations.GeneralCommandLine; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; @@ -143,7 +144,9 @@ public class GradleExecutionHelper { } if (!settings.getArguments().isEmpty()) { - LOG.info("Passing command-line args to Gradle Tooling API: " + StringUtil.join(settings.getArguments(), " ")); + String loggableArgs = StringUtil.join(obfuscatePasswordParameters(settings.getArguments()), " "); + LOG.info("Passing command-line args to Gradle Tooling API: " + loggableArgs); + // filter nulls and empty strings List filteredArgs = ContainerUtil.mapNotNull(settings.getArguments(), s -> StringUtil.isEmpty(s) ? null : s); @@ -575,6 +578,26 @@ public class GradleExecutionHelper { return result; } + @VisibleForTesting + @NotNull + static List obfuscatePasswordParameters(@NotNull List commandLineArguments) { + List replaced = new ArrayList<>(commandLineArguments.size()); + final String PASSWORD_PARAMETER_IDENTIFIER = ".password="; + for (String option : commandLineArguments) { + // Find parameters ending in "password", like: + // -Pandroid.injected.signing.store.password= + // -Pandroid.injected.signing.key.password= + int index = option.indexOf(PASSWORD_PARAMETER_IDENTIFIER); + if (index == -1) { + replaced.add(option); + } + else { + replaced.add(option.substring(0, index + PASSWORD_PARAMETER_IDENTIFIER.length()) + "*********"); + } + } + return replaced; + } + /** * @deprecated to be removed in future version */ diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelperTest.java b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelperTest.java new file mode 100644 index 000000000000..20bdb70a4289 --- /dev/null +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelperTest.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.gradle.service.execution; + +import com.google.common.collect.ImmutableList; +import org.junit.Test; + +import java.util.List; + +import static org.junit.Assert.assertEquals; + +public class GradleExecutionHelperTest { + + @Test + public void testPasswordObfuscation() throws Exception { + List originalArgs = ImmutableList.of( + "--configure-on-demand", + "-Pandroid.injected.invoked.from.ide=true", + "-Pandroid.injected.signing.store.password=asdfghjkl;", + "-Pandroid.injected.signing.key.alias=testKey", + "-Pandroid.injected.signing.key.password=blabla", + "/tmp/asLocalRepo1004.gradle" + ); + + List obfuscatedArgs = GradleExecutionHelper.obfuscatePasswordParameters(originalArgs); + + List expectedArgs = ImmutableList.of( + "--configure-on-demand", + "-Pandroid.injected.invoked.from.ide=true", + "-Pandroid.injected.signing.store.password=*********", + "-Pandroid.injected.signing.key.alias=testKey", + "-Pandroid.injected.signing.key.password=*********", + "/tmp/asLocalRepo1004.gradle" + ); + + assertEquals(obfuscatedArgs, expectedArgs); + } +}