changeset 786:83e1fb5aa843 Gaya-8.1.x

TW-36251 mask the password in the case of mercurial not found error
author Dmitry Neverov <dmitry.neverov@gmail.com>
date Wed, 30 Apr 2014 12:46:31 +0200
parents d60aa99940ba
children 969b545efa1b 97ae319eed9b
files mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResult.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResultTest.java
diffstat 2 files changed, 28 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResult.java	Thu Apr 17 19:56:05 2014 +0200
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResult.java	Wed Apr 30 12:46:31 2014 +0200
@@ -109,7 +109,7 @@
     Throwable e = getException();
     if (isMercurialNotFoundException(e)) {
       assert e != null;
-      throw new MercurialNotFoundException(myCommand, e);
+      throw new MercurialNotFoundException(getCommand(), e);
     }
     throw new VcsException(message);
   }
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResultTest.java	Thu Apr 17 19:56:05 2014 +0200
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResultTest.java	Wed Apr 30 12:46:31 2014 +0200
@@ -16,12 +16,14 @@
 
 package jetbrains.buildServer.buildTriggers.vcs.mercurial.command;
 
+import com.intellij.execution.process.ProcessNotCreatedException;
 import com.intellij.openapi.diagnostic.Logger;
 import jetbrains.buildServer.ExecResult;
 import jetbrains.buildServer.StreamGobbler;
 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.exception.AbandonedTransactionFound;
 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.exception.UnknownRevisionException;
 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.exception.UnrelatedRepositoryException;
+import jetbrains.buildServer.util.TestFor;
 import jetbrains.buildServer.vcs.VcsException;
 import org.apache.log4j.Level;
 import org.jetbrains.annotations.NonNls;
@@ -31,6 +33,7 @@
 import org.testng.annotations.Test;
 
 import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -40,7 +43,6 @@
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.not;
 import static org.testng.AssertJUnit.*;
-import static org.testng.AssertJUnit.assertTrue;
 
 /**
  * @author dmitry.neverov
@@ -62,6 +64,20 @@
     myLogger.assertLogMessagesDontContain(password);
   }
 
+  @TestFor(issues = "TW-36251")
+  public void exception_should_not_reveal_password_when_mercurial_is_not_found() {
+    String password = "pass";
+    Exception hgNotFound = new ProcessNotCreatedException("Cannot run program \"hg\". No such file or directory", new IOException(), null);
+    CommandResult commandResult = commandResultFor("hg pull https://usr:" + password + "@acme.com", execResult().withException(hgNotFound), password);
+    try {
+      commandResult.checkCommandFailed();
+      fail("should fail");
+    } catch (VcsException e) {
+      assertFalse(e.getMessage().contains(password));
+      myLogger.assertLogMessagesDontContain(password);
+    }
+  }
+
   @DataProvider(name = "exitCodesForErrors")
   public static Object[][] exitCodesForErrors() {
     return new Object[][] {
@@ -152,11 +168,18 @@
     return new ExecResultBuilder();
   }
 
-  CommandResult commandResultFor(ExecResultBuilder builder, String... privateData) {
-    return new CommandResult(myLogger, "", builder.build(), new HashSet<String>(Arrays.asList(privateData)), new CommandSettings());
+  @NotNull
+  CommandResult commandResultFor(@NotNull ExecResultBuilder builder, String... privateData) {
+    return commandResultFor("", builder, privateData);
   }
 
-  CommandResult commandResultFor(ExecResultBuilder builder, CommandSettings settings) {
+  @NotNull
+  CommandResult commandResultFor(@NotNull String command, @NotNull ExecResultBuilder builder, String... privateData) {
+    return new CommandResult(myLogger, command, builder.build(), new HashSet<String>(Arrays.asList(privateData)), new CommandSettings());
+  }
+
+  @NotNull
+  CommandResult commandResultFor(@NotNull ExecResultBuilder builder, CommandSettings settings) {
     return new CommandResult(myLogger, "", builder.build(), new HashSet<String>(), settings);
   }