diff --git a/src/main/java/org/pqca/scanning/go/GoScannerService.java b/src/main/java/org/pqca/scanning/go/GoScannerService.java index e19676e..55dacad 100644 --- a/src/main/java/org/pqca/scanning/go/GoScannerService.java +++ b/src/main/java/org/pqca/scanning/go/GoScannerService.java @@ -24,6 +24,7 @@ import jakarta.annotation.Nullable; import java.io.File; import java.io.IOException; +import java.nio.file.Files; import java.util.ArrayList; import java.util.List; import org.apache.commons.io.FileUtils; @@ -38,7 +39,6 @@ import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.batch.sensor.internal.SensorContextTester; -import org.sonar.api.impl.utils.DefaultTempFolder; import org.sonar.api.rule.RuleKey; import org.sonar.go.converter.GoConverter; import org.sonar.go.plugin.GoChecks; @@ -65,43 +65,52 @@ public GoScannerService( int numberOfScannedLines = 0; int numberOfScannedFiles = 0; - File goTempFolder = new DefaultTempFolder(this.projectDirectory).newDir(); - + File goTempFolder = null; try { - GoConverter goConverter = new GoConverter(goTempFolder); - GoCheck visitor = new GoDetectionCollectionRule(this); - GoChecks checks = new GoRuleChecks(visitor); - final SensorContextTester sensorContext = SensorContextTester.create(projectDirectory); - - // Go scanner (CryptoGoSensor) reads files from context - index.forEach( - project -> project.inputFileList().forEach(sensorContext.fileSystem()::add)); - - for (ProjectModule project : index) { - numberOfScannedFiles += project.inputFileList().size(); - numberOfScannedLines += - project.inputFileList().stream().mapToInt(InputFile::lines).sum(); - - final String projectStr = - project.identifier() + " (" + counter + "/" + index.size() + ")"; - if (this.progressDispatcher != null) { - this.progressDispatcher.send( - new ProgressMessage( - ProgressMessageType.LABEL, - "Scanning go project " + projectStr)); - } - LOGGER.info("Scanning go project {}", projectStr); - - CryptoGoSensor.execute((SensorContext) sensorContext, goConverter, checks); + goTempFolder = Files.createTempDirectory("cbomkit-go-").toFile(); + } catch (IOException e) { + LOGGER.error("Failed to create temp dir for go scanner", e); + } - counter += 1; - } - LOGGER.info("Scanned {} go projects", index.size()); - } finally { + if (goTempFolder != null) { try { - FileUtils.deleteDirectory(goTempFolder); - } catch (IOException e) { - LOGGER.error("Failed to delete temp dir {}", goTempFolder); + GoConverter goConverter = new GoConverter(goTempFolder); + GoCheck visitor = new GoDetectionCollectionRule(this); + GoChecks checks = new GoRuleChecks(visitor); + final SensorContextTester sensorContext = + SensorContextTester.create(projectDirectory); + + // Go scanner (CryptoGoSensor) reads files from context + index.forEach( + project -> + project.inputFileList().forEach(sensorContext.fileSystem()::add)); + + for (ProjectModule project : index) { + numberOfScannedFiles += project.inputFileList().size(); + numberOfScannedLines += + project.inputFileList().stream().mapToInt(InputFile::lines).sum(); + + final String projectStr = + project.identifier() + " (" + counter + "/" + index.size() + ")"; + if (this.progressDispatcher != null) { + this.progressDispatcher.send( + new ProgressMessage( + ProgressMessageType.LABEL, + "Scanning go project " + projectStr)); + } + LOGGER.info("Scanning go project {}", projectStr); + + CryptoGoSensor.execute((SensorContext) sensorContext, goConverter, checks); + + counter += 1; + } + LOGGER.info("Scanned {} go projects", index.size()); + } finally { + try { + FileUtils.deleteDirectory(goTempFolder); + } catch (IOException e) { + LOGGER.error("Failed to delete temp dir {}", goTempFolder, e); + } } } diff --git a/src/test/java/org/pqca/scanning/GoScannerServiceTest.java b/src/test/java/org/pqca/scanning/GoScannerServiceTest.java index 7b72a67..c9610e4 100644 --- a/src/test/java/org/pqca/scanning/GoScannerServiceTest.java +++ b/src/test/java/org/pqca/scanning/GoScannerServiceTest.java @@ -22,7 +22,13 @@ import static org.assertj.core.api.Assertions.assertThat; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.junit.jupiter.api.Test; import org.pqca.errors.ClientDisconnected; import org.pqca.indexing.ProjectModule; @@ -33,9 +39,11 @@ class GoScannerServiceTest { @Test - void test() throws ClientDisconnected { + void test() throws ClientDisconnected, IOException { // indexing final File projectDirectory = new File("src/test/testdata/go/gocrypto"); + final Set projectDirectoryEntriesBeforeScan = + listRelativePaths(projectDirectory.toPath()); final GoIndexService goIndexService = new GoIndexService(projectDirectory); final List goModules = goIndexService.index(null); assertThat(goModules).hasSize(1); @@ -84,5 +92,16 @@ void test() throws ClientDisconnected { "src/test/testdata/go/gocrypto/GoCryptoPBKDF2TestFile.go", 15)) .isTrue(); + + assertThat(listRelativePaths(projectDirectory.toPath())) + .isEqualTo(projectDirectoryEntriesBeforeScan); + } + + private static Set listRelativePaths(Path projectDirectory) throws IOException { + try (Stream paths = Files.walk(projectDirectory)) { + return paths.map(projectDirectory::relativize) + .map(Path::toString) + .collect(Collectors.toSet()); + } } }