Mercurial > farol > farolluz
annotate farolluz/document.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 | b87f2a6e613a |
children |
rev | line source |
---|---|
0 | 1 # -*- coding: utf-8 -*- |
2 # | |
3 # Authors: | |
4 # BenoƮt Allard <benoit.allard@greenbone.net> | |
5 # | |
6 # Copyright: | |
7 # Copyright (C) 2014 Greenbone Networks GmbH | |
8 # | |
9 # This program is free software; you can redistribute it and/or | |
10 # modify it under the terms of the GNU General Public License | |
11 # as published by the Free Software Foundation; either version 2 | |
12 # of the License, or (at your option) any later version. | |
13 # | |
14 # This program is distributed in the hope that it will be useful, | |
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 # GNU General Public License for more details. | |
18 # | |
19 # You should have received a copy of the GNU General Public License | |
20 # along with this program; if not, write to the Free Software | |
21 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
22 | |
23 """\ | |
24 Objects related to CVRF Documents | |
25 """ | |
26 | |
26
809db989cac5
Reorganize the code in smaller mpodules
Benoît Allard <benoit.allard@greenbone.net>
parents:
22
diff
changeset
|
27 from .common import ValidationError |
809db989cac5
Reorganize the code in smaller mpodules
Benoît Allard <benoit.allard@greenbone.net>
parents:
22
diff
changeset
|
28 from .producttree import CVRFProductTree, CVRFRelationship |
0 | 29 |
30 class CVRFPublisher(object): | |
31 TYPES = ('Vendor', 'Discoverer', 'Coordinator', 'User', 'Other') | |
32 def __init__(self, _type, vendorid=None): | |
33 self._type = _type | |
34 self._vendorid = vendorid | |
35 self._contact = None | |
36 self._authority = None | |
37 | |
38 def setContact(self, contact): | |
39 self._contact = contact | |
40 | |
41 def setAuthority(self, authority): | |
42 self._authority = authority | |
43 | |
44 def validate(self): | |
45 if not self._type: | |
46 raise ValidationError('Document Publisher needs to have a type') | |
47 if self._type not in self.TYPES: | |
48 raise ValidationError('Document Publisher Type needs to be one of %s' % ', '.join(self.TYPES)) | |
49 | |
50 def __str__(self): | |
51 s = 'CVRFPublisher: %s' % self._type | |
52 if self._vendorid is not None: | |
53 s += ' ID: %s' % self._vendorid | |
54 if self._contact is not None: | |
55 s += ' Contact: "%s"' % self._contact | |
56 if self._authority is not None: | |
57 s += ' Authority: "%s"' % self._authority | |
58 return s | |
59 | |
60 | |
61 class CVRFTrackingID(object): | |
62 def __init__(self, _id): | |
63 self._id = _id | |
64 self._aliases = [] | |
65 | |
66 def addAlias(self, alias): | |
67 self._aliases.append(alias) | |
68 | |
6
633ebfcff0d0
Add a method to request a Document ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
69 def getId(self): |
633ebfcff0d0
Add a method to request a Document ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
70 return self._id |
633ebfcff0d0
Add a method to request a Document ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
71 |
0 | 72 def validate(self): |
73 if not self._id: | |
74 raise ValidationError('Document ID cannot be left empty') | |
75 | |
76 def __str__(self): | |
77 if self._aliases: | |
78 return "%s (%s)" % (self._id, ', '.join(self._aliases)) | |
79 return self._id | |
80 | |
81 | |
82 class CVRFTracking(object): | |
83 STATUSES = ('Draft', 'Interim', 'Final') | |
84 def __init__(self, _id, status, version, initial, current): | |
43
b87f2a6e613a
Add CVE parsing (from OpenVAS GSA)
Benoît Allard <benoit.allard@greenbone.net>
parents:
31
diff
changeset
|
85 """ version must be a tuple of (max four) ints """ |
0 | 86 self._identification = _id |
87 self._status = status | |
88 self._version = version | |
89 self._history = [] | |
90 self._initialDate = initial | |
91 self._currentDate = current | |
92 self._generator = None | |
93 | |
94 def addRevision(self, revision): | |
95 self._history.append(revision) | |
96 | |
97 def setGenerator(self, generator): | |
98 self._generator = generator | |
99 | |
6
633ebfcff0d0
Add a method to request a Document ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
100 def getId(self): |
633ebfcff0d0
Add a method to request a Document ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
101 return self._identification.getId() |
633ebfcff0d0
Add a method to request a Document ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
102 |
0 | 103 def validate(self): |
104 if self._identification is None: | |
105 raise ValidationError('Document Tracking needs to have an Identification') | |
106 self._identification.validate() | |
107 if not self._status: | |
108 raise ValidationError('Document status must be set') | |
109 if self._status not in self.STATUSES: | |
110 raise ValidationError('Document Status must be one of %s' % ', '.join(self.STATUSES)) | |
111 if not self._version: | |
112 raise ValidationError('Document Version must be set') | |
113 if len(self._version) > 4: | |
114 raise ValidationError('Document Version must be comprised between `nn` and `nn.nn.nn.nn`') | |
115 if not self._history: | |
116 raise ValidationError('Document must have at least a revision') | |
117 if not self._initialDate: | |
118 raise ValidationError('Document must have an initial Release date set') | |
119 prev_date = self._initialDate | |
120 if self._history[0]._date < self._initialDate: | |
121 # Documents could have revisions before being released | |
122 prev_date = self._history[0]._date | |
123 prev = () | |
124 for revision in self._history: | |
125 revision.validate() | |
126 if revision._number <= prev: | |
127 raise ValidationError('Revision numbers must always be increasing') | |
128 if revision._date < prev_date: | |
129 raise ValidationError('Revision dates must always be increasing') | |
130 prev = revision._number | |
131 prev_date = revision._date | |
132 if not self._currentDate: | |
133 raise ValidationError('Document must have a Current Release Date set') | |
134 if self._currentDate != self._history[-1]._date: | |
135 raise ValidationError('Current Release Date must be the same as the Date from the last Revision') | |
136 if self._initialDate > self._currentDate: | |
137 raise ValidationError('Initial date must not be after current Date') | |
138 if self._version != self._history[-1]._number: | |
139 raise ValidationError('Document version must be the same as the number of the last Revision') | |
140 | |
141 def __str__(self): | |
142 s = "ID: %s" % self._identification | |
143 s += " Status: %s" % self._status | |
144 s += " v%s" % '.'.join('%d' % i for i in self._version) | |
145 s += " %d revisions" % len(self._history) | |
146 s += " Initial release: %s" % self._initialDate.isoformat() | |
147 return s | |
148 | |
149 | |
150 class CVRFRevision(object): | |
151 def __init__(self, number, date, description): | |
43
b87f2a6e613a
Add CVE parsing (from OpenVAS GSA)
Benoît Allard <benoit.allard@greenbone.net>
parents:
31
diff
changeset
|
152 """ number is a tuple of (max four) ints """ |
0 | 153 self._number = number |
154 self._date = date | |
155 self._description = description | |
156 | |
157 def validate(self): | |
158 if not self._number: | |
159 raise ValidationError('A Revision must have a Number') | |
160 if not self._date: | |
161 raise ValidationError('A Revision must have a Date') | |
162 if not self._description: | |
163 raise ValidationError('A Revision must have a Description') | |
164 | |
165 class CVRFGenerator(object): | |
166 def __init__(self): | |
167 self._engine = None | |
168 self._date = None | |
169 | |
170 def setEngine(self, engine): | |
171 self._engine = engine | |
172 | |
173 def setDate(self, date): | |
174 self._date = date | |
175 | |
176 def validate(self): | |
177 if (not self._engine) and (not self._date): | |
178 raise ValidationError('The Generator must have at least an Engine or a Date') | |
179 | |
180 | |
1
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
181 class CVRFAggregateSeverity(object): |
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
182 def __init__(self, severity): |
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
183 self._severity = severity |
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
184 self._namespace = None |
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
185 |
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
186 def setNamespace(self, namespace): |
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
187 self._namespace = namespace |
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
188 |
22
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
189 |
0 | 190 class CVRF(object): |
191 def __init__(self, title, _type): | |
192 self._title = title | |
193 self._type = _type | |
194 self._publisher = None | |
195 self._tracking = None | |
196 self._notes = [] | |
197 self._distribution = None | |
1
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
198 self._aggregateseverity = None |
0 | 199 self._references = [] |
200 self._acknowledgments = [] | |
201 self._producttree = None | |
202 self._vulnerabilities = [] | |
203 | |
204 def setPublisher(self, publisher): | |
205 self._publisher = publisher | |
206 | |
207 def setTracking(self, tracking): | |
208 self._tracking = tracking | |
209 | |
210 def addNote(self, note): | |
211 self._notes.append(note) | |
212 | |
213 def setDistribution(self, distribution): | |
214 self._distribution = distribution | |
215 | |
1
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
216 def setAggregateSeverity(self, aggregateseverity): |
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
217 self._aggregateseverity = aggregateseverity |
d47e1164740f
Add support for AggregateSeverity
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
218 |
0 | 219 def addReference(self, ref): |
220 self._references.append(ref) | |
221 | |
222 def addAcknowledgment(self, ack): | |
223 self._acknowledgments.append(ack) | |
224 | |
225 def createProductTree(self): | |
226 """ only done if the element is there """ | |
227 self._producttree = CVRFProductTree() | |
228 return self._producttree | |
229 | |
230 def addVulnerability(self, vuln): | |
231 self._vulnerabilities.append(vuln) | |
232 | |
233 def getProductForID(self, productid): | |
234 if self._producttree is None: | |
235 raise ValueError('No ProductTree') | |
236 return self._producttree.getProductForID(productid) | |
237 | |
238 def getGroupForID(self, groupid): | |
239 if self._producttree is None: | |
240 raise ValueError('No ProductTree') | |
241 return self._producttree.getGroupForID(groupid) | |
242 | |
243 def getHighestCVSS(self): | |
244 highestBaseScore = 0 | |
245 highest = None | |
246 for vulnerability in self._vulnerabilities: | |
247 for cvss in vulnerability._cvsss: | |
248 if cvss._basescore <= highestBaseScore: | |
249 continue | |
250 highestBaseScore = cvss._basescore | |
251 highest = cvss | |
252 return highest | |
253 | |
254 def getProductList(self, type_='Fixed'): | |
255 products = set() | |
256 if type_ == 'Fixed': | |
257 # First try through the Remediation | |
258 for vulnerability in self._vulnerabilities: | |
259 for remediation in vulnerability._remediations: | |
260 if remediation._type != 'Vendor Fix': | |
261 continue | |
262 for productid in remediation._productids: | |
263 products.add(productid) | |
264 for groupid in remediation._groupids: | |
265 for productid in self.getGroupForID(groupid)._productids: | |
266 products.add(productid) | |
267 if not products: | |
268 # If nothing there, try through the productstatuses | |
269 for vulnerability in self._vulnerabilities: | |
270 for status in vulnerability._productstatuses: | |
271 if status._type != type_: | |
272 continue | |
273 for productid in status._productids: | |
274 products.add(productid) | |
275 return set(self.getProductForID(p) for p in products) | |
276 | |
22
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
277 def mentionsProductId(self, productid): |
17
90852c11fabd
Add methods to extract Product references in a document.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
278 # We first look at the ProductTree |
90852c11fabd
Add methods to extract Product references in a document.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
279 ptree = self._producttree |
90852c11fabd
Add methods to extract Product references in a document.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
280 for relation in ptree._relationships: |
90852c11fabd
Add methods to extract Product references in a document.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
281 if productid == relation._productreference: |
22
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
282 yield relation |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
283 elif productid == relation._relatestoproductreference: |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
284 yield relation |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
285 # Then go through the groups |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
286 for group in ptree._groups: |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
287 if productid in group._productids: |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
288 yield group |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
289 # Finally, go through all the Vulnerabilities |
17
90852c11fabd
Add methods to extract Product references in a document.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
290 for vulnerability in self._vulnerabilities: |
22
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
291 for item in vulnerability.mentionsProdId(productid): |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
292 yield item |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
293 |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
294 def isProductOrphan(self, productid): |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
295 """ Returns if a productid is mentioned nowhere in the document """ |
30
b15022ae484a
Fix isProductOrphan
Benoît Allard <benoit.allard@greenbone.net>
parents:
26
diff
changeset
|
296 for _ in self.mentionsProductId(productid): |
b15022ae484a
Fix isProductOrphan
Benoît Allard <benoit.allard@greenbone.net>
parents:
26
diff
changeset
|
297 return False |
b15022ae484a
Fix isProductOrphan
Benoît Allard <benoit.allard@greenbone.net>
parents:
26
diff
changeset
|
298 return True |
22
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
299 |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
300 def changeProductID(self, old, new): |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
301 for item in self.mentionsProductId(old): |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
302 if isinstance(item, CVRFRelationship): |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
303 if old == item._productreference: |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
304 item._productreference = new |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
305 elif old == item._relatestoproductreference: |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
306 item._relatestoproductreference = new |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
307 else: |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
308 item._productids.remove(old) |
4004b67216a9
Add tests + method to change a ProductID
Benoît Allard <benoit.allard@greenbone.net>
parents:
19
diff
changeset
|
309 item._productids.append(new) |
17
90852c11fabd
Add methods to extract Product references in a document.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
310 |
31
1ea1a3c3c790
Add method to change a Group ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
30
diff
changeset
|
311 def mentionsGroupId(self, groupid): |
1ea1a3c3c790
Add method to change a Group ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
30
diff
changeset
|
312 for vulnerability in self._vulnerabilities: |
1ea1a3c3c790
Add method to change a Group ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
30
diff
changeset
|
313 for item in vulnerability.mentionsGroupId(groupid): |
1ea1a3c3c790
Add method to change a Group ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
30
diff
changeset
|
314 yield item |
1ea1a3c3c790
Add method to change a Group ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
30
diff
changeset
|
315 |
19
4b53e7bcff0d
Add method to check group and producttree references
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
316 def isGroupOrphan(self, groupid): |
4b53e7bcff0d
Add method to check group and producttree references
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
317 """ Returns if a group can be safely deleted """ |
31
1ea1a3c3c790
Add method to change a Group ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
30
diff
changeset
|
318 for _ in self.mentionsGroupId(groupid): |
1ea1a3c3c790
Add method to change a Group ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
30
diff
changeset
|
319 return False |
19
4b53e7bcff0d
Add method to check group and producttree references
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
320 return True |
4b53e7bcff0d
Add method to check group and producttree references
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
321 |
31
1ea1a3c3c790
Add method to change a Group ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
30
diff
changeset
|
322 def changeGroupID(self, old, new): |
1ea1a3c3c790
Add method to change a Group ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
30
diff
changeset
|
323 for item in self.mentionsGroupId(old): |
1ea1a3c3c790
Add method to change a Group ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
30
diff
changeset
|
324 item._groupids.remove(old) |
1ea1a3c3c790
Add method to change a Group ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
30
diff
changeset
|
325 item._groupids.append(new) |
1ea1a3c3c790
Add method to change a Group ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
30
diff
changeset
|
326 |
19
4b53e7bcff0d
Add method to check group and producttree references
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
327 def isProductTreeOrphan(self): |
4b53e7bcff0d
Add method to check group and producttree references
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
328 """ Difference with the previous method is that we don;t care about |
4b53e7bcff0d
Add method to check group and producttree references
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
329 inter-producttree references """ |
4b53e7bcff0d
Add method to check group and producttree references
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
330 for vulnerability in self._vulnerabilities: |
4b53e7bcff0d
Add method to check group and producttree references
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
331 for product in self._producttree._products: |
4b53e7bcff0d
Add method to check group and producttree references
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
332 if vulnerability.isMentioningProdId(product._productid): |
4b53e7bcff0d
Add method to check group and producttree references
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
333 return False |
4b53e7bcff0d
Add method to check group and producttree references
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
334 for group in self._producttree._groups: |
4b53e7bcff0d
Add method to check group and producttree references
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
335 if vulnerability.isMentioningGroupId(group._groupid): |
4b53e7bcff0d
Add method to check group and producttree references
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
336 return False |
4b53e7bcff0d
Add method to check group and producttree references
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
337 return True |
4b53e7bcff0d
Add method to check group and producttree references
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
338 |
0 | 339 def getNote(self, ordinal): |
340 for note in self._notes: | |
341 if note._ordinal == ordinal: | |
342 return note | |
343 return None | |
344 | |
6
633ebfcff0d0
Add a method to request a Document ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
345 def getDocId(self): |
633ebfcff0d0
Add a method to request a Document ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
346 if self._tracking is not None: |
633ebfcff0d0
Add a method to request a Document ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
347 return self._tracking.getId() |
633ebfcff0d0
Add a method to request a Document ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
348 # Make up something ... |
633ebfcff0d0
Add a method to request a Document ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
349 return self._title.lower() |
633ebfcff0d0
Add a method to request a Document ID
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
350 |
0 | 351 def validate(self): |
352 if not self._title: | |
353 raise ValidationError('Document Title cannot be empty') | |
354 if not self._type: | |
355 raise ValidationError('Document Type cannot be empty') | |
356 if self._publisher is None: | |
357 raise ValidationError('Document Publisher needs to be set') | |
358 self._publisher.validate() | |
359 if self._tracking is None: | |
360 raise ValidationError('Document Tracking needs to be set') | |
361 self._tracking.validate() | |
362 ordinals = set() | |
363 for note in self._notes: | |
364 note.validate() | |
365 if note._ordinal in ordinals: | |
366 raise ValidationError('Document Note ordinal %d is issued twice' % note._ordinal) | |
367 ordinals.add(note._ordinal) | |
368 for reference in self._references: | |
369 reference.validate() | |
370 for acknowledgment in self._acknowledgments: | |
371 acknowledgment.validate() | |
372 productids = set() | |
373 groupids = set() | |
374 if self._producttree: | |
375 productids, groupids = self._producttree.validate() | |
376 ordinals = set() | |
377 for vulnerability in self._vulnerabilities: | |
378 vulnerability.validate(productids, groupids) | |
379 if vulnerability._ordinal in ordinals: | |
380 raise ValidationError('Vulnerability ordinal %d is issued twice' % vulnerability._ordinal) | |
381 ordinals.add(vulnerability._ordinal) | |
382 | |
383 def __str__(self): | |
384 s = [ | |
385 'Title: %s' % self._title, | |
386 'Type: %s' % self._type, | |
387 'Publisher: %s' % self._publisher, | |
388 'tracking: %s' % self._tracking, | |
389 '%d Notes: %s' % (len(self._notes), ', '.join( | |
390 str(n) for n in self._notes)) | |
391 ] | |
392 if self._distribution is not None: | |
393 s.append('Distribution: %s' % self._distribution) | |
394 s.extend([ | |
395 '%d Acknowledgments' % len(self._acknowledgments), | |
396 'Products: %s' % self._producttree, | |
397 ]) | |
398 return '\n'.join(s) |