mirror of
https://github.com/ysoftdevs/DependencyCheck.git
synced 2026-03-21 00:29:21 +01:00
corrected how project references are propogated when the same dependency is analyzed more then once
This commit is contained in:
@@ -197,9 +197,24 @@ public class Engine implements FileFilter {
|
|||||||
* @since v0.3.2.5
|
* @since v0.3.2.5
|
||||||
*/
|
*/
|
||||||
public List<Dependency> scan(String[] paths) {
|
public List<Dependency> scan(String[] paths) {
|
||||||
|
return scan(paths, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scans an array of files or directories. If a directory is specified, it
|
||||||
|
* will be scanned recursively. Any dependencies identified are added to the
|
||||||
|
* dependency collection.
|
||||||
|
*
|
||||||
|
* @param paths an array of paths to files or directories to be analyzed
|
||||||
|
* @param projectReference the name of the project or scope in which the
|
||||||
|
* dependency was identified
|
||||||
|
* @return the list of dependencies scanned
|
||||||
|
* @since v1.4.4
|
||||||
|
*/
|
||||||
|
public List<Dependency> scan(String[] paths, String projectReference) {
|
||||||
final List<Dependency> deps = new ArrayList<Dependency>();
|
final List<Dependency> deps = new ArrayList<Dependency>();
|
||||||
for (String path : paths) {
|
for (String path : paths) {
|
||||||
final List<Dependency> d = scan(path);
|
final List<Dependency> d = scan(path, projectReference);
|
||||||
if (d != null) {
|
if (d != null) {
|
||||||
deps.addAll(d);
|
deps.addAll(d);
|
||||||
}
|
}
|
||||||
@@ -216,8 +231,23 @@ public class Engine implements FileFilter {
|
|||||||
* @return the list of dependencies scanned
|
* @return the list of dependencies scanned
|
||||||
*/
|
*/
|
||||||
public List<Dependency> scan(String path) {
|
public List<Dependency> scan(String path) {
|
||||||
|
return scan(path, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scans a given file or directory. If a directory is specified, it will be
|
||||||
|
* scanned recursively. Any dependencies identified are added to the
|
||||||
|
* dependency collection.
|
||||||
|
*
|
||||||
|
* @param path the path to a file or directory to be analyzed
|
||||||
|
* @param projectReference the name of the project or scope in which the
|
||||||
|
* dependency was identified
|
||||||
|
* @return the list of dependencies scanned
|
||||||
|
* @since v1.4.4
|
||||||
|
*/
|
||||||
|
public List<Dependency> scan(String path, String projectReference) {
|
||||||
final File file = new File(path);
|
final File file = new File(path);
|
||||||
return scan(file);
|
return scan(file, projectReference);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -230,9 +260,24 @@ public class Engine implements FileFilter {
|
|||||||
* @since v0.3.2.5
|
* @since v0.3.2.5
|
||||||
*/
|
*/
|
||||||
public List<Dependency> scan(File[] files) {
|
public List<Dependency> scan(File[] files) {
|
||||||
|
return scan(files, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scans an array of files or directories. If a directory is specified, it
|
||||||
|
* will be scanned recursively. Any dependencies identified are added to the
|
||||||
|
* dependency collection.
|
||||||
|
*
|
||||||
|
* @param files an array of paths to files or directories to be analyzed.
|
||||||
|
* @param projectReference the name of the project or scope in which the
|
||||||
|
* dependency was identified
|
||||||
|
* @return the list of dependencies
|
||||||
|
* @since v1.4.4
|
||||||
|
*/
|
||||||
|
public List<Dependency> scan(File[] files, String projectReference) {
|
||||||
final List<Dependency> deps = new ArrayList<Dependency>();
|
final List<Dependency> deps = new ArrayList<Dependency>();
|
||||||
for (File file : files) {
|
for (File file : files) {
|
||||||
final List<Dependency> d = scan(file);
|
final List<Dependency> d = scan(file, projectReference);
|
||||||
if (d != null) {
|
if (d != null) {
|
||||||
deps.addAll(d);
|
deps.addAll(d);
|
||||||
}
|
}
|
||||||
@@ -250,9 +295,24 @@ public class Engine implements FileFilter {
|
|||||||
* @since v0.3.2.5
|
* @since v0.3.2.5
|
||||||
*/
|
*/
|
||||||
public List<Dependency> scan(Collection<File> files) {
|
public List<Dependency> scan(Collection<File> files) {
|
||||||
|
return scan(files, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scans a collection of files or directories. If a directory is specified,
|
||||||
|
* it will be scanned recursively. Any dependencies identified are added to
|
||||||
|
* the dependency collection.
|
||||||
|
*
|
||||||
|
* @param files a set of paths to files or directories to be analyzed
|
||||||
|
* @param projectReference the name of the project or scope in which the
|
||||||
|
* dependency was identified
|
||||||
|
* @return the list of dependencies scanned
|
||||||
|
* @since v1.4.4
|
||||||
|
*/
|
||||||
|
public List<Dependency> scan(Collection<File> files, String projectReference) {
|
||||||
final List<Dependency> deps = new ArrayList<Dependency>();
|
final List<Dependency> deps = new ArrayList<Dependency>();
|
||||||
for (File file : files) {
|
for (File file : files) {
|
||||||
final List<Dependency> d = scan(file);
|
final List<Dependency> d = scan(file, projectReference);
|
||||||
if (d != null) {
|
if (d != null) {
|
||||||
deps.addAll(d);
|
deps.addAll(d);
|
||||||
}
|
}
|
||||||
@@ -270,11 +330,26 @@ public class Engine implements FileFilter {
|
|||||||
* @since v0.3.2.4
|
* @since v0.3.2.4
|
||||||
*/
|
*/
|
||||||
public List<Dependency> scan(File file) {
|
public List<Dependency> scan(File file) {
|
||||||
|
return scan(file, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scans a given file or directory. If a directory is specified, it will be
|
||||||
|
* scanned recursively. Any dependencies identified are added to the
|
||||||
|
* dependency collection.
|
||||||
|
*
|
||||||
|
* @param file the path to a file or directory to be analyzed
|
||||||
|
* @param projectReference the name of the project or scope in which the
|
||||||
|
* dependency was identified
|
||||||
|
* @return the list of dependencies scanned
|
||||||
|
* @since v1.4.4
|
||||||
|
*/
|
||||||
|
public List<Dependency> scan(File file, String projectReference) {
|
||||||
if (file.exists()) {
|
if (file.exists()) {
|
||||||
if (file.isDirectory()) {
|
if (file.isDirectory()) {
|
||||||
return scanDirectory(file);
|
return scanDirectory(file, projectReference);
|
||||||
} else {
|
} else {
|
||||||
final Dependency d = scanFile(file);
|
final Dependency d = scanFile(file, projectReference);
|
||||||
if (d != null) {
|
if (d != null) {
|
||||||
final List<Dependency> deps = new ArrayList<Dependency>();
|
final List<Dependency> deps = new ArrayList<Dependency>();
|
||||||
deps.add(d);
|
deps.add(d);
|
||||||
@@ -293,17 +368,31 @@ public class Engine implements FileFilter {
|
|||||||
* @return the list of Dependency objects scanned
|
* @return the list of Dependency objects scanned
|
||||||
*/
|
*/
|
||||||
protected List<Dependency> scanDirectory(File dir) {
|
protected List<Dependency> scanDirectory(File dir) {
|
||||||
|
return scanDirectory(dir, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursively scans files and directories. Any dependencies identified are
|
||||||
|
* added to the dependency collection.
|
||||||
|
*
|
||||||
|
* @param dir the directory to scan
|
||||||
|
* @param projectReference the name of the project or scope in which the
|
||||||
|
* dependency was identified
|
||||||
|
* @return the list of Dependency objects scanned
|
||||||
|
* @since v1.4.4
|
||||||
|
*/
|
||||||
|
protected List<Dependency> scanDirectory(File dir, String projectReference) {
|
||||||
final File[] files = dir.listFiles();
|
final File[] files = dir.listFiles();
|
||||||
final List<Dependency> deps = new ArrayList<Dependency>();
|
final List<Dependency> deps = new ArrayList<Dependency>();
|
||||||
if (files != null) {
|
if (files != null) {
|
||||||
for (File f : files) {
|
for (File f : files) {
|
||||||
if (f.isDirectory()) {
|
if (f.isDirectory()) {
|
||||||
final List<Dependency> d = scanDirectory(f);
|
final List<Dependency> d = scanDirectory(f, projectReference);
|
||||||
if (d != null) {
|
if (d != null) {
|
||||||
deps.addAll(d);
|
deps.addAll(d);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
final Dependency d = scanFile(f);
|
final Dependency d = scanFile(f, projectReference);
|
||||||
deps.add(d);
|
deps.add(d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -319,10 +408,27 @@ public class Engine implements FileFilter {
|
|||||||
* @return the scanned dependency
|
* @return the scanned dependency
|
||||||
*/
|
*/
|
||||||
protected Dependency scanFile(File file) {
|
protected Dependency scanFile(File file) {
|
||||||
|
return scanFile(file, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scans a specified file. If a dependency is identified it is added to the
|
||||||
|
* dependency collection.
|
||||||
|
*
|
||||||
|
* @param file The file to scan
|
||||||
|
* @param projectReference the name of the project or scope in which the
|
||||||
|
* dependency was identified
|
||||||
|
* @return the scanned dependency
|
||||||
|
* @since v1.4.4
|
||||||
|
*/
|
||||||
|
protected Dependency scanFile(File file, String projectReference) {
|
||||||
Dependency dependency = null;
|
Dependency dependency = null;
|
||||||
if (file.isFile()) {
|
if (file.isFile()) {
|
||||||
if (accept(file)) {
|
if (accept(file)) {
|
||||||
dependency = new Dependency(file);
|
dependency = new Dependency(file);
|
||||||
|
if (projectReference != null) {
|
||||||
|
dependency.addProjectReference(projectReference);
|
||||||
|
}
|
||||||
final String sha1 = dependency.getSha1sum();
|
final String sha1 = dependency.getSha1sum();
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
synchronized (dependencies) {
|
synchronized (dependencies) {
|
||||||
@@ -330,10 +436,18 @@ public class Engine implements FileFilter {
|
|||||||
for (Dependency existing : dependencies) {
|
for (Dependency existing : dependencies) {
|
||||||
if (sha1.equals(existing.getSha1sum())) {
|
if (sha1.equals(existing.getSha1sum())) {
|
||||||
found = true;
|
found = true;
|
||||||
|
if (projectReference != null) {
|
||||||
|
existing.addProjectReference(projectReference);
|
||||||
|
}
|
||||||
|
if (existing.getActualFilePath() != null && dependency.getActualFilePath() != null
|
||||||
|
&& !existing.getActualFilePath().equals(dependency.getActualFilePath())) {
|
||||||
|
existing.addRelatedDependency(dependency);
|
||||||
|
} else {
|
||||||
dependency = existing;
|
dependency = existing;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (!found) {
|
if (!found) {
|
||||||
dependencies.add(dependency);
|
dependencies.add(dependency);
|
||||||
}
|
}
|
||||||
@@ -432,7 +546,8 @@ public class Engine implements FileFilter {
|
|||||||
/**
|
/**
|
||||||
* Executes executes the analyzer using multiple threads.
|
* Executes executes the analyzer using multiple threads.
|
||||||
*
|
*
|
||||||
* @param exceptions a collection of exceptions that occurred during analysis
|
* @param exceptions a collection of exceptions that occurred during
|
||||||
|
* analysis
|
||||||
* @param analyzer the analyzer to execute
|
* @param analyzer the analyzer to execute
|
||||||
* @throws ExceptionCollection thrown if exceptions occurred during analysis
|
* @throws ExceptionCollection thrown if exceptions occurred during analysis
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -261,6 +261,7 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
d.getFileName());
|
d.getFileName());
|
||||||
d.setFilePath(displayPath);
|
d.setFilePath(displayPath);
|
||||||
d.setFileName(displayName);
|
d.setFileName(displayName);
|
||||||
|
d.setProjectReferences(dependency.getProjectReferences());
|
||||||
|
|
||||||
//TODO - can we get more evidence from the parent? EAR contains module name, etc.
|
//TODO - can we get more evidence from the parent? EAR contains module name, etc.
|
||||||
//analyze the dependency (i.e. extract files) if it is a supported type.
|
//analyze the dependency (i.e. extract files) if it is a supported type.
|
||||||
|
|||||||
@@ -661,7 +661,8 @@ public abstract class BaseDependencyCheckMojo extends AbstractMojo implements Ma
|
|||||||
try {
|
try {
|
||||||
final ArtifactResult result = repoSystem.resolveArtifact(repoSession, request);
|
final ArtifactResult result = repoSystem.resolveArtifact(repoSession, request);
|
||||||
if (result.isResolved() && result.getArtifact() != null && result.getArtifact().getFile() != null) {
|
if (result.isResolved() && result.getArtifact() != null && result.getArtifact().getFile() != null) {
|
||||||
final List<Dependency> deps = engine.scan(result.getArtifact().getFile().getAbsoluteFile());
|
final List<Dependency> deps = engine.scan(result.getArtifact().getFile().getAbsoluteFile(),
|
||||||
|
project.getName() + ":" + dependencyNode.getArtifact().getScope());
|
||||||
if (deps != null) {
|
if (deps != null) {
|
||||||
if (deps.size() == 1) {
|
if (deps.size() == 1) {
|
||||||
final Dependency d = deps.get(0);
|
final Dependency d = deps.get(0);
|
||||||
@@ -669,7 +670,6 @@ public abstract class BaseDependencyCheckMojo extends AbstractMojo implements Ma
|
|||||||
final Artifact a = result.getArtifact();
|
final Artifact a = result.getArtifact();
|
||||||
final MavenArtifact ma = new MavenArtifact(a.getGroupId(), a.getArtifactId(), a.getVersion());
|
final MavenArtifact ma = new MavenArtifact(a.getGroupId(), a.getArtifactId(), a.getVersion());
|
||||||
d.addAsEvidence("pom", ma, Confidence.HIGHEST);
|
d.addAsEvidence("pom", ma, Confidence.HIGHEST);
|
||||||
d.addProjectReference(project.getName() + ":" + dependencyNode.getArtifact().getScope());
|
|
||||||
if (getLog().isDebugEnabled()) {
|
if (getLog().isDebugEnabled()) {
|
||||||
getLog().debug(String.format("Adding project reference %s on dependency %s",
|
getLog().debug(String.format("Adding project reference %s on dependency %s",
|
||||||
project.getName(), d.getDisplayFileName()));
|
project.getName(), d.getDisplayFileName()));
|
||||||
|
|||||||
Reference in New Issue
Block a user