Пример #1
0
    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())
Пример #2
0
def test_clean_no_exceptions():
    helper.clean({
        "one": [1, None, "", {
            "two": None
        }, {
            "three": 3
        }],
        "four": 4
    })
Пример #3
0
    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
Пример #4
0
 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)
Пример #6
0
    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)
Пример #7
0
 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)
Пример #8
0
    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)
Пример #9
0
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])
Пример #10
0
    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}
Пример #11
0
    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
Пример #13
0
    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
Пример #14
0
    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)
Пример #15
0
    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)
Пример #16
0
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
    })
Пример #17
0
    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}
Пример #18
0
    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}
Пример #19
0
    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}
Пример #20
0
    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}
Пример #21
0
    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
Пример #22
0
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)
Пример #23
0
    def run(self, params={}):
        webid = params.get("webid")

        analysis = self.connection.api.info(webid)
        return {"analysis": clean(analysis)}
Пример #24
0
    def run(self, params={}):
        webid = params.get('webid')

        analysis = self.connection.api.info(webid)
        return {'analysis': clean(analysis)}
Пример #25
0
def test_clean_equal_list_successful():
    sample = ["one", {"two": "", "three": None}, {"four": 4}, None]
    assert ["one", {}, {"four": 4}] == helper.clean(sample)
Пример #26
0
    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