1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.owasp.dependencycheck.data.nuget;
19
20 import java.io.InputStream;
21 import javax.xml.parsers.DocumentBuilderFactory;
22 import javax.xml.xpath.XPath;
23 import javax.xml.xpath.XPathConstants;
24 import javax.xml.xpath.XPathFactory;
25 import org.w3c.dom.Document;
26 import org.w3c.dom.Node;
27
28
29
30
31
32
33 public class XPathNuspecParser implements NuspecParser {
34
35
36
37
38
39
40
41 private String getOrNull(Node n) {
42 if (n != null) {
43 return n.getTextContent();
44 } else {
45 return null;
46 }
47 }
48
49
50
51
52
53
54
55
56 @Override
57 public NugetPackage parse(InputStream stream) throws NuspecParseException {
58 try {
59 final Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(stream);
60 final XPath xpath = XPathFactory.newInstance().newXPath();
61 final NugetPackage nuspec = new NugetPackage();
62
63 if (xpath.evaluate("/package/metadata/id", d, XPathConstants.NODE) == null
64 || xpath.evaluate("/package/metadata/version", d, XPathConstants.NODE) == null
65 || xpath.evaluate("/package/metadata/authors", d, XPathConstants.NODE) == null
66 || xpath.evaluate("/package/metadata/description", d, XPathConstants.NODE) == null) {
67 throw new NuspecParseException("Invalid Nuspec format");
68 }
69
70 nuspec.setId(xpath.evaluate("/package/metadata/id", d));
71 nuspec.setVersion(xpath.evaluate("/package/metadata/version", d));
72 nuspec.setAuthors(xpath.evaluate("/package/metadata/authors", d));
73 nuspec.setOwners(getOrNull((Node) xpath.evaluate("/package/metadata/owners", d, XPathConstants.NODE)));
74 nuspec.setLicenseUrl(getOrNull((Node) xpath.evaluate("/package/metadata/licenseUrl", d, XPathConstants.NODE)));
75 nuspec.setTitle(getOrNull((Node) xpath.evaluate("/package/metadata/title", d, XPathConstants.NODE)));
76 return nuspec;
77 } catch (Throwable e) {
78 throw new NuspecParseException("Unable to parse nuspec", e);
79 }
80 }
81 }