Convert rest of code to use namedtuple Filters
							parent
							
								
									87f7503c0a
								
							
						
					
					
						commit
						961dfdc984
					
				|  | @ -289,17 +289,17 @@ class DataSource(object): | |||
| 
 | ||||
|                 # skip filter as filter was identified (when added) as | ||||
|                 # not a common filter | ||||
|                 if 'id' in filter_ and self.filter_allowed[filter_['id']] is False: | ||||
|                 if filter_.field not in STIX_COMMON_FIELDS: | ||||
|                     continue | ||||
| 
 | ||||
|                 # check filter "field" is in STIX object - if cant be applied | ||||
|                 # due to STIX object, STIX object is discarded (i.e. did not | ||||
|                 # make it through the filter) | ||||
|                 if filter_['field'] not in stix_obj.keys(): | ||||
|                 if filter_.field not in stix_obj.keys(): | ||||
|                     clean = False | ||||
|                     break | ||||
|                 try: | ||||
|                     match = getattr(STIXCommonPropertyFilters, filter_['field'])(filter_, stix_obj) | ||||
|                     match = getattr(STIXCommonPropertyFilters, filter_.field)(filter_, stix_obj) | ||||
|                     if not match: | ||||
|                         clean = False | ||||
|                         break | ||||
|  | @ -553,39 +553,39 @@ class STIXCommonPropertyFilters(): | |||
|     @classmethod | ||||
|     def _all(cls, filter_, stix_obj_field): | ||||
|         """all filter operations (for filters whose value type can be applied to any operation type)""" | ||||
|         if filter_["op"] == '=': | ||||
|             return stix_obj_field == filter_["value"] | ||||
|         elif filter_["op"] == "!=": | ||||
|             return stix_obj_field != filter_["value"] | ||||
|         elif filter_["op"] == "in": | ||||
|             return stix_obj_field in filter_["value"] | ||||
|         elif filter_["op"] == ">": | ||||
|             return stix_obj_field > filter_["value"] | ||||
|         elif filter_["op"] == "<": | ||||
|             return stix_obj_field < filter_["value"] | ||||
|         elif filter_["op"] == ">=": | ||||
|             return stix_obj_field >= filter_["value"] | ||||
|         elif filter_["op"] == "<=": | ||||
|             return stix_obj_field <= filter_["value"] | ||||
|         if filter_.op == '=': | ||||
|             return stix_obj_field == filter_.value | ||||
|         elif filter_.op == "!=": | ||||
|             return stix_obj_field != filter_.value | ||||
|         elif filter_.op == "in": | ||||
|             return stix_obj_field in filter_.value | ||||
|         elif filter_.op == ">": | ||||
|             return stix_obj_field > filter_.value | ||||
|         elif filter_.op == "<": | ||||
|             return stix_obj_field < filter_.value | ||||
|         elif filter_.op == ">=": | ||||
|             return stix_obj_field >= filter_.value | ||||
|         elif filter_.op == "<=": | ||||
|             return stix_obj_field <= filter_.value | ||||
|         else: | ||||
|             return -1 | ||||
| 
 | ||||
|     @classmethod | ||||
|     def _id(cls, filter_, stix_obj_id): | ||||
|         """base filter types""" | ||||
|         if filter_["op"] == "=": | ||||
|             return stix_obj_id == filter_["value"] | ||||
|         elif filter_["op"] == "!=": | ||||
|             return stix_obj_id != filter_["value"] | ||||
|         if filter_.op == "=": | ||||
|             return stix_obj_id == filter_.value | ||||
|         elif filter_.op == "!=": | ||||
|             return stix_obj_id != filter_.value | ||||
|         else: | ||||
|             return -1 | ||||
| 
 | ||||
|     @classmethod | ||||
|     def _boolean(cls, filter_, stix_obj_field): | ||||
|         if filter_["op"] == "=": | ||||
|             return stix_obj_field == filter_["value"] | ||||
|         elif filter_["op"] == "!=": | ||||
|             return stix_obj_field != filter_["value"] | ||||
|         if filter_.op == "=": | ||||
|             return stix_obj_field == filter_.value | ||||
|         elif filter_.op == "!=": | ||||
|             return stix_obj_field != filter_.value | ||||
|         else: | ||||
|             return -1 | ||||
| 
 | ||||
|  | @ -620,7 +620,7 @@ class STIXCommonPropertyFilters(): | |||
|         """ | ||||
|         for er in stix_obj["external_references"]: | ||||
|             # grab er property name from filter field | ||||
|             filter_field = filter_["field"].split(".")[1] | ||||
|             filter_field = filter_.field.split(".")[1] | ||||
|             r = cls._string(filter_, er[filter_field]) | ||||
|             if r: | ||||
|                 return r | ||||
|  | @ -637,7 +637,7 @@ class STIXCommonPropertyFilters(): | |||
|         """ | ||||
|         for gm in stix_obj["granular_markings"]: | ||||
|             # grab gm property name from filter field | ||||
|             filter_field = filter_["field"].split(".")[1] | ||||
|             filter_field = filter_.field.split(".")[1] | ||||
| 
 | ||||
|             if filter_field == "marking_ref": | ||||
|                 return cls._id(filter_, gm[filter_field]) | ||||
|  |  | |||
|  | @ -12,8 +12,8 @@ TODO: Test everything | |||
| import json | ||||
| import os | ||||
| 
 | ||||
| from stix2.sources import DataSink, DataSource, DataStore, make_id | ||||
| from stix2 import Bundle | ||||
| from stix2.sources import DataSink, DataSource, DataStore, make_id | ||||
| 
 | ||||
| 
 | ||||
