def on_request(self, request):
        """
        Invoked when a request message is received.

        :param request: The request message
        """
        # Handle request
        logger.info("Request received on topic: '%s' with payload: '%s'",
                    request.destination_topic,
                    MessageUtils.decode_payload(request))

        try:
            res = Response(request)

            request_dict = MessageUtils.json_payload_to_dict(request) \
                if request.payload else {}

            # Ensure required parameters are present
            if self._required_params:
                for name in self._required_params:
                    if name not in request_dict:
                        raise Exception(
                            "Required parameter not found: '{}'".format(name))

            if "format" not in request_dict:
                request_dict["format"] = "json"
            elif request_dict["format"] not in ("json", "xml"):
                raise Exception(
                    "Unsupported format requested: '{}'. {}".format(
                        request_dict["format"],
                        "Only 'json' and 'xml' are supported."))

            # Invoke DomainTools API via client
            dt_response = \
                getattr(self._app.domaintools_api,
                        self._func_name)(**request_dict)

            # Set response payload
            response_data = dt_response.data()
            if isinstance(response_data, dict):
                MessageUtils.dict_to_json_payload(res, response_data)
            else:
                MessageUtils.encode_payload(res, response_data)

        except ServiceException as ex:
            logger.exception("Error handling request")
            msg = "%s: %s" % (ex.__class__.__name__, ex.reason)
            res = ErrorResponse(request,
                                error_message=MessageUtils.encode(msg))

        except Exception as ex:
            logger.exception("Error handling request")
            msg = str(ex)
            if not msg:
                msg = ex.__class__.__name__
            res = ErrorResponse(request,
                                error_message=MessageUtils.encode(msg))

        # Send response
        self._app.client.send_response(res)
예제 #2
0
    def on_request(self, request):
        """
        Invoked when a request message is received.

        :param request: The request message
        """
        # Handle request
        logger.info(
            "Request received on topic: '{0}' with payload: '{1}'".format(
                request.destination_topic,
                MessageUtils.decode_payload(request)))

        try:
            # Create response
            res = Response(request)

            # Read DXL request payload into dictionary
            params = MessageUtils.json_payload_to_dict(request)

            # Invoke API call
            if 'data' in params.keys() and params['data'] != "":
                tide_data = params['data']
                if 'type' in params.keys(): tide_type = params['type']
                else: tide_type = get_ioc_type(tide_data, 'tide')
                if 'rlimit' in params.keys(
                ) and params['max_rec'] < self._app.tide_max_rec:
                    tide_max_rec = params['max_rec']
                else:
                    tide_max_rec = self._app.tide_max_rec  #Error data is required

                if 'format' in params.keys(): tide_format = params['format']
                else:
                    tide_format = self._app.tide_format  #Error data is required
                http_res = requests.get(
                    "https://api.activetrust.net:8000/api/data/threats",
                    params={
                        "type": tide_type,
                        tide_type: tide_data,
                        "data_format": tide_format,
                        "rlimit": tide_max_rec
                    },
                    auth=(self._app.api_key, ''))
                content = unicode(http_res.content, "utf-8")
            else:
                content = "{'status':'error','errorMessage':'The data field is required'}"  #Error data is required

            # Add web service response to DXL response payload
            MessageUtils.encode_payload(res, content, enc='utf-8')

            # Send response
            self._app.client.send_response(res)

        except Exception as ex:
            logger.exception("Error handling request")
            err_res = ErrorResponse(request,
                                    error_code=0,
                                    error_message=MessageUtils.encode(str(ex)))
            self._app.client.send_response(err_res)
    def on_request(self, request):
        """
        Invoked when a request message is received.

        :param request: The request message
        """
        # Handle request
        logger.info("Request received on topic: '%s' with payload: '%s'",
                    request.destination_topic,
                    MessageUtils.decode_payload(request))

        try:
            # API URL
            api_url = self._app.URL_VOID_API_URL_FORMAT.format(self._app.api_key)

            command = request.destination_topic[self._app.SERVICE_TYPE_LENGTH + 1:]
            params = {}
            if request.payload:
                params = MessageUtils.json_payload_to_dict(request)

            if self._required_params:
                self._validate(params)

            if command == self._app.CMD_HOST_INFO:
                host = params[self.PARAM_HOST]
                api_url = "{0}{1}/{2}".format(api_url, self.PARAM_HOST, host)
            elif command == self._app.CMD_HOST_RESCAN:
                host = params[self.PARAM_HOST]
                api_url = "{0}{1}/{2}/rescan".format(api_url, self.PARAM_HOST, host)
            elif command == self._app.CMD_HOST_SCAN:
                host = params[self.PARAM_HOST]
                api_url = "{0}{1}/{2}/scan".format(api_url, self.PARAM_HOST, host)
            elif command == self._app.CMD_STATS_REMAINED:
                api_url = "{0}{1}".format(api_url, command)

            # Invoke URLVoid API
            url_void_api_response = requests.get(api_url)

            # Check HTTP response code
            url_void_api_response.raise_for_status()

            # Create response
            res = Response(request)

            # Set payload
            MessageUtils.encode_payload(res, url_void_api_response.text)

            # Send response
            self._app.client.send_response(res)

        except Exception as ex:
            logger.exception("Error handling request")
            err_res = ErrorResponse(request, error_message=MessageUtils.encode(str(ex)))
            self._app.client.send_response(err_res)
