From d430da4c2edc2d4c6666afc1bc682078aa44afab Mon Sep 17 00:00:00 2001 From: Alex Van Brunt Date: Tue, 9 Jul 2024 10:47:55 -0600 Subject: [PATCH 1/9] Fix alerts getitem --- src/cbc_sdk/platform/alerts.py | 30 ++++++++++++++------ src/tests/unit/platform/test_alertsv7_api.py | 6 ++-- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/cbc_sdk/platform/alerts.py b/src/cbc_sdk/platform/alerts.py index a8397672..05f9dba9 100644 --- a/src/cbc_sdk/platform/alerts.py +++ b/src/cbc_sdk/platform/alerts.py @@ -474,9 +474,13 @@ def __getitem__(self, item): try: return super(Alert.Note, self).__getattribute__(Alert.Note.REMAPPED_NOTES_V6_TO_V7.get(item, item)) except AttributeError: - raise AttributeError("'{0}' object has no attribute '{1}'".format(self.__class__.__name__, - item)) - # fall through to the rest of the logic... + pass + + # try looking up via self._info, if we already have it. + if item in self._info: + return self._info[item] + else: + raise AttributeError("'{0}' object has no attribute '{1}'".format(self.__class__.__name__, item)) def __getattr__(self, item): """ @@ -495,9 +499,13 @@ def __getattr__(self, item): item = Alert.Note.REMAPPED_NOTES_V6_TO_V7.get(item, item) return super(Alert.Note, self).__getattr__(Alert.Note.REMAPPED_NOTES_V6_TO_V7.get(item, item)) except AttributeError: - raise AttributeError("'{0}' object has no attribute '{1}'".format(self.__class__.__name__, - item)) - # fall through to the rest of the logic... + pass + + # try looking up via self._info, if we already have it. + if item in self._info: + return self._info[item] + else: + raise AttributeError("'{0}' object has no attribute '{1}'".format(self.__class__.__name__, item)) def notes_(self, threat_note=False): """ @@ -765,9 +773,13 @@ def __getitem__(self, item): try: return super(Alert, self).__getattribute__(Alert.REMAPPED_ALERTS_V6_TO_V7.get(item, item)) except AttributeError: - raise AttributeError("'{0}' object has no attribute '{1}'".format(self.__class__.__name__, - item)) - # fall through to the rest of the logic... + pass + + # try looking up via self._info, if we already have it. + if item in self._info: + return self._info[item] + else: + raise AttributeError("'{0}' object has no attribute '{1}'".format(self.__class__.__name__, item)) def __getattr__(self, item): """ diff --git a/src/tests/unit/platform/test_alertsv7_api.py b/src/tests/unit/platform/test_alertsv7_api.py index c8264179..421ea339 100755 --- a/src/tests/unit/platform/test_alertsv7_api.py +++ b/src/tests/unit/platform/test_alertsv7_api.py @@ -142,9 +142,9 @@ def on_post(url, body, **kwargs): .add_criteria("device_target_value", ["HIGH"]).add_criteria("threat_id", ["B0RG"]) \ .add_criteria("workflow_status", ["OPEN"]).sort_by("name", "DESC") a = query.one() - assert a.id == "S0L0" - assert a.org_key == "test" - assert a.threat_id == "B0RG" + assert a["id"] == "S0L0" + assert a["org_key"] == "test" + assert a["threat_id"] == "B0RG" assert a.workflow["status"] == "OPEN" From 4e52ddf6625dce159efec73c028cbc04f383ac0e Mon Sep 17 00:00:00 2001 From: Leviathan <97615419+prose-leviathan@users.noreply.github.com> Date: Wed, 3 Jul 2024 22:53:46 +0200 Subject: [PATCH 2/9] conditional backport dependency in requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e4b50c76..98a9ef6d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,7 +8,7 @@ validators jsonschema keyring;platform_system=='Darwin' boto3 -backports-datetime-fromisoformat==2.0.1 +backports-datetime-fromisoformat==2.0.1 ; python_version < '3.11' # Dev dependencies From 08da0ef0cd4df0ea81890dd1f5da9ce724e534fd Mon Sep 17 00:00:00 2001 From: Leviathan <97615419+prose-leviathan@users.noreply.github.com> Date: Wed, 3 Jul 2024 23:02:29 +0200 Subject: [PATCH 3/9] patch alerts.py with monkeypatch strategy --- src/cbc_sdk/platform/alerts.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/cbc_sdk/platform/alerts.py b/src/cbc_sdk/platform/alerts.py index 05f9dba9..31daf230 100644 --- a/src/cbc_sdk/platform/alerts.py +++ b/src/cbc_sdk/platform/alerts.py @@ -34,6 +34,7 @@ import time import datetime +import sys from cbc_sdk.errors import ApiError, ObjectNotFoundError, NonQueryableModel, FunctionalityDecommissioned from cbc_sdk.platform import PlatformModel @@ -51,7 +52,9 @@ from cbc_sdk.platform.network_threat_metadata import NetworkThreatMetadata from cbc_sdk.enterprise_edr.threat_intelligence import Watchlist -from backports._datetime_fromisoformat import datetime_fromisoformat +if sys.version_info < (3, 11): + from backports._datetime_fromisoformat import MonkeyPatch + MonkeyPatch.patch_fromisoformat() """Alert Models""" @@ -1400,9 +1403,9 @@ def _create_valid_time_filter(self, kwargs): etime = kwargs["end"] try: if isinstance(stime, str): - stime = datetime_fromisoformat(stime) + stime = datetime.fromisoformat(stime) if isinstance(etime, str): - etime = datetime_fromisoformat(etime) + etime = datetime.fromisoformat(etime) if isinstance(stime, datetime.datetime) and isinstance(etime, datetime.datetime): time_filter = {"start": stime.strftime("%Y-%m-%dT%H:%M:%S.%fZ"), "end": etime.strftime("%Y-%m-%dT%H:%M:%S.%fZ")} From 21e79bf9cfb3a81dfaf846cd710a2ee2586b17ec Mon Sep 17 00:00:00 2001 From: Leviathan <97615419+prose-leviathan@users.noreply.github.com> Date: Wed, 3 Jul 2024 23:08:00 +0200 Subject: [PATCH 4/9] patch audit.py with monkeypatch strategy --- src/cbc_sdk/platform/audit.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/cbc_sdk/platform/audit.py b/src/cbc_sdk/platform/audit.py index bdff0a41..6ccfe37c 100644 --- a/src/cbc_sdk/platform/audit.py +++ b/src/cbc_sdk/platform/audit.py @@ -22,13 +22,17 @@ """ import datetime +import sys + from cbc_sdk.base import (UnrefreshableModel, BaseQuery, QueryBuilder, QueryBuilderSupportMixin, CriteriaBuilderSupportMixin, ExclusionBuilderSupportMixin, IterableQueryMixin, AsyncQueryMixin) from cbc_sdk.errors import ApiError from cbc_sdk.platform.jobs import Job -from backports._datetime_fromisoformat import datetime_fromisoformat +if sys.version_info < (3, 11): + from backports._datetime_fromisoformat import MonkeyPatch + MonkeyPatch.patch_fromisoformat() """Model Class""" @@ -171,9 +175,9 @@ def _create_valid_time_filter(kwargs): etime = kwargs["end"] try: if isinstance(stime, str): - stime = datetime_fromisoformat(stime) + stime = datetime.fromisoformat(stime) if isinstance(etime, str): - etime = datetime_fromisoformat(etime) + etime = datetime.fromisoformat(etime) if isinstance(stime, datetime.datetime) and isinstance(etime, datetime.datetime): time_filter = {"start": stime.strftime("%Y-%m-%dT%H:%M:%S.%fZ"), "end": etime.strftime("%Y-%m-%dT%H:%M:%S.%fZ")} From ef2d61ae8ea080039828bd98aca5689a19b235ef Mon Sep 17 00:00:00 2001 From: Leviathan <97615419+prose-leviathan@users.noreply.github.com> Date: Wed, 3 Jul 2024 23:09:52 +0200 Subject: [PATCH 5/9] patch setup.py with condition prior to 3.11 --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 8128e5fb..65f43938 100644 --- a/setup.py +++ b/setup.py @@ -25,7 +25,6 @@ 'jsonschema', "keyring;platform_system=='Darwin'", 'boto3', - 'backports-datetime-fromisoformat==2.0.1' ] extras_require = { @@ -44,6 +43,8 @@ if sys.version_info < (3, 0): install_requires.extend(['futures']) +if sys.version_info < (3, 11): + install_requires.extend(['backports-datetime-fromisoformat==2.0.1']) def read(fname): From 77f22f97fd1ce896db0a5ecb8a649c4ead7af012 Mon Sep 17 00:00:00 2001 From: Alex Van Brunt Date: Tue, 9 Jul 2024 16:43:21 -0600 Subject: [PATCH 6/9] Adjust datetime implementation --- src/cbc_sdk/platform/alerts.py | 13 +++++++++---- src/cbc_sdk/platform/audit.py | 13 +++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/cbc_sdk/platform/alerts.py b/src/cbc_sdk/platform/alerts.py index 31daf230..9fcf9a69 100644 --- a/src/cbc_sdk/platform/alerts.py +++ b/src/cbc_sdk/platform/alerts.py @@ -53,8 +53,7 @@ from cbc_sdk.enterprise_edr.threat_intelligence import Watchlist if sys.version_info < (3, 11): - from backports._datetime_fromisoformat import MonkeyPatch - MonkeyPatch.patch_fromisoformat() + from backports._datetime_fromisoformat import datetime_fromisoformat """Alert Models""" @@ -1403,9 +1402,15 @@ def _create_valid_time_filter(self, kwargs): etime = kwargs["end"] try: if isinstance(stime, str): - stime = datetime.fromisoformat(stime) + if sys.version_info < (3, 11): + stime = datetime_fromisoformat(stime) + else: + stime = datetime.datetime.fromisoformat(stime) if isinstance(etime, str): - etime = datetime.fromisoformat(etime) + if sys.version_info < (3, 11): + etime = datetime_fromisoformat(etime) + else: + etime = datetime.datetime.fromisoformat(etime) if isinstance(stime, datetime.datetime) and isinstance(etime, datetime.datetime): time_filter = {"start": stime.strftime("%Y-%m-%dT%H:%M:%S.%fZ"), "end": etime.strftime("%Y-%m-%dT%H:%M:%S.%fZ")} diff --git a/src/cbc_sdk/platform/audit.py b/src/cbc_sdk/platform/audit.py index 6ccfe37c..3fec089f 100644 --- a/src/cbc_sdk/platform/audit.py +++ b/src/cbc_sdk/platform/audit.py @@ -31,8 +31,7 @@ from cbc_sdk.platform.jobs import Job if sys.version_info < (3, 11): - from backports._datetime_fromisoformat import MonkeyPatch - MonkeyPatch.patch_fromisoformat() + from backports._datetime_fromisoformat import datetime_fromisoformat """Model Class""" @@ -175,9 +174,15 @@ def _create_valid_time_filter(kwargs): etime = kwargs["end"] try: if isinstance(stime, str): - stime = datetime.fromisoformat(stime) + if sys.version_info < (3, 11): + stime = datetime_fromisoformat(stime) + else: + stime = datetime.datetime.fromisoformat(stime) if isinstance(etime, str): - etime = datetime.fromisoformat(etime) + if sys.version_info < (3, 11): + etime = datetime_fromisoformat(etime) + else: + etime = datetime.datetime.fromisoformat(etime) if isinstance(stime, datetime.datetime) and isinstance(etime, datetime.datetime): time_filter = {"start": stime.strftime("%Y-%m-%dT%H:%M:%S.%fZ"), "end": etime.strftime("%Y-%m-%dT%H:%M:%S.%fZ")} From a2122b78deb5370fdbf1d9f4ae8560b44f4be928 Mon Sep 17 00:00:00 2001 From: Amy Bowersox Date: Wed, 10 Jul 2024 10:52:12 -0600 Subject: [PATCH 7/9] updated version numbers to 1.5.4 --- README.md | 4 ++-- VERSION | 2 +- docs/changelog.rst | 3 +++ docs/conf.py | 2 +- src/cbc_sdk/__init__.py | 4 ++-- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3f05fc61..6d1202d4 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Carbon Black Cloud Python SDK -**Latest Version:** 1.5.3 +**Latest Version:** 1.5.4
-**Release Date:** June 27, 2024 +**Release Date:** TBD [![Coverage Status](https://coveralls.io/repos/github/carbonblack/carbon-black-cloud-sdk-python/badge.svg?t=Id6Baf)](https://coveralls.io/github/carbonblack/carbon-black-cloud-sdk-python) [![Codeship Status for carbonblack/carbon-black-cloud-sdk-python](https://app.codeship.com/projects/9e55a370-a772-0138-aae4-129773225755/status?branch=develop)](https://app.codeship.com/projects/402767) diff --git a/VERSION b/VERSION index 8af85beb..94fe62c2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.5.3 +1.5.4 diff --git a/docs/changelog.rst b/docs/changelog.rst index 4f7d6d47..82a6690f 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -13,6 +13,9 @@ Changelog ========= +CBC SDK 1.5.4 - Released TBD +-------------------------------------- + CBC SDK 1.5.3 - Released June 27, 2024 -------------------------------------- diff --git a/docs/conf.py b/docs/conf.py index e2adabdf..d0d93657 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -23,7 +23,7 @@ author = 'Developer Relations' # The full version, including alpha/beta/rc tags -release = '1.5.3' +release = '1.5.4' # -- General configuration --------------------------------------------------- diff --git a/src/cbc_sdk/__init__.py b/src/cbc_sdk/__init__.py index 571b8cba..32faad04 100644 --- a/src/cbc_sdk/__init__.py +++ b/src/cbc_sdk/__init__.py @@ -14,8 +14,8 @@ __title__ = 'cbc_sdk' __author__ = 'Carbon Black Developer Network' __license__ = 'MIT' -__copyright__ = 'Copyright 2020-2024 VMware Carbon Black' -__version__ = '1.5.3' +__copyright__ = 'Copyright 2020-2024 Broadcom Inc. Carbon Black' +__version__ = '1.5.4' from .rest_api import CBCloudAPI from .cache import lru From 02bf864c1c7563ce3a205ab001005e41a69031ab Mon Sep 17 00:00:00 2001 From: Amy Bowersox Date: Wed, 10 Jul 2024 10:55:22 -0600 Subject: [PATCH 8/9] updated changelog --- docs/changelog.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index 82a6690f..15f8fe49 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -16,6 +16,11 @@ Changelog CBC SDK 1.5.4 - Released TBD -------------------------------------- +Bug Fixes: + +* Fixed dependency on backports-datetime-fromisoformat for Python 3.11 and later. +* Fixed a bug affecting the ability to access alert attributes with array syntax. + CBC SDK 1.5.3 - Released June 27, 2024 -------------------------------------- From f1f6090127e24e6ecd5b3108d1c1cde071a1b583 Mon Sep 17 00:00:00 2001 From: Amy Bowersox Date: Wed, 10 Jul 2024 12:45:14 -0600 Subject: [PATCH 9/9] updated release date --- README.md | 2 +- docs/changelog.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6d1202d4..b8d2386a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ **Latest Version:** 1.5.4
-**Release Date:** TBD +**Release Date:** July 10, 2024 [![Coverage Status](https://coveralls.io/repos/github/carbonblack/carbon-black-cloud-sdk-python/badge.svg?t=Id6Baf)](https://coveralls.io/github/carbonblack/carbon-black-cloud-sdk-python) [![Codeship Status for carbonblack/carbon-black-cloud-sdk-python](https://app.codeship.com/projects/9e55a370-a772-0138-aae4-129773225755/status?branch=develop)](https://app.codeship.com/projects/402767) diff --git a/docs/changelog.rst b/docs/changelog.rst index 15f8fe49..8295614d 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -13,7 +13,7 @@ Changelog ========= -CBC SDK 1.5.4 - Released TBD +CBC SDK 1.5.4 - Released July 10, 2024 -------------------------------------- Bug Fixes: