Skip to content

Commit 4c869e5

Browse files
committed
SLCORE-275 Replace nulls in issue messages
1 parent 2dafe75 commit 4c869e5

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

core/src/main/java/org/sonarsource/sonarlint/core/analyzer/sensor/DefaultSonarLintIssueLocation.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
import org.sonar.api.batch.sensor.issue.NewIssueLocation;
2727

2828
import static java.util.Objects.requireNonNull;
29+
import static org.apache.commons.lang.StringUtils.abbreviate;
30+
import static org.apache.commons.lang.StringUtils.replace;
31+
import static org.apache.commons.lang.StringUtils.trimToEmpty;
2932

3033
public class DefaultSonarLintIssueLocation implements NewIssueLocation, IssueLocation {
3134

@@ -50,10 +53,14 @@ public DefaultSonarLintIssueLocation at(TextRange location) {
5053

5154
@Override
5255
public DefaultSonarLintIssueLocation message(String message) {
53-
this.message = message;
56+
this.message = abbreviate(trimToEmpty(sanitizeNulls(message)), MESSAGE_MAX_SIZE);
5457
return this;
5558
}
5659

60+
private static String sanitizeNulls(String message) {
61+
return replace(message, "\u0000", "[NULL]");
62+
}
63+
5764
@Override
5865
public InputComponent inputComponent() {
5966
return this.component;

core/src/test/java/org/sonarsource/sonarlint/core/analyzer/sensor/DefaultSonarLintIssueTest.java

+35
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.sonarsource.sonarlint.core.container.analysis.filesystem.SonarLintInputDir;
3434
import org.sonarsource.sonarlint.core.container.analysis.filesystem.SonarLintInputProject;
3535

36+
import static org.apache.commons.lang.StringUtils.repeat;
3637
import static org.assertj.core.api.Assertions.assertThat;
3738
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
3839
import static org.mockito.Mockito.mock;
@@ -81,6 +82,40 @@ public void build_file_issue() {
8182
verify(storage).store(issue);
8283
}
8384

85+
@Test
86+
public void replace_null_characters() {
87+
SensorStorage storage = mock(SensorStorage.class);
88+
DefaultSonarLintIssue issue = new DefaultSonarLintIssue(project, baseDir, storage)
89+
.at(new DefaultSonarLintIssueLocation()
90+
.on(inputFile)
91+
.message("Wrong \u0000 use of NULL\u0000"))
92+
.forRule(RuleKey.of("repo", "rule"));
93+
94+
assertThat(issue.primaryLocation().message()).isEqualTo("Wrong [NULL] use of NULL[NULL]");
95+
96+
issue.save();
97+
98+
verify(storage).store(issue);
99+
}
100+
101+
@Test
102+
public void truncate_and_trim() {
103+
SensorStorage storage = mock(SensorStorage.class);
104+
String prefix = "prefix: ";
105+
DefaultSonarLintIssue issue = new DefaultSonarLintIssue(project, baseDir, storage)
106+
.at(new DefaultSonarLintIssueLocation()
107+
.on(inputFile)
108+
.message(" " + prefix + repeat("a", 4000)))
109+
.forRule(RuleKey.of("repo", "rule"));
110+
111+
String ellipse = "...";
112+
assertThat(issue.primaryLocation().message()).isEqualTo(prefix + repeat("a", 4000 - prefix.length() - ellipse.length()) + ellipse);
113+
114+
issue.save();
115+
116+
verify(storage).store(issue);
117+
}
118+
84119
@Test
85120
public void move_directory_issue_to_project_root() {
86121
SensorStorage storage = mock(SensorStorage.class);

0 commit comments

Comments
 (0)