예제 #4
0
    def on_request(self, request):
        """
        Invoked when a request message is received.

        :param request: The request message
        """
        # Handle request
        logger.info(
            "Request received on topic: '{0}' with payload: '{1}'".format(
                request.destination_topic,
                MessageUtils.decode_payload(request)))

        try:
            # Create response
            res = Response(request)

            # Read DXL request payload into dictionary
            params = MessageUtils.decode_payload(request)
            headers = {'Content-Type': 'application/json'}
            #print(params)

            # Invoke API call
            http_res = requests.post(
                "https://api.activetrust.net:8000/api/services/intel/lookup/jobs?wait=true",
                headers=headers,
                data=params,
                auth=(self._app.api_key, ''))
            content = unicode(http_res.content, "utf-8")

            # Add web service response to DXL response payload
            MessageUtils.encode_payload(res, content, enc='utf-8')

            # Send response
            self._app.client.send_response(res)

        except Exception as ex:
            logger.exception("Error handling request")
            err_res = ErrorResponse(request,
                                    error_code=0,
                                    error_message=MessageUtils.encode(str(ex)))
            self._app.client.send_response(err_res)
예제 #5
0
# Create DXL configuration from file
config = DxlClientConfig.create_dxl_config_from_file(CONFIG_FILE)

# Create the client
with DxlClient(config) as client:

    # Connect to the fabric
    client.connect()

    logger.info("Connected to DXL fabric.")

    # Create the event
    event = Event(EVENT_TOPIC)

    # Set the payload
    MessageUtils.encode_payload(event, "Hello from OpenDXL")

    # Send the event
    client.send_event(event)

    print("Waiting for event payloads to be stored in Elasticsearch...")
    time.sleep(5)

    for document_id in DOCUMENT_IDS:
        # Create the get request
        request_topic = "/opendxl-elasticsearch/service/elasticsearch-api/get"
        req = Request(request_topic)

        # Set the payload for the get request
        MessageUtils.dict_to_json_payload(req, {
            "index": DOCUMENT_INDEX,
예제 #6
0
    def on_request(self, request):
        """
        Invoked when a request message is received.

        :param request: The request message
        """
        # Handle request
        logger.info(
            "Request received on topic: '{0}' with payload: '{1}'".format(
                request.destination_topic,
                MessageUtils.decode_payload(request)))

        try:
            # Create response
            res = Response(request)

            # Read DXL request payload into dictionary
            params = MessageUtils.json_payload_to_dict(request)

            # Invoke API call
            if 'data' in params.keys() and params['data'] != "":
                dossier_data = params['data']
                if 'type' in params.keys(): dossier_type = params['type']
                else: dossier_type = get_ioc_type(dossier_data, 'dossier')
                if 'sources' in params.keys():
                    payload = {
                        "target": {
                            "one": {
                                "type": dossier_type,
                                "target": dossier_data,
                                "sources": params['sources']
                            }
                        }
                    }
                else:
                    payload = {
                        "target": {
                            "one": {
                                "type": dossier_type,
                                "target": dossier_data
                            }
                        }
                    }
                headers = {'Content-Type': 'application/json'}
                http_res = requests.post(
                    "https://api.activetrust.net:8000/api/services/intel/lookup/jobs?wait=true",
                    json=payload,
                    auth=(self._app.api_key, ''))
                content = unicode(http_res.content, "utf-8")
            else:
                content = "{'status':'error','errorMessage':'The data field is required'}"  #Error data is required

            # Add web service response to DXL response payload
            MessageUtils.encode_payload(res, content, enc='utf-8')

            # Send response
            self._app.client.send_response(res)

        except Exception as ex:
            logger.exception("Error handling request")
            err_res = ErrorResponse(request,
                                    error_code=0,
                                    error_message=MessageUtils.encode(str(ex)))
            self._app.client.send_response(err_res)
    def on_request(self, request):  #pylint
        """
        Invoked when a request message is received.

        :param request: The request message
        """
        # Handle request
        logger.info("Request received on topic: '%s' with payload: '%s'",
                    request.destination_topic,
                    MessageUtils.decode_payload(request))

        try:
            command = request.destination_topic[self._app.SERVICE_TYPE_LENGTH +
                                                1:]

            stats_remained = False
            if self._app.REQ_TOPIC_SUFFIX_STATS in command:
                stats_remained = True
                command = command[:len(command) -
                                  len(self._app.REQ_TOPIC_SUFFIX_STATS) - 1]

            # API URL
            api_url = self._app.API_VOID_URL_FORMAT.format(
                command, self._app.KEY_PARAM_FORMAT.format(self._app.api_key))

            if stats_remained:
                api_url = "{0}&{1}".format(api_url, self.PARAM_STATS)
            else:
                params = {}
                if request.payload:
                    params = MessageUtils.json_payload_to_dict(request)

                if self._required_params:
                    self._validate(params)

                if command == self._app.CMD_IP_REPUTATION:
                    ip_param = params[self.PARAM_IP]
                    api_url = "{0}&{1}={2}".format(api_url, self.PARAM_IP,
                                                   ip_param)
                elif command == self._app.CMD_DOMAIN_REPUTATION:
                    host = params[self.PARAM_HOST]
                    api_url = "{0}&{1}={2}".format(api_url, self.PARAM_HOST,
                                                   host)
                elif command == self._app.CMD_DNS_LOOKUP:
                    action = params[self.PARAM_ACTION]
                    host = params[self.PARAM_HOST]
                    api_url = "{0}&{1}={2}&{3}={4}".format(
                        api_url, self.PARAM_ACTION, action, self.PARAM_HOST,
                        host)
                elif command in self._app.CMD_LIST:
                    host = params[self.PARAM_HOST]
                    api_url = "{0}&{1}={2}".format(api_url, self.PARAM_HOST,
                                                   host)

            # Invoke URLVoid API
            api_void_response = requests.get(api_url)

            # Check HTTP response code
            api_void_response.raise_for_status()

            # Create response
            res = Response(request)

            # Set payload
            MessageUtils.encode_payload(res, api_void_response.text)

            # Send response
            self._app.client.send_response(res)

        except Exception as ex:
            logger.exception("Error handling request")
            err_res = ErrorResponse(request,
                                    error_message=MessageUtils.encode(str(ex)))
            self._app.client.send_response(err_res)