package com.englishtown.bitbucket.hook; import com.atlassian.bitbucket.scm.CommandErrorHandler; import com.atlassian.bitbucket.scm.CommandExitHandler; import com.atlassian.bitbucket.scm.CommandOutputHandler; import com.atlassian.utils.process.StringOutputHandler; import javax.annotation.Nonnull; import javax.annotation.Nullable; /** * Handles removing passwords from output text */ class PasswordHandler extends StringOutputHandler implements CommandOutputHandler<String>, CommandErrorHandler, CommandExitHandler { private final String target; private final CommandExitHandler exitHandler; private static final String PASSWORD_REPLACEMENT = ":*****@"; public PasswordHandler(String password, CommandExitHandler exitHandler) { this.exitHandler = exitHandler; this.target = ":" + password + "@"; } public String cleanText(String text) { if (text == null || text.isEmpty()) { return text; } return text.replace(target, PASSWORD_REPLACEMENT); } @Override public String getOutput() { return cleanText(super.getOutput()); } @Override public void onCancel(@Nonnull String command, int exitCode, @Nullable String stdErr, @Nullable Throwable thrown) { exitHandler.onCancel(cleanText(command), exitCode, cleanText(stdErr), thrown); } @Override public void onExit(@Nonnull String command, int exitCode, @Nullable String stdErr, @Nullable Throwable thrown) { exitHandler.onExit(cleanText(command), exitCode, cleanText(stdErr), thrown); } }