From cdbb4b28208c945c8e2d84a761f129a9163bc668 Mon Sep 17 00:00:00 2001 From: Kiko Fernandez-Reyes Date: Wed, 4 Dec 2024 15:35:14 +0100 Subject: [PATCH] feat(scanner): Add flag to scanner to detect unlicensed files Add flag `includeUnlicensed` to the scanner configuration. Its default is `false`. When set to `true`, the scanner add to a `ScanResult` files without license as LicenseFindings with license set to `NONE`. This contribution makes possible to the scanner to display all files as license findings. The ultimate goal is that any file without license is catched by the scanner, so that curation mechanism can override files without licenses in cases where a license applies to a whole folder. Signed-off-by: Kiko Fernandez-Reyes --- .../kotlin/config/ScannerConfiguration.kt | 5 ++++ scanner/src/main/kotlin/Scanner.kt | 26 ++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/model/src/main/kotlin/config/ScannerConfiguration.kt b/model/src/main/kotlin/config/ScannerConfiguration.kt index dedc38a1cbe64..3277841a8c65d 100644 --- a/model/src/main/kotlin/config/ScannerConfiguration.kt +++ b/model/src/main/kotlin/config/ScannerConfiguration.kt @@ -44,6 +44,11 @@ data class ScannerConfiguration( */ val skipExcluded: Boolean = false, + /** + * A flag to indicate whether the scanner should add files without license to the scanner results. + */ + val includeFilesWithoutFindings: Boolean = false, + /** * Configuration of a [FileArchiver] that archives certain scanned files in an external [FileStorage]. */ diff --git a/scanner/src/main/kotlin/Scanner.kt b/scanner/src/main/kotlin/Scanner.kt index 4916dedef45fd..4b5556e9c442a 100644 --- a/scanner/src/main/kotlin/Scanner.kt +++ b/scanner/src/main/kotlin/Scanner.kt @@ -36,6 +36,7 @@ import org.ossreviewtoolkit.model.FileList import org.ossreviewtoolkit.model.Identifier import org.ossreviewtoolkit.model.Issue import org.ossreviewtoolkit.model.KnownProvenance +import org.ossreviewtoolkit.model.LicenseFinding import org.ossreviewtoolkit.model.OrtResult import org.ossreviewtoolkit.model.Package import org.ossreviewtoolkit.model.PackageType @@ -43,6 +44,8 @@ import org.ossreviewtoolkit.model.ProvenanceResolutionResult import org.ossreviewtoolkit.model.ScanResult import org.ossreviewtoolkit.model.ScanSummary import org.ossreviewtoolkit.model.ScannerRun +import org.ossreviewtoolkit.model.TextLocation +import org.ossreviewtoolkit.model.TextLocation.Companion.UNKNOWN_LINE import org.ossreviewtoolkit.model.VcsInfo import org.ossreviewtoolkit.model.config.DownloaderConfiguration import org.ossreviewtoolkit.model.config.ScannerConfiguration @@ -67,6 +70,7 @@ import org.ossreviewtoolkit.utils.common.collectMessages import org.ossreviewtoolkit.utils.common.safeDeleteRecursively import org.ossreviewtoolkit.utils.ort.Environment import org.ossreviewtoolkit.utils.ort.showStackTrace +import org.ossreviewtoolkit.utils.spdx.SpdxConstants import org.ossreviewtoolkit.utils.spdx.toSpdx const val TOOL_NAME = "scanner" @@ -207,13 +211,33 @@ class Scanner( } } + val scanResults = if (!scannerConfig.includeFilesWithoutFindings) { + filteredScanResults.mapTo(mutableSetOf()) { scanResult -> + val allPaths = controller.getAllFileLists()[scanResult.provenance]?.files?.map { it.path }.orEmpty() + val pathsWithFindings = scanResult.summary.licenseFindings.map { it.location.path } + val pathsWithoutFindings = allPaths - pathsWithFindings + + val findingsThatAreNone = pathsWithoutFindings.map { + LicenseFinding(SpdxConstants.NOASSERTION, TextLocation(it, UNKNOWN_LINE)) + } + + scanResult.copy( + summary = scanResult.summary.copy( + licenseFindings = scanResult.summary.licenseFindings + findingsThatAreNone + ) + ) + } + } else { + filteredScanResults + } + val scannerNames = scannerWrappers.mapTo(mutableSetOf()) { it.name } val scanners = packages.associateBy({ it.id }) { scannerNames } return ScannerRun.EMPTY.copy( config = scannerConfig, provenances = provenances, - scanResults = filteredScanResults, + scanResults = scanResults, files = files, scanners = scanners )