diff --git a/gvm/protocols/gmp/_gmpnext.py b/gvm/protocols/gmp/_gmpnext.py index 357c236e..c67f798f 100644 --- a/gvm/protocols/gmp/_gmpnext.py +++ b/gvm/protocols/gmp/_gmpnext.py @@ -26,6 +26,7 @@ ReportClosedCVEs, ReportCVEs, ReportErrors, + ReportExports, ReportHosts, ReportOperatingSystems, ReportPorts, @@ -1808,3 +1809,35 @@ def export_scan_report( result_tags=result_tags, ) ) + + def get_report_exports( + self, + ) -> T: + """Request report exports. + + The command requests a list of report exports. + + Returns: + A request for the get_report_exports GMP command. + """ + return self._send_request_and_transform_response( + ReportExports.get_report_exports() + ) + + def get_report_export( + self, + report_export_id: EntityID, + ) -> T: + """Request a single report export. + + Args: + report_export_id: UUID of the report export. + + Returns: + A request for the get_report_exports GMP command. + """ + return self._send_request_and_transform_response( + ReportExports.get_report_export( + report_export_id=report_export_id, + ) + ) diff --git a/gvm/protocols/gmp/requests/next/__init__.py b/gvm/protocols/gmp/requests/next/__init__.py index a4b8f046..ff9cbcff 100644 --- a/gvm/protocols/gmp/requests/next/__init__.py +++ b/gvm/protocols/gmp/requests/next/__init__.py @@ -30,6 +30,9 @@ from gvm.protocols.gmp.requests.next._report_errors import ( ReportErrors, ) +from gvm.protocols.gmp.requests.next._report_exports import ( + ReportExports, +) from gvm.protocols.gmp.requests.next._report_hosts import ( ReportHosts, ) @@ -174,6 +177,7 @@ "ReportConfigParameter", "ReportConfigs", "ReportErrors", + "ReportExports", "ReportFormatType", "ReportFormats", "ReportHosts", diff --git a/gvm/protocols/gmp/requests/next/_integration_configs.py b/gvm/protocols/gmp/requests/next/_integration_configs.py index d0576852..fd2d3bcc 100644 --- a/gvm/protocols/gmp/requests/next/_integration_configs.py +++ b/gvm/protocols/gmp/requests/next/_integration_configs.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Greenbone AG +# +# SPDX-License-Identifier: GPL-3.0-or-later + from gvm.errors import RequiredArgument from gvm.protocols.core import Request from gvm.protocols.gmp.requests import EntityID diff --git a/gvm/protocols/gmp/requests/next/_report_applications.py b/gvm/protocols/gmp/requests/next/_report_applications.py index 6875709d..179fcc22 100644 --- a/gvm/protocols/gmp/requests/next/_report_applications.py +++ b/gvm/protocols/gmp/requests/next/_report_applications.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Greenbone AG +# +# SPDX-License-Identifier: GPL-3.0-or-later + from gvm.errors import RequiredArgument from gvm.protocols.core import Request from gvm.protocols.gmp.requests import EntityID diff --git a/gvm/protocols/gmp/requests/next/_report_closed_cves.py b/gvm/protocols/gmp/requests/next/_report_closed_cves.py index 2650101d..9c485977 100644 --- a/gvm/protocols/gmp/requests/next/_report_closed_cves.py +++ b/gvm/protocols/gmp/requests/next/_report_closed_cves.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Greenbone AG +# +# SPDX-License-Identifier: GPL-3.0-or-later + from gvm.errors import RequiredArgument from gvm.protocols.core import Request from gvm.protocols.gmp.requests import EntityID diff --git a/gvm/protocols/gmp/requests/next/_report_cves.py b/gvm/protocols/gmp/requests/next/_report_cves.py index ef1fc28b..8a0fc169 100644 --- a/gvm/protocols/gmp/requests/next/_report_cves.py +++ b/gvm/protocols/gmp/requests/next/_report_cves.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Greenbone AG +# +# SPDX-License-Identifier: GPL-3.0-or-later + from gvm.errors import RequiredArgument from gvm.protocols.core import Request from gvm.protocols.gmp.requests import EntityID diff --git a/gvm/protocols/gmp/requests/next/_report_errors.py b/gvm/protocols/gmp/requests/next/_report_errors.py index e36af893..6c61e99b 100644 --- a/gvm/protocols/gmp/requests/next/_report_errors.py +++ b/gvm/protocols/gmp/requests/next/_report_errors.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Greenbone AG +# +# SPDX-License-Identifier: GPL-3.0-or-later + from gvm.errors import RequiredArgument from gvm.protocols.core import Request from gvm.protocols.gmp.requests import EntityID diff --git a/gvm/protocols/gmp/requests/next/_report_exports.py b/gvm/protocols/gmp/requests/next/_report_exports.py new file mode 100644 index 00000000..0c1147fd --- /dev/null +++ b/gvm/protocols/gmp/requests/next/_report_exports.py @@ -0,0 +1,55 @@ +# SPDX-FileCopyrightText: 2026 Greenbone AG +# +# SPDX-License-Identifier: GPL-3.0-or-later + +from gvm.errors import RequiredArgument +from gvm.protocols.core import Request +from gvm.protocols.gmp.requests import EntityID +from gvm.xml import XmlCommand + + +class ReportExports: + @classmethod + def get_report_exports( + cls, + ) -> Request: + """Request report exports. + + The command requests a list of report exports. + + Returns: + A request for the get_report_exports GMP command. + """ + cmd = XmlCommand("get_report_exports") + + return cmd + + @classmethod + def get_report_export( + cls, + report_export_id: EntityID, + ) -> Request: + """Request a single report export. + + Args: + report_export_id: UUID of the report export. + + Returns: + A request for the get_report_exports GMP command. + + Raises: + RequiredArgument: If report_export_id is not provided. + """ + if not report_export_id: + raise RequiredArgument( + function=cls.get_report_export.__name__, + argument="report_export_id", + ) + + cmd = XmlCommand("get_report_exports") + cmd.set_attribute( + "report_export_id", + str(report_export_id), + ) + + return cmd diff --git a/gvm/protocols/gmp/requests/next/_report_hosts.py b/gvm/protocols/gmp/requests/next/_report_hosts.py index 7237163f..7e9fd798 100644 --- a/gvm/protocols/gmp/requests/next/_report_hosts.py +++ b/gvm/protocols/gmp/requests/next/_report_hosts.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Greenbone AG +# +# SPDX-License-Identifier: GPL-3.0-or-later + from gvm.errors import RequiredArgument from gvm.protocols.core import Request from gvm.protocols.gmp.requests import EntityID diff --git a/gvm/protocols/gmp/requests/next/_report_operating_systems.py b/gvm/protocols/gmp/requests/next/_report_operating_systems.py index 36fc1ca6..49d2c810 100644 --- a/gvm/protocols/gmp/requests/next/_report_operating_systems.py +++ b/gvm/protocols/gmp/requests/next/_report_operating_systems.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Greenbone AG +# +# SPDX-License-Identifier: GPL-3.0-or-later + from gvm.errors import RequiredArgument from gvm.protocols.core import Request from gvm.protocols.gmp.requests import EntityID diff --git a/gvm/protocols/gmp/requests/next/_report_ports.py b/gvm/protocols/gmp/requests/next/_report_ports.py index fe3ba7af..49a7e706 100644 --- a/gvm/protocols/gmp/requests/next/_report_ports.py +++ b/gvm/protocols/gmp/requests/next/_report_ports.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Greenbone AG +# +# SPDX-License-Identifier: GPL-3.0-or-later + from gvm.errors import RequiredArgument from gvm.protocols.core import Request from gvm.protocols.gmp.requests import EntityID diff --git a/gvm/protocols/gmp/requests/next/_report_tls_certificates.py b/gvm/protocols/gmp/requests/next/_report_tls_certificates.py index 13ff8168..058595cf 100644 --- a/gvm/protocols/gmp/requests/next/_report_tls_certificates.py +++ b/gvm/protocols/gmp/requests/next/_report_tls_certificates.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Greenbone AG +# +# SPDX-License-Identifier: GPL-3.0-or-later + from gvm.errors import RequiredArgument from gvm.protocols.core import Request from gvm.protocols.gmp.requests import EntityID diff --git a/gvm/protocols/gmp/requests/next/_report_vulnerabilities.py b/gvm/protocols/gmp/requests/next/_report_vulnerabilities.py index a5a9b18a..90a8eb30 100644 --- a/gvm/protocols/gmp/requests/next/_report_vulnerabilities.py +++ b/gvm/protocols/gmp/requests/next/_report_vulnerabilities.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Greenbone AG +# +# SPDX-License-Identifier: GPL-3.0-or-later + from gvm.errors import RequiredArgument from gvm.protocols.core import Request from gvm.protocols.gmp.requests import EntityID diff --git a/gvm/protocols/gmp/requests/next/_scan_report.py b/gvm/protocols/gmp/requests/next/_scan_report.py index b7c13589..50e4334f 100644 --- a/gvm/protocols/gmp/requests/next/_scan_report.py +++ b/gvm/protocols/gmp/requests/next/_scan_report.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Greenbone AG +# +# SPDX-License-Identifier: GPL-3.0-or-later + from gvm.errors import RequiredArgument from gvm.protocols.core import Request from gvm.protocols.gmp.requests import EntityID diff --git a/tests/protocols/gmpnext/entities/report_exports/__init__.py b/tests/protocols/gmpnext/entities/report_exports/__init__.py new file mode 100644 index 00000000..67091b86 --- /dev/null +++ b/tests/protocols/gmpnext/entities/report_exports/__init__.py @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: 2026 Greenbone AG +# +# SPDX-License-Identifier: GPL-3.0-or-later + +from .test_get_report_export import GmpGetReportExportTestMixin +from .test_get_report_exports import GmpGetReportExportsTestMixin + +__all__ = [ + "GmpGetReportExportTestMixin", + "GmpGetReportExportsTestMixin", +] diff --git a/tests/protocols/gmpnext/entities/report_exports/test_get_report_export.py b/tests/protocols/gmpnext/entities/report_exports/test_get_report_export.py new file mode 100644 index 00000000..f73663b8 --- /dev/null +++ b/tests/protocols/gmpnext/entities/report_exports/test_get_report_export.py @@ -0,0 +1,21 @@ +# SPDX-FileCopyrightText: 2026 Greenbone AG +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +from gvm.errors import RequiredArgument + + +class GmpGetReportExportTestMixin: + def test_get_report_export_without_id(self): + with self.assertRaises(RequiredArgument): + self.gmp.get_report_export(None) + + with self.assertRaises(RequiredArgument): + self.gmp.get_report_export("") + + def test_get_report_export_with_id(self): + self.gmp.get_report_export(report_export_id="e1") + + self.connection.send.has_been_called_with( + b'' + ) diff --git a/tests/protocols/gmpnext/entities/report_exports/test_get_report_exports.py b/tests/protocols/gmpnext/entities/report_exports/test_get_report_exports.py new file mode 100644 index 00000000..16691f85 --- /dev/null +++ b/tests/protocols/gmpnext/entities/report_exports/test_get_report_exports.py @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: 2026 Greenbone AG +# +# SPDX-License-Identifier: GPL-3.0-or-later +# + + +class GmpGetReportExportsTestMixin: + def test_get_report_exports(self): + self.gmp.get_report_exports() + + self.connection.send.has_been_called_with(b"") diff --git a/tests/protocols/gmpnext/entities/test_report_exports.py b/tests/protocols/gmpnext/entities/test_report_exports.py new file mode 100644 index 00000000..c0d358a7 --- /dev/null +++ b/tests/protocols/gmpnext/entities/test_report_exports.py @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2026 Greenbone AG +# +# SPDX-License-Identifier: GPL-3.0-or-later +# + +from ...gmpnext import GMPTestCase +from .report_exports import ( + GmpGetReportExportsTestMixin, + GmpGetReportExportTestMixin, +) + + +class GmpGmpGetReportExportsTestCase(GmpGetReportExportsTestMixin, GMPTestCase): + pass + + +class GmpGmpGetReportExportTestCase(GmpGetReportExportTestMixin, GMPTestCase): + pass