Skip to content

Commit d78502c

Browse files
committed
added method to adjust quotes in cli command and added test case for exclusions
1 parent d80713b commit d78502c

File tree

3 files changed

+67
-17
lines changed

3 files changed

+67
-17
lines changed

src/main/java/com/jfrog/ide/common/configuration/AuditConfig.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package com.jfrog.ide.common.configuration;
22

3+
import lombok.Getter;
4+
35
import java.util.List;
46
import java.util.Map;
57

8+
@Getter
69
public class AuditConfig {
10+
// Getters
711
private final List<String> scannedDirectories;
812
private final String serverId;
9-
private final String excludedPattern;
13+
private final List<String> excludedPattern;
1014
private final List<String> extraArgs;
1115
private final Map<String, String> envVars;
1216

@@ -21,7 +25,7 @@ private AuditConfig(Builder builder) {
2125
public static class Builder {
2226
private List<String> scannedDirectories;
2327
private String serverId;
24-
private String excludedPattern;
28+
private List<String> excludedPattern;
2529
private List<String> extraArgs;
2630
private Map<String, String> envVars;
2731

@@ -35,7 +39,7 @@ public Builder scannedDirectories(List<String> scannedDirectories) {
3539
return this;
3640
}
3741

38-
public Builder excludedPattern(String excludedPattern) {
42+
public Builder excludedPattern(List<String> excludedPattern) {
3943
this.excludedPattern = excludedPattern;
4044
return this;
4145
}
@@ -55,10 +59,4 @@ public AuditConfig build() {
5559
}
5660
}
5761

58-
// Getters
59-
public List<String> getScannedDirectories() { return scannedDirectories; }
60-
public String getServerId() { return serverId; }
61-
public String getExcludedPattern() { return excludedPattern; }
62-
public List<String> getExtraArgs() { return extraArgs; }
63-
public Map<String, String> getEnvVars() { return envVars; }
6462
}

src/main/java/com/jfrog/ide/common/configuration/JfrogCliDriver.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,15 +200,17 @@ public CommandResults runCliAudit(File workingDirectory, AuditConfig config) thr
200200
String workingDirsString = config.getScannedDirectories().size() > 1 ?
201201
String.join(", ", config.getScannedDirectories()) :
202202
config.getScannedDirectories().get(0);
203-
args.add("--working-dirs=" + workingDirsString);
203+
args.add("--working-dirs=" + quoteArgumentForUnix(workingDirsString));
204204
}
205205

206206
args.add("--server-id=" + config.getServerId());
207207
args.add("--format=sarif");
208208

209-
if (StringUtils.isNotBlank(config.getExcludedPattern())) {
210-
args.add("--exclusions=" + config.getExcludedPattern());
209+
if (config.getExcludedPattern() != null && !config.getExcludedPattern().isEmpty()) {
210+
String excludedPatterns = String.join(",", config.getExcludedPattern());
211+
args.add("--exclusions=" + quoteArgumentForUnix(excludedPatterns));
211212
}
213+
System.out.println("Running JF audit with args: " + args);
212214

213215
try {
214216
return runCommand(workingDirectory, config.getEnvVars(), args.toArray(new String[0]),
@@ -238,4 +240,9 @@ private void addDefaultEnvVars(Map<String, String> env) {
238240
env.put("JFROG_CLI_AVOID_NEW_VERSION_WARNING", "true");
239241
}
240242
}
243+
244+
private String quoteArgumentForUnix(String commaSeparatedValues) {
245+
// macOS/Linux: add quotes around the comma-separated values
246+
return SystemUtils.IS_OS_WINDOWS ? commaSeparatedValues : "\"" + commaSeparatedValues + "\"";
247+
}
241248
}

src/test/java/com/jfrog/ide/common/configuration/JfrogCliDriverTest.java

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.jfrog.ide.common.configuration;
22

3+
import com.jfrog.ide.common.nodes.FileIssueNode;
34
import com.jfrog.ide.common.nodes.FileTreeNode;
5+
import com.jfrog.ide.common.nodes.subentities.Severity;
6+
import com.jfrog.ide.common.nodes.subentities.SourceCodeScanType;
47
import com.jfrog.ide.common.parse.SarifParser;
58
import org.apache.commons.lang3.SystemUtils;
69
import org.jfrog.build.api.util.NullLog;
@@ -85,6 +88,8 @@ private void configJfrogCli(Boolean skipDownload) {
8588
fail(e.getMessage(), e);
8689
}
8790
testEnv.put("JFROG_CLI_HOME_DIR", tempDir.getAbsolutePath());
91+
testEnv.put("JFROG_CLI_LOG_LEVEL", "DEBUG");
92+
testEnv.put("CI", "true");
8893
jfrogCliDriver = new JfrogCliDriver(testEnv, tempDir.getAbsolutePath() + File.separator, new NullLog());
8994
}
9095

@@ -155,7 +160,6 @@ public void testAddCliServerConfig_withUsernameAndPassword() {
155160
CommandResults response = jfrogCliDriver.addCliServerConfig(XRAY_URL, ARTIFACTORY_URL, testServerId, USER_NAME, PASSWORD, null, tempDir, testEnv);
156161
JfrogCliServerConfig serverConfig = jfrogCliDriver.getServerConfig(tempDir, Collections.emptyList(), testEnv);
157162
assertTrue(response.isOk());
158-
assertTrue(response.getErr().isBlank());
159163
assertNotNull(serverConfig);
160164
assertEquals(serverConfig.getUsername(), USER_NAME);
161165
assertEquals(serverConfig.getPassword(), PASSWORD);
@@ -172,7 +176,6 @@ public void testAddCliServerConfig_withAccessToken() {
172176
CommandResults response = jfrogCliDriver.addCliServerConfig(XRAY_URL, ARTIFACTORY_URL, testServerId, null, null, ACCESS_TOKEN, tempDir, testEnv);
173177
JfrogCliServerConfig serverConfig = jfrogCliDriver.getServerConfig(tempDir, Collections.emptyList(), testEnv);
174178
assertTrue(response.isOk());
175-
assertTrue(response.getErr().isBlank());
176179
assertNotNull(serverConfig);
177180
assertEquals(serverConfig.getAccessToken(), ACCESS_TOKEN);
178181
assertEquals(serverConfig.getArtifactoryUrl(), ARTIFACTORY_URL);
@@ -200,14 +203,20 @@ public void testAddServerConfig_withBadCredentials() {
200203
public void testRunAudit_NpmProject() {
201204
String projectToCheck = "npm";
202205
try {
203-
Path exampleProjectsFolder = Path.of("src/test/resources/example-projects/npm");
206+
Path exampleProjectsFolder = Path.of("src/test/resources/example-projects");
204207
CommandResults response = jfrogCliDriver.runCliAudit(exampleProjectsFolder.toFile(),
205208
singletonList(projectToCheck), testServerId, null, testEnv);
206209
assertEquals(response.getExitValue(),0);
207210
List<FileTreeNode> findings = parser.parse(response.getRes());
208211
assertNotNull(findings);
209212
assertFalse(findings.isEmpty(), "Expected findings in SARIF output for npm project");
210-
// TODO: Add more checks on the findings
213+
// Verify the findings
214+
assertEquals(findings.size(), 1, "Expected exactly one file with findings");
215+
FileTreeNode node = findings.get(0);
216+
assertEquals(node.getChildren().size(), 1, "Expected exactly one vulnerabilities");
217+
FileIssueNode issue = (FileIssueNode) node.getChildren().get(0);
218+
assertEquals(issue.getSeverity(), Severity.High, "Expected severity to be HIGH");
219+
assertEquals(issue.getReporterType(), SourceCodeScanType.SCA, "Expected reporter type to be SCA");
211220
} catch (Exception e) {
212221
fail(e.getMessage(), e);
213222
}
@@ -221,10 +230,18 @@ public void testRunAudit_MultiMavenProject() {
221230
CommandResults response = jfrogCliDriver.runCliAudit(exampleProjectsFolder.toFile(),
222231
projectsToCheck, testServerId, null, testEnv);
223232
assertEquals(response.getExitValue(), 0);
233+
System.out.println("Audit debug logs: \n" + response.getErr());
234+
System.out.println("Audit response: \n" + response.getRes());
224235
List<FileTreeNode> findings = parser.parse(response.getRes());
225236
assertNotNull(findings);
226237
assertFalse(findings.isEmpty(), "Expected findings in SARIF output for multi-maven project");
227-
// TODO: Add more checks on the findings
238+
// Verifiy the findings
239+
assertEquals(findings.size(), 1, "Expected exactly one file with findings");
240+
FileTreeNode node = findings.get(0);
241+
assertEquals(node.getChildren().size(), 3, "Expected exactly three vulnerabilities");
242+
assertEquals(node.getSeverity(), Severity.High, "Expected severity to be HIGH");
243+
FileIssueNode issue = (FileIssueNode) node.getChildren().get(0);
244+
assertEquals(issue.getReporterType(), SourceCodeScanType.SCA, "Expected reporter type to be SCA");
228245
} catch (Exception e) {
229246
fail(e.getMessage(), e);
230247
}
@@ -234,6 +251,34 @@ private String createServerId() {
234251
return "ide-plugins-common-test-server-" + timeStampFormat.format(System.currentTimeMillis());
235252
}
236253

254+
@Test
255+
public void testRunAudit_WithExcludedPattern() {
256+
try {
257+
Path exampleProjectsFolder = Path.of("src/test/resources/example-projects/maven-example");
258+
AuditConfig config = new AuditConfig.Builder()
259+
.serverId(testServerId)
260+
.excludedPattern(new ArrayList<>(List.of("*multi3*")))
261+
.serverId(testServerId)
262+
.extraArgs(null)
263+
.envVars(testEnv)
264+
.build();
265+
CommandResults response = jfrogCliDriver.runCliAudit(exampleProjectsFolder.toFile(), config);
266+
assertEquals(response.getExitValue(), 0);
267+
List<FileTreeNode> findings = parser.parse(response.getRes());
268+
assertNotNull(findings);
269+
assertFalse(findings.isEmpty(), "Expected findings in SARIF output for multi-maven project");
270+
// Verifiy the findings
271+
assertEquals(findings.size(), 1, "Expected exactly one file with findings");
272+
FileTreeNode node = findings.get(0);
273+
assertEquals(node.getChildren().size(), 3, "Expected exactly three vulnerabilities");
274+
assertEquals(node.getSeverity(), Severity.High, "Expected severity to be HIGH");
275+
FileIssueNode issue = (FileIssueNode) node.getChildren().get(0);
276+
assertEquals(issue.getReporterType(), SourceCodeScanType.SCA, "Expected reporter type to be SCA");
277+
} catch (Exception e) {
278+
fail(e.getMessage(), e);
279+
}
280+
}
281+
237282
@AfterMethod
238283
public void cleanUp(Method method) {
239284
try {

0 commit comments

Comments
 (0)