0
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1 # -*- coding: utf-8 -*- |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
2 # |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
3 # Authors: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
4 # BenoƮt Allard <benoit.allard@greenbone.net> |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
5 # |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
6 # Copyright: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
7 # Copyright (C) 2014 Greenbone Networks GmbH |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
8 # |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
9 # This program is free software; you can redistribute it and/or |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
10 # modify it under the terms of the GNU General Public License |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
11 # as published by the Free Software Foundation; either version 2 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
12 # of the License, or (at your option) any later version. |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
13 # |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
14 # This program is distributed in the hope that it will be useful, |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
17 # GNU General Public License for more details. |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
18 # |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
19 # You should have received a copy of the GNU General Public License |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
20 # along with this program; if not, write to the Free Software |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
21 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
22 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
23 """\ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
24 Objects related to CVRF Documents |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
25 """ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
26 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
27 class ValidationError(Exception): pass |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
28 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
29 class CVRFPublisher(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
30 TYPES = ('Vendor', 'Discoverer', 'Coordinator', 'User', 'Other') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
31 def __init__(self, _type, vendorid=None): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
32 self._type = _type |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
33 self._vendorid = vendorid |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
34 self._contact = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
35 self._authority = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
36 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
37 def setContact(self, contact): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
38 self._contact = contact |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
39 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
40 def setAuthority(self, authority): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
41 self._authority = authority |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
42 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
43 def validate(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
44 if not self._type: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
45 raise ValidationError('Document Publisher needs to have a type') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
46 if self._type not in self.TYPES: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
47 raise ValidationError('Document Publisher Type needs to be one of %s' % ', '.join(self.TYPES)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
48 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
49 def __str__(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
50 s = 'CVRFPublisher: %s' % self._type |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
51 if self._vendorid is not None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
52 s += ' ID: %s' % self._vendorid |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
53 if self._contact is not None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
54 s += ' Contact: "%s"' % self._contact |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
55 if self._authority is not None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
56 s += ' Authority: "%s"' % self._authority |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
57 return s |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
58 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
59 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
60 class CVRFTrackingID(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
61 def __init__(self, _id): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
62 self._id = _id |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
63 self._aliases = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
64 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
65 def addAlias(self, alias): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
66 self._aliases.append(alias) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
67 |
6
|
68 def getId(self): |
|
69 return self._id |
|
70 |
0
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
71 def validate(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
72 if not self._id: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
73 raise ValidationError('Document ID cannot be left empty') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
74 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
75 def __str__(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
76 if self._aliases: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
77 return "%s (%s)" % (self._id, ', '.join(self._aliases)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
78 return self._id |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
79 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
80 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
81 class CVRFTracking(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
82 STATUSES = ('Draft', 'Interim', 'Final') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
83 def __init__(self, _id, status, version, initial, current): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
84 self._identification = _id |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
85 self._status = status |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
86 self._version = version |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
87 self._history = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
88 self._initialDate = initial |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
89 self._currentDate = current |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
90 self._generator = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
91 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
92 def addRevision(self, revision): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
93 self._history.append(revision) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
94 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
95 def setGenerator(self, generator): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
96 self._generator = generator |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
97 |
6
|
98 def getId(self): |
|
99 return self._identification.getId() |
|
100 |
0
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
101 def validate(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
102 if self._identification is None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
103 raise ValidationError('Document Tracking needs to have an Identification') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
104 self._identification.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
105 if not self._status: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
106 raise ValidationError('Document status must be set') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
107 if self._status not in self.STATUSES: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
108 raise ValidationError('Document Status must be one of %s' % ', '.join(self.STATUSES)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
109 if not self._version: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
110 raise ValidationError('Document Version must be set') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
111 if len(self._version) > 4: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
112 raise ValidationError('Document Version must be comprised between `nn` and `nn.nn.nn.nn`') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
113 if not self._history: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
114 raise ValidationError('Document must have at least a revision') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
115 if not self._initialDate: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
116 raise ValidationError('Document must have an initial Release date set') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
117 prev_date = self._initialDate |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
118 if self._history[0]._date < self._initialDate: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
119 # Documents could have revisions before being released |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
120 prev_date = self._history[0]._date |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
121 prev = () |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
122 for revision in self._history: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
123 revision.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
124 if revision._number <= prev: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
125 raise ValidationError('Revision numbers must always be increasing') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
126 if revision._date < prev_date: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
127 raise ValidationError('Revision dates must always be increasing') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
128 prev = revision._number |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
129 prev_date = revision._date |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
130 if not self._currentDate: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
131 raise ValidationError('Document must have a Current Release Date set') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
132 if self._currentDate != self._history[-1]._date: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
133 raise ValidationError('Current Release Date must be the same as the Date from the last Revision') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
134 if self._initialDate > self._currentDate: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
135 raise ValidationError('Initial date must not be after current Date') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
136 if self._version != self._history[-1]._number: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
137 raise ValidationError('Document version must be the same as the number of the last Revision') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
138 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
139 def __str__(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
140 s = "ID: %s" % self._identification |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
141 s += " Status: %s" % self._status |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
142 s += " v%s" % '.'.join('%d' % i for i in self._version) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
143 s += " %d revisions" % len(self._history) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
144 s += " Initial release: %s" % self._initialDate.isoformat() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
145 return s |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
146 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
147 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
148 class CVRFRevision(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
149 def __init__(self, number, date, description): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
150 self._number = number |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
151 self._date = date |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
152 self._description = description |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
153 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
154 def validate(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
155 if not self._number: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
156 raise ValidationError('A Revision must have a Number') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
157 if not self._date: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
158 raise ValidationError('A Revision must have a Date') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
159 if not self._description: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
160 raise ValidationError('A Revision must have a Description') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
161 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
162 class CVRFGenerator(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
163 def __init__(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
164 self._engine = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
165 self._date = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
166 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
167 def setEngine(self, engine): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
168 self._engine = engine |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
169 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
170 def setDate(self, date): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
171 self._date = date |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
172 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
173 def validate(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
174 if (not self._engine) and (not self._date): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
175 raise ValidationError('The Generator must have at least an Engine or a Date') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
176 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
177 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
178 class CVRFNote(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
179 TYPES = ('General', 'Details', 'Description', 'Summary', 'FAQ', |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
180 'Legal Disclaimer', 'Other') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
181 def __init__(self, _type, ordinal, note, title=None, audience=None): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
182 self._type = _type |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
183 self._ordinal = ordinal |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
184 self._note = note |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
185 self._title = title |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
186 self._audience = audience |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
187 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
188 def getTitle(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
189 """ returns something that can be used as a title """ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
190 if self._title is None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
191 return "%s (#%d)" % (self._type, self._ordinal) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
192 return "%s (%s)" % (self._title, self._type) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
193 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
194 def validate(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
195 if not self._type: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
196 raise ValidationError('A Note needs to have a Type set') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
197 if self._type not in self.TYPES: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
198 raise ValidationError('A Note Type needs to be one of %s' % ', '.join(self.TYPES)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
199 if self._ordinal < 0: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
200 raise ValidationError('A Note ordinal must be a positive integer') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
201 if not self._note: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
202 raise ValidationError('A Note must contain some text') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
203 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
204 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
205 def __str__(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
206 return self._note |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
207 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
208 |
1
|
209 class CVRFAggregateSeverity(object): |
|
210 def __init__(self, severity): |
|
211 self._severity = severity |
|
212 self._namespace = None |
|
213 |
|
214 def setNamespace(self, namespace): |
|
215 self._namespace = namespace |
|
216 |
0
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
217 class CVRFReference(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
218 TYPES = ('Self', 'External') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
219 def __init__(self, url, description, _type=None): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
220 self._url = url |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
221 self._description = description |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
222 self._type = _type |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
223 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
224 def validate(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
225 if (self._type is not None) and (self._type not in self.TYPES): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
226 raise ValidationError('If a Reference type is set, it mist be one of %s' % ', '.join(self.TYPES)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
227 if not self._url: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
228 raise ValidationError('A Reference must contain an URL') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
229 if not self._description: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
230 raise ValidationError('A Reference must contain a description') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
231 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
232 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
233 class CVRFAcknowledgment(object): |
8
cb8b2a196f0b
Allow Name and Organization in anAcknowledgment to be plural
Benoît Allard <benoit.allard@greenbone.net>
diff
changeset
|
234 def __init__(self, names=[], organizations=[], description=None, |
0
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
235 url=None): |
8
cb8b2a196f0b
Allow Name and Organization in anAcknowledgment to be plural
Benoît Allard <benoit.allard@greenbone.net>
diff
changeset
|
236 self._names = names |
cb8b2a196f0b
Allow Name and Organization in anAcknowledgment to be plural
Benoît Allard <benoit.allard@greenbone.net>
diff
changeset
|
237 self._organizations = organizations |
0
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
238 self._description = description |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
239 self._url = url |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
240 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
241 def getTitle(self): |
8
cb8b2a196f0b
Allow Name and Organization in anAcknowledgment to be plural
Benoît Allard <benoit.allard@greenbone.net>
diff
changeset
|
242 return "%s - %s" % (', '.join(self._names), |
cb8b2a196f0b
Allow Name and Organization in anAcknowledgment to be plural
Benoît Allard <benoit.allard@greenbone.net>
diff
changeset
|
243 ', '.join(self._organizations)) |
0
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
244 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
245 def validate(self): |
8
cb8b2a196f0b
Allow Name and Organization in anAcknowledgment to be plural
Benoît Allard <benoit.allard@greenbone.net>
diff
changeset
|
246 if (not self._names) and (not self._organizations) and (not self._description): |
0
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
247 raise ValidationError('An Acknowledgment must have at least a Name, an Organization or a Description') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
248 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
249 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
250 class CVRFProductTree(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
251 def __init__(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
252 # All the branches, they can be order with their `parent` attribute |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
253 self._branches = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
254 self._groups = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
255 self._relationships = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
256 self._products = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
257 self._groups = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
258 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
259 def addBranch(self, branch): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
260 parent = self.getBranch(branch.getParent().getPath()) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
261 if parent is self: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
262 self._branches.append(branch) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
263 else: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
264 parent._childs.append(branch) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
265 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
266 def addProduct(self, product): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
267 if product not in self._products: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
268 self._products.append(product) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
269 if product._parent is not self: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
270 product._parent._product = product |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
271 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
272 def addRelationship(self, rel): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
273 self._relationships.append(rel) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
274 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
275 def addGroup(self, group): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
276 self._groups.append(group) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
277 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
278 def getProductForID(self, productid): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
279 for product in self._products: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
280 if product._productid == productid: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
281 return product |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
282 raise KeyError(productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
283 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
284 def getGroupForID(self, groupid): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
285 for group in self._groups: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
286 if group._groupid == groupid: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
287 return group |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
288 raise KeyError(groupid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
289 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
290 def decomposeProduct(self, productid): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
291 """ In case of product defined as a relationship (product X installed |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
292 on OS Y), this gives us the following tuple: (OS, product). """ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
293 product = self.getProductForID(productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
294 parent = product._parent |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
295 if parent is None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
296 return (None, None) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
297 if not isinstance(parent, CVRFRelationship): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
298 return (None, None) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
299 relationtype = parent._relationtype.replace(' ', '').lower() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
300 if relationtype not in ('defaultcomponentof', 'installedon'): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
301 return (None, None) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
302 return ( |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
303 self.getProductForID(parent._relatestoproductreference), |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
304 self.getProductForID(parent._productreference) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
305 ) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
306 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
307 def getBranch(self, path): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
308 if len(path) == 0: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
309 return self |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
310 branches = self._branches |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
311 node = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
312 for idx in path: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
313 node = branches[idx] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
314 branches = node._childs |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
315 return node |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
316 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
317 def getBranches(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
318 for branch in self._branches: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
319 yield branch |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
320 for sub_branch in branch.getBranches(): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
321 yield sub_branch |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
322 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
323 def getPath(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
324 return () |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
325 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
326 def getNameOfRelationship(self, relationship): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
327 if relationship is None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
328 return '' |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
329 return ' '.join((self.getProductForID(relationship._productreference)._name, 'as', |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
330 relationship._relationtype.lower(), |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
331 self.getProductForID(relationship._relatestoproductreference)._name)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
332 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
333 def getOrphanedBranches(self, product=None): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
334 """ The branches that could accept `product` as Product Definition """ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
335 white_list = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
336 if product is not None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
337 white_list = [product._parent] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
338 for branch in self.getBranches(): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
339 if (branch in white_list) or branch.isOrphaned(): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
340 yield branch |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
341 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
342 def getNotTerminalBranches(self, b2=None): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
343 """\ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
344 The branches that could accept `b2` as new sub-branches |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
345 Note that b2 and all its sub-branches cannot be listed |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
346 """ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
347 black_list = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
348 if b2 is not None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
349 black_list = [b2] + list(b2.getBranches()) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
350 for branch in self.getBranches(): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
351 if branch in black_list: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
352 continue |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
353 if branch._product is None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
354 yield branch |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
355 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
356 def getOrphanedRelationships(self, product=None): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
357 """ The relationships that need a product defninition """ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
358 white_list = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
359 if product is not None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
360 white_list = [product.getCurrentRelationship()] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
361 for i, relationship in enumerate(self._relationships): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
362 if (relationship in white_list) or relationship.isOrphaned(): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
363 yield (i, relationship) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
364 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
365 def nbProducts(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
366 """ Amount of 'raw' Products """ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
367 return len([p for p in self._products if p._parent is self]) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
368 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
369 def validate(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
370 for branch in self._branches: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
371 branch.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
372 productids = set() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
373 for product in self._products: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
374 product.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
375 if product._productid in productids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
376 raise ValidationError('Each ProductID must be unique (%s)' % product._productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
377 productids.add(product._productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
378 for relationship in self._relationships: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
379 relationship.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
380 for productid in (relationship._productreference, |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
381 relationship._relatestoproductreference): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
382 if productid not in productids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
383 raise ValidationError('ProductID %s is unknown' % productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
384 groupids = set() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
385 for group in self._groups: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
386 group.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
387 if group._groupid in groupids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
388 raise ValidationError('Duplicated GroupID: %s' % group._groupid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
389 groupids.add(group._groupid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
390 for productid in group._productids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
391 if productid not in productids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
392 raise ValidationError('ProductID %s is unknown' % productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
393 return productids, groupids |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
394 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
395 def __str__(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
396 return 'Products: %s' % '\n'.join(str(p) for p in self._products) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
397 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
398 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
399 class CVRFProductBranch(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
400 TYPES = ('Vendor', 'Product Family', 'Product Name', 'Product Version', |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
401 'Patch Level', 'Service Pack', 'Architecture', 'Language', |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
402 'Legacy', 'Specification') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
403 def __init__(self, _type, name, parentbranch): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
404 self._type = _type |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
405 self._name = name |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
406 self._parentbranch = parentbranch |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
407 self._childs = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
408 self._product = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
409 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
410 def getParent(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
411 return self._parentbranch |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
412 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
413 def getPath(self, string=False): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
414 """ return the path to that branch element as a tuple """ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
415 if self.isRoot(): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
416 for i, b in enumerate(self._parentbranch._branches): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
417 if b is self: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
418 if string: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
419 return '%d' % i |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
420 return (i, ) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
421 else: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
422 for i, b in enumerate(self._parentbranch._childs): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
423 if b is self: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
424 if string: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
425 return '/'.join([self._parentbranch.getPath(string), '%d' % i]) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
426 return self._parentbranch.getPath(string) + (i,) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
427 if string: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
428 return '' |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
429 return () |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
430 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
431 def getTree(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
432 """ this returns a list of tuples (type, name) leading to here""" |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
433 if self.isRoot(): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
434 return [(self._type, self._name)] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
435 return self._parentbranch.getTree() + [(self._type, self._name)] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
436 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
437 def getName(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
438 return ' / '.join("%s: %s" % (type_, name) for type_, name in self.getTree()) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
439 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
440 def getParentPath(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
441 """ return as string the path to the parent """ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
442 return '/'.join('%s' % p for p in self.getPath()[:-1]) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
443 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
444 def isRoot(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
445 return isinstance(self._parentbranch, CVRFProductTree) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
446 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
447 def isOrphaned(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
448 """ Has no childs and no product """ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
449 return len(self._childs) == 0 and (self._product is None) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
450 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
451 def getBranches(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
452 for branch in self._childs: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
453 yield branch |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
454 for sub_branch in branch.getBranches(): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
455 yield sub_branch |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
456 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
457 def unlink(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
458 """ Unset our _parent, and remove us from the _parent._childs """ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
459 if self.isRoot(): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
460 self.getParent()._branches.remove(self) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
461 else: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
462 self.getParent()._childs.remove(self) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
463 self._parentbranch = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
464 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
465 def validate(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
466 if not self._type: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
467 raise ValidationError('A Branch must have a Type') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
468 if self._type not in self.TYPES: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
469 raise ValidationError('A Branch Type must be one of %s' % ', '.join(self.TYPES)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
470 if not self._name: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
471 raise ValidationError('A Branch must have a Name') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
472 for branch in self._childs: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
473 branch.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
474 if self.isOrphaned(): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
475 raise ValidationError('A Branch must have at least a sub-product or sub-branches') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
476 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
477 def __str__(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
478 return "%s: %s" % (self._type, self._name) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
479 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
480 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
481 class CVRFFullProductName(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
482 def __init__(self, productid, name, parent, cpe=None): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
483 self._productid = productid |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
484 self._name = name |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
485 # Can be None (directly under the tree), a ProductBranch, or a |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
486 # Relationship |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
487 self._parent = parent |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
488 self._cpe = cpe |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
489 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
490 def isRoot(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
491 return isinstance(self._parent, CVRFProductTree) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
492 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
493 def isRelationship(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
494 return isinstance(self._parent, CVRFRelationship) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
495 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
496 def getTree(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
497 if not isinstance(self._parent, CVRFProductBranch): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
498 return [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
499 return self._parent.getTree() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
500 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
501 def getParentPath(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
502 if self.isRoot() or self.isRelationship(): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
503 return '' |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
504 return self._parent.getPath(True) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
505 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
506 def getCurrentRelationship(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
507 if self.isRelationship(): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
508 return self._parent |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
509 return None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
510 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
511 def unlink(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
512 """ Unset our _parent, and remove us from the _parent._childs """ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
513 if self.isRoot(): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
514 self._parent._products.remove(self) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
515 else: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
516 self._parent._product = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
517 self._parent = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
518 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
519 def validate(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
520 if not self._productid: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
521 raise ValidationError('A Product must have a ProductID') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
522 if not self._name: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
523 raise ValidationError('A Product must have a Name') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
524 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
525 def __str__(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
526 return "%s (%s)" % (self._productid, self._name) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
527 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
528 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
529 class CVRFRelationship(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
530 TYPES = ('Default Component Of', 'Optional Component Of', |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
531 'External Component Of', 'Installed On', 'Installed With') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
532 def __init__(self, productref, reltype, relatestoproductref): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
533 self._productreference = productref |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
534 self._relationtype = reltype |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
535 self._relatestoproductreference = relatestoproductref |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
536 self._product = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
537 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
538 def getParent(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
539 """ All parent element of a FullProductName should implement that |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
540 method """ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
541 return None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
542 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
543 def isOrphaned(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
544 return self._product is None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
545 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
546 def validate(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
547 if not self._productreference: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
548 raise ValidationError('A Relationship must have a Product Reference') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
549 if not self._relationtype: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
550 raise ValidationError('A Relationship must have a Relation Type') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
551 if self._relationtype not in self.TYPES: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
552 raise ValidationError('Relation Type must be one of %s' % ', '.join(self.TYPES)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
553 if not self._relatestoproductreference: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
554 raise ValidationError('A Relationship must have a "Relates To product Reference"') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
555 if self._productreference == self._relatestoproductreference: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
556 raise ValidationError('A Relationship cannot reference twice the same Product') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
557 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
558 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
559 class CVRFGroup(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
560 def __init__(self, groupid): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
561 self._groupid = groupid |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
562 self._description = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
563 self._productids = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
564 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
565 def setDescription(self, description): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
566 self._description = description |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
567 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
568 def addProductID(self, productid): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
569 self._productids.append(productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
570 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
571 def getTitle(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
572 if self._description: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
573 return "%s (%d products)" % (self._description, len(self._productids)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
574 return "#%s (%d products)" % (self._groupid, len(self._productids)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
575 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
576 def validate(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
577 if not self._groupid: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
578 raise ValidationError('A Group must have a GroupID') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
579 if not self._productids or len(self._productids) < 2: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
580 raise ValidationError('A Group must contain at least two products') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
581 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
582 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
583 class CVRFVulnerabilityID(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
584 def __init__(self, systemname, value): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
585 self._systemname = systemname |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
586 self._value = value |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
587 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
588 def validate(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
589 if not self._systemname: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
590 raise ValidationError('A Vulnerability ID must have a System Name') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
591 if not self._value: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
592 raise ValidationError('A Vulnerability ID must have a value') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
593 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
594 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
595 class CVRFVulnerability(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
596 def __init__(self, ordinal): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
597 self._ordinal = ordinal |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
598 self._title = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
599 self._id = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
600 self._notes = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
601 self._discoverydate = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
602 self._releasedate = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
603 self._involvements = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
604 self._cve = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
605 self._cwes = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
606 self._productstatuses = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
607 self._threats = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
608 self._cvsss = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
609 self._remediations = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
610 self._references = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
611 self._acknowledgments = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
612 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
613 def setTitle(self, title): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
614 self._title = title |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
615 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
616 def setID(self, _id): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
617 self._id = _id |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
618 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
619 def addNote(self, note): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
620 self._notes.append(note) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
621 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
622 def setDiscoveryDate(self, date): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
623 self._discoverydate = date |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
624 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
625 def setReleaseDate(self, date): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
626 self._releasedate = date |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
627 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
628 def addInvolvement(self, involvement): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
629 self._involvements.append(involvement) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
630 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
631 def setCVE(self, cve): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
632 self._cve = cve |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
633 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
634 def addCWE(self, cwe): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
635 self._cwes.append(cwe) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
636 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
637 def addProductStatus(self, productstatus): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
638 self._productstatuses.append(productstatus) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
639 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
640 def addThreat(self, threat): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
641 self._threats.append(threat) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
642 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
643 def addCVSSSet(self, cvss_set): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
644 self._cvsss.append(cvss_set) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
645 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
646 def addRemediation(self, remediation): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
647 self._remediations.append(remediation) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
648 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
649 def addReference(self, ref): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
650 self._references.append(ref) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
651 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
652 def addAcknowledgment(self, ack): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
653 self._acknowledgments.append(ack) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
654 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
655 def getTitle(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
656 """ return something that can be used as a title """ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
657 if self._title: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
658 if self._id: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
659 return "%s (%s)" % (self._title, self._id._value) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
660 return self._title |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
661 if self._id: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
662 return self._id._value |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
663 return "#%d" % self._ordinal |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
664 |
7
|
665 def getNote(self, ordinal): |
|
666 for note in self._notes: |
|
667 if note._ordinal == ordinal: |
|
668 return note |
|
669 return None |
|
670 |
0
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
671 def validate(self, productids, groupids): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
672 if not self._ordinal: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
673 raise ValidationError('A Vulnerability must have an ordinal') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
674 if self._id is not None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
675 self._id.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
676 ordinals = set() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
677 for note in self._notes: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
678 note.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
679 if note._ordinal in ordinals: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
680 raise ValidationError('Vulnerability Note Ordinal %d duplicated' % note._ordinal) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
681 ordinals.add(note._ordinal) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
682 for involvement in self._involvements: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
683 involvement.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
684 for cwe in self._cwes: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
685 cwe.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
686 for status in self._productstatuses: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
687 status.validate(productids) |
13
|
688 pids = set() |
|
689 for status in self._productstatuses: |
|
690 for pid in status._productids: |
|
691 if pid in pids: |
|
692 raise ValidationError('ProductID %s mentionned in two different ProductStatuses for Vulnerability %d' % (pid, self._ordinal)) |
|
693 pids.add(pid) |
0
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
694 for threat in self._threats: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
695 threat.validate(productids, groupids) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
696 for cvss in self._cvsss: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
697 cvss.validate(productids) |
14
|
698 pids = set() |
13
|
699 for cvss in self._cvsss: |
|
700 for pid in (cvss._productids or productids): |
|
701 if pid in pids: |
|
702 raise ValidationError('ProductID %s mentionned in two different CVSS Score Sets for Vulnerability %d' % (pid, self._ordinal)) |
|
703 pids.add(pid) |
0
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
704 for remediation in self._remediations: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
705 remediation.validate(productids, groupids) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
706 for reference in self._references: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
707 reference.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
708 for acknowledgment in self._acknowledgments: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
709 acknowledgment.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
710 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
711 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
712 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
713 class CVRFInvolvement(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
714 PARTIES = CVRFPublisher.TYPES |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
715 STATUSES = ('Open', 'Disputed', 'In Progress', 'Completed', |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
716 'Contact Attempted', 'Not Contacted') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
717 def __init__(self, party, status): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
718 self._party = party |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
719 self._status = status |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
720 self._description = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
721 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
722 def setDescription(self, description): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
723 self._description = description |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
724 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
725 def getTitle(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
726 return "From %s: %s" % (self._party, self._status) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
727 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
728 def validate(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
729 if not self._party: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
730 raise ValidationError('An Involvement must have a Party') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
731 if self._party not in self.PARTIES: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
732 raise ValidationError("An Involvement's Party must be one of %s" % ', '.join(self.PARTIES)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
733 if not self._status: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
734 raise ValidationError('An Involvement must have a Status') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
735 if self._status not in self.STATUSES: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
736 raise ValidationError("An Involvement's Status must be one of %s" % ', '.join(self.STATUSES)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
737 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
738 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
739 class CVRFCWE(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
740 def __init__(self, _id, value): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
741 self._id = _id |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
742 self._value = value |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
743 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
744 def validate(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
745 if not self._id: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
746 raise ValidationError('A CWE must have an ID') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
747 if not self._value: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
748 raise ValidationError('A CWE must have a description') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
749 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
750 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
751 class CVRFProductStatus(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
752 TYPES = ('First Affected', 'Known Affected', 'Known Not Affected', |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
753 'First Fixed', 'Fixed', 'Recommended', 'Last Affected') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
754 def __init__(self, _type): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
755 self._type = _type |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
756 self._productids = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
757 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
758 def addProductID(self, productid): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
759 self._productids.append(productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
760 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
761 def getTitle(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
762 return "%s: %d products" % (self._type, len(self._productids)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
763 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
764 def validate(self, productids): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
765 if not self._type: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
766 raise ValidationError('A Product Status must have a Type') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
767 if self._type not in self.TYPES: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
768 raise ValidationError("A Product Status' Type must be one of %s" % ', '.join(self.TYPES)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
769 if len(self._productids) < 1: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
770 raise ValidationError('A Product Status must mention at least one Product') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
771 for productid in self._productids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
772 if productid not in productids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
773 raise ValidationError('Unknown ProductID: %s' % productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
774 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
775 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
776 class CVRFThreat(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
777 TYPES = ('Impact', 'Exploit Status', 'Target Set') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
778 def __init__(self, _type, description): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
779 self._type = _type |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
780 self._description = description |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
781 self._date = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
782 self._productids = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
783 self._groupids = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
784 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
785 def setDate(self, date): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
786 self._date = date |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
787 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
788 def addProductID(self, productid): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
789 self._productids.append(productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
790 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
791 def addGroupID(self, groupid): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
792 self._groupids.append(groupid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
793 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
794 def getTitle(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
795 return self._type |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
796 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
797 def validate(self, productids, groupids): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
798 if not self._type: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
799 raise ValidationError('A Threat must have a Type') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
800 if self._type not in self.TYPES: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
801 raise ValidationError("A Threat's Type must be one of %s" % ', '.join(self.TYPES)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
802 if not self._description: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
803 raise ValidationError('A Threat must have a Description') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
804 for productid in self._productids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
805 if productid not in productids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
806 raise ValidationError('Unknown ProductID: %s' % productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
807 for groupid in self._groupids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
808 if groupid not in groupids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
809 raise ValidationError('Unknown GroupID: %s' % groupid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
810 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
811 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
812 class CVRFCVSSSet(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
813 # To determine the base Score |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
814 VALUES = {'AV': {'L':0.395, 'A':0.646, 'N':1.0}, |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
815 'AC': {'H':0.35, 'M':0.61 ,'L':0.71}, |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
816 'Au': {'M':0.45, 'S':0.56, 'N':0.704}, |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
817 'C': {'N':0.0, 'P':0.275, 'C':0.66}, |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
818 'I': {'N':0.0, 'P':0.275, 'C':0.66}, |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
819 'A': {'N':0.0, 'P':0.275, 'C':0.66}} |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
820 def __init__(self, basescore): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
821 self._basescore = basescore |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
822 self._temporalscore = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
823 self._environmentalscore = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
824 self._vector = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
825 self.vector = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
826 self._productids = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
827 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
828 def setTemporalScore(self, tempscore): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
829 self._temporalscore = tempscore |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
830 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
831 def setEnvironmentalScore(self, envscore): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
832 self._environmentalscore = envscore |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
833 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
834 def setVector(self, vector): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
835 self._vector = vector |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
836 if vector is None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
837 self.vector = vector |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
838 return |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
839 try: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
840 self.vector = {} |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
841 for component in vector[:26].split('/'): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
842 name, value = component.split(':') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
843 self.vector[name] = self.VALUES[name][value] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
844 except (KeyError, ValueError): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
845 self.vector = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
846 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
847 def addProductID(self, productid): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
848 self._productids.append(productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
849 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
850 def baseScore(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
851 v = self.vector # make an alias for shorter lines |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
852 exploitability = 20 * v['AV'] * v['AC'] * v['Au'] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
853 impact = 10.41 * (1 - (1 - v['C']) * (1 - v['I']) * (1 - v['A'])) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
854 def f(i): return 0 if i == 0 else 1.176 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
855 return ((0.6 * impact) + (0.4 * exploitability) - 1.5) * f(impact) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
856 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
857 def validate(self, productids): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
858 if not self._basescore: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
859 raise ValidationError('A CVSS Score Set must have a Base Score') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
860 if self._vector and not self.vector: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
861 raise ValidationError('Syntax Error in CVSS Vector') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
862 if abs(self._basescore - self.baseScore()) >= 0.05: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
863 raise ValidationError('Inconsistency in CVSS Score Set between Vector (%f) and Base Score (%f)' % (self.baseScore(), self._basescore)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
864 for productid in self._productids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
865 if productid not in productids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
866 raise ValidationError('Unknown ProductID: %s' % productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
867 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
868 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
869 class CVRFRemediation(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
870 TYPES = ('Workaround', 'Mitigation', 'Vendor Fix', 'None Available', |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
871 'Will Not Fix') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
872 def __init__(self, _type, description): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
873 self._type = _type |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
874 self._description = description |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
875 self._date = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
876 self._entitlement = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
877 self._url = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
878 self._productids = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
879 self._groupids = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
880 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
881 def setDate(self, date): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
882 self._date = date |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
883 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
884 def setEntitlement(self, entitlement): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
885 self._entitlement = entitlement |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
886 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
887 def setURL(self, url): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
888 self._url = url |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
889 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
890 def addProductID(self, productid): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
891 self._productids.append(productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
892 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
893 def addGroupID(self, groupid): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
894 self._groupids.append(groupid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
895 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
896 def getTitle(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
897 return self._type |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
898 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
899 def validate(self, productids, groupids): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
900 if not self._type: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
901 raise ValidationError('A Remediation must have a Type') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
902 if self._type not in self.TYPES: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
903 raise ValidationError("A Remediation's Type must be one of %s" % ', '.join(self.TYPES)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
904 if not self._description: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
905 raise ValidationError('A Remediation must have a Description') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
906 for productid in self._productids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
907 if productid not in productids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
908 raise ValidationError('Unknown ProductID: %s' % productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
909 for groupid in self._groupids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
910 if groupid not in groupids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
911 raise ValidationError('Unknown GroupID: %s' % groupid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
912 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
913 class CVRF(object): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
914 def __init__(self, title, _type): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
915 self._title = title |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
916 self._type = _type |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
917 self._publisher = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
918 self._tracking = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
919 self._notes = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
920 self._distribution = None |
1
|
921 self._aggregateseverity = None |
0
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
922 self._references = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
923 self._acknowledgments = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
924 self._producttree = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
925 self._vulnerabilities = [] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
926 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
927 def setPublisher(self, publisher): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
928 self._publisher = publisher |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
929 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
930 def setTracking(self, tracking): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
931 self._tracking = tracking |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
932 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
933 def addNote(self, note): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
934 self._notes.append(note) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
935 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
936 def setDistribution(self, distribution): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
937 self._distribution = distribution |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
938 |
1
|
939 def setAggregateSeverity(self, aggregateseverity): |
|
940 self._aggregateseverity = aggregateseverity |
|
941 |
0
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
942 def addReference(self, ref): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
943 self._references.append(ref) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
944 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
945 def addAcknowledgment(self, ack): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
946 self._acknowledgments.append(ack) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
947 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
948 def createProductTree(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
949 """ only done if the element is there """ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
950 self._producttree = CVRFProductTree() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
951 return self._producttree |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
952 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
953 def addVulnerability(self, vuln): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
954 self._vulnerabilities.append(vuln) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
955 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
956 def getProductForID(self, productid): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
957 if self._producttree is None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
958 raise ValueError('No ProductTree') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
959 return self._producttree.getProductForID(productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
960 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
961 def getGroupForID(self, groupid): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
962 if self._producttree is None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
963 raise ValueError('No ProductTree') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
964 return self._producttree.getGroupForID(groupid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
965 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
966 def getHighestCVSS(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
967 highestBaseScore = 0 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
968 highest = None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
969 for vulnerability in self._vulnerabilities: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
970 for cvss in vulnerability._cvsss: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
971 if cvss._basescore <= highestBaseScore: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
972 continue |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
973 highestBaseScore = cvss._basescore |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
974 highest = cvss |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
975 return highest |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
976 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
977 def getProductList(self, type_='Fixed'): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
978 products = set() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
979 if type_ == 'Fixed': |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
980 # First try through the Remediation |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
981 for vulnerability in self._vulnerabilities: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
982 for remediation in vulnerability._remediations: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
983 if remediation._type != 'Vendor Fix': |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
984 continue |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
985 for productid in remediation._productids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
986 products.add(productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
987 for groupid in remediation._groupids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
988 for productid in self.getGroupForID(groupid)._productids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
989 products.add(productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
990 if not products: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
991 # If nothing there, try through the productstatuses |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
992 for vulnerability in self._vulnerabilities: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
993 for status in vulnerability._productstatuses: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
994 if status._type != type_: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
995 continue |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
996 for productid in status._productids: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
997 products.add(productid) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
998 return set(self.getProductForID(p) for p in products) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
999 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1000 def getNote(self, ordinal): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1001 for note in self._notes: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1002 if note._ordinal == ordinal: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1003 return note |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1004 return None |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1005 |
6
|
1006 def getDocId(self): |
|
1007 if self._tracking is not None: |
|
1008 return self._tracking.getId() |
|
1009 # Make up something ... |
|
1010 return self._title.lower() |
|
1011 |
0
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1012 def validate(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1013 if not self._title: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1014 raise ValidationError('Document Title cannot be empty') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1015 if not self._type: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1016 raise ValidationError('Document Type cannot be empty') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1017 if self._publisher is None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1018 raise ValidationError('Document Publisher needs to be set') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1019 self._publisher.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1020 if self._tracking is None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1021 raise ValidationError('Document Tracking needs to be set') |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1022 self._tracking.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1023 ordinals = set() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1024 for note in self._notes: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1025 note.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1026 if note._ordinal in ordinals: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1027 raise ValidationError('Document Note ordinal %d is issued twice' % note._ordinal) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1028 ordinals.add(note._ordinal) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1029 for reference in self._references: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1030 reference.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1031 for acknowledgment in self._acknowledgments: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1032 acknowledgment.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1033 productids = set() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1034 groupids = set() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1035 if self._producttree: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1036 productids, groupids = self._producttree.validate() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1037 ordinals = set() |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1038 for vulnerability in self._vulnerabilities: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1039 vulnerability.validate(productids, groupids) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1040 if vulnerability._ordinal in ordinals: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1041 raise ValidationError('Vulnerability ordinal %d is issued twice' % vulnerability._ordinal) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1042 ordinals.add(vulnerability._ordinal) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1043 |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1044 def __str__(self): |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1045 s = [ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1046 'Title: %s' % self._title, |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1047 'Type: %s' % self._type, |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1048 'Publisher: %s' % self._publisher, |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1049 'tracking: %s' % self._tracking, |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1050 '%d Notes: %s' % (len(self._notes), ', '.join( |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1051 str(n) for n in self._notes)) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1052 ] |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1053 if self._distribution is not None: |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1054 s.append('Distribution: %s' % self._distribution) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1055 s.extend([ |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1056 '%d Acknowledgments' % len(self._acknowledgments), |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1057 'Products: %s' % self._producttree, |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1058 ]) |
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff
changeset
|
1059 return '\n'.join(s) |