Mercurial > farol > farolluz
annotate farolluz/parsers/cvrf.py @ 55:7653ffbec88b tip
Update setup.py
author | Benoît Allard <benoit.allard@greenbone.net> |
---|---|
date | Wed, 07 Jan 2015 12:02:23 +0100 |
parents | 9ed24f48df01 |
children |
rev | line source |
---|---|
0 | 1 # -*- coding: utf-8 -*- |
2 # Description: | |
3 # Methods for parsing CVRF documents | |
4 # | |
5 # Authors: | |
6 # BenoƮt Allard <benoit.allard@greenbone.net> | |
7 # | |
8 # Copyright: | |
9 # Copyright (C) 2014 Greenbone Networks GmbH | |
10 # | |
11 # This program is free software; you can redistribute it and/or | |
12 # modify it under the terms of the GNU General Public License | |
13 # as published by the Free Software Foundation; either version 2 | |
14 # of the License, or (at your option) any later version. | |
15 # | |
16 # This program is distributed in the hope that it will be useful, | |
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 # GNU General Public License for more details. | |
20 # | |
21 # You should have received a copy of the GNU General Public License | |
22 # along with this program; if not, write to the Free Software | |
23 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
24 | |
25 """\ | |
26 Methods for parsing of CVRF Documents | |
27 """ | |
28 | |
29 from __future__ import print_function | |
42
9ed24f48df01
parsers/CVRF: Move the date parsing method to parsers/XML
Benoît Allard <benoit.allard@greenbone.net>
parents:
27
diff
changeset
|
30 # Allow .xml to be different from xml |
9ed24f48df01
parsers/CVRF: Move the date parsing method to parsers/XML
Benoît Allard <benoit.allard@greenbone.net>
parents:
27
diff
changeset
|
31 from __future__ import absolute_import |
0 | 32 |
33 import textwrap | |
34 import xml.etree.ElementTree as ET | |
35 | |
42
9ed24f48df01
parsers/CVRF: Move the date parsing method to parsers/XML
Benoît Allard <benoit.allard@greenbone.net>
parents:
27
diff
changeset
|
36 from .xml import parseDate |
0 | 37 |
27 | 38 from ..common import CVRFNote, CVRFAcknowledgment, CVRFReference |
39 from ..document import (CVRF, CVRFPublisher, CVRFTracking, CVRFRevision, | |
40 CVRFGenerator, CVRFAggregateSeverity, CVRFTrackingID) | |
41 from ..producttree import (CVRFProductBranch, CVRFFullProductName, | |
42 CVRFRelationship, CVRFGroup) | |
43 from ..vulnerability import (CVRFVulnerability, CVRFVulnerabilityID, CVRFThreat, | |
44 CVRFProductStatus, CVRFCVSSSet, CVRFRemediation, CVRFInvolvement, CVRFCWE) | |
0 | 45 |
46 NAMESPACES = { | |
47 'cvrf': "http://www.icasi.org/CVRF/schema/cvrf/1.1", | |
48 'prod': "http://www.icasi.org/CVRF/schema/prod/1.1", | |
49 'vuln': "http://www.icasi.org/CVRF/schema/vuln/1.1", | |
50 'xml': "http://www.w3.org/XML/1998/namespace", | |
51 } | |
52 | |
53 | |
54 def UN(ns, name): | |
55 """ UN for Universal Name """ | |
56 return "{%s}%s" % (NAMESPACES[ns], name) | |
57 | |
58 | |
59 def parseVersion(string): | |
60 return tuple(int(i) for i in string.split('.')) | |
61 | |
62 | |
63 def parseNote(elem): | |
64 return CVRFNote( | |
65 elem.attrib['Type'], | |
66 int(elem.attrib['Ordinal']), | |
67 textwrap.dedent(elem.text).strip(), | |
68 elem.attrib.get('Title'), | |
69 elem.attrib.get('Audience') | |
70 ) | |
71 | |
72 | |
73 def parseReference(elem, ns='cvrf'): | |
74 """ ns is the current namespace """ | |
75 return CVRFReference( | |
76 elem.findtext(UN(ns, 'URL')).strip(), | |
77 textwrap.dedent(elem.findtext(UN(ns, 'Description'))).strip(), | |
78 elem.attrib.get('Type') | |
79 ) | |
80 | |
81 | |
82 def parseAcknowledgment(elem, ns='cvrf'): | |
9
4c6e15514a6d
Parse Name and Organization in a Acknowledgment as multiple elements
Benoît Allard <benoit.allard@greenbone.net>
parents:
5
diff
changeset
|
83 names = [] |
4c6e15514a6d
Parse Name and Organization in a Acknowledgment as multiple elements
Benoît Allard <benoit.allard@greenbone.net>
parents:
5
diff
changeset
|
84 for cvrfname in elem.findall(UN(ns, 'Name')): |
4c6e15514a6d
Parse Name and Organization in a Acknowledgment as multiple elements
Benoît Allard <benoit.allard@greenbone.net>
parents:
5
diff
changeset
|
85 names.append(cvrfname.text.strip()) |
4c6e15514a6d
Parse Name and Organization in a Acknowledgment as multiple elements
Benoît Allard <benoit.allard@greenbone.net>
parents:
5
diff
changeset
|
86 orgs = [] |
4c6e15514a6d
Parse Name and Organization in a Acknowledgment as multiple elements
Benoît Allard <benoit.allard@greenbone.net>
parents:
5
diff
changeset
|
87 for cvrforg in elem.findall(UN(ns, 'Organization')): |
4c6e15514a6d
Parse Name and Organization in a Acknowledgment as multiple elements
Benoît Allard <benoit.allard@greenbone.net>
parents:
5
diff
changeset
|
88 orgs.append(cvrforg.text.strip()) |
0 | 89 return CVRFAcknowledgment( |
9
4c6e15514a6d
Parse Name and Organization in a Acknowledgment as multiple elements
Benoît Allard <benoit.allard@greenbone.net>
parents:
5
diff
changeset
|
90 names, orgs, |
0 | 91 elem.findtext(UN(ns, 'Description')), |
92 elem.findtext(UN(ns, 'URL')), | |
93 ) | |
94 | |
95 | |
96 def parseFullProductName(elem, parent): | |
97 return CVRFFullProductName( | |
98 elem.attrib['ProductID'], | |
99 elem.text.strip(), | |
100 parent, | |
101 cpe=elem.attrib.get('CPE') | |
102 ) | |
103 | |
104 | |
105 def parseProdBranch(elem, ptree, parentbranch=None): | |
106 """ Recursively parses the branches and the terminal productnames """ | |
107 fpncvrf = elem.find(UN('prod', 'FullProductName')) | |
108 if (parentbranch is not None) and (fpncvrf is not None): | |
109 # Don't process the products at the root of the tree | |
110 prod = parseFullProductName(fpncvrf, parentbranch) | |
111 ptree.addProduct(prod) | |
112 | |
113 if parentbranch is None: | |
114 parentbranch = ptree | |
115 for brcvrf in elem.findall(UN('prod', 'Branch')): | |
116 br = CVRFProductBranch(brcvrf.attrib['Type'], brcvrf.attrib['Name'], parentbranch) | |
117 # And go into recursion ... | |
118 br._childs = list(parseProdBranch(brcvrf, ptree, br)) | |
119 yield br | |
120 | |
121 | |
122 def parseVulnerability(elem): | |
123 vuln = CVRFVulnerability(int(elem.attrib['Ordinal'])) | |
124 | |
125 xmltitle = elem.findtext(UN('vuln', 'Title')) | |
126 if xmltitle is not None: | |
127 vuln.setTitle(xmltitle.strip()) | |
128 | |
129 xmlID = elem.find(UN('vuln', 'ID')) | |
130 if xmlID is not None: | |
131 vuln.setID(CVRFVulnerabilityID(xmlID.attrib['SystemName'], xmlID.text.strip())) | |
132 | |
133 for xmlnote in elem.findall('/'.join([UN('vuln', 'Notes'), UN('vuln', 'Note')])): | |
134 vuln.addNote(parseNote(xmlnote)) | |
135 | |
136 xmldiscoverydate = elem.findtext(UN('vuln', 'DiscoveryDate')) | |
137 if xmldiscoverydate is not None: | |
138 vuln.setDiscoveryDate(parseDate(xmldiscoverydate)) | |
139 xmlreleasedate = elem.findtext(UN('vuln', 'ReleaseDate')) | |
140 if xmlreleasedate is not None: | |
141 vuln.setReleaseDate(parseDate(xmlreleasedate)) | |
142 | |
143 for xmlinv in elem.findall('/'.join([UN('vuln', 'Involvements'), UN('vuln', 'Involvement')])): | |
144 involvement = CVRFInvolvement( | |
145 xmlinv.attrib['Party'], | |
146 xmlinv.attrib['Status'] | |
147 ) | |
148 xmldescr = xmlinv.findtext(UN('vuln', 'Description')) | |
149 if xmldescr is not None: | |
150 involvement.setDescription(textwrap.dedent(xmldescr).strip()) | |
151 vuln.addInvolvement(involvement) | |
152 | |
153 xmlcve = elem.findtext(UN('vuln', 'CVE')) | |
154 if xmlcve is not None: | |
155 vuln.setCVE(xmlcve.strip()) | |
156 | |
157 for xmlcwe in elem.findall(UN('vuln', 'CWE')): | |
158 vuln.addCWE(CVRFCWE( | |
159 xmlcwe.attrib['ID'], | |
160 xmlcwe.text.strip() | |
161 )) | |
162 | |
163 for xmlstatus in elem.findall('/'.join([UN('vuln', 'ProductStatuses'), UN('vuln', 'Status')])): | |
164 status = CVRFProductStatus(xmlstatus.attrib['Type']) | |
165 for xmlproductid in xmlstatus.findall(UN('vuln', 'ProductID')): | |
166 status.addProductID(xmlproductid.text.strip()) | |
167 | |
168 vuln.addProductStatus(status) | |
169 | |
170 for xmlthreat in elem.findall('/'.join([UN('vuln', 'Threats'), UN('vuln', 'Threat')])): | |
171 threat = CVRFThreat( | |
172 xmlthreat.attrib['Type'], | |
173 textwrap.dedent(xmlthreat.findtext(UN('vuln', 'Description'))).strip() | |
174 ) | |
175 xmldate = xmlthreat.findtext(UN('vuln', 'Date')) | |
176 if xmldate is not None: | |
177 threat.setDate(parseDate(xmldate)) | |
178 for xmlpid in xmlthreat.findall(UN('vuln', 'ProductID')): | |
179 threat.addProductID(xmlpid.text.strip()) | |
180 for xmlgid in xmlthreat.findall(UN('vuln', 'GroupID')): | |
181 threat.addGroupID(xmlgid.text.strip()) | |
182 | |
183 vuln.addThreat(threat) | |
184 | |
185 for xmlcvss in elem.findall('/'.join([UN('vuln', 'CVSSScoreSets'), UN('vuln', 'ScoreSet')])): | |
186 cvss_set = CVRFCVSSSet(float(xmlcvss.findtext(UN('vuln', 'BaseScore')).strip())) | |
187 xmltempscore = xmlcvss.findtext(UN('vuln', 'TemporalScore')) | |
188 if xmltempscore is not None: | |
189 cvss_set.setTemporalScore(float(xmltempscore.strip())) | |
190 xmlenvscore = xmlcvss.findtext(UN('vuln', 'EnvironmentalScore')) | |
191 if xmlenvscore is not None: | |
192 cvss_set.setEnvironmentalScore(float(xmlenvscore.strip())) | |
193 xmlvector = xmlcvss.findtext(UN('vuln', 'Vector')) | |
194 if xmlvector is not None: | |
195 cvss_set.setVector(xmlvector.strip()) | |
196 for xmlprodid in xmlcvss.findall(UN('vuln', 'ProductID')): | |
197 cvss_set.addProductID(xmlprodid.text.strip()) | |
198 | |
199 vuln.addCVSSSet(cvss_set) | |
200 | |
201 for xmlremediation in elem.findall('/'.join([UN('vuln', 'Remediations'), UN('vuln', 'Remediation')])): | |
202 remediation = CVRFRemediation( | |
203 xmlremediation.attrib['Type'], | |
204 textwrap.dedent(xmlremediation.findtext(UN('vuln', 'Description'))).strip() | |
205 ) | |
206 xmldate = xmlremediation.findtext(UN('vuln', 'Date')) | |
207 if xmldate is not None: | |
208 remediation.setDate(parseDate(xmldate)) | |
209 xmlentitlement = xmlremediation.findtext(UN('vuln', 'Entitlement')) | |
210 if xmlentitlement is not None: | |
211 remediation.setEntitlement(textwrap.dedent(xmlentitlement).strip()) | |
212 xmlurl = xmlremediation.findtext(UN('vuln', 'URL')) | |
213 if xmlurl is not None: | |
214 remediation.setURL(xmlurl.strip()) | |
215 for xmlpid in xmlremediation.findall(UN('vuln', 'ProductID')): | |
216 remediation.addProductID(xmlpid.text.strip()) | |
217 for xmlgid in xmlremediation.findall(UN('vuln', 'GroupID')): | |
218 remediation.addGroupID(xmlgid.text.strip()) | |
219 | |
220 vuln.addRemediation(remediation) | |
221 | |
222 for xmlref in elem.findall('/'.join([UN('vuln', 'References'), UN('vuln', 'Reference')])): | |
223 vuln.addReference(parseReference(xmlref, 'vuln')) | |
224 | |
225 for xmlack in elem.findall('/'.join([UN('vuln', 'Acknowledgments'), UN('vuln', 'Acknowledgment')])): | |
226 vuln.addAcknowledgment(parseAcknowledgment(xmlack, 'vuln')) | |
227 | |
228 return vuln | |
229 | |
230 | |
231 def parse(xml): | |
232 if hasattr(xml, 'read'): | |
233 xml = xml.read() | |
234 cvrfdoc = ET.fromstring(xml) | |
235 if cvrfdoc.tag != UN('cvrf', 'cvrfdoc'): | |
236 raise ValueError('Not a CVRF document !') | |
237 doc = CVRF( | |
238 cvrfdoc.findtext(UN('cvrf', 'DocumentTitle')).strip(), | |
239 cvrfdoc.findtext(UN('cvrf', 'DocumentType')).strip() | |
240 ) | |
5
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
241 |
0 | 242 cvrfpub = cvrfdoc.find(UN('cvrf', 'DocumentPublisher')) |
5
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
243 if cvrfpub is not None: |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
244 pub = CVRFPublisher(cvrfpub.attrib['Type'], cvrfpub.attrib.get('VendorID')) |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
245 doc.setPublisher(pub) |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
246 contact = cvrfpub.find(UN('cvrf', 'ContactDetails')) |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
247 if contact is not None: |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
248 pub.setContact(contact.text.strip()) |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
249 authority = cvrfpub.find(UN('cvrf', 'IssuingAuthority')) |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
250 if authority is not None: |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
251 pub.setAuthority(authority.text.strip()) |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
252 |
0 | 253 cvrftracking = cvrfdoc.find(UN('cvrf', 'DocumentTracking')) |
5
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
254 if cvrftracking is not None: |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
255 identification = CVRFTrackingID( |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
256 cvrftracking.findtext('/'.join([UN('cvrf', 'Identification'), UN('cvrf', 'ID')])).strip() |
0 | 257 ) |
5
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
258 for cvrfalias in cvrftracking.findall('/'.join([UN('cvrf', 'Identification'), UN('cvrf', 'Alias')])): |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
259 identification.addAlias(cvrfalias.text.strip()) |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
260 tracking = CVRFTracking( |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
261 identification, |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
262 cvrftracking.findtext(UN('cvrf', 'Status')).strip(), |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
263 parseVersion(cvrftracking.findtext(UN('cvrf', 'Version')).strip()), |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
264 parseDate(cvrftracking.findtext(UN('cvrf', 'InitialReleaseDate')).strip()), |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
265 parseDate(cvrftracking.findtext(UN('cvrf', 'CurrentReleaseDate')).strip()) |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
266 ) |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
267 doc.setTracking(tracking) |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
268 for cvrfrev in cvrftracking.findall('/'.join([UN('cvrf', 'RevisionHistory'), UN('cvrf', 'Revision')])): |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
269 rev = CVRFRevision( |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
270 parseVersion(cvrfrev.findtext(UN('cvrf', 'Number')).strip()), |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
271 parseDate(cvrfrev.findtext(UN('cvrf', 'Date')).strip()), |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
272 cvrfrev.findtext(UN('cvrf', 'Description')).strip(), |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
273 ) |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
274 tracking.addRevision(rev) |
0 | 275 |
5
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
276 xmlgenerator = cvrftracking.find(UN('cvrf', 'Generator')) |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
277 if xmlgenerator is not None: |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
278 generator = CVRFGenerator() |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
279 xmlengine = xmlgenerator.findtext(UN('cvrf', 'Engine')) |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
280 if xmlengine is not None: |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
281 generator.setEngine(xmlengine.strip()) |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
282 xmldate = xmlgenerator.findtext(UN('cvrf', 'Date')) |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
283 if xmldate is not None: |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
284 generator.setDate(parseDate(xmldate.strip())) |
d62264a643fb
Allow parsing of incomplete documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
285 tracking.setGenerator(generator) |
0 | 286 |
287 for cvrfnote in cvrfdoc.findall('/'.join([UN('cvrf', 'DocumentNotes'), UN('cvrf', 'Note')])): | |
288 doc.addNote(parseNote(cvrfnote)) | |
289 | |
290 distr = cvrfdoc.findtext(UN('cvrf', 'DocumentDistribution')) | |
291 if distr is not None: | |
292 doc.setDistribution(textwrap.dedent(distr).strip()) | |
293 | |
294 # This is in a quite free format, not sure how to do something with it ... | |
295 xmlaggsev = cvrfdoc.find(UN('cvrf', 'AggregateSeverity')) | |
1
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
296 if xmlaggsev is not None: |
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
297 aggsev = CVRFAggregateSeverity(xmlaggsev.text.strip()) |
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
298 if 'Namespace' in xmlaggsev.attrib: |
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
299 aggsev.setNamespace(xmlaggsev.attrib['Namespace']) |
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
300 doc.setAggregateSeverity(aggsev) |
0 | 301 |
302 for xmlref in cvrfdoc.findall('/'.join([UN('cvrf', 'DocumentReferences'), UN('cvrf', 'Reference')])): | |
303 doc.addReference(parseReference(xmlref)) | |
304 | |
305 for cvrfack in cvrfdoc.findall('/'.join([UN('cvrf', 'Acknowledgments'), UN('cvrf', 'Acknowledgment')])): | |
306 doc.addAcknowledgment(parseAcknowledgment(cvrfack)) | |
307 | |
308 # --- The ProductTree | |
309 | |
310 cvrfptree = cvrfdoc.find(UN('prod', 'ProductTree')) | |
311 if cvrfptree is not None: | |
312 producttree = doc.createProductTree() | |
15
dcc946b30343
Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents:
9
diff
changeset
|
313 # We need to exhaust our generator ... |
dcc946b30343
Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents:
9
diff
changeset
|
314 for _ in parseProdBranch(cvrfptree, producttree): pass |
0 | 315 |
316 for product in cvrfptree.findall(UN('prod', 'FullProductName')): | |
317 producttree.addProduct(parseFullProductName(product, producttree)) | |
318 | |
319 for cvrfrel in cvrfptree.findall(UN('prod', 'Relationship')): | |
320 rel = CVRFRelationship( | |
321 cvrfrel.attrib['ProductReference'], | |
322 cvrfrel.attrib['RelationType'], | |
323 cvrfrel.attrib['RelatesToProductReference'] | |
324 ) | |
325 producttree.addRelationship(rel) | |
326 producttree.addProduct(parseFullProductName(cvrfrel.find(UN('prod', 'FullProductName')), rel)) | |
327 | |
328 for xmlgroup in cvrfptree.findall('/'.join([UN('prod', 'ProductGroups'), UN('prod', 'Group')])): | |
329 group = CVRFGroup(xmlgroup.attrib['GroupID']) | |
330 xmldescr = xmlgroup.findtext(UN('prod', 'Description')) | |
331 if xmldescr is not None: | |
332 group.setDescription(textwrap.dedent(xmldescr).strip()) | |
333 for xmlpid in xmlgroup.findall(UN('prod', 'ProductID')): | |
334 group.addProductID(xmlpid.text.strip()) | |
335 producttree.addGroup(group) | |
336 | |
337 # --- The Vulnerabilities | |
338 | |
339 for cvrfvuln in cvrfdoc.findall(UN('vuln', 'Vulnerability')): | |
340 doc.addVulnerability(parseVulnerability(cvrfvuln)) | |
341 | |
342 return doc | |
343 | |
344 | |
345 if __name__ == "__main__": | |
346 import sys | |
347 with open(sys.argv[1], 'rt') as f: | |
348 cvrf = parse(f) | |
349 cvrf.validate() | |
350 print(cvrf) | |
351 print(cvrf.getHighestCVSS()._vector) | |
352 print(cvrf.getProductList()) | |
353 print(cvrf._producttree._branches) | |
354 # print(cvrf._producttree._branches[0]._childs) |