From eba1844535a8140751dfee6dfcdc81835ba94830 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 13 Apr 2018 14:01:33 -0400 Subject: [PATCH] tweak to filter property checking to make sure original object property is not altered; added tests for this as well --- stix2/datastore/filters.py | 5 +++-- stix2/test/test_datastore.py | 10 +++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/stix2/datastore/filters.py b/stix2/datastore/filters.py index 21a156e..c260dcc 100644 --- a/stix2/datastore/filters.py +++ b/stix2/datastore/filters.py @@ -90,10 +90,11 @@ class Filter(collections.namedtuple("Filter", ['property', 'op', 'value'])): False otherwise. """ if isinstance(stix_obj_property, datetime): - # if a datetime obj, convert to str before comparison + # if a datetime obj, use str format before comparison # NOTE: this check seems like it should be done upstream # but will put here for now - stix_obj_property = format_datetime(stix_obj_property) + tmp = format_datetime(stix_obj_property) + stix_obj_property = tmp # use tmp variable to avoid deepcopy op if self.op == "=": return stix_obj_property == self.value diff --git a/stix2/test/test_datastore.py b/stix2/test/test_datastore.py index 772c72e..7ee4877 100644 --- a/stix2/test/test_datastore.py +++ b/stix2/test/test_datastore.py @@ -6,7 +6,7 @@ from stix2.core import parse from stix2.datastore import (CompositeDataSource, DataSink, DataSource, make_id, taxii) from stix2.datastore.filters import apply_common_filters -from stix2.utils import deduplicate, parse_into_datetime +from stix2.utils import STIXdatetime, deduplicate, parse_into_datetime COLLECTION_URL = 'https://example.com/api1/collections/91a7b528-80eb-42ed-a74d-c6fbd5a26116/' @@ -489,6 +489,9 @@ def test_apply_common_filters13(): resp = list(apply_common_filters(stix_objs, [filters[14]])) assert resp[0]["id"] == stix_objs[4]["id"] assert len(resp) == 1 + # important additional check to make sure original File dict was + # not converted to File object. (this was a deep bug found) + assert isinstance(resp[0]["objects"]["0"], dict) resp = list(apply_common_filters(real_stix_objs, [filters[14]])) assert resp[0].id == real_stix_objs[4].id @@ -507,6 +510,9 @@ def test_datetime_filter_behavior(): filter_with_dt_obj = Filter("created", "=", parse_into_datetime("2016-02-14T00:00:00.000Z", "millisecond")) filter_with_str = Filter("created", "=", "2016-02-14T00:00:00.000Z") + # check taht filter value is converted from datetime to str + assert isinstance(filter_with_dt_obj.value, str) + # compare datetime string to filter w/ datetime obj resp = list(apply_common_filters(stix_objs, [filter_with_dt_obj])) assert len(resp) == 1 @@ -516,6 +522,7 @@ def test_datetime_filter_behavior(): resp = list(apply_common_filters(real_stix_objs, [filter_with_dt_obj])) assert len(resp) == 1 assert resp[0]["id"] == "vulnerability--ee916c28-c7a4-4d0d-ad56-a8d357f89fef" + assert isinstance(resp[0].created, STIXdatetime) # make sure original object not altered # compare datetime string to filter w/ str resp = list(apply_common_filters(stix_objs, [filter_with_str])) @@ -526,6 +533,7 @@ def test_datetime_filter_behavior(): resp = list(apply_common_filters(real_stix_objs, [filter_with_str])) assert len(resp) == 1 assert resp[0]["id"] == "vulnerability--ee916c28-c7a4-4d0d-ad56-a8d357f89fef" + assert isinstance(resp[0].created, STIXdatetime) # make sure original object not altered def test_filters0():