tcex 4.0.11.dev0__tar.gz → 4.0.11.dev2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tcex-4.0.11.dev0/tcex.egg-info → tcex-4.0.11.dev2}/PKG-INFO +1 -1
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/pyproject.toml +1 -1
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/__metadata__.py +1 -1
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/batch.py +1 -138
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/batch_submit.py +143 -2
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/object_abc.py +12 -1
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/object_collection_abc.py +6 -5
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2/tcex.egg-info}/PKG-INFO +1 -1
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/LICENSE +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/README.md +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/setup.cfg +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/api.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/tc.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/ti_transform/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/ti_transform/model/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/ti_transform/model/transform_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/ti_transform/ti_predefined_functions.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/ti_transform/ti_transform.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/ti_transform/transform_abc.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/util/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/util/threat_intel_util.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/association.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/attribute.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/batch_writer.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/group.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/indicator.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/security_label.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/tag.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/datastore/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/datastore/cache.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/datastore/datastore.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/metric/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/metric/metric.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/notification/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/notification/notification.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/filters.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/adversary.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/attack_pattern.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/campaign.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/course_of_action.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/document.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/email.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/event.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/incident.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/intrusion_set.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/malware.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/report.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/signature.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/tactic.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/threat.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/tool.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/vulnerability.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/indicator/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/indicator/indicator.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/indicator/indicator_type/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/indicator/indicator_type/address.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/indicator/indicator_type/email_address.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/indicator/indicator_type/file.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/indicator/indicator_type/host.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/indicator/indicator_type/url.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/mapping.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/owner.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/security_label.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/tag.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/tags.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/task.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/victim.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/tcex_ti_tc_request.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/threat_intelligence.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/v2.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_gen.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_gen_abc.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_gen_args_abc.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_gen_filter_abc.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_gen_model_abc.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_gen_object_abc.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_options_abc.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_options_data_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_options_data_object.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/model/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/model/_filter_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/model/_property_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/adversary_assets/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/api_endpoints.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/artifact_types/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/artifact_types/artifact_type.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/artifact_types/artifact_type_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/artifact_types/artifact_type_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/artifacts/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/artifacts/artifact.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/artifacts/artifact_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/artifacts/artifact_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/attribute_types/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/attribute_types/attribute_type.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/attribute_types/attribute_type_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/attribute_types/attribute_type_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/attributes/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/attributes/attribute_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/case_attributes/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/case_attributes/case_attribute.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/case_attributes/case_attribute_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/case_attributes/case_attribute_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/case_management/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/case_management/case_management.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/cases/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/cases/case.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/cases/case_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/cases/case_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/file_actions/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/file_actions/file_action_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/file_occurrences/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/file_occurrences/file_occurrence_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/filter_abc.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/group_attributes/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/group_attributes/group_attribute.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/group_attributes/group_attribute_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/group_attributes/group_attribute_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/groups/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/groups/group.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/groups/group_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/groups/group_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/indicator_attributes/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/indicator_attributes/indicator_attribute.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/indicator_attributes/indicator_attribute_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/indicator_attributes/indicator_attribute_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/indicators/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/indicators/indicator.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/indicators/indicator_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/indicators/indicator_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirement/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirement/ir.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/categories/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/categories/category.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/categories/category_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/categories/category_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/intel_req_type_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/intel_requirement.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/intel_requirement_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/intel_requirement_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/keyword_sections/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/keyword_sections/keyword_section_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/results/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/results/result.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/results/result_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/results/result_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/subtypes/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/subtypes/subtype.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/subtypes/subtype_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/subtypes/subtype_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/notes/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/notes/note.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/notes/note_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/notes/note_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/assignee_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/assignee_user_group_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/assignee_user_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/exclusion_lists/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/exclusion_lists/exclusion_list.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/exclusion_lists/exclusion_list_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/exclusion_lists/exclusion_list_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/owner_roles/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/owner_roles/owner_role.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/owner_roles/owner_role_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/owner_roles/owner_role_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/owners/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/owners/owner.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/owners/owner_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/owners/owner_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/security.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/system_roles/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/system_roles/system_role.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/system_roles/system_role_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/system_roles/system_role_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/task_assignee_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/user_groups/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/user_groups/user_group.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/user_groups/user_group_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/user_groups/user_group_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/users/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/users/user.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/users/user_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/users/user_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security_labels/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security_labels/security_label.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security_labels/security_label_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security_labels/security_label_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tags/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tags/default_naics_tags.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tags/mitre_tags.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tags/naics_tags.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tags/tag.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tags/tag_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tags/tag_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tasks/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tasks/task.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tasks/task_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tasks/task_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/threat_intelligence/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/threat_intelligence/threat_intelligence.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tql/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tql/tql.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tql/tql_operator.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tql/tql_type.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/v3.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/v3_model_abc.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/v3_types.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victim_assets/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victim_assets/victim_asset.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victim_assets/victim_asset_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victim_assets/victim_asset_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victim_attributes/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victim_attributes/victim_attribute.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victim_attributes/victim_attribute_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victim_attributes/victim_attribute_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victims/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victims/victim.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victims/victim_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victims/victim_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/workflow_events/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/workflow_events/workflow_event.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/workflow_events/workflow_event_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/workflow_events/workflow_event_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/workflow_templates/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/workflow_templates/workflow_template.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/workflow_templates/workflow_template_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/workflow_templates/workflow_template_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/app.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/app_spec_yml.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/install_json.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/install_json_update.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/install_json_validate.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/job_json.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/layout_json.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/model/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/model/app_spec_yml_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/model/install_json_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/model/job_json_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/model/layout_json_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/model/tcex_json_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/permutation.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/tcex_json.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/tcex_json_update.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/decorator/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/decorator/benchmark.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/decorator/debug.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/decorator/fail_on_output.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/decorator/on_exception.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/decorator/on_success.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/decorator/output.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/key_value_store/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/key_value_store/key_value_abc.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/key_value_store/key_value_api.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/key_value_store/key_value_mock.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/key_value_store/key_value_redis.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/key_value_store/key_value_store.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/key_value_store/redis_client.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/key_value_store/redis_client_ssl.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/playbook/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/playbook/advanced_request.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/playbook/playbook.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/playbook/playbook_create.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/playbook/playbook_delete.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/playbook/playbook_output.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/playbook/playbook_read.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/service/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/service/api_service.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/service/common_service.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/service/common_service_trigger.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/service/mqtt_message_broker.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/service/webhook_trigger_service.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/token/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/token/token.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/exit/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/exit/error_code.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/exit/exit.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/binary.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/case_management_entity.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/choice.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/datetime.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/edit_choice.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/exception.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/group_entity.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/indicator_entity.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/integer.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/ip_address.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/key_value.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/sensitive.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/string.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/tc_entity.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/validator.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/input.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/advanced_request_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/api_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/app_api_service_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/app_external_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/app_feed_api_service_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/app_organization_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/app_playbook_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/app_system_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/app_trigger_service_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/app_webhook_trigger_service_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/batch_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/cal_setting_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/cert_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/common_advanced_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/common_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/create_config_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/logging_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/model_map.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/module_app_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/module_requests_session_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/organization_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/path_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/playbook_common_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/playbook_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/proxy_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/service_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/smtp_setting_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/logger/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/logger/api_handler.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/logger/cache_handler.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/logger/logger.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/logger/rotating_file_handler_custom.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/logger/sensitive_filter.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/logger/trace_logger.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/cached_property.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/event.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/exception_thread.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/jmespath_custom.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/none_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/proxies.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/scoped_property.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/singleton.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/registry.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_external/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_external/external_session.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_external/rate_limit_handler.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_external/requests_external.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_tc/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_tc/auth/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_tc/auth/hmac_auth.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_tc/auth/tc_auth.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_tc/auth/token_auth.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_tc/requests_tc.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_tc/tc_session.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/tcex.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/aes_operation.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/code_operation.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/datetime_operation.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/file_operation.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/model/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/model/playbook_variable_model.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/render/__init__.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/render/render.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/render/render_panel.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/render/render_prompt.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/render/render_table.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/requests_to_curl.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/string_operation.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/util.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/variable.py +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex.egg-info/SOURCES.txt +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex.egg-info/dependency_links.txt +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex.egg-info/requires.txt +0 -0
- {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex.egg-info/top_level.txt +0 -0
|
@@ -108,7 +108,7 @@ commit = false
|
|
|
108
108
|
# Additional arguments to pass to the git commit command
|
|
109
109
|
commit_args = "--no-verify"
|
|
110
110
|
# The current version of the project
|
|
111
|
-
current_version = "4.0.11-
|
|
111
|
+
current_version = "4.0.11-dev2"
|
|
112
112
|
# The commit message template used when committing version bumps
|
|
113
113
|
message = "Version updated from {current_version} to {new_version}"
|
|
114
114
|
# Regular expression for parsing version strings
|
|
@@ -10,7 +10,6 @@ import threading
|
|
|
10
10
|
import time
|
|
11
11
|
from collections import deque
|
|
12
12
|
from collections.abc import Callable
|
|
13
|
-
from functools import cached_property
|
|
14
13
|
from typing import Any
|
|
15
14
|
|
|
16
15
|
# third-party
|
|
@@ -922,140 +921,7 @@ class Batch(BatchWriter, BatchSubmit):
|
|
|
922
921
|
|
|
923
922
|
return {}
|
|
924
923
|
|
|
925
|
-
|
|
926
|
-
def attribute_config(self) -> dict:
|
|
927
|
-
"""Return a dict of attribute types keyed by 'name', fetched across all pages."""
|
|
928
|
-
attributes: dict[str, dict] = {}
|
|
929
|
-
|
|
930
|
-
# Start with the initial endpoint
|
|
931
|
-
url = '/v3/attributeTypes'
|
|
932
|
-
while True:
|
|
933
|
-
# Fetch page (first call uses relative path; subsequent calls use absolute next_ URL)
|
|
934
|
-
resp = self.session_tc.get(url, params={'resultLimit': 10_000})
|
|
935
|
-
payload = resp.json()
|
|
936
|
-
|
|
937
|
-
# Collect items from this page
|
|
938
|
-
for attribute_type in payload.get('data', []):
|
|
939
|
-
name = attribute_type.get('name')
|
|
940
|
-
if name is None:
|
|
941
|
-
# Skip entries without a name key (defensive)
|
|
942
|
-
continue
|
|
943
|
-
attributes[name] = attribute_type
|
|
944
|
-
|
|
945
|
-
# Get the next page URL; stop if none
|
|
946
|
-
next_ = payload.get('next')
|
|
947
|
-
if not next_:
|
|
948
|
-
break
|
|
949
|
-
|
|
950
|
-
# next_ is the full URL for the next page
|
|
951
|
-
url = next_
|
|
952
|
-
|
|
953
|
-
return attributes
|
|
954
|
-
|
|
955
|
-
def _auto_truncate_attribute(
|
|
956
|
-
self, attribute_type: str, attribute_value: str, ellipsis: str = '...'
|
|
957
|
-
) -> str:
|
|
958
|
-
"""Truncate attribute value if it exceeds the maximum length for its type.
|
|
959
|
-
|
|
960
|
-
Args:
|
|
961
|
-
attribute_type: The name of the attribute type.
|
|
962
|
-
attribute_value: The attribute value to potentially truncate.
|
|
963
|
-
ellipsis: The string to append when truncating. Defaults to '...'.
|
|
964
|
-
|
|
965
|
-
Returns:
|
|
966
|
-
The original value if within limits, or the truncated value with ellipsis.
|
|
967
|
-
"""
|
|
968
|
-
attribute_config = self.attribute_config.get(attribute_type)
|
|
969
|
-
if not attribute_config:
|
|
970
|
-
return attribute_value
|
|
971
|
-
|
|
972
|
-
max_length = attribute_config.get('maxSize')
|
|
973
|
-
if not max_length:
|
|
974
|
-
return attribute_value
|
|
975
|
-
|
|
976
|
-
# Only strings can be truncated
|
|
977
|
-
if not isinstance(attribute_value, str):
|
|
978
|
-
return attribute_value
|
|
979
|
-
|
|
980
|
-
# If within limit, keep as-is
|
|
981
|
-
if len(attribute_value) <= max_length:
|
|
982
|
-
return attribute_value
|
|
983
|
-
|
|
984
|
-
# If max is tiny, avoid negative slicing; fall back to hard cut
|
|
985
|
-
if max_length <= len(ellipsis):
|
|
986
|
-
return attribute_value[:max_length]
|
|
987
|
-
|
|
988
|
-
# Truncate and append the msg
|
|
989
|
-
return attribute_value[: max_length - len(ellipsis)] + ellipsis
|
|
990
|
-
|
|
991
|
-
def _clean_attributes(self, content: dict) -> dict:
|
|
992
|
-
"""Clean, truncate, and deduplicate attributes for groups and indicators.
|
|
993
|
-
|
|
994
|
-
Args:
|
|
995
|
-
content: The content dictionary containing groups and/or indicators with attributes.
|
|
996
|
-
|
|
997
|
-
Returns:
|
|
998
|
-
The content dictionary with cleaned, truncated, and deduplicated attributes.
|
|
999
|
-
"""
|
|
1000
|
-
truncated_types: set[str] = set()
|
|
1001
|
-
|
|
1002
|
-
for key in ['groups', 'indicators']:
|
|
1003
|
-
for item in content.get(key, []):
|
|
1004
|
-
original_attrs = item.get('attributes') or []
|
|
1005
|
-
cleaned_attrs = []
|
|
1006
|
-
seen = set() # track normalized tuples of the entire attribute
|
|
1007
|
-
|
|
1008
|
-
for attr in original_attrs:
|
|
1009
|
-
type_ = attr.get('type')
|
|
1010
|
-
value = attr.get('value')
|
|
1011
|
-
|
|
1012
|
-
# Skip if type missing or value explicitly empty/None
|
|
1013
|
-
if not type_ or value is None or value == '':
|
|
1014
|
-
continue
|
|
1015
|
-
|
|
1016
|
-
# Truncate/normalize value
|
|
1017
|
-
truncated = self._auto_truncate_attribute(type_, value)
|
|
1018
|
-
|
|
1019
|
-
# Log warning once per attribute type when truncation occurs
|
|
1020
|
-
if truncated != value and type_ not in truncated_types:
|
|
1021
|
-
truncated_types.add(type_)
|
|
1022
|
-
self.log.warning(
|
|
1023
|
-
f'feature=batch, event=attribute-truncated, '
|
|
1024
|
-
f'key={key}, attribute-type={type_}'
|
|
1025
|
-
)
|
|
1026
|
-
|
|
1027
|
-
# De-duplication is based on all fields, but with the truncated value
|
|
1028
|
-
# Combine with the `seen` set to skip duplicates
|
|
1029
|
-
normalized_items = tuple(
|
|
1030
|
-
(k, truncated if k == 'value' else attr.get(k)) for k in sorted(attr.keys())
|
|
1031
|
-
)
|
|
1032
|
-
|
|
1033
|
-
if normalized_items in seen:
|
|
1034
|
-
continue
|
|
1035
|
-
seen.add(normalized_items)
|
|
1036
|
-
|
|
1037
|
-
new_attr = dict(attr)
|
|
1038
|
-
new_attr['value'] = truncated
|
|
1039
|
-
cleaned_attrs.append(new_attr)
|
|
1040
|
-
|
|
1041
|
-
item['attributes'] = cleaned_attrs
|
|
1042
|
-
|
|
1043
|
-
return content
|
|
1044
|
-
|
|
1045
|
-
def clean_content(self, content: dict) -> dict:
|
|
1046
|
-
"""Clean content before upload.
|
|
1047
|
-
|
|
1048
|
-
Args:
|
|
1049
|
-
content: The content dictionary to clean.
|
|
1050
|
-
|
|
1051
|
-
Returns:
|
|
1052
|
-
The cleaned content dictionary.
|
|
1053
|
-
"""
|
|
1054
|
-
return self._clean_attributes(content)
|
|
1055
|
-
|
|
1056
|
-
def submit_files(
|
|
1057
|
-
self, file_data: dict, halt_on_error: bool = True, clean_content: bool = False
|
|
1058
|
-
) -> list[dict] | None:
|
|
924
|
+
def submit_files(self, file_data: dict, halt_on_error: bool = True) -> list[dict] | None:
|
|
1059
925
|
"""Submit Files for Documents and Reports to ThreatConnect API.
|
|
1060
926
|
|
|
1061
927
|
Critical Errors: There is insufficient document storage allocated to this account.
|
|
@@ -1097,9 +963,6 @@ class Batch(BatchWriter, BatchSubmit):
|
|
|
1097
963
|
except Exception as e:
|
|
1098
964
|
self.log.warning(f'feature=batch, event=file-download-exception, err="""{e}"""')
|
|
1099
965
|
|
|
1100
|
-
if clean_content is True:
|
|
1101
|
-
content = self.clean_content(content)
|
|
1102
|
-
|
|
1103
966
|
if content is None:
|
|
1104
967
|
upload_status.append({'uploaded': False, 'xid': xid})
|
|
1105
968
|
self.log.warning(f'feature=batch-submit-files, xid={xid}, event=content-null')
|
|
@@ -15,6 +15,7 @@ from requests import Session
|
|
|
15
15
|
from tcex.exit.error_code import handle_error
|
|
16
16
|
from tcex.input.input import Input
|
|
17
17
|
from tcex.logger.trace_logger import TraceLogger
|
|
18
|
+
from tcex.pleb.cached_property import cached_property
|
|
18
19
|
|
|
19
20
|
# get tcex logger
|
|
20
21
|
_logger: TraceLogger = logging.getLogger(__name__.split('.', maxsplit=1)[0]) # type: ignore
|
|
@@ -73,6 +74,96 @@ class BatchSubmit:
|
|
|
73
74
|
self._poll_interval_times = []
|
|
74
75
|
self._poll_timeout = 3600
|
|
75
76
|
|
|
77
|
+
def _auto_truncate_attribute(
|
|
78
|
+
self, attribute_type: str, attribute_value: str, ellipsis: str = '...'
|
|
79
|
+
) -> str:
|
|
80
|
+
"""Truncate attribute value if it exceeds the maximum length for its type.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
attribute_type: The name of the attribute type.
|
|
84
|
+
attribute_value: The attribute value to potentially truncate.
|
|
85
|
+
ellipsis: The string to append when truncating. Defaults to '...'.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
The original value if within limits, or the truncated value with ellipsis.
|
|
89
|
+
"""
|
|
90
|
+
attribute_config = self.attribute_config.get(attribute_type)
|
|
91
|
+
if not attribute_config:
|
|
92
|
+
return attribute_value
|
|
93
|
+
|
|
94
|
+
max_length = attribute_config.get('maxSize')
|
|
95
|
+
if not max_length:
|
|
96
|
+
return attribute_value
|
|
97
|
+
|
|
98
|
+
# Only strings can be truncated
|
|
99
|
+
if not isinstance(attribute_value, str):
|
|
100
|
+
return attribute_value
|
|
101
|
+
|
|
102
|
+
# If within limit, keep as-is
|
|
103
|
+
if len(attribute_value) <= max_length:
|
|
104
|
+
return attribute_value
|
|
105
|
+
|
|
106
|
+
# If max is tiny, avoid negative slicing; fall back to hard cut
|
|
107
|
+
if max_length <= len(ellipsis):
|
|
108
|
+
return attribute_value[:max_length]
|
|
109
|
+
|
|
110
|
+
# Truncate and append the msg
|
|
111
|
+
return attribute_value[: max_length - len(ellipsis)] + ellipsis
|
|
112
|
+
|
|
113
|
+
def _clean_attributes(self, content: dict) -> dict:
|
|
114
|
+
"""Clean, truncate, and deduplicate attributes for groups and indicators.
|
|
115
|
+
|
|
116
|
+
Args:
|
|
117
|
+
content: The content dictionary containing groups and/or indicators with attributes.
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
The content dictionary with cleaned, truncated, and deduplicated attributes.
|
|
121
|
+
"""
|
|
122
|
+
truncated_types: set[str] = set()
|
|
123
|
+
|
|
124
|
+
for key in ['groups', 'indicators']:
|
|
125
|
+
for item in content.get(key, []):
|
|
126
|
+
original_attrs = item.get('attributes') or []
|
|
127
|
+
cleaned_attrs = []
|
|
128
|
+
seen = set() # track normalized tuples of the entire attribute
|
|
129
|
+
|
|
130
|
+
for attr in original_attrs:
|
|
131
|
+
type_ = attr.get('type')
|
|
132
|
+
value = attr.get('value')
|
|
133
|
+
|
|
134
|
+
# Skip if type missing or value explicitly empty/None
|
|
135
|
+
if not type_ or value is None or value == '':
|
|
136
|
+
continue
|
|
137
|
+
|
|
138
|
+
# Truncate/normalize value
|
|
139
|
+
truncated = self._auto_truncate_attribute(type_, value)
|
|
140
|
+
|
|
141
|
+
# Log warning once per attribute type when truncation occurs
|
|
142
|
+
if truncated != value and type_ not in truncated_types:
|
|
143
|
+
truncated_types.add(type_)
|
|
144
|
+
self.log.warning(
|
|
145
|
+
f'feature=batch, event=attribute-truncated, '
|
|
146
|
+
f'key={key}, attribute-type={type_}'
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
# De-duplication is based on all fields, but with the truncated value
|
|
150
|
+
# Combine with the `seen` set to skip duplicates
|
|
151
|
+
normalized_items = tuple(
|
|
152
|
+
(k, truncated if k == 'value' else attr.get(k)) for k in sorted(attr.keys())
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
if normalized_items in seen:
|
|
156
|
+
continue
|
|
157
|
+
seen.add(normalized_items)
|
|
158
|
+
|
|
159
|
+
new_attr = dict(attr)
|
|
160
|
+
new_attr['value'] = truncated
|
|
161
|
+
cleaned_attrs.append(new_attr)
|
|
162
|
+
|
|
163
|
+
item['attributes'] = cleaned_attrs
|
|
164
|
+
|
|
165
|
+
return content
|
|
166
|
+
|
|
76
167
|
@property
|
|
77
168
|
def _critical_failures(self) -> list[str]: # pragma: no cover
|
|
78
169
|
"""Return Batch critical failure messages."""
|
|
@@ -91,6 +182,36 @@ class BatchSubmit:
|
|
|
91
182
|
"""Set batch action."""
|
|
92
183
|
self._action = action
|
|
93
184
|
|
|
185
|
+
@cached_property
|
|
186
|
+
def attribute_config(self) -> dict:
|
|
187
|
+
"""Return a dict of attribute types keyed by 'name', fetched across all pages."""
|
|
188
|
+
attributes: dict[str, dict] = {}
|
|
189
|
+
|
|
190
|
+
# Start with the initial endpoint
|
|
191
|
+
url = '/v3/attributeTypes'
|
|
192
|
+
while True:
|
|
193
|
+
# Fetch page (first call uses relative path; subsequent calls use absolute next_ URL)
|
|
194
|
+
resp = self.session_tc.get(url, params={'resultLimit': 10_000})
|
|
195
|
+
payload = resp.json()
|
|
196
|
+
|
|
197
|
+
# Collect items from this page
|
|
198
|
+
for attribute_type in payload.get('data', []):
|
|
199
|
+
name = attribute_type.get('name')
|
|
200
|
+
if name is None:
|
|
201
|
+
# Skip entries without a name key (defensive)
|
|
202
|
+
continue
|
|
203
|
+
attributes[name] = attribute_type
|
|
204
|
+
|
|
205
|
+
# Get the next page URL; stop if none
|
|
206
|
+
next_ = payload.get('next')
|
|
207
|
+
if not next_:
|
|
208
|
+
break
|
|
209
|
+
|
|
210
|
+
# next_ is the full URL for the next page
|
|
211
|
+
url = next_
|
|
212
|
+
|
|
213
|
+
return attributes
|
|
214
|
+
|
|
94
215
|
@property
|
|
95
216
|
def attribute_write_type(self) -> str:
|
|
96
217
|
"""Return batch attribute write type."""
|
|
@@ -101,6 +222,18 @@ class BatchSubmit:
|
|
|
101
222
|
"""Set batch attribute write type."""
|
|
102
223
|
self._attribute_write_type = write_type
|
|
103
224
|
|
|
225
|
+
def clean_content(self, content: dict | str) -> dict:
|
|
226
|
+
"""Clean content before upload.
|
|
227
|
+
|
|
228
|
+
Args:
|
|
229
|
+
content: The content dictionary to clean.
|
|
230
|
+
|
|
231
|
+
Returns:
|
|
232
|
+
The cleaned content dictionary.
|
|
233
|
+
"""
|
|
234
|
+
content_dict = json.loads(content) if isinstance(content, str) else content
|
|
235
|
+
return self._clean_attributes(content_dict)
|
|
236
|
+
|
|
104
237
|
def create_job(self, halt_on_error: bool = True) -> int | None:
|
|
105
238
|
"""Submit Batch request to ThreatConnect API.
|
|
106
239
|
|
|
@@ -341,7 +474,7 @@ class BatchSubmit:
|
|
|
341
474
|
if data.get('data', {}).get('batchStatus', {}).get('status') == 'Completed':
|
|
342
475
|
# store last 5 poll times to use in calculating average poll time
|
|
343
476
|
modifier = poll_time_total * 0.7
|
|
344
|
-
self._poll_interval_times = self._poll_interval_times[-4:]
|
|
477
|
+
self._poll_interval_times = [*self._poll_interval_times[-4:], modifier]
|
|
345
478
|
|
|
346
479
|
weights: list[float | int] = [1]
|
|
347
480
|
poll_interval_time_weighted_sum = 0
|
|
@@ -447,7 +580,11 @@ class BatchSubmit:
|
|
|
447
580
|
return {}
|
|
448
581
|
|
|
449
582
|
def submit_data(
|
|
450
|
-
self,
|
|
583
|
+
self,
|
|
584
|
+
batch_id: int,
|
|
585
|
+
content: dict | str,
|
|
586
|
+
halt_on_error: bool = True,
|
|
587
|
+
clean_content: bool = False,
|
|
451
588
|
) -> dict | None:
|
|
452
589
|
"""Submit Batch request to ThreatConnect API.
|
|
453
590
|
|
|
@@ -456,6 +593,7 @@ class BatchSubmit:
|
|
|
456
593
|
content: The dict of groups and indicator data.
|
|
457
594
|
halt_on_error (bool = True): If True the process
|
|
458
595
|
should halt if any errors are encountered.
|
|
596
|
+
clean_content: If True the content will be cleaned before upload.
|
|
459
597
|
|
|
460
598
|
Returns:
|
|
461
599
|
dict: The response data
|
|
@@ -467,6 +605,9 @@ class BatchSubmit:
|
|
|
467
605
|
# TC Core requires the header to be application/octet-stream
|
|
468
606
|
headers = {'Content-Type': 'application/octet-stream'}
|
|
469
607
|
try:
|
|
608
|
+
if clean_content is True:
|
|
609
|
+
content = self.clean_content(content)
|
|
610
|
+
|
|
470
611
|
if isinstance(content, dict):
|
|
471
612
|
content = json.dumps(content)
|
|
472
613
|
|
|
@@ -54,6 +54,7 @@ class ObjectABC(ABC): # noqa: B024
|
|
|
54
54
|
self._model: V3ModelABC
|
|
55
55
|
self._nested_field_name: str | None = None
|
|
56
56
|
self._nested_filter: str | None = None
|
|
57
|
+
self._timeout = None
|
|
57
58
|
self.type_: str
|
|
58
59
|
|
|
59
60
|
@property
|
|
@@ -141,7 +142,7 @@ class ObjectABC(ABC): # noqa: B024
|
|
|
141
142
|
try:
|
|
142
143
|
self.log_request(method, url, body, params)
|
|
143
144
|
self.request = self._session.request(
|
|
144
|
-
method, url, data=body, headers=headers, params=params
|
|
145
|
+
method, url, data=body, headers=headers, params=params, timeout=self.timeout
|
|
145
146
|
)
|
|
146
147
|
except (ConnectionError, ProxyError, RetryError): # pragma: no cover
|
|
147
148
|
handle_error(
|
|
@@ -393,6 +394,16 @@ class ObjectABC(ABC): # noqa: B024
|
|
|
393
394
|
status = False
|
|
394
395
|
return status
|
|
395
396
|
|
|
397
|
+
@property
|
|
398
|
+
def timeout(self) -> int | None:
|
|
399
|
+
"""Return the current timeout value for all requests."""
|
|
400
|
+
return self._timeout
|
|
401
|
+
|
|
402
|
+
@timeout.setter
|
|
403
|
+
def timeout(self, timeout: int | None):
|
|
404
|
+
"""Set the current timeout value for all requests."""
|
|
405
|
+
self._timeout = timeout
|
|
406
|
+
|
|
396
407
|
def update(self, mode: str | None = None, params: dict | None = None) -> Response:
|
|
397
408
|
"""Create or Update the Case Management object.
|
|
398
409
|
|
|
@@ -47,6 +47,7 @@ class ObjectCollectionABC(ABC): # noqa: B024
|
|
|
47
47
|
self.log = _logger
|
|
48
48
|
self.request: Response
|
|
49
49
|
self.tql = Tql()
|
|
50
|
+
self._timeout = None
|
|
50
51
|
self._model = None
|
|
51
52
|
self.type_ = None # defined in child class
|
|
52
53
|
self.util = Util()
|
|
@@ -121,7 +122,7 @@ class ObjectCollectionABC(ABC): # noqa: B024
|
|
|
121
122
|
try:
|
|
122
123
|
self.log_request(method, url, body, params)
|
|
123
124
|
self.request = self._session.request(
|
|
124
|
-
method, url, data=body, headers=headers, params=params
|
|
125
|
+
method, url, data=body, headers=headers, params=params, timeout=self.timeout
|
|
125
126
|
)
|
|
126
127
|
except (ConnectionError, ProxyError, RetryError): # pragma: no cover
|
|
127
128
|
handle_error(
|
|
@@ -275,13 +276,13 @@ class ObjectCollectionABC(ABC): # noqa: B024
|
|
|
275
276
|
return status
|
|
276
277
|
|
|
277
278
|
@property
|
|
278
|
-
def timeout(self) -> int:
|
|
279
|
-
"""Return the timeout
|
|
279
|
+
def timeout(self) -> int | None:
|
|
280
|
+
"""Return the current timeout value for all requests."""
|
|
280
281
|
return self._timeout
|
|
281
282
|
|
|
282
283
|
@timeout.setter
|
|
283
|
-
def timeout(self, timeout: int):
|
|
284
|
-
"""Set the timeout
|
|
284
|
+
def timeout(self, timeout: int | None):
|
|
285
|
+
"""Set the current timeout value for all requests."""
|
|
285
286
|
self._timeout = timeout
|
|
286
287
|
|
|
287
288
|
@cached_property
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/__init__.py
RENAMED
|
File without changes
|
{tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/security_label.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/tcex_ti_tc_request.py
RENAMED
|
File without changes
|
{tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/threat_intelligence.py
RENAMED
|
File without changes
|
|
File without changes
|