src/eric7/PipInterface/PipPackageDetailsDialog.py

branch
eric7
changeset 9659
3152923264c2
parent 9653
e67609152c5e
child 9676
9edcc7302ac4
--- 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):
         """

eric ide

mercurial