Skip to content

Commit

Permalink
SONARJNKNS-301 Store tokens as Secret
Browse files Browse the repository at this point in the history
  • Loading branch information
henryju committed Sep 18, 2018
1 parent 521c749 commit d1fe7cf
Show file tree
Hide file tree
Showing 13 changed files with 63 additions and 24 deletions.
10 changes: 7 additions & 3 deletions src/main/java/hudson/plugins/sonar/MsBuildSQRunnerBegin.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@
import java.util.LinkedHashMap;
import java.util.Map;
import javax.annotation.Nullable;

import hudson.util.Secret;
import jenkins.model.Jenkins;
import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;
Expand Down Expand Up @@ -108,9 +110,11 @@ private static Map<String, String> getSonarProps(SonarInstallation inst) {
Map<String, String> map = new LinkedHashMap<>();

map.put("sonar.host.url", inst.getServerUrl());

if (!StringUtils.isBlank(inst.getServerAuthenticationToken())) {
map.put("sonar.login", inst.getServerAuthenticationToken());

Secret token = inst.getServerAuthenticationToken();
String tokenPlainText = token.getPlainText();
if (!StringUtils.isBlank(tokenPlainText)) {
map.put("sonar.login", tokenPlainText);
}

return map;
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/hudson/plugins/sonar/MsBuildSQRunnerEnd.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

import hudson.util.Secret;
import jenkins.model.Jenkins;
import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;
Expand Down Expand Up @@ -102,8 +104,10 @@ private static void addArgs(ArgumentListBuilder args, EnvVars env, SonarInstalla
private static Map<String, String> getSonarProps(SonarInstallation inst) {
Map<String, String> map = new LinkedHashMap<>();

if (!StringUtils.isBlank(inst.getServerAuthenticationToken())) {
map.put("sonar.login", inst.getServerAuthenticationToken());
Secret token = inst.getServerAuthenticationToken();
String tokenPlainText = token.getPlainText();
if (!StringUtils.isBlank(tokenPlainText)) {
map.put("sonar.login", tokenPlainText);
}

return map;
Expand Down
10 changes: 7 additions & 3 deletions src/main/java/hudson/plugins/sonar/SonarBuildWrapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;

import hudson.util.Secret;
import jenkins.tasks.SimpleBuildWrapper;
import org.apache.commons.lang.StringUtils;
import org.jenkinsci.Symbol;
Expand Down Expand Up @@ -83,7 +85,7 @@ static Map<String, String> createVars(SonarInstallation inst, EnvVars initialEnv
map.put("SONAR_CONFIG_NAME", inst.getName());
String hostUrl = getOrDefault(initialEnvironment.expand(inst.getServerUrl()), "http://localhost:9000");
map.put("SONAR_HOST_URL", hostUrl);
String token = getOrDefault(initialEnvironment.expand(inst.getServerAuthenticationToken()), "");
String token = getOrDefault(initialEnvironment.expand(inst.getServerAuthenticationToken().getPlainText()), "");
map.put("SONAR_AUTH_TOKEN", token);

String mojoVersion = inst.getMojoVersion();
Expand Down Expand Up @@ -143,8 +145,10 @@ public ConsoleLogFilter createLoggerDecorator(Run<?, ?> build) {

List<String> passwords = new ArrayList<>();

if (!StringUtils.isBlank(inst.getServerAuthenticationToken())) {
passwords.add(inst.getServerAuthenticationToken());
Secret token = inst.getServerAuthenticationToken();
String tokenPlainText = token.getPlainText();
if (!StringUtils.isBlank(tokenPlainText)) {
passwords.add(tokenPlainText);
}

return new SonarQubePasswordLogFilter(passwords, build.getCharset().name());
Expand Down
10 changes: 6 additions & 4 deletions src/main/java/hudson/plugins/sonar/SonarInstallation.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
import hudson.plugins.sonar.model.TriggersConfig;
import java.io.Serializable;
import javax.annotation.CheckForNull;

import hudson.util.Secret;
import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;

Expand All @@ -39,7 +41,7 @@ public class SonarInstallation implements Serializable {
/**
* @since 2.4
*/
private String serverAuthenticationToken;
private Secret serverAuthenticationToken;

/**
* @since 1.5
Expand All @@ -62,7 +64,7 @@ public SonarInstallation(String name,
String additionalAnalysisProperties) {
this.name = name;
this.serverUrl = serverUrl;
this.serverAuthenticationToken = serverAuthenticationToken;
this.serverAuthenticationToken = Secret.fromString(StringUtils.trimToNull(serverAuthenticationToken));
this.additionalAnalysisProperties = additionalAnalysisProperties;
this.mojoVersion = mojoVersion;
this.additionalProperties = additionalProperties;
Expand Down Expand Up @@ -137,8 +139,8 @@ public String getServerUrl() {
/**
* @since 2.4
*/
public String getServerAuthenticationToken() {
return StringUtils.trimToNull(serverAuthenticationToken);
public Secret getServerAuthenticationToken() {
return serverAuthenticationToken;
}

/**
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/hudson/plugins/sonar/SonarRunnerBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@
import java.util.Properties;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;

import hudson.util.Secret;
import jenkins.model.Jenkins;
import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;
Expand Down Expand Up @@ -361,8 +363,10 @@ void populateConfiguration(ExtendedArgumentListBuilder args, Run<?, ?> build, Fi
TaskListener listener, EnvVars env, @Nullable SonarInstallation si) throws IOException, InterruptedException {
if (si != null) {
args.append("sonar.host.url", si.getServerUrl());
if (StringUtils.isNotBlank(si.getServerAuthenticationToken())) {
args.appendMasked("sonar.login", si.getServerAuthenticationToken());
Secret token = si.getServerAuthenticationToken();
String tokenPlainText = token.getPlainText();
if (StringUtils.isNotBlank(tokenPlainText)) {
args.appendMasked("sonar.login", tokenPlainText);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import hudson.plugins.sonar.client.WsClient.CETask;
import hudson.plugins.sonar.utils.Logger;
import hudson.plugins.sonar.utils.Version;
import org.apache.commons.lang.StringUtils;

import java.util.logging.Level;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
Expand Down Expand Up @@ -52,8 +54,9 @@ public ProjectInformation resolve(@Nullable String serverUrl, @Nullable String p
}

try {

WsClient wsClient = new WsClient(client, serverUrl, inst.getServerAuthenticationToken());
String tokenPlainText = inst.getServerAuthenticationToken().getPlainText();
String tokenToPass = StringUtils.isBlank(tokenPlainText) ? null : tokenPlainText;
WsClient wsClient = new WsClient(client, serverUrl, tokenToPass);
Version version = new Version(wsClient.getServerVersion());

if (version.compareTo(new Version("5.6")) < 0) {
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/hudson/plugins/sonar/utils/SonarMaven.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@
import hudson.tasks.Maven;
import hudson.util.ArgumentListBuilder;
import java.io.IOException;

import hudson.util.Secret;
import jenkins.model.Jenkins;
import jenkins.mvn.GlobalSettingsProvider;
import jenkins.mvn.SettingsProvider;
Expand Down Expand Up @@ -95,8 +97,10 @@ protected void wrapUpArguments(ArgumentListBuilder args, String normalizedTarget

argsBuilder.append("sonar.branch", publisher.getBranch());

if (StringUtils.isNotBlank(getInstallation().getServerAuthenticationToken())) {
argsBuilder.appendMasked("sonar.login", getInstallation().getServerAuthenticationToken());
Secret token = getInstallation().getServerAuthenticationToken();
String tokenPlainText = token.getPlainText();
if (StringUtils.isNotBlank(tokenPlainText)) {
argsBuilder.appendMasked("sonar.login", tokenPlainText);
}

if (build instanceof MavenModuleSetBuild) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Nullable;

import org.apache.commons.lang.StringUtils;
import org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.Whitelisted;
import org.jenkinsci.plugins.workflow.graph.FlowNode;
import org.jenkinsci.plugins.workflow.steps.Step;
Expand Down Expand Up @@ -178,8 +180,10 @@ private boolean checkTaskCompleted() throws IOException, InterruptedException {
}

log("Checking status of SonarQube task '%s' on server '%s'", step.taskId, step.getInstallationName());

WsClient wsClient = new WsClient(new HttpClient(), step.getServerUrl(), inst.getServerAuthenticationToken());

String tokenPlainText = inst.getServerAuthenticationToken().getPlainText();
String tokenToPass = StringUtils.isBlank(tokenPlainText) ? null : tokenPlainText;
WsClient wsClient = new WsClient(new HttpClient(), step.getServerUrl(), tokenToPass);
WsClient.CETask ceTask = wsClient.getCETask(step.getTaskId());
log("SonarQube task '%s' status is '%s'", step.taskId, ceTask.getStatus());
switch (ceTask.getStatus()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
import hudson.plugins.sonar.AbstractMsBuildSQRunner.SonarQubeScannerMsBuildParams;
import hudson.slaves.EnvironmentVariablesNodeProperty;
import javax.annotation.Nullable;

import hudson.util.Secret;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;

Expand Down
6 changes: 4 additions & 2 deletions src/test/java/hudson/plugins/sonar/SonarInstallationTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import hudson.plugins.sonar.model.TriggersConfig;
import java.io.File;
import java.io.IOException;

import hudson.util.Secret;
import jenkins.model.Jenkins;
import org.junit.Test;

Expand All @@ -40,7 +42,7 @@ public void testRoundtrip() throws IOException {
d.setInstallations(new SonarInstallation(
"Name",
"server.url",
" tokenWithSpace ",
"token",
"mojoVersion",
"props",
triggers,
Expand All @@ -52,7 +54,7 @@ public void testRoundtrip() throws IOException {

assertThat(i.getName()).isEqualTo("Name");
assertThat(i.getServerUrl()).isEqualTo("server.url");
assertThat(i.getServerAuthenticationToken()).isEqualTo("tokenWithSpace");
assertThat(i.getServerAuthenticationToken().getPlainText()).isEqualTo("token");
assertThat(i.getMojoVersion()).isEqualTo("mojoVersion");
assertThat(i.getAdditionalProperties()).isEqualTo("props");
assertThat(i.getAdditionalAnalysisProperties()).isEqualTo("key=value");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
import hudson.util.ArgumentListBuilder;
import java.io.File;
import java.io.IOException;

import hudson.util.Secret;
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.Before;
Expand Down Expand Up @@ -130,7 +132,7 @@ public void shouldPopulateProjectSettingsParameter() throws IOException, Interru
public void shouldPopulateSonarToken() throws IOException, InterruptedException {
SonarInstallation installation = mock(SonarInstallation.class);
when(installation.getServerUrl()).thenReturn("hostUrl");
when(installation.getServerAuthenticationToken()).thenReturn("token");
when(installation.getServerAuthenticationToken()).thenReturn(Secret.fromString("token"));

SonarRunnerBuilder builder = new SonarRunnerBuilder(null, null, null, null, null, null, null, null);
builder.populateConfiguration(argsBuilder, build, build.getWorkspace(), listener, env, installation);
Expand Down
2 changes: 2 additions & 0 deletions src/test/java/hudson/plugins/sonar/client/WsClientTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import hudson.util.Secret;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
Expand Down
4 changes: 3 additions & 1 deletion src/test/java/hudson/plugins/sonar/utils/SonarMavenTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
import hudson.plugins.sonar.SonarPublisher;
import hudson.util.ArgumentListBuilder;
import java.util.List;

import hudson.util.Secret;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;
Expand All @@ -45,7 +47,7 @@ public void shouldWrapUpArguments() throws Exception {
SonarPublisher publisher = mock(SonarPublisher.class);
SonarInstallation installation = mock(SonarInstallation.class);
when(installation.getServerUrl()).thenReturn("hostUrl");
when(installation.getServerAuthenticationToken()).thenReturn("xyz");
when(installation.getServerAuthenticationToken()).thenReturn(Secret.fromString("xyz"));
when(publisher.getInstallation()).thenReturn(installation);
when(publisher.getBranch()).thenReturn("branch");

Expand Down

0 comments on commit d1fe7cf

Please sign in to comment.