annotate farolluz/document.py @ 43:b87f2a6e613a

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