def request(self, request_method, url, query_params=None, json=None, pagination_enabled=False): """ Calls Sentry API (the call is authenticated using the token). Any exceptions encountered during the call are logged and then re-raised. If no exceptions occured, this method returns JSON content of the response. """ api_url = self._get_api_url(url) if pagination_enabled: results = [] while True: response = self._call_api_url(request_method, api_url, query_params, json) results.extend(clean(response.json())) next_link = response.links.get('next', None) self.logger.info('next_link: {}'.format(next_link)) if not next_link or next_link['results'] == 'false': break api_url = next_link['url'] self.logger.info('api_url: {}'.format(api_url)) query_params = None json = None return results else: response = self._call_api_url(request_method, api_url, query_params, json) return clean(response.json())
def test_clean_no_exceptions(): helper.clean({ "one": [1, None, "", { "two": None }, { "three": 3 }], "four": 4 })
def call_api(self, method, url, params=None, json=None, data=None, allow_404=False): api_url = self.base_url + url self.logger.info('Call API: Trying to reach endpoint: ' + api_url) kwargs = {'params': params, 'json': json, 'data': data} kwargs = clean(kwargs) resp = request(method, api_url, headers={ 'X-API-Key': self.api_key, }, **kwargs) try: resp.raise_for_status() except HTTPError: if resp.status_code == 401: raise ConnectionTestException( preset=ConnectionTestException.Preset.API_KEY) elif resp.status_code == 404: if allow_404: return None else: raise ConnectionTestException( preset=ConnectionTestException.Preset.NOT_FOUND) else: try: content = resp.json() cause = find_value('message', content) or \ find_value('error_message', content) cause = cause.capitalize() if not cause.endswith('.'): cause = cause + '.' except ValueError: cause = resp.content.decode() raise ConnectionTestException( cause=cause, assistance='Please make sure that your API key is valid ' + 'and that you did not attempt to create entities that ' + 'already exist.') try: json = resp.json() except ValueError as e: raise ConnectionTestException( cause='Incorrect data format received from API: ' + str(e), assistance='Please make sure that your API key ' + 'has the correct scope and the correct inputs were used.') self.logger.info('Call API: Successfully obtained data from the API') return json
def list_routes(self, app_id, from_=None, to=None, per_page=10, page=1): params = {'from': from_, 'to': to, 'per_page': per_page, 'page': page} params = clean(params) return self.call_api('GET', 'apps/' + app_id + '/routes', params=params, allow_404=True)
def run(self, params={}): """Run the trigger""" app_id = params.get('app_id') source = params.get('source') frequency = params.get('frequency', 5) filter_ = params.get('filter') while True: from_ = datetime.now() events = self.connection.api.get_events(app_id, source, filter_, from_).get('table', []) if not events: self.logger.info('No new events found') for event in events: self.logger.info('New event found: ' + event.get('id')) # Unnest the location object # "location": { "location": { "country": "United States" } } # -> # "location": { "country": "United States" } if 'location' in event: if 'location' in event['location']: location = event.pop('location').pop('location') event['location'] = location self.send({'event': clean(event)}) time.sleep(frequency)
def run(self, params={}): """Run the trigger""" app_id = params.get("app_id") source = params.get("source") frequency = params.get("frequency", 5) filter_ = params.get("filter") while True: from_ = datetime.now() events = self.connection.api.get_events(app_id, source, filter_, from_).get("table", []) if not events: self.logger.info("No new events found") for event in events: self.logger.info("New event found: " + event.get("id")) # Unnest the location object # "location": { "location": { "country": "United States" } } # -> # "location": { "country": "United States" } if "location" in event: if "location" in event["location"]: location = event.pop("location").pop("location") event["location"] = location self.send({"event": clean(event)}) time.sleep(frequency)
def list_routes(self, app_id, from_=None, to=None, per_page=10, page=1): params = {"from": from_, "to": to, "per_page": per_page, "page": page} params = clean(params) return self.call_api("GET", "apps/" + app_id + "/routes", params=params, allow_404=True)
def get_events(self, app_id, source, filter_=None, from_=None): params = {'filter': filter_, 'from': from_} params = clean(params) return self.call_api('GET', 'apps/' + app_id + '/sources/' + source + '/table', params=params, allow_404=True)
def test_clean_not_equal_list_successful(): sample = ["one", {"two": "", "three": None}, {"four": 4}, None] assert sample != helper.clean( ["one", { "two": "", "three": None }, { "four": 4 }, None])
def run(self, params={}): timeout = params.get(Input.TIMEOUT) output = checkdmarc.check_domains([params.get(Input.DOMAIN)], timeout=timeout, skip_tls=True) try: clean_output = helper.clean(json.loads(json.dumps(output))) except Exception as e: raise PluginException(cause="Unexpected response from server", assistance=e) return {Output.REPORT: clean_output}
def get_events(self, app_id, source, filter_=None, from_=None): params = {"filter": filter_, "from": from_} params = clean(params) return self.call_api("GET", "apps/" + app_id + "/sources/" + source + "/table", params=params, allow_404=True)
def remove_null_and_clean(in_list): output = [] for item in in_list: dict_ = item for key in list(dict_.keys()): if dict_[key] is None: dict_.pop(key) output.append(helper.clean(dict_)) return output
def _call_api(self, method, url, data=None, json=None, params=None): api_url = self.instance_url + url kwargs = {'params': params, 'json': json, 'data': data} kwargs = clean(kwargs) self.logger.info('HippocampeAPI: Trying to reach endpoint: ' + api_url) response = request(method, api_url, **kwargs) try: response.raise_for_status() except HTTPError: if response.status_code == 401: raise ConnectionTestException( preset=ConnectionTestException.Preset.API_KEY ) elif response.status_code == 404: raise ConnectionTestException( preset=ConnectionTestException.Preset.NOT_FOUND ) else: cause = None try: response_json = response.json() # Only error returned, no actual data if set(response_json.keys()) == {'error'}: cause = response_json['error'] except JSONDecodeError: # Not a JSON response cause = response.content.decode() if cause: raise ConnectionTestException( cause=cause, assistance=( 'If the issue persists please contact support.' ) ) response = response.json() if response is None: self.logger.warn('HippocampeAPI: Received empty response') response = {} elif 'error' in response: error = response['error'] self.logger.warn( 'HippocampeAPI: An error occurred, but some ' 'data was returned successfully: ' + error ) del response['error'] self.logger.info('HippocampeAPI: API call successful') return response
def run(self, params={}): group_name = params.get("group_name") items = params.get("items") result = self.connection.api.update_ip_group(group_name, items) output = { "id": result.get("result").get("id"), "message": result.get("result").get("message"), } return clean(output)
def run(self, params={}): group_name = params.get('group_name') items = params.get('items') result = self.connection.api.update_ip_group(group_name, items) output = { 'id': result.get('result').get('id'), 'message': result.get('result').get('message') } return clean(output)
def test_clean_not_equal_dict_successful(): sample = {"one": [1, None, "", {"two": None}, {"three": 3}], "four": 4} assert sample != helper.clean({ "one": [1, None, "", { "two": None }, { "three": 3 }], "four": 4 })
def run(self, params={}): query = params.get('query') results = self.connection.api.advanced_search(query) flat_results = [] for result in results: flat_result = { 'type': result.get('attributes', {}).get('type', ''), 'url': result.get('attributes', {}).get('url', ''), 'name': result.get('Name'), 'id': result.get('Id'), } flat_result = clean(flat_result) flat_results.append(flat_result) return {'search_results': flat_results}
def run(self, params={}): query = params.get("query") results = self.connection.api.advanced_search(query) flat_results = [] for result in results: flat_result = { "type": result.get("attributes", {}).get("type", ""), "url": result.get("attributes", {}).get("url", ""), "name": result.get("Name"), "id": result.get("Id"), } flat_result = clean(flat_result) flat_results.append(flat_result) return {"search_results": flat_results}
def run(self, params={}): text = params.get("text") results = self.connection.api.simple_search(text) flat_results = [] for result in results: flat_result = { "type": result.get("attributes", {}).get("type", ""), "url": result.get("attributes", {}).get("url", ""), "name": result.get("Name"), "id": result.get("Id"), } flat_result = clean(flat_result) flat_results.append(flat_result) return {"search_results": flat_results}
def run(self, params={}): text = params.get('text') results = self.connection.api.simple_search(text) flat_results = [] for result in results: flat_result = { 'type': result.get('attributes', {}).get('type', ''), 'url': result.get('attributes', {}).get('url', ''), 'name': result.get('Name'), 'id': result.get('Id'), } flat_result = clean(flat_result) flat_results.append(flat_result) return {'search_results': flat_results}
def _call_api(self, method, url, data=None, json=None, params=None): api_url = self.instance_url + url kwargs = {"params": params, "json": json, "data": data} kwargs = clean(kwargs) self.logger.info("SalesforceAPI: Trying to reach endpoint: " + api_url) response = request( method, api_url, headers={ "Authorization": "Bearer " + self.access_token, }, **kwargs, ) try: response.raise_for_status() except HTTPError: if response.status_code == 401: raise ConnectionTestException( preset=ConnectionTestException.Preset.API_KEY) elif response.status_code == 404: raise ConnectionTestException( preset=ConnectionTestException.Preset.NOT_FOUND) else: cause = response.content.decode() raise ConnectionTestException( cause=cause, assistance="Please make sure that your application was " + "properly connected and that you are using a correct " + "security token (reset the token if unsure).", ) try: response = response.json() except (JSONDecodeError, UnicodeDecodeError): self.logger.info("SalesforceAPI: Received non-JSON response") response = response.content self.logger.info("SalesforceAPI: API call successful") return response
def remove_null_and_clean(in_dict): for key in in_dict.keys(): if in_dict.get(key) == "null": in_dict.pop(key) return helper.clean(in_dict)
def run(self, params={}): webid = params.get("webid") analysis = self.connection.api.info(webid) return {"analysis": clean(analysis)}
def run(self, params={}): webid = params.get('webid') analysis = self.connection.api.info(webid) return {'analysis': clean(analysis)}
def test_clean_equal_list_successful(): sample = ["one", {"two": "", "three": None}, {"four": 4}, None] assert ["one", {}, {"four": 4}] == helper.clean(sample)
def call_api(self, method, url, params=None, json=None, data=None, allow_404=False): api_url = self.base_url + url self.logger.info("Call API: Trying to reach endpoint: " + api_url) kwargs = {"params": params, "json": json, "data": data} kwargs = clean(kwargs) resp = request( method, api_url, headers={ "X-API-Key": self.api_key, }, **kwargs, ) try: resp.raise_for_status() except HTTPError: if resp.status_code == 401: raise ConnectionTestException( preset=ConnectionTestException.Preset.API_KEY) elif resp.status_code == 404: if allow_404: return None else: raise ConnectionTestException( preset=ConnectionTestException.Preset.NOT_FOUND) else: try: content = resp.json() cause = find_value("message", content) or find_value( "error_message", content) cause = cause.capitalize() if not cause.endswith("."): cause = cause + "." except ValueError: cause = resp.content.decode() raise ConnectionTestException( cause=cause, assistance="Please make sure that your API key is valid " + "and that you did not attempt to create entities that " + "already exist.", ) try: json = resp.json() except ValueError as e: raise ConnectionTestException( cause="Incorrect data format received from API: " + str(e), assistance="Please make sure that your API key " + "has the correct scope and the correct inputs were used.", ) self.logger.info("Call API: Successfully obtained data from the API") return json