src/eric7/CycloneDXInterface/CycloneDXUtilities.py

Tue, 13 May 2025 15:58:12 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Tue, 13 May 2025 15:58:12 +0200
branch
eric7
changeset 11282
dc23e5ac706a
parent 11148
15e30f0c76a8
child 11283
67d5b135cb0f
permissions
-rw-r--r--

CycloneDX Interface
- Changed the interface to work with newer CycloneDX releases.

# -*- coding: utf-8 -*-

# Copyright (c) 2022 - 2025 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing the interface to CycloneDX.
"""

import os
import sys

from PyQt6.QtCore import QCoreApplication, QProcess
from PyQt6.QtWidgets import QDialog

from eric7.EricWidgets import EricMessageBox


def createCycloneDXFile(venvName, parent=None):
    """
    Function to create a CyccloneDX SBOM file.

    @param venvName name of the virtual environment
    @type str
    @param parent referent to a parent widget (defaults to None)
    @type QWidget (optional)
    @exception RuntimeError raised to indicate illegal creation parameters
    """
    from .CycloneDXConfigDialog import CycloneDXConfigDialog

    dlg = CycloneDXConfigDialog(venvName, parent=parent)
    if dlg.exec() == QDialog.DialogCode.Accepted:
        (
            inputSource,
            inputPath,
            fileFormat,
            specVersion,
            sbomFile,
            pyprojectFile,
            mainComponentType,
        ) = dlg.getData()

        # check error conditions first
        if inputSource not in ("environment", "pipenv", "poetry", "requirements"):
            raise RuntimeError("Unsupported input source given.")
        if fileFormat not in ("XML", "JSON"):
            raise RuntimeError("Unsupported SBOM file format given.")

        args = [
            inputSource,
            "--mc-type",
            mainComponentType,
            "--spec-version",
            specVersion,
            "--output-format",
            fileFormat,
            "--output-file",
            sbomFile,
        ]
        if pyprojectFile:
            args.extend(["--pyproject", pyprojectFile])

        args.append(inputPath)
        prog = os.path.join(os.path.dirname(sys.executable), "cyclonedx-py")
        process = QProcess()
        process.start(prog, args)
        if process.waitForStarted():
            if process.waitForFinished():
                if process.exitCode() == 0:
                    EricMessageBox.information(
                        None,
                        QCoreApplication.translate(
                            "CycloneDX", "CycloneDX - SBOM Creation"
                        ),
                        QCoreApplication.translate(
                            "CycloneDX",
                            "<p>The SBOM data was written to file <b>{0}</b>.</p>",
                        ).format(sbomFile),
                    )
                else:
                    EricMessageBox.critical(
                        None,
                        QCoreApplication.translate(
                            "CycloneDX", "CycloneDX - SBOM Creation"
                        ),
                        QCoreApplication.translate(
                            "CycloneDX",
                            "<p>The SBOM file <b>{0}</b> could not be written.</p>"
                            "<p>Reason: {1}</p>",
                        ).format(sbomFile, process.errorString()),
                    )
            else:
                EricMessageBox.critical(
                    None,
                    QCoreApplication.translate(
                        "CycloneDX", "CycloneDX - SBOM Creation"
                    ),
                    QCoreApplication.translate(
                        "CycloneDX",
                        "<p>The SBOM creation process did not finish within 30s.</p>",
                    ),
                )
        else:
            EricMessageBox.critical(
                None,
                QCoreApplication.translate("CycloneDX", "CycloneDX - SBOM Creation"),
                QCoreApplication.translate(
                    "CycloneDX",
                    "<p>The SBOM creation process could not be started.</p>"
                    "<p>Reason: {0}</p>",
                ).format(process.errorString()),
            )

eric ide

mercurial