27 |
29 |
28 ButtonInstall = 1 |
30 ButtonInstall = 1 |
29 ButtonRemove = 2 |
31 ButtonRemove = 2 |
30 ButtonUpgrade = 4 |
32 ButtonUpgrade = 4 |
31 |
33 |
32 def __init__(self, detailsData, buttonsMode=0, parent=None): |
34 def __init__(self, detailsData, vulnerabilities=None, buttonsMode=0, parent=None): |
33 """ |
35 """ |
34 Constructor |
36 Constructor |
35 |
37 |
36 @param detailsData package details |
38 @param detailsData package details |
37 @type dict |
39 @type dict |
|
40 @param vulnerabilities list of known vulnerabilities (defaults to None) |
|
41 @type list (optional) |
38 @param buttonsMode flags telling which convenience buttons to enable |
42 @param buttonsMode flags telling which convenience buttons to enable |
39 (defaults to 0) |
43 (defaults to 0) |
40 @type int (optional) |
44 @type int (optional) |
41 @param parent reference to the parent widget (defaults to None) |
45 @param parent reference to the parent widget (defaults to None) |
42 @type QWidget (optional) |
46 @type QWidget (optional) |
71 self.__packageName = detailsData["info"]["name"] |
75 self.__packageName = detailsData["info"]["name"] |
72 |
76 |
73 self.__populateDetails(detailsData["info"]) |
77 self.__populateDetails(detailsData["info"]) |
74 self.__populateDownloadUrls(detailsData["urls"]) |
78 self.__populateDownloadUrls(detailsData["urls"]) |
75 self.__populateRequiresProvides(detailsData["info"]) |
79 self.__populateRequiresProvides(detailsData["info"]) |
|
80 self.__populateVulnerabilities(vulnerabilities) |
76 |
81 |
77 self.__installButton.setEnabled(buttonsMode & self.ButtonInstall) |
82 self.__installButton.setEnabled(buttonsMode & self.ButtonInstall) |
78 self.__removeButton.setEnabled(buttonsMode & self.ButtonRemove) |
83 self.__removeButton.setEnabled(buttonsMode & self.ButtonRemove) |
79 self.__upgradeButton.setEnabled(buttonsMode & self.ButtonUpgrade) |
84 self.__upgradeButton.setEnabled(buttonsMode & self.ButtonUpgrade) |
|
85 |
|
86 if vulnerabilities: |
|
87 self.infoWidget.setCurrentWidget(self.security) |
|
88 else: |
|
89 self.infoWidget.setCurrentWidget(self.details) |
80 |
90 |
81 def __populateDetails(self, detailsData): |
91 def __populateDetails(self, detailsData): |
82 """ |
92 """ |
83 Private method to populate the details tab. |
93 Private method to populate the details tab. |
84 |
94 |
135 @param downloadsData downloads information |
145 @param downloadsData downloads information |
136 @type dict |
146 @type dict |
137 """ |
147 """ |
138 index = self.infoWidget.indexOf(self.urls) |
148 index = self.infoWidget.indexOf(self.urls) |
139 if downloadsData: |
149 if downloadsData: |
140 self.infoWidget.setTabEnabled(index, True) |
150 self.infoWidget.setTabVisible(index, True) |
141 for download in downloadsData: |
151 for download in downloadsData: |
142 itm = QTreeWidgetItem( |
152 itm = QTreeWidgetItem( |
143 self.downloadUrlsList, |
153 self.downloadUrlsList, |
144 [ |
154 [ |
145 "", |
155 "", |
172 urlLabel.setOpenExternalLinks(True) |
182 urlLabel.setOpenExternalLinks(True) |
173 self.downloadUrlsList.setItemWidget(itm, 0, urlLabel) |
183 self.downloadUrlsList.setItemWidget(itm, 0, urlLabel) |
174 header = self.downloadUrlsList.header() |
184 header = self.downloadUrlsList.header() |
175 header.resizeSections(QHeaderView.ResizeMode.ResizeToContents) |
185 header.resizeSections(QHeaderView.ResizeMode.ResizeToContents) |
176 else: |
186 else: |
177 self.infoWidget.setTabEnabled(index, False) |
187 self.infoWidget.setTabVisible(index, False) |
178 |
188 |
179 def __populateRequiresProvides(self, detailsData): |
189 def __populateRequiresProvides(self, detailsData): |
180 """ |
190 """ |
181 Private method to populate the requires/provides tab. |
191 Private method to populate the requires/provides tab. |
182 |
192 |
197 if "provides_dist" in detailsData and detailsData["provides_dist"]: |
207 if "provides_dist" in detailsData and detailsData["provides_dist"]: |
198 self.providedDistributionsList.addItems(detailsData["provides_dist"]) |
208 self.providedDistributionsList.addItems(detailsData["provides_dist"]) |
199 populatedItems += len(detailsData["provides_dist"]) |
209 populatedItems += len(detailsData["provides_dist"]) |
200 |
210 |
201 index = self.infoWidget.indexOf(self.requires) |
211 index = self.infoWidget.indexOf(self.requires) |
202 self.infoWidget.setTabEnabled(index, populatedItems > 0) |
212 self.infoWidget.setTabVisible(index, populatedItems > 0) |
|
213 |
|
214 def __populateVulnerabilities(self, vulnerabilities): |
|
215 """ |
|
216 Private method to populate the Security tab. |
|
217 |
|
218 @param vulnerabilities list of known vulnerabilities |
|
219 @type list |
|
220 """ |
|
221 index = self.infoWidget.indexOf(self.security) |
|
222 if vulnerabilities: |
|
223 self.infoWidget.setTabVisible(index, True) |
|
224 for vulnerability in vulnerabilities: |
|
225 title = ( |
|
226 vulnerability.cve |
|
227 if vulnerability.cve |
|
228 else vulnerability.vulnerabilityId |
|
229 ) |
|
230 self.vulnerabilitiesEdit.insertHtml( |
|
231 self.tr( |
|
232 "<h3>{0}</h3>" |
|
233 "<table>" |
|
234 "<tr><td>Installed Version:</td><td>{1}</td></tr>" |
|
235 "<tr><td>Affected Version:</td><td>{2}</td></tr>" |
|
236 "<tr><td>Advisory:</td><td>{3}</td></tr>" |
|
237 "</table>" |
|
238 ).format( |
|
239 Utilities.html_encode(title), |
|
240 Utilities.html_encode(vulnerability.version), |
|
241 Utilities.html_encode(vulnerability.spec), |
|
242 "<p>{0}</p>".format( |
|
243 Utilities.html_encode(vulnerability.advisory).replace( |
|
244 "\r\n", "<br/>" |
|
245 ) |
|
246 ) |
|
247 ), |
|
248 ) |
|
249 else: |
|
250 self.infoWidget.setTabVisible(index, False) |
203 |
251 |
204 def __sanitize(self, text, forUrl=False): |
252 def __sanitize(self, text, forUrl=False): |
205 """ |
253 """ |
206 Private method to clean-up the given text. |
254 Private method to clean-up the given text. |
207 |
255 |