| class FileSystemStore(DataStore): | ||||
|  | @ -136,13 +136,13 @@ class FileSystemSource(DataSource): | |||
|         # the corresponding subdirectories as well | ||||
|         include_paths = [] | ||||
|         declude_paths = [] | ||||
|         if "type" in [filter_["field"] for filter_ in file_filters]: | ||||
|         if "type" in [filter_.field for filter_ in file_filters]: | ||||
|             for filter_ in file_filters: | ||||
|                 if filter_["field"] == "type": | ||||
|                     if filter_["op"] == '=': | ||||
|                         include_paths.append(os.path.join(self.stix_dir, filter_["value"])) | ||||
|                     elif filter_["op"] == "!=": | ||||
|                         declude_paths.append(os.path.join(self.stix_dir, filter_["value"])) | ||||
|                 if filter_.field == "type": | ||||
|                     if filter_.op == '=': | ||||
|                         include_paths.append(os.path.join(self.stix_dir, filter_.value)) | ||||
|                     elif filter_.op == "!=": | ||||
|                         declude_paths.append(os.path.join(self.stix_dir, filter_.value)) | ||||
|         else: | ||||
|             # have to walk entire STIX directory | ||||
|             include_paths.append(self.stix_dir) | ||||
|  | @ -165,10 +165,10 @@ class FileSystemSource(DataSource): | |||
| 
 | ||||
|         # grab stix object ID as well - if present in filters, as | ||||
|         # may forgo the loading of STIX content into memory | ||||
|         if "id" in [filter_["field"] for filter_ in file_filters]: | ||||
|         if "id" in [filter_.field for filter_ in file_filters]: | ||||
|             for filter_ in file_filters: | ||||
|                 if filter_["field"] == "id" and filter_["field"] == '=': | ||||
|                     id_ = filter_["value"] | ||||
|                 if filter_.field == "id" and filter_.field == '=': | ||||
|                     id_ = filter_.value | ||||
|         else: | ||||
|             id_ = None | ||||
| 
 | ||||
|  | @ -196,6 +196,6 @@ class FileSystemSource(DataSource): | |||
|         """ | ||||
|         file_filters = [] | ||||
|         for filter_ in query: | ||||
|             if filter_["field"] == "id" or filter_["field"] == "type": | ||||
|             if filter_.field == "id" or filter_.field == "type": | ||||
|                 file_filters.append(filter_) | ||||
|         return file_filters | ||||
|  |  | |||
|  | @ -159,10 +159,10 @@ class TAXIICollectionSource(DataSource): | |||
|         params = {} | ||||
| 
 | ||||
|         for filter_ in query: | ||||
|             if filter_["field"] in TAXII_FILTERS: | ||||
|                 if filter_["field"] == "added_after": | ||||
|                     params[filter_["field"]] = filter_["value"] | ||||
|             if filter_.field in TAXII_FILTERS: | ||||
|                 if filter_.field == "added_after": | ||||
|                     params[filter_.field] = filter_.value | ||||
|                 else: | ||||
|                     taxii_field = "match[" + filter_["field"] + ']' | ||||
|                     params[taxii_field] = filter_["value"] | ||||
|                     taxii_field = "match[" + filter_.field + ']' | ||||
|                     params[taxii_field] = filter_.value | ||||
|         return params | ||||
|  |  | |||
|  | @ -33,31 +33,11 @@ def test_ds_taxii_name(collection): | |||
| 
 | ||||
| def test_parse_taxii_filters(): | ||||
|     query = [ | ||||
|         { | ||||
|             "field": "added_after", | ||||
|             "op": "=", | ||||
|             "value": "2016-02-01T00:00:01.000Z" | ||||
|         }, | ||||
|         { | ||||
|             "field": "id", | ||||
|             "op": "=", | ||||
|             "value": "taxii stix object ID" | ||||
|         }, | ||||
|         { | ||||
|             "field": "type", | ||||
|             "op": "=", | ||||
|             "value": "taxii stix object ID" | ||||
|         }, | ||||
|         { | ||||
|             "field": "version", | ||||
|             "op": "=", | ||||
|             "value": "first" | ||||
|         }, | ||||
|         { | ||||
|             "field": "created_by_ref", | ||||
|             "op": "=", | ||||
|             "value": "Bane" | ||||
|         } | ||||
|         Filter("added_after", "=", "2016-02-01T00:00:01.000Z"), | ||||
|         Filter("id", "=", "taxii stix object ID"), | ||||
|         Filter("type", "=", "taxii stix object ID"), | ||||
|         Filter("version", "=", "first"), | ||||
|         Filter("created_by_ref", "=", "Bane"), | ||||
|     ] | ||||
| 
 | ||||
|     expected_params = { | ||||
|  | @ -162,21 +142,9 @@ def test_apply_common_filters(): | |||
|     ] | ||||
| 
 | ||||
|     filters = [ | ||||
|         { | ||||
|             "field": "type", | ||||
|             "op": "!=", | ||||
|             "value": "relationship" | ||||
|         }, | ||||
|         { | ||||
|             "field": "id", | ||||
|             "op": "=", | ||||
|             "value": "relationship--2f9a9aa9-108a-4333-83e2-4fb25add0463" | ||||
|         }, | ||||
|         { | ||||
|             "field": "labels", | ||||
|             "op": "in", | ||||
|             "value": "remote-access-trojan" | ||||
|         } | ||||
|         Filter("type", "!=", "relationship"), | ||||
|         Filter("id", "=", "relationship--2f9a9aa9-108a-4333-83e2-4fb25add0463"), | ||||
|         Filter("labels", "in", "remote-access-trojan"), | ||||
|     ] | ||||
| 
 | ||||
|     ds = DataSource() | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Greg Back
						Greg Back