in hunting/search.py [0:0]
def search(self, mitre_filter: tuple = (), data_source: str = None, keyword: str = None) -> list:
"""Search the index based on MITRE techniques, data source, or keyword."""
results = []
# Step 1: If data source is provided, filter by data source first
if data_source:
click.echo(f"Filtering by data source: {data_source}")
results = self._filter_by_data_source(data_source)
if not results:
# data source always takes precedence over other filters if provided
click.echo(f"No matching queries found for data source: {data_source}")
return results
# Step 2: If MITRE filter is provided, process the filter
if mitre_filter:
click.echo(f"Searching for MITRE techniques: {mitre_filter}")
self._process_mitre_filter(mitre_filter)
if results:
# Filter existing results further by MITRE if data source results already exist
results = [result for result in results if
any(tech in self.mitre_technique_ids for tech in result['mitre'])]
else:
# Otherwise, perform a fresh search based on MITRE filter
results = self._search_index(mitre_filter)
# Step 3: If keyword is provided, search for it in name, description, and notes
if keyword:
click.echo(f"Searching for keyword: {keyword}")
if results:
# Filter existing results further by keyword
results = [result for result in results if self._matches_keyword(result, keyword)]
else:
# Perform a fresh search by keyword
results = self._search_keyword(keyword)
return self._handle_no_results(results, mitre_filter, data_source, keyword)