import demistomock as demisto # noqa: F401 from CommonServerPython import * # noqa: F401 """ IMPORTS """ # Std imports from datetime import datetime # 3-rd party imports from typing import Any, AnyStr import urllib3 # Local imports from CommonServerUserPython import * """GLOBALS/PARAMS Attributes: INTEGRATION_NAME: Name of the integration as shown in the integration UI, for example: Microsoft Graph User. INTEGRATION_COMMAND_NAME: Command names should be written in all lower-case letters, and each word separated with a hyphen, for example: msgraph-user. INTEGRATION_CONTEXT_NAME: Context output names should be written in camel case, for example: MSGraphUser. """ INTEGRATION_NAME = "PhishLabs IOC - DRP" INTEGRATION_COMMAND_NAME = "phishlabs-ioc-drp" INTEGRATION_CONTEXT_NAME = "PhishLabsIOC" # Disable insecure warnings urllib3.disable_warnings() class Client(BaseClient): def test_module(self) -> dict: """Performs basic GET request to check if the API is reachable and authentication is successful. Returns: Response json """ return self.get_cases(max_records=2) def travel_to_end_date( self, cases_temp: list, params: dict, end_date: str | None, date_field: str, suffix: str ) -> tuple[list[Any], dict[Any, Any], int, datetime | None]: """Moving index to starting point, if neccery chage cases_temp (more get request) Args: cases_temp: case as starting point assuming list sorted by date params: query params end_date: end date of the query searched date_field: date field to apply end date filter suffix: suffix of url Returns: Tuple of (list of cases temp, modified params, index in cases, datetime object of last run in traveling) """ format_time = "%Y-%m-%dT%H:%M:%SZ" last_time: datetime | None = None if not cases_temp else datetime.strptime(cases_temp[0].get(date_field), format_time) end_date_obj: datetime = datetime.strptime(end_date, format_time) if end_date else datetime.now() index = 0 while end_date_obj and last_time: if end_date_obj < last_time: if len(cases_temp) == index + 1: params["offset"] += len(cases_temp) cases_temp = self._http_request("GET", url_suffix=suffix, params=assign_params(**params), timeout=20).get( "data", [] ) index = 0 if not cases_temp: break else: index += 1 last_time = datetime.strptime(cases_temp[index].get(date_field), format_time) else: break return cases_temp, params, index, last_time def travel_to_begin_date( self, cases_temp: list, index: int, params: dict, begin_date: str | None, last_time: datetime | None, date_field: str, max_records: str | int, suffix: str, ) -> list[dict[Any, Any]]: """ Args: suffix: suffix of url cases_temp: case as starting point assuming list sorted by date index: current traveling point in travelling params: query params begin_date: begin date to move while traveling case last_time: last time of last case visited date_field: date field to apply end date filter max_records: max records to get in this query suffix: suffix of url Returns: List of cases filtered by date """ format_time = "%Y-%m-%dT%H:%M:%SZ" begin_date_obj: datetime | None = datetime.strptime(begin_date, format_time) if begin_date else None cases: list = [] while cases_temp and len(cases) < int(max_records) and last_time: if begin_date_obj: if last_time > begin_date_obj: cases.append(cases_temp[index]) else: break else: cases.append(cases_temp[index]) if len(cases) == max_records: break if len(cases_temp) == index + 1: params["offset"] += len(cases_temp) cases_temp = self._http_request("GET", url_suffix=suffix, params=assign_params(**params), timeout=20).get( "data", [] ) index = 0 if not cases_temp: break else: index += 1 last_time = datetime.strptime(cases_temp[index].get(date_field), format_time) return cases def get_cases( self, status: str | None = None, case_type: str | None = None, max_records: str | int = 20, offset: str | int = 0, date_field: str = "dateModified", begin_date: str | None = None, end_date: str | None = None, query_type: str = "", period: str | None = None, ) -> dict: """ Query the specified kwargs with default parameters if not defined Args: status: Filter cases based on the case status case_type: Filter cases by case type max_records: Maximum number of cases to return, default is 20, maximum is 200 offset: Paginate results used in conjunction with maxRecords date_field: Field to use to query using dateBegin and dateEnd parameters. begin_date: Date query beginning date end_date: Date query beginning date query_type: query type influence on suffix - all/open/closed period: timestamp (