--- a/src/eric7/PipInterface/PipPackageDetailsDialog.py Mon Jan 02 14:24:18 2023 +0100 +++ b/src/eric7/PipInterface/PipPackageDetailsDialog.py Mon Jan 02 15:50:02 2023 +0100 @@ -17,6 +17,8 @@ QTreeWidgetItem, ) +from eric7 import Utilities + from .Ui_PipPackageDetailsDialog import Ui_PipPackageDetailsDialog @@ -29,12 +31,14 @@ ButtonRemove = 2 ButtonUpgrade = 4 - def __init__(self, detailsData, buttonsMode=0, parent=None): + def __init__(self, detailsData, vulnerabilities=None, buttonsMode=0, parent=None): """ Constructor @param detailsData package details @type dict + @param vulnerabilities list of known vulnerabilities (defaults to None) + @type list (optional) @param buttonsMode flags telling which convenience buttons to enable (defaults to 0) @type int (optional) @@ -73,11 +77,17 @@ self.__populateDetails(detailsData["info"]) self.__populateDownloadUrls(detailsData["urls"]) self.__populateRequiresProvides(detailsData["info"]) + self.__populateVulnerabilities(vulnerabilities) self.__installButton.setEnabled(buttonsMode & self.ButtonInstall) self.__removeButton.setEnabled(buttonsMode & self.ButtonRemove) self.__upgradeButton.setEnabled(buttonsMode & self.ButtonUpgrade) + if vulnerabilities: + self.infoWidget.setCurrentWidget(self.security) + else: + self.infoWidget.setCurrentWidget(self.details) + def __populateDetails(self, detailsData): """ Private method to populate the details tab. @@ -137,7 +147,7 @@ """ index = self.infoWidget.indexOf(self.urls) if downloadsData: - self.infoWidget.setTabEnabled(index, True) + self.infoWidget.setTabVisible(index, True) for download in downloadsData: itm = QTreeWidgetItem( self.downloadUrlsList, @@ -174,7 +184,7 @@ header = self.downloadUrlsList.header() header.resizeSections(QHeaderView.ResizeMode.ResizeToContents) else: - self.infoWidget.setTabEnabled(index, False) + self.infoWidget.setTabVisible(index, False) def __populateRequiresProvides(self, detailsData): """ @@ -199,7 +209,45 @@ populatedItems += len(detailsData["provides_dist"]) index = self.infoWidget.indexOf(self.requires) - self.infoWidget.setTabEnabled(index, populatedItems > 0) + self.infoWidget.setTabVisible(index, populatedItems > 0) + + def __populateVulnerabilities(self, vulnerabilities): + """ + Private method to populate the Security tab. + + @param vulnerabilities list of known vulnerabilities + @type list + """ + index = self.infoWidget.indexOf(self.security) + if vulnerabilities: + self.infoWidget.setTabVisible(index, True) + for vulnerability in vulnerabilities: + title = ( + vulnerability.cve + if vulnerability.cve + else vulnerability.vulnerabilityId + ) + self.vulnerabilitiesEdit.insertHtml( + self.tr( + "<h3>{0}</h3>" + "<table>" + "<tr><td>Installed Version:</td><td>{1}</td></tr>" + "<tr><td>Affected Version:</td><td>{2}</td></tr>" + "<tr><td>Advisory:</td><td>{3}</td></tr>" + "</table>" + ).format( + Utilities.html_encode(title), + Utilities.html_encode(vulnerability.version), + Utilities.html_encode(vulnerability.spec), + "<p>{0}</p>".format( + Utilities.html_encode(vulnerability.advisory).replace( + "\r\n", "<br/>" + ) + ) + ), + ) + else: + self.infoWidget.setTabVisible(index, False) def __sanitize(self, text, forUrl=False): """