1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.owasp.dependencycheck.analyzer;
19
20 import org.owasp.dependencycheck.Engine;
21 import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
22 import org.owasp.dependencycheck.data.nuget.NugetPackage;
23 import org.owasp.dependencycheck.data.nuget.NuspecParseException;
24 import org.owasp.dependencycheck.data.nuget.NuspecParser;
25 import org.owasp.dependencycheck.data.nuget.XPathNuspecParser;
26 import org.owasp.dependencycheck.dependency.Confidence;
27 import org.owasp.dependencycheck.dependency.Dependency;
28 import org.owasp.dependencycheck.utils.FileFilterBuilder;
29 import org.owasp.dependencycheck.utils.Settings;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33 import java.io.FileFilter;
34 import java.io.FileInputStream;
35 import java.io.FileNotFoundException;
36 import java.io.IOException;
37
38
39
40
41
42
43 public class NuspecAnalyzer extends AbstractFileTypeAnalyzer {
44
45
46
47
48 private static final Logger LOGGER = LoggerFactory.getLogger(NuspecAnalyzer.class);
49
50
51
52
53 private static final String ANALYZER_NAME = "Nuspec Analyzer";
54
55
56
57
58 private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
59
60
61
62
63 private static final String SUPPORTED_EXTENSIONS = "nuspec";
64
65
66
67
68
69
70 @Override
71 public void initializeFileTypeAnalyzer() throws Exception {
72 }
73
74
75
76
77
78
79 @Override
80 public String getName() {
81 return ANALYZER_NAME;
82 }
83
84
85
86
87
88
89 @Override
90 protected String getAnalyzerEnabledSettingKey() {
91 return Settings.KEYS.ANALYZER_NUSPEC_ENABLED;
92 }
93
94
95
96
97
98
99 @Override
100 public AnalysisPhase getAnalysisPhase() {
101 return ANALYSIS_PHASE;
102 }
103
104
105
106
107 private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(
108 SUPPORTED_EXTENSIONS).build();
109
110
111
112
113
114
115 @Override
116 protected FileFilter getFileFilter() {
117 return FILTER;
118 }
119
120
121
122
123
124
125
126
127 @Override
128 public void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException {
129 LOGGER.debug("Checking Nuspec file {}", dependency);
130 try {
131 final NuspecParser parser = new XPathNuspecParser();
132 NugetPackage np = null;
133 FileInputStream fis = null;
134 try {
135 fis = new FileInputStream(dependency.getActualFilePath());
136 np = parser.parse(fis);
137 } catch (NuspecParseException ex) {
138 throw new AnalysisException(ex);
139 } catch (FileNotFoundException ex) {
140 throw new AnalysisException(ex);
141 } finally {
142 if (fis != null) {
143 try {
144 fis.close();
145 } catch (IOException e) {
146 LOGGER.debug("Error closing input stream");
147 }
148 }
149 }
150
151 if (np.getOwners() != null) {
152 dependency.getVendorEvidence().addEvidence("nuspec", "owners", np.getOwners(), Confidence.HIGHEST);
153 }
154 dependency.getVendorEvidence().addEvidence("nuspec", "authors", np.getAuthors(), Confidence.HIGH);
155 dependency.getVersionEvidence().addEvidence("nuspec", "version", np.getVersion(), Confidence.HIGHEST);
156 dependency.getProductEvidence().addEvidence("nuspec", "id", np.getId(), Confidence.HIGHEST);
157 if (np.getTitle() != null) {
158 dependency.getProductEvidence().addEvidence("nuspec", "title", np.getTitle(), Confidence.MEDIUM);
159 }
160 } catch (Throwable e) {
161 throw new AnalysisException(e);
162 }
163 }
164 }