73 lines
2.3 KiB
Java
73 lines
2.3 KiB
Java
package it.unitn.molerat.repos.trackers.vuln;
|
|
|
|
import it.unitn.molerat.evidence.Changes;
|
|
import it.unitn.molerat.evidence.VulnerabilityEvidence;
|
|
import it.unitn.molerat.repos.utils.SignatureExtractor;
|
|
import it.unitn.molerat.repos.wrappers.RepoWrapper;
|
|
|
|
import java.util.HashSet;
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
|
|
public class EnhancedDeletionVulnerabilityEvidenceTracker extends DeletionVulnerabilityEvidenceTracker{
|
|
|
|
public EnhancedDeletionVulnerabilityEvidenceTracker(RepoWrapper wrapper, String fixedRev) throws Exception {
|
|
super(wrapper, fixedRev);
|
|
}
|
|
|
|
|
|
@Override
|
|
protected Set<VulnerabilityEvidence> getInitialVulnerabilityEvidence(Changes changes) throws Exception {
|
|
if (changes.getDeletions().size() != 0) {
|
|
return super.getInitialVulnerabilityEvidence(changes);
|
|
}
|
|
else {
|
|
SignatureExtractor se = new SignatureExtractor(repoWrapper.doCat(changes.getPath(), changes.getRightRevision()));
|
|
Map<String, Set<Integer>> rightSignatures = se.getSignaturesWithLines();
|
|
|
|
Set<String> relevantSignatures = new HashSet<>();
|
|
|
|
for (int line : changes.getAdditions().keySet()) {
|
|
for (Map.Entry<String, Set<Integer>> entry : rightSignatures.entrySet()) {
|
|
if (entry.getValue().contains(line)) {
|
|
relevantSignatures.add(entry.getKey());
|
|
}
|
|
}
|
|
}
|
|
|
|
String leftFile = repoWrapper.doCat(changes.getPath(), changes.getLeftRevision());
|
|
Map<Integer, String> lineMappings = repoWrapper.getLineMappings(leftFile);
|
|
se = new SignatureExtractor(leftFile);
|
|
Map<String, Set<Integer>> leftSignatures = se.getSignaturesWithLines();
|
|
|
|
for (int line : changes.getDeletions().keySet()) {
|
|
for (Map.Entry<String, Set<Integer>> entry : leftSignatures.entrySet()) {
|
|
if (entry.getValue().contains(line)) {
|
|
relevantSignatures.add(entry.getKey());
|
|
}
|
|
}
|
|
}
|
|
|
|
Set<VulnerabilityEvidence> initialEvidence = new HashSet<>();
|
|
for (String signature : relevantSignatures) {
|
|
for (Map.Entry<String, Set<Integer>> entry : leftSignatures.entrySet()) {
|
|
if (signature.equals(entry.getKey())) {
|
|
for (int line : entry.getValue()) {
|
|
VulnerabilityEvidence evd = new VulnerabilityEvidence(
|
|
changes.getPath(),
|
|
changes.getLeftRevision(),
|
|
signature,
|
|
line,
|
|
lineMappings.get(line)
|
|
);
|
|
initialEvidence.add(evd);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return initialEvidence;
|
|
}
|
|
}
|
|
}
|