|
2 | 2 | # See the file 'LICENSE' for copying permission.
|
3 | 3 |
|
4 | 4 | import requests
|
| 5 | +import logging |
5 | 6 |
|
6 |
| -from api_app.exceptions import AnalyzerRunException |
| 7 | +from api_app.exceptions import AnalyzerConfigurationException |
7 | 8 | from api_app.script_analyzers import classes
|
8 | 9 | from intel_owl import secrets
|
9 | 10 |
|
| 11 | +logger = logging.getLogger(__name__) |
| 12 | + |
10 | 13 |
|
11 | 14 | class HoneyDB(classes.ObservableAnalyzer):
|
12 | 15 | base_url = "https://honeydb.io/api"
|
13 | 16 |
|
14 | 17 | def set_config(self, additional_config_params):
|
15 | 18 | api_key_name = additional_config_params.get("api_key_name", "HONEYDB_API_KEY")
|
16 | 19 | api_id_name = additional_config_params.get("api_id_name", "HONEYDB_API_ID")
|
17 |
| - self.analysis_type = additional_config_params.get( |
18 |
| - "honeydb_analysis", "ip_query" |
19 |
| - ) |
| 20 | + self.analysis_type = additional_config_params.get("honeydb_analysis", "all") |
| 21 | + self.endpoints = [ |
| 22 | + "scan_twitter", |
| 23 | + "ip_query", |
| 24 | + "ip_history", |
| 25 | + "internet_scanner", |
| 26 | + "ip_info", |
| 27 | + ] |
| 28 | + if self.analysis_type not in self.endpoints and self.analysis_type != "all": |
| 29 | + raise AnalyzerConfigurationException( |
| 30 | + f"analysis_type is not valid: {self.analysis_type}" |
| 31 | + ) |
20 | 32 | self.__api_key = secrets.get_secret(api_key_name)
|
21 | 33 | self.__api_id = secrets.get_secret(api_id_name)
|
22 |
| - |
23 |
| - def run(self): |
24 | 34 | if not self.__api_key:
|
25 |
| - raise AnalyzerRunException("No HoneyDB API Key retrieved") |
| 35 | + raise AnalyzerConfigurationException("No HoneyDB API Key retrieved") |
26 | 36 | if not self.__api_id:
|
27 |
| - raise AnalyzerRunException("No HoneyDB API ID retrieved") |
28 |
| - headers = {"X-HoneyDb-ApiKey": self.__api_key, "X-HoneyDb-ApiId": self.__api_id} |
| 37 | + raise AnalyzerConfigurationException("No HoneyDB API ID retrieved") |
| 38 | + self.headers = { |
| 39 | + "X-HoneyDb-ApiKey": self.__api_key, |
| 40 | + "X-HoneyDb-ApiId": self.__api_id, |
| 41 | + } |
| 42 | + self.result = {} |
29 | 43 |
|
30 |
| - if self.analysis_type == "scan_twitter": |
31 |
| - url = f"{self.base_url}/twitter-threat-feed/{self.observable_name}" |
32 |
| - elif self.analysis_type == "ip_query": |
33 |
| - url = f"{self.base_url}/netinfo/lookup/{self.observable_name}" |
| 44 | + def run(self): |
| 45 | + if self.analysis_type == "all": |
| 46 | + for endpoint in self.endpoints: |
| 47 | + self._request_analysis(endpoint) |
34 | 48 | else:
|
35 |
| - raise AnalyzerRunException( |
36 |
| - """invalid analyzer name specified. |
37 |
| - Supported: HONEYDB_Scan_Twitter, HONEYDB_Get""" |
38 |
| - ) |
| 49 | + self._request_analysis(self.analysis_type) |
39 | 50 |
|
40 |
| - response = requests.get(url, headers=headers) |
41 |
| - response.raise_for_status() |
| 51 | + return self.result |
42 | 52 |
|
43 |
| - result = response.json() |
44 |
| - return result |
| 53 | + def _request_analysis(self, endpoint): |
| 54 | + if endpoint == "scan_twitter": |
| 55 | + url = f"{self.base_url}/twitter-threat-feed/{self.observable_name}" |
| 56 | + elif endpoint == "ip_query": |
| 57 | + url = f"{self.base_url}/netinfo/lookup/{self.observable_name}" |
| 58 | + elif endpoint == "ip_history": |
| 59 | + url = f"{self.base_url}/ip-history/{self.observable_name}" |
| 60 | + elif endpoint == "internet_scanner": |
| 61 | + url = f"{self.base_url}/internet-scanner/info/{self.observable_name}" |
| 62 | + elif endpoint == "ip_info": |
| 63 | + url = f"{self.base_url}/ipinfo/{self.observable_name}" |
| 64 | + else: |
| 65 | + logger.error(f"endpoint {endpoint} not supported") |
| 66 | + return |
| 67 | + try: |
| 68 | + response = requests.get(url, headers=self.headers) |
| 69 | + response.raise_for_status() |
| 70 | + except Exception as e: |
| 71 | + logger.exception(e) |
| 72 | + self.result[endpoint] = {"error": e} |
| 73 | + else: |
| 74 | + self.result[endpoint] = response.json() |
0 commit comments