Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
Expand Down Expand Up @@ -285,8 +286,7 @@ void processWorkspaceDependencies(
CargoPackage depPackage = findPackageByName(packageMap, depName);
try {
PackageURL depUrl =
new PackageURL(
Type.CARGO.getType(), null, depPackage.name(), depPackage.version(), null, null);
createCargoPurl(depPackage.name(), depPackage.version(), depPackage.isPathDependency());
sbom.addDependency(root, depUrl, null);
} catch (Exception e) {
log.warning("Failed to create PackageURL for workspace dependency: " + depName);
Expand Down Expand Up @@ -332,8 +332,7 @@ private void processWorkspaceMember(

try {
PackageURL memberUrl =
new PackageURL(
Type.CARGO.getType(), null, memberPkg.name(), memberPkg.version(), null, null);
createCargoPurl(memberPkg.name(), memberPkg.version(), memberPkg.isPathDependency());
sbom.addDependency(workspaceRoot, memberUrl, null);

if (debugLoggingIsNeeded()) {
Expand Down Expand Up @@ -528,8 +527,7 @@ private void processDirectDependencies(

try {
PackageURL packageUrl =
new PackageURL(
Type.CARGO.getType(), null, childInfo.name(), childInfo.version(), null, null);
createCargoPurl(childInfo.name(), childInfo.version(), childInfo.isPathDependency());
sbom.addDependency(sourceUrl, packageUrl, null);
if (debugLoggingIsNeeded()) {
log.info(
Expand Down Expand Up @@ -594,8 +592,7 @@ private void processDependencyNode(

try {
PackageURL childUrl =
new PackageURL(
Type.CARGO.getType(), null, childInfo.name(), childInfo.version(), null, null);
createCargoPurl(childInfo.name(), childInfo.version(), childInfo.isPathDependency());

String relationshipKey = parent.getCoordinates() + "->" + childUrl.getCoordinates();

Expand Down Expand Up @@ -641,7 +638,7 @@ private Map<String, CargoPackage> buildPackageMap(CargoMetadata metadata) {

private DependencyInfo getPackageInfo(String packageId, Map<String, CargoPackage> packageMap) {
CargoPackage pkg = packageMap.get(packageId);
return new DependencyInfo(pkg.name(), pkg.version());
return new DependencyInfo(pkg.name(), pkg.version(), pkg.source());
}

public CargoProvider(Path manifest) {
Expand Down Expand Up @@ -821,4 +818,16 @@ private boolean lineContainsDependency(String trimmed, String depName) {
}
return false;
}

/**
* Creates a {@link PackageURL} for a Cargo package. Path dependencies ({@code source == null})
* get a {@code repository_url=local} qualifier so the backend can distinguish them from registry
* packages and skip vulnerability checks.
*/
private static PackageURL createCargoPurl(String name, String version, boolean isPathDep)
throws Exception {
TreeMap<String, String> qualifiers =
isPathDep ? new TreeMap<>(Map.of("repository_url", "local")) : null;
return new PackageURL(Type.CARGO.getType(), null, name, version, qualifiers, null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,12 @@ public record CargoPackage(
@JsonProperty("name") String name,
@JsonProperty("version") String version,
@JsonProperty("id") String id,
@JsonProperty("source") String source,
@JsonProperty("manifest_path") String manifestPath,
@JsonProperty("dependencies") List<CargoDependency> dependencies) {}
@JsonProperty("dependencies") List<CargoDependency> dependencies) {

/** Path dependencies have {@code source == null} in cargo metadata. */
public boolean isPathDependency() {
return source == null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,10 @@
*/
package io.github.guacsec.trustifyda.providers.rust.model;

public record DependencyInfo(String name, String version) {}
public record DependencyInfo(String name, String version, String source) {

/** Path dependencies have {@code source == null} in cargo metadata. */
public boolean isPathDependency() {
return source == null;
}
}
Loading