From 36bbf2968410784caa807563a705e10a1ad9b4d3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 09:22:40 +0200 Subject: [PATCH 01/10] [client] Update opentelemetry-python monorepo to >=1.35.0,<1.36.0 Co-authored-by: Romuald Lemesle --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index cb102a3..b786dbc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,8 +36,8 @@ dependencies = [ "setuptools (>=80.4.0,<80.5.0)", "cachetools (>=5.5.0,<5.6.0)", "prometheus-client (>=0.21.1,<0.22.0)", - "opentelemetry-api (>=1.32.0,<1.33.0)", - "opentelemetry-sdk (>=1.32.0,<1.33.0)", + "opentelemetry-api (>=1.35.0,<1.36.0)", + "opentelemetry-sdk (>=1.35.0,<1.36.0)", # OpenBAS, "requests-toolbelt (>=1.0.0,<1.1.0)", "dataclasses-json (>=0.6.4,<0.7.0)", From ebba800d30509c8b0c719e2fc40324ae2d547f1e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 09:28:39 +0200 Subject: [PATCH 02/10] [client] Update dependency setuptools to >=80.9.0,<80.10.0 Co-authored-by: Romuald Lemesle --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b786dbc..3a22dbe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ dependencies = [ "PyYAML (>=6.0,<6.1)", "pydantic (>=2.11.3,<2.12.0)", "requests (>=2.32.3,<2.33.0)", - "setuptools (>=80.4.0,<80.5.0)", + "setuptools (>=80.9.0,<80.10.0)", "cachetools (>=5.5.0,<5.6.0)", "prometheus-client (>=0.21.1,<0.22.0)", "opentelemetry-api (>=1.35.0,<1.36.0)", From 62f06e6d7c2e85ea5b2c7fc2c4e7a78103c23054 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 09:25:53 +0200 Subject: [PATCH 03/10] [client] Update dependency prometheus-client to >=0.22.1,<0.23.0 Co-authored-by: Romuald Lemesle --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 3a22dbe..6057502 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ dependencies = [ "requests (>=2.32.3,<2.33.0)", "setuptools (>=80.9.0,<80.10.0)", "cachetools (>=5.5.0,<5.6.0)", - "prometheus-client (>=0.21.1,<0.22.0)", + "prometheus-client (>=0.22.1,<0.23.0)", "opentelemetry-api (>=1.35.0,<1.36.0)", "opentelemetry-sdk (>=1.35.0,<1.36.0)", # OpenBAS, From 4d3db0dded71b0f6f4baddb216bbb5af200a1dac Mon Sep 17 00:00:00 2001 From: MarineLeM Date: Thu, 31 Jul 2025 18:01:06 +0200 Subject: [PATCH 04/10] [client] Update expectation signatures --- pyobas/signatures/types.py | 13 +++++++------ test/apis/expectation/test_expectation.py | 15 +++++++++------ test/signatures/test_signature_type.py | 6 +++--- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/pyobas/signatures/types.py b/pyobas/signatures/types.py index cd2b7f3..4a479a1 100644 --- a/pyobas/signatures/types.py +++ b/pyobas/signatures/types.py @@ -8,9 +8,10 @@ class MatchTypes(str, Enum): class SignatureTypes(str, Enum): SIG_TYPE_PARENT_PROCESS_NAME = "parent_process_name" - SIG_TYPE_HOSTNAME = "hostname" - SIG_TYPE_PROCESS_NAME = "process_name" - SIG_TYPE_COMMAND_LINE = "command_line" - SIG_TYPE_FILE_NAME = "file_name" - SIG_TYPE_IPV4 = "ipv4_address" - SIG_TYPE_IPV6 = "ipv6_address" + SIG_TYPE_SOURCE_IPV4_ADDRESS = "source_ipv4_address" + SIG_TYPE_SOURCE_IPV6_ADDRESS = "source_ipv6_address" + SIG_TYPE_TARGET_IPV4_ADDRESS = "target_ipv4_address" + SIG_TYPE_TARGET_IPV6_ADDRESS = "target_ipv6_address" + SIG_TYPE_TARGET_HOSTNAME_ADDRESS = "target_hostname_address" + SIG_TYPE_START_DATE = "start_date" + SIG_TYPE_END_DATE = "end_date" diff --git a/test/apis/expectation/test_expectation.py b/test/apis/expectation/test_expectation.py index 5bcbe0b..cbb8bc0 100644 --- a/test/apis/expectation/test_expectation.py +++ b/test/apis/expectation/test_expectation.py @@ -126,7 +126,7 @@ def test_when_no_expectation_signature_is_relevant_match_alert_return_false(self relevant_signature_types = [ SignatureType( - label=SignatureTypes.SIG_TYPE_HOSTNAME, + label=SignatureTypes.SIG_TYPE_TARGET_HOSTNAME_ADDRESS, match_type=MatchTypes.MATCH_TYPE_SIMPLE, ) ] @@ -251,7 +251,10 @@ def test_when_relevant_signatures_when_alert_data_missing_for_some_relevant_sign "type": SignatureTypes.SIG_TYPE_PARENT_PROCESS_NAME, "value": "parent.exe", }, - {"type": SignatureTypes.SIG_TYPE_FILE_NAME, "value": "filename"}, + { + "type": SignatureTypes.SIG_TYPE_SOURCE_IPV4_ADDRESS, + "value": "231.102.107.38", + }, ], }, api_client=create_mock_api_client(), @@ -263,7 +266,7 @@ def test_when_relevant_signatures_when_alert_data_missing_for_some_relevant_sign match_score=95, ) file_name_signature_type = SignatureType( - label=SignatureTypes.SIG_TYPE_FILE_NAME, + label=SignatureTypes.SIG_TYPE_SOURCE_IPV4_ADDRESS, match_type=MatchTypes.MATCH_TYPE_FUZZY, match_score=95, ) @@ -294,8 +297,8 @@ def test_when_relevant_signatures_when_some_alert_data_dont_match_return_false( "value": "parent.exe", }, { - "type": SignatureTypes.SIG_TYPE_FILE_NAME, - "value": "some_file.odt", + "type": SignatureTypes.SIG_TYPE_SOURCE_IPV4_ADDRESS, + "value": "108.134.173.48", }, ], }, @@ -308,7 +311,7 @@ def test_when_relevant_signatures_when_some_alert_data_dont_match_return_false( match_score=95, ) file_name_signature_type = SignatureType( - label=SignatureTypes.SIG_TYPE_FILE_NAME, + label=SignatureTypes.SIG_TYPE_SOURCE_IPV4_ADDRESS, match_type=MatchTypes.MATCH_TYPE_FUZZY, match_score=95, ) diff --git a/test/signatures/test_signature_type.py b/test/signatures/test_signature_type.py index b90b01b..ce0b449 100644 --- a/test/signatures/test_signature_type.py +++ b/test/signatures/test_signature_type.py @@ -6,7 +6,7 @@ class TestSignatureType(unittest.TestCase): def test_make_struct_create_expected_struct_for_simple_sig_type(self): - simple_signature_type_label = SignatureTypes.SIG_TYPE_HOSTNAME + simple_signature_type_label = SignatureTypes.SIG_TYPE_TARGET_HOSTNAME_ADDRESS simple_signature_type = SignatureType( label=simple_signature_type_label, match_type=MatchTypes.MATCH_TYPE_SIMPLE ) @@ -19,7 +19,7 @@ def test_make_struct_create_expected_struct_for_simple_sig_type(self): self.assertFalse("score" in simple_struct.keys()) def test_make_struct_create_expected_struct_for_fuzzy_sig_type(self): - fuzzy_signature_type_label = SignatureTypes.SIG_TYPE_HOSTNAME + fuzzy_signature_type_label = SignatureTypes.SIG_TYPE_TARGET_HOSTNAME_ADDRESS fuzzy_signature_type_score = 50 fuzzy_signature_type = SignatureType( label=fuzzy_signature_type_label, @@ -37,7 +37,7 @@ def test_make_struct_create_expected_struct_for_fuzzy_sig_type(self): def test_make_struct_create_expected_struct_for_fuzzy_sig_type_when_score_is_0( self, ): - fuzzy_signature_type_label = SignatureTypes.SIG_TYPE_HOSTNAME + fuzzy_signature_type_label = SignatureTypes.SIG_TYPE_TARGET_HOSTNAME_ADDRESS fuzzy_signature_type_score = 0 fuzzy_signature_type = SignatureType( label=fuzzy_signature_type_label, From ff87594e2b35ad513a34dc65451c7b998e0d147c Mon Sep 17 00:00:00 2001 From: Filigran Automation Date: Fri, 1 Aug 2025 13:46:44 +0000 Subject: [PATCH 05/10] [client] Release 1.18.8 --- pyobas/__init__.py | 2 +- pyobas/_version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyobas/__init__.py b/pyobas/__init__.py index 37e58d8..2996e43 100644 --- a/pyobas/__init__.py +++ b/pyobas/__init__.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -__version__ = "1.18.7" +__version__ = "1.18.8" from pyobas._version import ( # noqa: F401 __author__, diff --git a/pyobas/_version.py b/pyobas/_version.py index ea5b294..94c221f 100644 --- a/pyobas/_version.py +++ b/pyobas/_version.py @@ -3,4 +3,4 @@ __email__ = "contact@filigran.io" __license__ = "Apache 2.0" __title__ = "python-openbas" -__version__ = "1.18.7" +__version__ = "1.18.8" From dc8f0fe7d411ba15694198ca03d44c36221be606 Mon Sep 17 00:00:00 2001 From: Filigran Automation Date: Fri, 1 Aug 2025 21:22:27 +0000 Subject: [PATCH 06/10] [client] Release 1.18.9 --- pyobas/__init__.py | 2 +- pyobas/_version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyobas/__init__.py b/pyobas/__init__.py index 2996e43..5d6ca0c 100644 --- a/pyobas/__init__.py +++ b/pyobas/__init__.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -__version__ = "1.18.8" +__version__ = "1.18.9" from pyobas._version import ( # noqa: F401 __author__, diff --git a/pyobas/_version.py b/pyobas/_version.py index 94c221f..df3965f 100644 --- a/pyobas/_version.py +++ b/pyobas/_version.py @@ -3,4 +3,4 @@ __email__ = "contact@filigran.io" __license__ = "Apache 2.0" __title__ = "python-openbas" -__version__ = "1.18.8" +__version__ = "1.18.9" From c41f3036810cc6191ae435a2e9dcd2c0b16f5994 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 15:00:53 +0200 Subject: [PATCH 07/10] [client] Update dependency slack to v5.2.0 Co-authored-by: Romuald Lemesle --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6889b9f..7ff8680 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,7 +1,7 @@ --- version: 2.1 orbs: - slack: circleci/slack@5.1.1 + slack: circleci/slack@5.2.0 jobs: ensure_formatting: docker: From cc2386ce36e8cf63d2a646d5af7cceede4a3ee90 Mon Sep 17 00:00:00 2001 From: MarineLeM Date: Mon, 4 Aug 2025 17:35:21 +0200 Subject: [PATCH 08/10] [client] Add cve endpoints --- pyobas/apis/__init__.py | 1 + pyobas/apis/collector.py | 9 +++++++++ pyobas/apis/cve.py | 18 ++++++++++++++++++ pyobas/client.py | 1 + 4 files changed, 29 insertions(+) create mode 100644 pyobas/apis/cve.py diff --git a/pyobas/apis/__init__.py b/pyobas/apis/__init__.py index 87a7d3f..2b7909b 100644 --- a/pyobas/apis/__init__.py +++ b/pyobas/apis/__init__.py @@ -1,5 +1,6 @@ from .attack_pattern import * # noqa: F401,F403 from .collector import * # noqa: F401,F403 +from .cve import * # noqa: F401,F403 from .document import * # noqa: F401,F403 from .endpoint import * # noqa: F401,F403 from .inject import * # noqa: F401,F403 diff --git a/pyobas/apis/collector.py b/pyobas/apis/collector.py index 94fd6aa..2f89dc6 100644 --- a/pyobas/apis/collector.py +++ b/pyobas/apis/collector.py @@ -1,3 +1,6 @@ +from typing import Any, Dict + +from pyobas import exceptions as exc from pyobas.base import RESTManager, RESTObject from pyobas.mixins import CreateMixin, GetMixin, ListMixin, UpdateMixin from pyobas.utils import RequiredOptional @@ -18,3 +21,9 @@ class CollectorManager(GetMixin, ListMixin, CreateMixin, UpdateMixin, RESTManage "collector_period", ) ) + + @exc.on_http_error(exc.OpenBASUpdateError) + def get(self, collector_id: str, **kwargs: Any) -> Dict[str, Any]: + path = f"{self.path}/" + collector_id + result = self.openbas.http_get(path, **kwargs) + return result diff --git a/pyobas/apis/cve.py b/pyobas/apis/cve.py new file mode 100644 index 0000000..b28303f --- /dev/null +++ b/pyobas/apis/cve.py @@ -0,0 +1,18 @@ +from typing import Any, Dict + +from pyobas import exceptions as exc +from pyobas.base import RESTManager, RESTObject + + +class Cve(RESTObject): + _id_attr = "cve_id" + + +class CveManager(RESTManager): + _path = "/cves" + + @exc.on_http_error(exc.OpenBASUpdateError) + def upsert(self, data: Dict[str, Any], **kwargs: Any) -> Dict[str, Any]: + path = f"{self.path}/bulk" + result = self.openbas.http_post(path, post_data=data, **kwargs) + return result diff --git a/pyobas/client.py b/pyobas/client.py index 169a151..b6007e9 100644 --- a/pyobas/client.py +++ b/pyobas/client.py @@ -59,6 +59,7 @@ def __init__( self.organization = apis.OrganizationManager(self) self.injector = apis.InjectorManager(self) self.collector = apis.CollectorManager(self) + self.cve = apis.CveManager(self) self.inject = apis.InjectManager(self) self.document = apis.DocumentManager(self) self.kill_chain_phase = apis.KillChainPhaseManager(self) From 667e8de4dde98740770264a46496671e806054f4 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Tue, 10 Jun 2025 08:53:48 +0200 Subject: [PATCH 09/10] [pyobas] Update mandatory contract properties --- pyobas/contracts/contract_config.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyobas/contracts/contract_config.py b/pyobas/contracts/contract_config.py index 8262829..af228ff 100644 --- a/pyobas/contracts/contract_config.py +++ b/pyobas/contracts/contract_config.py @@ -73,9 +73,9 @@ class ContractElement(ABC): key: str label: str type: str = field(default="", init=False) - mandatoryGroups: List[str] = None - mandatoryConditionField: str = None - mandatoryConditionValue: str = None + mandatoryGroups: List["ContractElement"] = field(default_factory=list) + mandatoryConditionFields: List["ContractElement"] = field(default_factory=list) + mandatoryConditionValues: List[str] = field(default_factory=list) linkedFields: List["ContractElement"] = field(default_factory=list) linkedValues: List[str] = field(default_factory=list) mandatory: bool = False From a3a1fe6477590e64a9696a93725c7ca4cd0f9f47 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Tue, 17 Jun 2025 14:34:41 +0200 Subject: [PATCH 10/10] [pyobas] Update mandatory contract properties --- pyobas/contracts/contract_config.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/pyobas/contracts/contract_config.py b/pyobas/contracts/contract_config.py index af228ff..710e8ea 100644 --- a/pyobas/contracts/contract_config.py +++ b/pyobas/contracts/contract_config.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from dataclasses import dataclass, field from enum import Enum -from typing import List +from typing import List, Dict from pyobas import utils from pyobas.contracts.contract_utils import ContractCardinality, ContractVariable @@ -73,11 +73,12 @@ class ContractElement(ABC): key: str label: str type: str = field(default="", init=False) - mandatoryGroups: List["ContractElement"] = field(default_factory=list) - mandatoryConditionFields: List["ContractElement"] = field(default_factory=list) - mandatoryConditionValues: List[str] = field(default_factory=list) - linkedFields: List["ContractElement"] = field(default_factory=list) - linkedValues: List[str] = field(default_factory=list) + mandatoryGroups: List[str] = field(default_factory=list) + mandatoryConditionFields: List[str] = field(default_factory=list) + mandatoryConditionValues: Dict[str, any] = field(default_factory=list) + visibleConditionFields: List[str] = field(default_factory=list) + visibleConditionValues: Dict[str, any] = field(default_factory=list) + linkedFields: List[str] = field(default_factory=list) mandatory: bool = False readOnly: bool = False